##// END OF EJS Templates
Implemented #111 copy github node finder solution
marcink -
r1452:8585fbf3 beta
parent child Browse files
Show More
@@ -1,413 +1,418 b''
1 1 """
2 2 Routes configuration
3 3
4 4 The more specific and detailed routes should be defined first so they
5 5 may take precedent over the more generic routes. For more information
6 6 refer to the routes manual at http://routes.groovie.org/docs/
7 7 """
8 8 from __future__ import with_statement
9 9 from routes import Mapper
10 10 from rhodecode.lib.utils import check_repo_fast as cr
11 11
12 12 # prefix for non repository related links needs to be prefixed with `/`
13 13 ADMIN_PREFIX = '/_admin'
14 14
15 15
16 16 def make_map(config):
17 17 """Create, configure and return the routes Mapper"""
18 18 rmap = Mapper(directory=config['pylons.paths']['controllers'],
19 19 always_scan=config['debug'])
20 20 rmap.minimization = False
21 21 rmap.explicit = False
22 22
23 23 def check_repo(environ, match_dict):
24 24 """
25 25 check for valid repository for proper 404 handling
26 26 :param environ:
27 27 :param match_dict:
28 28 """
29 29 repo_name = match_dict.get('repo_name')
30 30 return not cr(repo_name, config['base_path'])
31 31
32 32
33 33 def check_int(environ, match_dict):
34 34 return match_dict.get('id').isdigit()
35 35
36 36
37 37
38 38
39 39 # The ErrorController route (handles 404/500 error pages); it should
40 40 # likely stay at the top, ensuring it can always be resolved
41 41 rmap.connect('/error/{action}', controller='error')
42 42 rmap.connect('/error/{action}/{id}', controller='error')
43 43
44 44 #==========================================================================
45 45 # CUSTOM ROUTES HERE
46 46 #==========================================================================
47 47
48 48 #MAIN PAGE
49 49 rmap.connect('home', '/', controller='home', action='index')
50 50 rmap.connect('repo_switcher', '/repos', controller='home',
51 51 action='repo_switcher')
52 52 rmap.connect('bugtracker',
53 53 "http://bitbucket.org/marcinkuzminski/rhodecode/issues",
54 54 _static=True)
55 55 rmap.connect('rhodecode_official', "http://rhodecode.org", _static=True)
56 56
57 57 #ADMIN REPOSITORY REST ROUTES
58 58 with rmap.submapper(path_prefix=ADMIN_PREFIX,
59 59 controller='admin/repos') as m:
60 60 m.connect("repos", "/repos",
61 61 action="create", conditions=dict(method=["POST"]))
62 62 m.connect("repos", "/repos",
63 63 action="index", conditions=dict(method=["GET"]))
64 64 m.connect("formatted_repos", "/repos.{format}",
65 65 action="index",
66 66 conditions=dict(method=["GET"]))
67 67 m.connect("new_repo", "/repos/new",
68 68 action="new", conditions=dict(method=["GET"]))
69 69 m.connect("formatted_new_repo", "/repos/new.{format}",
70 70 action="new", conditions=dict(method=["GET"]))
71 71 m.connect("/repos/{repo_name:.*}",
72 72 action="update", conditions=dict(method=["PUT"],
73 73 function=check_repo))
74 74 m.connect("/repos/{repo_name:.*}",
75 75 action="delete", conditions=dict(method=["DELETE"],
76 76 function=check_repo))
77 77 m.connect("edit_repo", "/repos/{repo_name:.*}/edit",
78 78 action="edit", conditions=dict(method=["GET"],
79 79 function=check_repo))
80 80 m.connect("formatted_edit_repo", "/repos/{repo_name:.*}.{format}/edit",
81 81 action="edit", conditions=dict(method=["GET"],
82 82 function=check_repo))
83 83 m.connect("repo", "/repos/{repo_name:.*}",
84 84 action="show", conditions=dict(method=["GET"],
85 85 function=check_repo))
86 86 m.connect("formatted_repo", "/repos/{repo_name:.*}.{format}",
87 87 action="show", conditions=dict(method=["GET"],
88 88 function=check_repo))
89 89 #ajax delete repo perm user
90 90 m.connect('delete_repo_user', "/repos_delete_user/{repo_name:.*}",
91 91 action="delete_perm_user", conditions=dict(method=["DELETE"],
92 92 function=check_repo))
93 93 #ajax delete repo perm users_group
94 94 m.connect('delete_repo_users_group',
95 95 "/repos_delete_users_group/{repo_name:.*}",
96 96 action="delete_perm_users_group",
97 97 conditions=dict(method=["DELETE"], function=check_repo))
98 98
99 99 #settings actions
100 100 m.connect('repo_stats', "/repos_stats/{repo_name:.*}",
101 101 action="repo_stats", conditions=dict(method=["DELETE"],
102 102 function=check_repo))
103 103 m.connect('repo_cache', "/repos_cache/{repo_name:.*}",
104 104 action="repo_cache", conditions=dict(method=["DELETE"],
105 105 function=check_repo))
106 106 m.connect('repo_public_journal',
107 107 "/repos_public_journal/{repo_name:.*}",
108 108 action="repo_public_journal", conditions=dict(method=["PUT"],
109 109 function=check_repo))
110 110 m.connect('repo_pull', "/repo_pull/{repo_name:.*}",
111 111 action="repo_pull", conditions=dict(method=["PUT"],
112 112 function=check_repo))
113 113
114 114 with rmap.submapper(path_prefix=ADMIN_PREFIX,
115 115 controller='admin/repos_groups') as m:
116 116 m.connect("repos_groups", "/repos_groups",
117 117 action="create", conditions=dict(method=["POST"]))
118 118 m.connect("repos_groups", "/repos_groups",
119 119 action="index", conditions=dict(method=["GET"]))
120 120 m.connect("formatted_repos_groups", "/repos_groups.{format}",
121 121 action="index", conditions=dict(method=["GET"]))
122 122 m.connect("new_repos_group", "/repos_groups/new",
123 123 action="new", conditions=dict(method=["GET"]))
124 124 m.connect("formatted_new_repos_group", "/repos_groups/new.{format}",
125 125 action="new", conditions=dict(method=["GET"]))
126 126 m.connect("update_repos_group", "/repos_groups/{id}",
127 127 action="update", conditions=dict(method=["PUT"],
128 128 function=check_int))
129 129 m.connect("delete_repos_group", "/repos_groups/{id}",
130 130 action="delete", conditions=dict(method=["DELETE"],
131 131 function=check_int))
132 132 m.connect("edit_repos_group", "/repos_groups/{id}/edit",
133 133 action="edit", conditions=dict(method=["GET"],
134 134 function=check_int))
135 135 m.connect("formatted_edit_repos_group",
136 136 "/repos_groups/{id}.{format}/edit",
137 137 action="edit", conditions=dict(method=["GET"],
138 138 function=check_int))
139 139 m.connect("repos_group", "/repos_groups/{id}",
140 140 action="show", conditions=dict(method=["GET"],
141 141 function=check_int))
142 142 m.connect("formatted_repos_group", "/repos_groups/{id}.{format}",
143 143 action="show", conditions=dict(method=["GET"],
144 144 function=check_int))
145 145
146 146 #ADMIN USER REST ROUTES
147 147 with rmap.submapper(path_prefix=ADMIN_PREFIX,
148 148 controller='admin/users') as m:
149 149 m.connect("users", "/users",
150 150 action="create", conditions=dict(method=["POST"]))
151 151 m.connect("users", "/users",
152 152 action="index", conditions=dict(method=["GET"]))
153 153 m.connect("formatted_users", "/users.{format}",
154 154 action="index", conditions=dict(method=["GET"]))
155 155 m.connect("new_user", "/users/new",
156 156 action="new", conditions=dict(method=["GET"]))
157 157 m.connect("formatted_new_user", "/users/new.{format}",
158 158 action="new", conditions=dict(method=["GET"]))
159 159 m.connect("update_user", "/users/{id}",
160 160 action="update", conditions=dict(method=["PUT"]))
161 161 m.connect("delete_user", "/users/{id}",
162 162 action="delete", conditions=dict(method=["DELETE"]))
163 163 m.connect("edit_user", "/users/{id}/edit",
164 164 action="edit", conditions=dict(method=["GET"]))
165 165 m.connect("formatted_edit_user",
166 166 "/users/{id}.{format}/edit",
167 167 action="edit", conditions=dict(method=["GET"]))
168 168 m.connect("user", "/users/{id}",
169 169 action="show", conditions=dict(method=["GET"]))
170 170 m.connect("formatted_user", "/users/{id}.{format}",
171 171 action="show", conditions=dict(method=["GET"]))
172 172
173 173 #EXTRAS USER ROUTES
174 174 m.connect("user_perm", "/users_perm/{id}",
175 175 action="update_perm", conditions=dict(method=["PUT"]))
176 176
177 177 #ADMIN USERS REST ROUTES
178 178 with rmap.submapper(path_prefix=ADMIN_PREFIX,
179 179 controller='admin/users_groups') as m:
180 180 m.connect("users_groups", "/users_groups",
181 181 action="create", conditions=dict(method=["POST"]))
182 182 m.connect("users_groups", "/users_groups",
183 183 action="index", conditions=dict(method=["GET"]))
184 184 m.connect("formatted_users_groups", "/users_groups.{format}",
185 185 action="index", conditions=dict(method=["GET"]))
186 186 m.connect("new_users_group", "/users_groups/new",
187 187 action="new", conditions=dict(method=["GET"]))
188 188 m.connect("formatted_new_users_group", "/users_groups/new.{format}",
189 189 action="new", conditions=dict(method=["GET"]))
190 190 m.connect("update_users_group", "/users_groups/{id}",
191 191 action="update", conditions=dict(method=["PUT"]))
192 192 m.connect("delete_users_group", "/users_groups/{id}",
193 193 action="delete", conditions=dict(method=["DELETE"]))
194 194 m.connect("edit_users_group", "/users_groups/{id}/edit",
195 195 action="edit", conditions=dict(method=["GET"]))
196 196 m.connect("formatted_edit_users_group",
197 197 "/users_groups/{id}.{format}/edit",
198 198 action="edit", conditions=dict(method=["GET"]))
199 199 m.connect("users_group", "/users_groups/{id}",
200 200 action="show", conditions=dict(method=["GET"]))
201 201 m.connect("formatted_users_group", "/users_groups/{id}.{format}",
202 202 action="show", conditions=dict(method=["GET"]))
203 203
204 204 #EXTRAS USER ROUTES
205 205 m.connect("users_group_perm", "/users_groups_perm/{id}",
206 206 action="update_perm", conditions=dict(method=["PUT"]))
207 207
208 208 #ADMIN GROUP REST ROUTES
209 209 rmap.resource('group', 'groups',
210 210 controller='admin/groups', path_prefix=ADMIN_PREFIX)
211 211
212 212 #ADMIN PERMISSIONS REST ROUTES
213 213 rmap.resource('permission', 'permissions',
214 214 controller='admin/permissions', path_prefix=ADMIN_PREFIX)
215 215
216 216 ##ADMIN LDAP SETTINGS
217 217 rmap.connect('ldap_settings', '%s/ldap' % ADMIN_PREFIX,
218 218 controller='admin/ldap_settings', action='ldap_settings',
219 219 conditions=dict(method=["POST"]))
220 220
221 221 rmap.connect('ldap_home', '%s/ldap' % ADMIN_PREFIX,
222 222 controller='admin/ldap_settings')
223 223
224 224 #ADMIN SETTINGS REST ROUTES
225 225 with rmap.submapper(path_prefix=ADMIN_PREFIX,
226 226 controller='admin/settings') as m:
227 227 m.connect("admin_settings", "/settings",
228 228 action="create", conditions=dict(method=["POST"]))
229 229 m.connect("admin_settings", "/settings",
230 230 action="index", conditions=dict(method=["GET"]))
231 231 m.connect("formatted_admin_settings", "/settings.{format}",
232 232 action="index", conditions=dict(method=["GET"]))
233 233 m.connect("admin_new_setting", "/settings/new",
234 234 action="new", conditions=dict(method=["GET"]))
235 235 m.connect("formatted_admin_new_setting", "/settings/new.{format}",
236 236 action="new", conditions=dict(method=["GET"]))
237 237 m.connect("/settings/{setting_id}",
238 238 action="update", conditions=dict(method=["PUT"]))
239 239 m.connect("/settings/{setting_id}",
240 240 action="delete", conditions=dict(method=["DELETE"]))
241 241 m.connect("admin_edit_setting", "/settings/{setting_id}/edit",
242 242 action="edit", conditions=dict(method=["GET"]))
243 243 m.connect("formatted_admin_edit_setting",
244 244 "/settings/{setting_id}.{format}/edit",
245 245 action="edit", conditions=dict(method=["GET"]))
246 246 m.connect("admin_setting", "/settings/{setting_id}",
247 247 action="show", conditions=dict(method=["GET"]))
248 248 m.connect("formatted_admin_setting", "/settings/{setting_id}.{format}",
249 249 action="show", conditions=dict(method=["GET"]))
250 250 m.connect("admin_settings_my_account", "/my_account",
251 251 action="my_account", conditions=dict(method=["GET"]))
252 252 m.connect("admin_settings_my_account_update", "/my_account_update",
253 253 action="my_account_update", conditions=dict(method=["PUT"]))
254 254 m.connect("admin_settings_create_repository", "/create_repository",
255 255 action="create_repository", conditions=dict(method=["GET"]))
256 256
257 257
258 258 #ADMIN MAIN PAGES
259 259 with rmap.submapper(path_prefix=ADMIN_PREFIX,
260 260 controller='admin/admin') as m:
261 261 m.connect('admin_home', '', action='index')
262 262 m.connect('admin_add_repo', '/add_repo/{new_repo:[a-z0-9\. _-]*}',
263 263 action='add_repo')
264 264
265 265 #==========================================================================
266 266 # API V1
267 267 #==========================================================================
268 268 with rmap.submapper(path_prefix=ADMIN_PREFIX,
269 269 controller='api/api') as m:
270 270 m.connect('api', '/api')
271 271
272 272
273 273 #USER JOURNAL
274 274 rmap.connect('journal', '%s/journal' % ADMIN_PREFIX, controller='journal')
275 275
276 276 rmap.connect('public_journal', '%s/public_journal' % ADMIN_PREFIX,
277 277 controller='journal', action="public_journal")
278 278
279 279 rmap.connect('public_journal_rss', '%s/public_journal_rss' % ADMIN_PREFIX,
280 280 controller='journal', action="public_journal_rss")
281 281
282 282 rmap.connect('public_journal_atom',
283 283 '%s/public_journal_atom' % ADMIN_PREFIX, controller='journal',
284 284 action="public_journal_atom")
285 285
286 286 rmap.connect('toggle_following', '%s/toggle_following' % ADMIN_PREFIX,
287 287 controller='journal', action='toggle_following',
288 288 conditions=dict(method=["POST"]))
289 289
290 290 #SEARCH
291 291 rmap.connect('search', '%s/search' % ADMIN_PREFIX, controller='search',)
292 292 rmap.connect('search_repo', '%s/search/{search_repo:.*}' % ADMIN_PREFIX,
293 293 controller='search')
294 294
295 295 #LOGIN/LOGOUT/REGISTER/SIGN IN
296 296 rmap.connect('login_home', '%s/login' % ADMIN_PREFIX, controller='login')
297 297 rmap.connect('logout_home', '%s/logout' % ADMIN_PREFIX, controller='login',
298 298 action='logout')
299 299
300 300 rmap.connect('register', '%s/register' % ADMIN_PREFIX, controller='login',
301 301 action='register')
302 302
303 303 rmap.connect('reset_password', '%s/password_reset' % ADMIN_PREFIX,
304 304 controller='login', action='password_reset')
305 305
306 306 rmap.connect('reset_password_confirmation',
307 307 '%s/password_reset_confirmation' % ADMIN_PREFIX,
308 308 controller='login', action='password_reset_confirmation')
309 309
310 310 #FEEDS
311 311 rmap.connect('rss_feed_home', '/{repo_name:.*}/feed/rss',
312 312 controller='feed', action='rss',
313 313 conditions=dict(function=check_repo))
314 314
315 315 rmap.connect('atom_feed_home', '/{repo_name:.*}/feed/atom',
316 316 controller='feed', action='atom',
317 317 conditions=dict(function=check_repo))
318 318
319 319 #==========================================================================
320 320 # REPOSITORY ROUTES
321 321 #==========================================================================
322 322 rmap.connect('changeset_home', '/{repo_name:.*}/changeset/{revision}',
323 323 controller='changeset', revision='tip',
324 324 conditions=dict(function=check_repo))
325 325
326 326 rmap.connect('raw_changeset_home',
327 327 '/{repo_name:.*}/raw-changeset/{revision}',
328 328 controller='changeset', action='raw_changeset',
329 329 revision='tip', conditions=dict(function=check_repo))
330 330
331 331 rmap.connect('summary_home', '/{repo_name:.*}',
332 332 controller='summary', conditions=dict(function=check_repo))
333 333
334 334 rmap.connect('summary_home', '/{repo_name:.*}/summary',
335 335 controller='summary', conditions=dict(function=check_repo))
336 336
337 337 rmap.connect('shortlog_home', '/{repo_name:.*}/shortlog',
338 338 controller='shortlog', conditions=dict(function=check_repo))
339 339
340 340 rmap.connect('branches_home', '/{repo_name:.*}/branches',
341 341 controller='branches', conditions=dict(function=check_repo))
342 342
343 343 rmap.connect('tags_home', '/{repo_name:.*}/tags',
344 344 controller='tags', conditions=dict(function=check_repo))
345 345
346 346 rmap.connect('changelog_home', '/{repo_name:.*}/changelog',
347 347 controller='changelog', conditions=dict(function=check_repo))
348 348
349 349 rmap.connect('changelog_details', '/{repo_name:.*}/changelog_details/{cs}',
350 350 controller='changelog', action='changelog_details',
351 351 conditions=dict(function=check_repo))
352 352
353 353 rmap.connect('files_home', '/{repo_name:.*}/files/{revision}/{f_path:.*}',
354 354 controller='files', revision='tip', f_path='',
355 355 conditions=dict(function=check_repo))
356 356
357 357 rmap.connect('files_diff_home', '/{repo_name:.*}/diff/{f_path:.*}',
358 358 controller='files', action='diff', revision='tip', f_path='',
359 359 conditions=dict(function=check_repo))
360 360
361 361 rmap.connect('files_rawfile_home',
362 362 '/{repo_name:.*}/rawfile/{revision}/{f_path:.*}',
363 363 controller='files', action='rawfile', revision='tip',
364 364 f_path='', conditions=dict(function=check_repo))
365 365
366 366 rmap.connect('files_raw_home',
367 367 '/{repo_name:.*}/raw/{revision}/{f_path:.*}',
368 368 controller='files', action='raw', revision='tip', f_path='',
369 369 conditions=dict(function=check_repo))
370 370
371 371 rmap.connect('files_annotate_home',
372 372 '/{repo_name:.*}/annotate/{revision}/{f_path:.*}',
373 373 controller='files', action='annotate', revision='tip',
374 374 f_path='', conditions=dict(function=check_repo))
375 375
376 376 rmap.connect('files_edit_home',
377 377 '/{repo_name:.*}/edit/{revision}/{f_path:.*}',
378 378 controller='files', action='edit', revision='tip',
379 379 f_path='', conditions=dict(function=check_repo))
380 380
381 381 rmap.connect('files_archive_home', '/{repo_name:.*}/archive/{fname}',
382 382 controller='files', action='archivefile',
383 383 conditions=dict(function=check_repo))
384 384
385 rmap.connect('files_nodelist_home',
386 '/{repo_name:.*}/nodelist/{revision}/{f_path:.*}',
387 controller='files', action='nodelist',
388 conditions=dict(function=check_repo))
389
385 390 rmap.connect('repo_settings_delete', '/{repo_name:.*}/settings',
386 391 controller='settings', action="delete",
387 392 conditions=dict(method=["DELETE"], function=check_repo))
388 393
389 394 rmap.connect('repo_settings_update', '/{repo_name:.*}/settings',
390 395 controller='settings', action="update",
391 396 conditions=dict(method=["PUT"], function=check_repo))
392 397
393 398 rmap.connect('repo_settings_home', '/{repo_name:.*}/settings',
394 399 controller='settings', action='index',
395 400 conditions=dict(function=check_repo))
396 401
397 402 rmap.connect('repo_fork_create_home', '/{repo_name:.*}/fork',
398 403 controller='settings', action='fork_create',
399 404 conditions=dict(function=check_repo, method=["POST"]))
400 405
401 406 rmap.connect('repo_fork_home', '/{repo_name:.*}/fork',
402 407 controller='settings', action='fork',
403 408 conditions=dict(function=check_repo))
404 409
405 410 rmap.connect('repo_followers_home', '/{repo_name:.*}/followers',
406 411 controller='followers', action='followers',
407 412 conditions=dict(function=check_repo))
408 413
409 414 rmap.connect('repo_forks_home', '/{repo_name:.*}/forks',
410 415 controller='forks', action='forks',
411 416 conditions=dict(function=check_repo))
412 417
413 418 return rmap
@@ -1,415 +1,447 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 rhodecode.controllers.files
4 4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
5 5
6 6 Files controller for RhodeCode
7 7
8 8 :created_on: Apr 21, 2010
9 9 :author: marcink
10 10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 11 :license: GPLv3, see COPYING for more details.
12 12 """
13 13 # This program is free software: you can redistribute it and/or modify
14 14 # it under the terms of the GNU General Public License as published by
15 15 # the Free Software Foundation, either version 3 of the License, or
16 16 # (at your option) any later version.
17 17 #
18 18 # This program is distributed in the hope that it will be useful,
19 19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 21 # GNU General Public License for more details.
22 22 #
23 23 # You should have received a copy of the GNU General Public License
24 24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25 25
26 26 import os
27 27 import logging
28 import mimetypes
29 28 import traceback
30 29
30 from os.path import join as jn
31
31 32 from pylons import request, response, session, tmpl_context as c, url
32 33 from pylons.i18n.translation import _
33 34 from pylons.controllers.util import redirect
35 from pylons.decorators import jsonify
34 36
35 37 from vcs.backends import ARCHIVE_SPECS
36 38 from vcs.exceptions import RepositoryError, ChangesetDoesNotExistError, \
37 39 EmptyRepositoryError, ImproperArchiveTypeError, VCSError
38 40 from vcs.nodes import FileNode, NodeKind
39 41 from vcs.utils import diffs as differ
40 42
41 43 from rhodecode.lib import convert_line_endings, detect_mode, safe_str
42 44 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
43 45 from rhodecode.lib.base import BaseRepoController, render
44 46 from rhodecode.lib.utils import EmptyChangeset
45 47 import rhodecode.lib.helpers as h
46 48 from rhodecode.model.repo import RepoModel
47 49
48 50 log = logging.getLogger(__name__)
49 51
50 52
51 53 class FilesController(BaseRepoController):
52 54
53 55 @LoginRequired()
54 56 def __before__(self):
55 57 super(FilesController, self).__before__()
56 58 c.cut_off_limit = self.cut_off_limit
57 59
58 60 def __get_cs_or_redirect(self, rev, repo_name):
59 61 """
60 62 Safe way to get changeset if error occur it redirects to tip with
61 63 proper message
62 64
63 65 :param rev: revision to fetch
64 66 :param repo_name: repo name to redirect after
65 67 """
66 68
67 69 try:
68 70 return c.rhodecode_repo.get_changeset(rev)
69 71 except EmptyRepositoryError, e:
70 72 h.flash(_('There are no files yet'), category='warning')
71 73 redirect(h.url('summary_home', repo_name=repo_name))
72 74
73 75 except RepositoryError, e:
74 76 h.flash(str(e), category='warning')
75 77 redirect(h.url('files_home', repo_name=repo_name, revision='tip'))
76 78
77 79 def __get_filenode_or_redirect(self, repo_name, cs, path):
78 80 """
79 81 Returns file_node, if error occurs or given path is directory,
80 82 it'll redirect to top level path
81 83
82 84 :param repo_name: repo_name
83 85 :param cs: given changeset
84 86 :param path: path to lookup
85 87 """
86 88
87 89 try:
88 90 file_node = cs.get_node(path)
89 91 if file_node.is_dir():
90 92 raise RepositoryError('given path is a directory')
91 93 except RepositoryError, e:
92 94 h.flash(str(e), category='warning')
93 95 redirect(h.url('files_home', repo_name=repo_name,
94 96 revision=cs.raw_id))
95 97
96 98 return file_node
97 99
100
101 def __get_paths(self, changeset, starting_path):
102 """recursive walk in root dir and return a set of all path in that dir
103 based on repository walk function
104 """
105 _files = list()
106 _dirs = list()
107
108 try:
109 tip = changeset
110 for topnode, dirs, files in tip.walk(starting_path):
111 for f in files:
112 _files.append(f.path)
113 for d in dirs:
114 _dirs.append(d.path)
115 except RepositoryError, e:
116 log.debug(traceback.format_exc())
117 pass
118 return _dirs, _files
119
98 120 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
99 121 'repository.admin')
100 122 def index(self, repo_name, revision, f_path):
101 123 #reditect to given revision from form if given
102 124 post_revision = request.POST.get('at_rev', None)
103 125 if post_revision:
104 126 cs = self.__get_cs_or_redirect(post_revision, repo_name)
105 127 redirect(url('files_home', repo_name=c.repo_name,
106 128 revision=cs.raw_id, f_path=f_path))
107 129
108 130 c.changeset = self.__get_cs_or_redirect(revision, repo_name)
109 131 c.branch = request.GET.get('branch', None)
110 132 c.f_path = f_path
111 133
112 134 cur_rev = c.changeset.revision
113 135
114 136 #prev link
115 137 try:
116 138 prev_rev = c.rhodecode_repo.get_changeset(cur_rev).prev(c.branch)
117 139 c.url_prev = url('files_home', repo_name=c.repo_name,
118 140 revision=prev_rev.raw_id, f_path=f_path)
119 141 if c.branch:
120 142 c.url_prev += '?branch=%s' % c.branch
121 143 except (ChangesetDoesNotExistError, VCSError):
122 144 c.url_prev = '#'
123 145
124 146 #next link
125 147 try:
126 148 next_rev = c.rhodecode_repo.get_changeset(cur_rev).next(c.branch)
127 149 c.url_next = url('files_home', repo_name=c.repo_name,
128 150 revision=next_rev.raw_id, f_path=f_path)
129 151 if c.branch:
130 152 c.url_next += '?branch=%s' % c.branch
131 153 except (ChangesetDoesNotExistError, VCSError):
132 154 c.url_next = '#'
133 155
134 156 #files or dirs
135 157 try:
136 158 c.files_list = c.changeset.get_node(f_path)
137 159
138 160 if c.files_list.is_file():
139 161 c.file_history = self._get_node_history(c.changeset, f_path)
140 162 else:
141 163 c.file_history = []
142 164 except RepositoryError, e:
143 165 h.flash(str(e), category='warning')
144 166 redirect(h.url('files_home', repo_name=repo_name,
145 167 revision=revision))
146 168
147 169 return render('files/files.html')
148 170
149 171 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
150 172 'repository.admin')
151 173 def rawfile(self, repo_name, revision, f_path):
152 174 cs = self.__get_cs_or_redirect(revision, repo_name)
153 175 file_node = self.__get_filenode_or_redirect(repo_name, cs, f_path)
154 176
155 177 response.content_disposition = 'attachment; filename=%s' % \
156 178 safe_str(f_path.split(os.sep)[-1])
157 179
158 180 response.content_type = file_node.mimetype
159 181 return file_node.content
160 182
161 183 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
162 184 'repository.admin')
163 185 def raw(self, repo_name, revision, f_path):
164 186 cs = self.__get_cs_or_redirect(revision, repo_name)
165 187 file_node = self.__get_filenode_or_redirect(repo_name, cs, f_path)
166 188
167 189 raw_mimetype_mapping = {
168 190 # map original mimetype to a mimetype used for "show as raw"
169 191 # you can also provide a content-disposition to override the
170 192 # default "attachment" disposition.
171 193 # orig_type: (new_type, new_dispo)
172 194
173 195 # show images inline:
174 196 'image/x-icon': ('image/x-icon', 'inline'),
175 197 'image/png': ('image/png', 'inline'),
176 198 'image/gif': ('image/gif', 'inline'),
177 199 'image/jpeg': ('image/jpeg', 'inline'),
178 200 'image/svg+xml': ('image/svg+xml', 'inline'),
179 201 }
180 202
181 203 mimetype = file_node.mimetype
182 204 try:
183 205 mimetype, dispo = raw_mimetype_mapping[mimetype]
184 206 except KeyError:
185 207 # we don't know anything special about this, handle it safely
186 208 if file_node.is_binary:
187 209 # do same as download raw for binary files
188 210 mimetype, dispo = 'application/octet-stream', 'attachment'
189 211 else:
190 212 # do not just use the original mimetype, but force text/plain,
191 213 # otherwise it would serve text/html and that might be unsafe.
192 214 # Note: underlying vcs library fakes text/plain mimetype if the
193 215 # mimetype can not be determined and it thinks it is not
194 216 # binary.This might lead to erroneous text display in some
195 217 # cases, but helps in other cases, like with text files
196 218 # without extension.
197 219 mimetype, dispo = 'text/plain', 'inline'
198 220
199 221 if dispo == 'attachment':
200 222 dispo = 'attachment; filename=%s' % \
201 223 safe_str(f_path.split(os.sep)[-1])
202 224
203 225 response.content_disposition = dispo
204 226 response.content_type = mimetype
205 227 return file_node.content
206 228
207 229 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
208 230 'repository.admin')
209 231 def annotate(self, repo_name, revision, f_path):
210 232 c.cs = self.__get_cs_or_redirect(revision, repo_name)
211 233 c.file = self.__get_filenode_or_redirect(repo_name, c.cs, f_path)
212 234
213 235 c.file_history = self._get_node_history(c.cs, f_path)
214 236 c.f_path = f_path
215 237 return render('files/files_annotate.html')
216 238
217 239 @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin')
218 240 def edit(self, repo_name, revision, f_path):
219 241 r_post = request.POST
220 242
221 243 c.cs = self.__get_cs_or_redirect(revision, repo_name)
222 244 c.file = self.__get_filenode_or_redirect(repo_name, c.cs, f_path)
223 245
224 246 if c.file.is_binary:
225 247 return redirect(url('files_home', repo_name=c.repo_name,
226 248 revision=c.cs.raw_id, f_path=f_path))
227 249
228 250 c.file_history = self._get_node_history(c.cs, f_path)
229 251 c.f_path = f_path
230 252
231 253 if r_post:
232 254
233 255 old_content = c.file.content
234 256 sl = old_content.splitlines(1)
235 257 first_line = sl[0] if sl else ''
236 258 # modes: 0 - Unix, 1 - Mac, 2 - DOS
237 259 mode = detect_mode(first_line, 0)
238 260 content = convert_line_endings(r_post.get('content'), mode)
239 261
240 262 message = r_post.get('message') or (_('Edited %s via RhodeCode')
241 263 % (f_path))
242 264 author = self.rhodecode_user.full_contact
243 265
244 266 if content == old_content:
245 267 h.flash(_('No changes'),
246 268 category='warning')
247 269 return redirect(url('changeset_home', repo_name=c.repo_name,
248 270 revision='tip'))
249 271
250 272 try:
251 273 self.scm_model.commit_change(repo=c.rhodecode_repo,
252 274 repo_name=repo_name, cs=c.cs,
253 275 user=self.rhodecode_user,
254 276 author=author, message=message,
255 277 content=content, f_path=f_path)
256 278 h.flash(_('Successfully committed to %s' % f_path),
257 279 category='success')
258 280
259 281 except Exception:
260 282 log.error(traceback.format_exc())
261 283 h.flash(_('Error occurred during commit'), category='error')
262 284 return redirect(url('changeset_home',
263 285 repo_name=c.repo_name, revision='tip'))
264 286
265 287 return render('files/files_edit.html')
266 288
267 289 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
268 290 'repository.admin')
269 291 def archivefile(self, repo_name, fname):
270 292
271 293 fileformat = None
272 294 revision = None
273 295 ext = None
274 296 subrepos = request.GET.get('subrepos') == 'true'
275 297
276 298 for a_type, ext_data in ARCHIVE_SPECS.items():
277 299 archive_spec = fname.split(ext_data[1])
278 300 if len(archive_spec) == 2 and archive_spec[1] == '':
279 301 fileformat = a_type or ext_data[1]
280 302 revision = archive_spec[0]
281 303 ext = ext_data[1]
282 304
283 305 try:
284 306 dbrepo = RepoModel().get_by_repo_name(repo_name)
285 307 if dbrepo.enable_downloads is False:
286 308 return _('downloads disabled')
287 309
288 310 cs = c.rhodecode_repo.get_changeset(revision)
289 311 content_type = ARCHIVE_SPECS[fileformat][0]
290 312 except ChangesetDoesNotExistError:
291 313 return _('Unknown revision %s') % revision
292 314 except EmptyRepositoryError:
293 315 return _('Empty repository')
294 316 except (ImproperArchiveTypeError, KeyError):
295 317 return _('Unknown archive type')
296 318
297 319 response.content_type = content_type
298 320 response.content_disposition = 'attachment; filename=%s-%s%s' \
299 321 % (repo_name, revision, ext)
300 322
301 323 import tempfile
302 324 archive = tempfile.mkstemp()[1]
303 325 t = open(archive, 'wb')
304 326 cs.fill_archive(stream=t, kind=fileformat, subrepos=subrepos)
305 327
306 328 def get_chunked_archive(archive):
307 329 stream = open(archive, 'rb')
308 330 while True:
309 331 data = stream.read(4096)
310 332 if not data:
311 333 os.remove(archive)
312 334 break
313 335 yield data
314 336
315 337 return get_chunked_archive(archive)
316 338
317 339 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
318 340 'repository.admin')
319 341 def diff(self, repo_name, f_path):
320 342 diff1 = request.GET.get('diff1')
321 343 diff2 = request.GET.get('diff2')
322 344 c.action = request.GET.get('diff')
323 345 c.no_changes = diff1 == diff2
324 346 c.f_path = f_path
325 347 c.big_diff = False
326 348
327 349 try:
328 350 if diff1 not in ['', None, 'None', '0' * 12, '0' * 40]:
329 351 c.changeset_1 = c.rhodecode_repo.get_changeset(diff1)
330 352 node1 = c.changeset_1.get_node(f_path)
331 353 else:
332 354 c.changeset_1 = EmptyChangeset(repo=c.rhodecode_repo)
333 355 node1 = FileNode('.', '', changeset=c.changeset_1)
334 356
335 357 if diff2 not in ['', None, 'None', '0' * 12, '0' * 40]:
336 358 c.changeset_2 = c.rhodecode_repo.get_changeset(diff2)
337 359 node2 = c.changeset_2.get_node(f_path)
338 360 else:
339 361 c.changeset_2 = EmptyChangeset(repo=c.rhodecode_repo)
340 362 node2 = FileNode('.', '', changeset=c.changeset_2)
341 363 except RepositoryError:
342 364 return redirect(url('files_home',
343 365 repo_name=c.repo_name, f_path=f_path))
344 366
345 367 if c.action == 'download':
346 368 diff = differ.DiffProcessor(differ.get_gitdiff(node1, node2),
347 369 format='gitdiff')
348 370
349 371 diff_name = '%s_vs_%s.diff' % (diff1, diff2)
350 372 response.content_type = 'text/plain'
351 373 response.content_disposition = 'attachment; filename=%s' \
352 374 % diff_name
353 375 return diff.raw_diff()
354 376
355 377 elif c.action == 'raw':
356 378 diff = differ.DiffProcessor(differ.get_gitdiff(node1, node2),
357 379 format='gitdiff')
358 380 response.content_type = 'text/plain'
359 381 return diff.raw_diff()
360 382
361 383 elif c.action == 'diff':
362 384 if node1.is_binary or node2.is_binary:
363 385 c.cur_diff = _('Binary file')
364 386 elif node1.size > self.cut_off_limit or \
365 387 node2.size > self.cut_off_limit:
366 388 c.cur_diff = ''
367 389 c.big_diff = True
368 390 else:
369 391 diff = differ.DiffProcessor(differ.get_gitdiff(node1, node2),
370 392 format='gitdiff')
371 393 c.cur_diff = diff.as_html()
372 394 else:
373 395
374 396 #default option
375 397 if node1.is_binary or node2.is_binary:
376 398 c.cur_diff = _('Binary file')
377 399 elif node1.size > self.cut_off_limit or \
378 400 node2.size > self.cut_off_limit:
379 401 c.cur_diff = ''
380 402 c.big_diff = True
381 403
382 404 else:
383 405 diff = differ.DiffProcessor(differ.get_gitdiff(node1, node2),
384 406 format='gitdiff')
385 407 c.cur_diff = diff.as_html()
386 408
387 409 if not c.cur_diff and not c.big_diff:
388 410 c.no_changes = True
389 411 return render('files/file_diff.html')
390 412
391 413 def _get_node_history(self, cs, f_path):
392 414 changesets = cs.get_file_history(f_path)
393 415 hist_l = []
394 416
395 417 changesets_group = ([], _("Changesets"))
396 418 branches_group = ([], _("Branches"))
397 419 tags_group = ([], _("Tags"))
398 420
399 421 for chs in changesets:
400 422 n_desc = 'r%s:%s' % (chs.revision, chs.short_id)
401 423 changesets_group[0].append((chs.raw_id, n_desc,))
402 424
403 425 hist_l.append(changesets_group)
404 426
405 427 for name, chs in c.rhodecode_repo.branches.items():
406 428 #chs = chs.split(':')[-1]
407 429 branches_group[0].append((chs, name),)
408 430 hist_l.append(branches_group)
409 431
410 432 for name, chs in c.rhodecode_repo.tags.items():
411 433 #chs = chs.split(':')[-1]
412 434 tags_group[0].append((chs, name),)
413 435 hist_l.append(tags_group)
414 436
415 437 return hist_l
438
439 @jsonify
440 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
441 'repository.admin')
442 def nodelist(self, repo_name, revision, f_path):
443 if request.environ.get('HTTP_X_PARTIAL_XHR'):
444 cs = self.__get_cs_or_redirect(revision, repo_name)
445 _d, _f = self.__get_paths(cs, f_path)
446 return _d + _f
447
@@ -1,2721 +1,2744 b''
1 1 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td {
2 2 border:0;
3 3 outline:0;
4 4 font-size:100%;
5 5 vertical-align:baseline;
6 6 background:transparent;
7 7 margin:0;
8 8 padding:0;
9 9 }
10 10
11 11 body {
12 12 line-height:1;
13 13 height:100%;
14 14 background:url("../images/background.png") repeat scroll 0 0 #B0B0B0;
15 15 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
16 16 font-size:12px;
17 17 color:#000;
18 18 margin:0;
19 19 padding:0;
20 20 }
21 21
22 22 ol,ul {
23 23 list-style:none;
24 24 }
25 25
26 26 blockquote,q {
27 27 quotes:none;
28 28 }
29 29
30 30 blockquote:before,blockquote:after,q:before,q:after {
31 31 content:none;
32 32 }
33 33
34 34 :focus {
35 35 outline:0;
36 36 }
37 37
38 38 del {
39 39 text-decoration:line-through;
40 40 }
41 41
42 42 table {
43 43 border-collapse:collapse;
44 44 border-spacing:0;
45 45 }
46 46
47 47 html {
48 48 height:100%;
49 49 }
50 50
51 51 a {
52 52 color:#003367;
53 53 text-decoration:none;
54 54 cursor:pointer;
55 font-weight:700;
56 55 }
57 56
58 57 a:hover {
59 58 color:#316293;
60 59 text-decoration:underline;
61 60 }
62 61
63 62 h1,h2,h3,h4,h5,h6 {
64 63 color:#292929;
65 64 font-weight:700;
66 65 }
67 66
68 67 h1 {
69 68 font-size:22px;
70 69 }
71 70
72 71 h2 {
73 72 font-size:20px;
74 73 }
75 74
76 75 h3 {
77 76 font-size:18px;
78 77 }
79 78
80 79 h4 {
81 80 font-size:16px;
82 81 }
83 82
84 83 h5 {
85 84 font-size:14px;
86 85 }
87 86
88 87 h6 {
89 88 font-size:11px;
90 89 }
91 90
92 91 ul.circle {
93 92 list-style-type:circle;
94 93 }
95 94
96 95 ul.disc {
97 96 list-style-type:disc;
98 97 }
99 98
100 99 ul.square {
101 100 list-style-type:square;
102 101 }
103 102
104 103 ol.lower-roman {
105 104 list-style-type:lower-roman;
106 105 }
107 106
108 107 ol.upper-roman {
109 108 list-style-type:upper-roman;
110 109 }
111 110
112 111 ol.lower-alpha {
113 112 list-style-type:lower-alpha;
114 113 }
115 114
116 115 ol.upper-alpha {
117 116 list-style-type:upper-alpha;
118 117 }
119 118
120 119 ol.decimal {
121 120 list-style-type:decimal;
122 121 }
123 122
124 123 div.color {
125 124 clear:both;
126 125 overflow:hidden;
127 126 position:absolute;
128 127 background:#FFF;
129 128 margin:7px 0 0 60px;
130 129 padding:1px 1px 1px 0;
131 130 }
132 131
133 132 div.color a {
134 133 width:15px;
135 134 height:15px;
136 135 display:block;
137 136 float:left;
138 137 margin:0 0 0 1px;
139 138 padding:0;
140 139 }
141 140
142 141 div.options {
143 142 clear:both;
144 143 overflow:hidden;
145 144 position:absolute;
146 145 background:#FFF;
147 146 margin:7px 0 0 162px;
148 147 padding:0;
149 148 }
150 149
151 150 div.options a {
152 151 height:1%;
153 152 display:block;
154 153 text-decoration:none;
155 154 margin:0;
156 155 padding:3px 8px;
157 156 }
158 157
159 158 .top-left-rounded-corner {
160 159 -webkit-border-top-left-radius: 8px;
161 160 -khtml-border-radius-topleft: 8px;
162 161 -moz-border-radius-topleft: 8px;
163 162 border-top-left-radius: 8px;
164 163 }
165 164
166 165 .top-right-rounded-corner {
167 166 -webkit-border-top-right-radius: 8px;
168 167 -khtml-border-radius-topright: 8px;
169 168 -moz-border-radius-topright: 8px;
170 169 border-top-right-radius: 8px;
171 170 }
172 171
173 172 .bottom-left-rounded-corner {
174 173 -webkit-border-bottom-left-radius: 8px;
175 174 -khtml-border-radius-bottomleft: 8px;
176 175 -moz-border-radius-bottomleft: 8px;
177 176 border-bottom-left-radius: 8px;
178 177 }
179 178
180 179 .bottom-right-rounded-corner {
181 180 -webkit-border-bottom-right-radius: 8px;
182 181 -khtml-border-radius-bottomright: 8px;
183 182 -moz-border-radius-bottomright: 8px;
184 183 border-bottom-right-radius: 8px;
185 184 }
186 185
187 186
188 187 #header {
189 188 margin:0;
190 189 padding:0 10px;
191 190 }
192 191
193 192
194 193 #header ul#logged-user{
195 194 margin-bottom:5px !important;
196 195 -webkit-border-radius: 0px 0px 8px 8px;
197 196 -khtml-border-radius: 0px 0px 8px 8px;
198 197 -moz-border-radius: 0px 0px 8px 8px;
199 198 border-radius: 0px 0px 8px 8px;
200 199 height:37px;
201 200 background:url("../images/header_inner.png") repeat-x scroll 0 0 #003367;
202 201 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
203 202 }
204 203
205 204 #header ul#logged-user li {
206 205 list-style:none;
207 206 float:left;
208 207 margin:8px 0 0;
209 208 padding:4px 12px;
210 209 border-left: 1px solid #316293;
211 210 }
212 211
213 212 #header ul#logged-user li.first {
214 213 border-left:none;
215 214 margin:4px;
216 215 }
217 216
218 217 #header ul#logged-user li.first div.gravatar {
219 218 margin-top:-2px;
220 219 }
221 220
222 221 #header ul#logged-user li.first div.account {
223 222 padding-top:4px;
224 223 float:left;
225 224 }
226 225
227 226 #header ul#logged-user li.last {
228 227 border-right:none;
229 228 }
230 229
231 230 #header ul#logged-user li a {
232 231 color:#fff;
233 232 font-weight:700;
234 233 text-decoration:none;
235 234 }
236 235
237 236 #header ul#logged-user li a:hover {
238 237 text-decoration:underline;
239 238 }
240 239
241 240 #header ul#logged-user li.highlight a {
242 241 color:#fff;
243 242 }
244 243
245 244 #header ul#logged-user li.highlight a:hover {
246 245 color:#FFF;
247 246 }
248 247
249 248 #header #header-inner {
250 249 height:40px;
251 250 clear:both;
252 251 position:relative;
253 252 background:#003367 url("../images/header_inner.png") repeat-x;
254 253 border-bottom:2px solid #fff;
255 254 margin:0;
256 255 padding:0;
257 256 }
258 257
259 258 #header #header-inner #home a {
260 259 height:40px;
261 260 width:46px;
262 261 display:block;
263 262 background:url("../images/button_home.png");
264 263 background-position:0 0;
265 264 margin:0;
266 265 padding:0;
267 266 }
268 267
269 268 #header #header-inner #home a:hover {
270 269 background-position:0 -40px;
271 270 }
272 271
273 272 #header #header-inner #logo h1 {
274 273 color:#FFF;
275 274 font-size:18px;
276 275 margin:10px 0 0 13px;
277 276 padding:0;
278 277 }
279 278
280 279 #header #header-inner #logo a {
281 280 color:#fff;
282 281 text-decoration:none;
283 282 }
284 283
285 284 #header #header-inner #logo a:hover {
286 285 color:#bfe3ff;
287 286 }
288 287
289 288 #header #header-inner #quick,#header #header-inner #quick ul {
290 289 position:relative;
291 290 float:right;
292 291 list-style-type:none;
293 292 list-style-position:outside;
294 293 margin:10px 5px 0 0;
295 294 padding:0;
296 295 }
297 296
298 297 #header #header-inner #quick li {
299 298 position:relative;
300 299 float:left;
301 300 margin:0 5px 0 0;
302 301 padding:0;
303 302 }
304 303
305 304 #header #header-inner #quick li a {
306 305 top:0;
307 306 left:0;
308 307 height:1%;
309 308 display:block;
310 309 clear:both;
311 310 overflow:hidden;
312 311 color:#FFF;
313 312 font-weight:700;
314 313 text-decoration:none;
315 314 background:#369 url("../images/quick_l.png") no-repeat top left;
316 315 padding:0;
317 316 }
318 317
319 318 #header #header-inner #quick li span.short {
320 319 padding:9px 6px 8px 6px;
321 320 }
322 321
323 322 #header #header-inner #quick li span {
324 323 top:0;
325 324 right:0;
326 325 height:1%;
327 326 display:block;
328 327 float:left;
329 328 background:url("../images/quick_r.png") no-repeat top right;
330 329 border-left:1px solid #3f6f9f;
331 330 margin:0;
332 331 padding:10px 12px 8px 10px;
333 332 }
334 333
335 334 #header #header-inner #quick li span.normal {
336 335 border:none;
337 336 padding:10px 12px 8px;
338 337 }
339 338
340 339 #header #header-inner #quick li span.icon {
341 340 top:0;
342 341 left:0;
343 342 border-left:none;
344 343 background:url("../images/quick_l.png") no-repeat top left;
345 344 border-right:1px solid #2e5c89;
346 345 padding:8px 8px 4px;
347 346 }
348 347
349 348 #header #header-inner #quick li span.icon_short {
350 349 top:0;
351 350 left:0;
352 351 border-left:none;
353 352 background:url("../images/quick_l.png") no-repeat top left;
354 353 border-right:1px solid #2e5c89;
355 354 padding:9px 4px 4px;
356 355 }
357 356
358 357 #header #header-inner #quick li a:hover {
359 358 background:#4e4e4e url("../images/quick_l_selected.png") no-repeat top left;
360 359 }
361 360
362 361 #header #header-inner #quick li a:hover span {
363 362 border-left:1px solid #545454;
364 363 background:url("../images/quick_r_selected.png") no-repeat top right;
365 364 }
366 365
367 366 #header #header-inner #quick li a:hover span.icon,#header #header-inner #quick li a:hover span.icon_short {
368 367 border-left:none;
369 368 border-right:1px solid #464646;
370 369 background:url("../images/quick_l_selected.png") no-repeat top left;
371 370 }
372 371
373 372 #header #header-inner #quick ul {
374 373 top:29px;
375 374 right:0;
376 375 min-width:200px;
377 376 display:none;
378 377 position:absolute;
379 378 background:#FFF;
380 379 border:1px solid #666;
381 380 border-top:1px solid #003367;
382 381 z-index:100;
383 382 margin:0;
384 383 padding:0;
385 384 }
386 385
387 386 #header #header-inner #quick ul.repo_switcher {
388 387 max-height:275px;
389 388 overflow-x:hidden;
390 389 overflow-y:auto;
391 390 }
392 391 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
393 392 float:none;
394 393 margin:0;
395 394 border-bottom:2px solid #003367;
396 395 }
397 396
398 397
399 398 #header #header-inner #quick .repo_switcher_type{
400 399 position:absolute;
401 400 left:0;
402 401 top:9px;
403 402
404 403 }
405 404 #header #header-inner #quick li ul li {
406 405 border-bottom:1px solid #ddd;
407 406 }
408 407
409 408 #header #header-inner #quick li ul li a {
410 409 width:182px;
411 410 height:auto;
412 411 display:block;
413 412 float:left;
414 413 background:#FFF;
415 414 color:#003367;
416 415 font-weight:400;
417 416 margin:0;
418 417 padding:7px 9px;
419 418 }
420 419
421 420 #header #header-inner #quick li ul li a:hover {
422 421 color:#000;
423 422 background:#FFF;
424 423 }
425 424
426 425 #header #header-inner #quick ul ul {
427 426 top:auto;
428 427 }
429 428
430 429 #header #header-inner #quick li ul ul {
431 430 right:200px;
432 431 max-height:275px;
433 432 overflow:auto;
434 433 overflow-x:hidden;
435 434 white-space:normal;
436 435 }
437 436
438 437 #header #header-inner #quick li ul li a.journal,#header #header-inner #quick li ul li a.journal:hover {
439 438 background:url("../images/icons/book.png") no-repeat scroll 4px 9px #FFF;
440 439 width:167px;
441 440 margin:0;
442 441 padding:12px 9px 7px 24px;
443 442 }
444 443
445 444 #header #header-inner #quick li ul li a.private_repo,#header #header-inner #quick li ul li a.private_repo:hover {
446 445 background:url("../images/icons/lock.png") no-repeat scroll 4px 9px #FFF;
447 446 min-width:167px;
448 447 margin:0;
449 448 padding:12px 9px 7px 24px;
450 449 }
451 450
452 451 #header #header-inner #quick li ul li a.public_repo,#header #header-inner #quick li ul li a.public_repo:hover {
453 452 background:url("../images/icons/lock_open.png") no-repeat scroll 4px 9px #FFF;
454 453 min-width:167px;
455 454 margin:0;
456 455 padding:12px 9px 7px 24px;
457 456 }
458 457
459 458 #header #header-inner #quick li ul li a.hg,#header #header-inner #quick li ul li a.hg:hover {
460 459 background:url("../images/icons/hgicon.png") no-repeat scroll 4px 9px #FFF;
461 460 min-width:167px;
462 461 margin:0 0 0 14px;
463 462 padding:12px 9px 7px 24px;
464 463 }
465 464
466 465 #header #header-inner #quick li ul li a.git,#header #header-inner #quick li ul li a.git:hover {
467 466 background:url("../images/icons/giticon.png") no-repeat scroll 4px 9px #FFF;
468 467 min-width:167px;
469 468 margin:0 0 0 14px;
470 469 padding:12px 9px 7px 24px;
471 470 }
472 471
473 472 #header #header-inner #quick li ul li a.repos,#header #header-inner #quick li ul li a.repos:hover {
474 473 background:url("../images/icons/database_edit.png") no-repeat scroll 4px 9px #FFF;
475 474 width:167px;
476 475 margin:0;
477 476 padding:12px 9px 7px 24px;
478 477 }
479 478
480 479 #header #header-inner #quick li ul li a.repos_groups,#header #header-inner #quick li ul li a.repos_groups:hover {
481 480 background:url("../images/icons/database_link.png") no-repeat scroll 4px 9px #FFF;
482 481 width:167px;
483 482 margin:0;
484 483 padding:12px 9px 7px 24px;
485 484 }
486 485
487 486 #header #header-inner #quick li ul li a.users,#header #header-inner #quick li ul li a.users:hover {
488 487 background:#FFF url("../images/icons/user_edit.png") no-repeat 4px 9px;
489 488 width:167px;
490 489 margin:0;
491 490 padding:12px 9px 7px 24px;
492 491 }
493 492
494 493 #header #header-inner #quick li ul li a.groups,#header #header-inner #quick li ul li a.groups:hover {
495 494 background:#FFF url("../images/icons/group_edit.png") no-repeat 4px 9px;
496 495 width:167px;
497 496 margin:0;
498 497 padding:12px 9px 7px 24px;
499 498 }
500 499
501 500 #header #header-inner #quick li ul li a.settings,#header #header-inner #quick li ul li a.settings:hover {
502 501 background:#FFF url("../images/icons/cog.png") no-repeat 4px 9px;
503 502 width:167px;
504 503 margin:0;
505 504 padding:12px 9px 7px 24px;
506 505 }
507 506
508 507 #header #header-inner #quick li ul li a.permissions,#header #header-inner #quick li ul li a.permissions:hover {
509 508 background:#FFF url("../images/icons/key.png") no-repeat 4px 9px;
510 509 width:167px;
511 510 margin:0;
512 511 padding:12px 9px 7px 24px;
513 512 }
514 513
515 514 #header #header-inner #quick li ul li a.ldap,#header #header-inner #quick li ul li a.ldap:hover {
516 515 background:#FFF url("../images/icons/server_key.png") no-repeat 4px 9px;
517 516 width:167px;
518 517 margin:0;
519 518 padding:12px 9px 7px 24px;
520 519 }
521 520
522 521 #header #header-inner #quick li ul li a.fork,#header #header-inner #quick li ul li a.fork:hover {
523 522 background:#FFF url("../images/icons/arrow_divide.png") no-repeat 4px 9px;
524 523 width:167px;
525 524 margin:0;
526 525 padding:12px 9px 7px 24px;
527 526 }
528 527
529 528 #header #header-inner #quick li ul li a.search,#header #header-inner #quick li ul li a.search:hover {
530 529 background:#FFF url("../images/icons/search_16.png") no-repeat 4px 9px;
531 530 width:167px;
532 531 margin:0;
533 532 padding:12px 9px 7px 24px;
534 533 }
535 534
536 535 #header #header-inner #quick li ul li a.delete,#header #header-inner #quick li ul li a.delete:hover {
537 536 background:#FFF url("../images/icons/delete.png") no-repeat 4px 9px;
538 537 width:167px;
539 538 margin:0;
540 539 padding:12px 9px 7px 24px;
541 540 }
542 541
543 542 #header #header-inner #quick li ul li a.branches,#header #header-inner #quick li ul li a.branches:hover {
544 543 background:#FFF url("../images/icons/arrow_branch.png") no-repeat 4px 9px;
545 544 width:167px;
546 545 margin:0;
547 546 padding:12px 9px 7px 24px;
548 547 }
549 548
550 549 #header #header-inner #quick li ul li a.tags,#header #header-inner #quick li ul li a.tags:hover {
551 550 background:#FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
552 551 width:167px;
553 552 margin:0;
554 553 padding:12px 9px 7px 24px;
555 554 }
556 555
557 556 #header #header-inner #quick li ul li a.admin,#header #header-inner #quick li ul li a.admin:hover {
558 557 background:#FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
559 558 width:167px;
560 559 margin:0;
561 560 padding:12px 9px 7px 24px;
562 561 }
563 562
564 563
565 564 .quick_repo_menu{
566 565 background: #FFF url("../images/vertical-indicator.png") 8px 50% no-repeat !important;
567 566 cursor: pointer;
568 567 width: 8px;
569 568 }
570 569 .quick_repo_menu.active{
571 570 background: #FFF url("../images/horizontal-indicator.png") 4px 50% no-repeat !important;
572 571 cursor: pointer;
573 572 }
574 573 .quick_repo_menu .menu_items{
575 574 margin-top:6px;
576 575 width:150px;
577 576 position: absolute;
578 577 background-color:#FFF;
579 578 background: none repeat scroll 0 0 #FFFFFF;
580 579 border-color: #003367 #666666 #666666;
581 580 border-right: 1px solid #666666;
582 581 border-style: solid;
583 582 border-width: 1px;
584 583 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
585 584 }
586 585 .quick_repo_menu .menu_items li{
587 586 padding:0 !important;
588 587 }
589 588 .quick_repo_menu .menu_items a{
590 589 display: block;
591 590 padding: 4px 12px 4px 8px;
592 591 }
593 592 .quick_repo_menu .menu_items a:hover{
594 593 background-color: #EEE;
595 594 text-decoration: none;
596 595
597 596 }
598 597 .quick_repo_menu .menu_items .icon img{
599 598 margin-bottom:-2px;
600 599 }
601 600 .quick_repo_menu .menu_items.hidden{
602 601 display: none;
603 602 }
604 603
605 604 #content #left {
606 605 left:0;
607 606 width:280px;
608 607 position:absolute;
609 608 }
610 609
611 610 #content #right {
612 611 margin:0 60px 10px 290px;
613 612 }
614 613
615 614 #content div.box {
616 615 clear:both;
617 616 overflow:hidden;
618 617 background:#fff;
619 618 margin:0 0 10px;
620 619 padding:0 0 10px;
621 620 }
622 621
623 622 #content div.box-left {
624 623 width:49%;
625 624 clear:none;
626 625 float:left;
627 626 margin:0 0 10px;
628 627 }
629 628
630 629 #content div.box-right {
631 630 width:49%;
632 631 clear:none;
633 632 float:right;
634 633 margin:0 0 10px;
635 634 }
636 635
637 636 #content div.box div.title {
638 637 clear:both;
639 638 overflow:hidden;
640 639 background:#369 url("../images/header_inner.png") repeat-x;
641 640 margin:0 0 20px;
642 641 padding:0;
643 642 }
644 643
645 644 #content div.box div.title h5 {
646 645 float:left;
647 646 border:none;
648 647 color:#fff;
649 648 text-transform:uppercase;
650 649 margin:0;
651 650 padding:11px 0 11px 10px;
652 651 }
653 652
654 653 #content div.box div.title ul.links li {
655 654 list-style:none;
656 655 float:left;
657 656 margin:0;
658 657 padding:0;
659 658 }
660 659
661 660 #content div.box div.title ul.links li a {
662 661 border-left: 1px solid #316293;
663 662 color: #FFFFFF;
664 663 display: block;
665 664 float: left;
666 665 font-size: 13px;
667 666 font-weight: 700;
668 667 height: 1%;
669 668 margin: 0;
670 669 padding: 11px 22px 12px;
671 670 text-decoration: none;
672 671 }
673 672
674 673 #content div.box h1,#content div.box h2,#content div.box h3,#content div.box h4,#content div.box h5,#content div.box h6 {
675 674 clear:both;
676 675 overflow:hidden;
677 676 border-bottom:1px solid #DDD;
678 677 margin:10px 20px;
679 678 padding:0 0 15px;
680 679 }
681 680
682 681 #content div.box p {
683 682 color:#5f5f5f;
684 683 font-size:12px;
685 684 line-height:150%;
686 685 margin:0 24px 10px;
687 686 padding:0;
688 687 }
689 688
690 689 #content div.box blockquote {
691 690 border-left:4px solid #DDD;
692 691 color:#5f5f5f;
693 692 font-size:11px;
694 693 line-height:150%;
695 694 margin:0 34px;
696 695 padding:0 0 0 14px;
697 696 }
698 697
699 698 #content div.box blockquote p {
700 699 margin:10px 0;
701 700 padding:0;
702 701 }
703 702
704 703 #content div.box dl {
705 704 margin:10px 24px;
706 705 }
707 706
708 707 #content div.box dt {
709 708 font-size:12px;
710 709 margin:0;
711 710 }
712 711
713 712 #content div.box dd {
714 713 font-size:12px;
715 714 margin:0;
716 715 padding:8px 0 8px 15px;
717 716 }
718 717
719 718 #content div.box li {
720 719 font-size:12px;
721 720 padding:4px 0;
722 721 }
723 722
724 723 #content div.box ul.disc,#content div.box ul.circle {
725 724 margin:10px 24px 10px 38px;
726 725 }
727 726
728 727 #content div.box ul.square {
729 728 margin:10px 24px 10px 40px;
730 729 }
731 730
732 731 #content div.box img.left {
733 732 border:none;
734 733 float:left;
735 734 margin:10px 10px 10px 0;
736 735 }
737 736
738 737 #content div.box img.right {
739 738 border:none;
740 739 float:right;
741 740 margin:10px 0 10px 10px;
742 741 }
743 742
744 743 #content div.box div.messages {
745 744 clear:both;
746 745 overflow:hidden;
747 746 margin:0 20px;
748 747 padding:0;
749 748 }
750 749
751 750 #content div.box div.message {
752 751 clear:both;
753 752 overflow:hidden;
754 753 margin:0;
755 754 padding:10px 0;
756 755 }
757 756
758 757 #content div.box div.message a {
759 758 font-weight:400 !important;
760 759 }
761 760
762 761 #content div.box div.message div.image {
763 762 float:left;
764 763 margin:9px 0 0 5px;
765 764 padding:6px;
766 765 }
767 766
768 767 #content div.box div.message div.image img {
769 768 vertical-align:middle;
770 769 margin:0;
771 770 }
772 771
773 772 #content div.box div.message div.text {
774 773 float:left;
775 774 margin:0;
776 775 padding:9px 6px;
777 776 }
778 777
779 778 #content div.box div.message div.dismiss a {
780 779 height:16px;
781 780 width:16px;
782 781 display:block;
783 782 background:url("../images/icons/cross.png") no-repeat;
784 783 margin:15px 14px 0 0;
785 784 padding:0;
786 785 }
787 786
788 787 #content div.box div.message div.text h1,#content div.box div.message div.text h2,#content div.box div.message div.text h3,#content div.box div.message div.text h4,#content div.box div.message div.text h5,#content div.box div.message div.text h6 {
789 788 border:none;
790 789 margin:0;
791 790 padding:0;
792 791 }
793 792
794 793 #content div.box div.message div.text span {
795 794 height:1%;
796 795 display:block;
797 796 margin:0;
798 797 padding:5px 0 0;
799 798 }
800 799
801 800 #content div.box div.message-error {
802 801 height:1%;
803 802 clear:both;
804 803 overflow:hidden;
805 804 background:#FBE3E4;
806 805 border:1px solid #FBC2C4;
807 806 color:#860006;
808 807 }
809 808
810 809 #content div.box div.message-error h6 {
811 810 color:#860006;
812 811 }
813 812
814 813 #content div.box div.message-warning {
815 814 height:1%;
816 815 clear:both;
817 816 overflow:hidden;
818 817 background:#FFF6BF;
819 818 border:1px solid #FFD324;
820 819 color:#5f5200;
821 820 }
822 821
823 822 #content div.box div.message-warning h6 {
824 823 color:#5f5200;
825 824 }
826 825
827 826 #content div.box div.message-notice {
828 827 height:1%;
829 828 clear:both;
830 829 overflow:hidden;
831 830 background:#8FBDE0;
832 831 border:1px solid #6BACDE;
833 832 color:#003863;
834 833 }
835 834
836 835 #content div.box div.message-notice h6 {
837 836 color:#003863;
838 837 }
839 838
840 839 #content div.box div.message-success {
841 840 height:1%;
842 841 clear:both;
843 842 overflow:hidden;
844 843 background:#E6EFC2;
845 844 border:1px solid #C6D880;
846 845 color:#4e6100;
847 846 }
848 847
849 848 #content div.box div.message-success h6 {
850 849 color:#4e6100;
851 850 }
852 851
853 852 #content div.box div.form div.fields div.field {
854 853 height:1%;
855 854 border-bottom:1px solid #DDD;
856 855 clear:both;
857 856 margin:0;
858 857 padding:10px 0;
859 858 }
860 859
861 860 #content div.box div.form div.fields div.field-first {
862 861 padding:0 0 10px;
863 862 }
864 863
865 864 #content div.box div.form div.fields div.field-noborder {
866 865 border-bottom:0 !important;
867 866 }
868 867
869 868 #content div.box div.form div.fields div.field span.error-message {
870 869 height:1%;
871 870 display:inline-block;
872 871 color:red;
873 872 margin:8px 0 0 4px;
874 873 padding:0;
875 874 }
876 875
877 876 #content div.box div.form div.fields div.field span.success {
878 877 height:1%;
879 878 display:block;
880 879 color:#316309;
881 880 margin:8px 0 0;
882 881 padding:0;
883 882 }
884 883
885 884 #content div.box div.form div.fields div.field div.label {
886 885 left:70px;
887 886 width:auto;
888 887 position:absolute;
889 888 margin:0;
890 889 padding:8px 0 0 5px;
891 890 }
892 891
893 892 #content div.box-left div.form div.fields div.field div.label,#content div.box-right div.form div.fields div.field div.label {
894 893 clear:both;
895 894 overflow:hidden;
896 895 left:0;
897 896 width:auto;
898 897 position:relative;
899 898 margin:0;
900 899 padding:0 0 8px;
901 900 }
902 901
903 902 #content div.box div.form div.fields div.field div.label-select {
904 903 padding:5px 0 0 5px;
905 904 }
906 905
907 906 #content div.box-left div.form div.fields div.field div.label-select,#content div.box-right div.form div.fields div.field div.label-select {
908 907 padding:0 0 8px;
909 908 }
910 909
911 910 #content div.box-left div.form div.fields div.field div.label-textarea,#content div.box-right div.form div.fields div.field div.label-textarea {
912 911 padding:0 0 8px !important;
913 912 }
914 913
915 914 #content div.box div.form div.fields div.field div.label label, div.label label{
916 915 color:#393939;
917 916 font-weight:700;
918 917 }
919 918
920 919 #content div.box div.form div.fields div.field div.input {
921 920 margin:0 0 0 200px;
922 921 }
923 922 #content div.box-left div.form div.fields div.field div.input,#content div.box-right div.form div.fields div.field div.input {
924 923 margin:0 0 0 0px;
925 924 }
926 925
927 926 #content div.box div.form div.fields div.field div.input input {
928 927 background:#FFF;
929 928 border-top:1px solid #b3b3b3;
930 929 border-left:1px solid #b3b3b3;
931 930 border-right:1px solid #eaeaea;
932 931 border-bottom:1px solid #eaeaea;
933 932 color:#000;
934 933 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
935 934 font-size:11px;
936 935 margin:0;
937 936 padding:7px 7px 6px;
938 937 }
939 938
940 939
941 940
942 941 #content div.box div.form div.fields div.field div.input input.small {
943 942 width:30%;
944 943 }
945 944
946 945 #content div.box div.form div.fields div.field div.input input.medium {
947 946 width:55%;
948 947 }
949 948
950 949 #content div.box div.form div.fields div.field div.input input.large {
951 950 width:85%;
952 951 }
953 952
954 953 #content div.box div.form div.fields div.field div.input input.date {
955 954 width:177px;
956 955 }
957 956
958 957 #content div.box div.form div.fields div.field div.input input.button {
959 958 background:#D4D0C8;
960 959 border-top:1px solid #FFF;
961 960 border-left:1px solid #FFF;
962 961 border-right:1px solid #404040;
963 962 border-bottom:1px solid #404040;
964 963 color:#000;
965 964 margin:0;
966 965 padding:4px 8px;
967 966 }
968 967
969 968 #content div.box div.form div.fields div.field div.textarea {
970 969 border-top:1px solid #b3b3b3;
971 970 border-left:1px solid #b3b3b3;
972 971 border-right:1px solid #eaeaea;
973 972 border-bottom:1px solid #eaeaea;
974 973 margin:0 0 0 200px;
975 974 padding:10px;
976 975 }
977 976
978 977 #content div.box div.form div.fields div.field div.textarea-editor {
979 978 border:1px solid #ddd;
980 979 padding:0;
981 980 }
982 981
983 982 #content div.box div.form div.fields div.field div.textarea textarea {
984 983 width:100%;
985 984 height:220px;
986 985 overflow:hidden;
987 986 background:#FFF;
988 987 color:#000;
989 988 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
990 989 font-size:11px;
991 990 outline:none;
992 991 border-width:0;
993 992 margin:0;
994 993 padding:0;
995 994 }
996 995
997 996 #content div.box-left div.form div.fields div.field div.textarea textarea,#content div.box-right div.form div.fields div.field div.textarea textarea {
998 997 width:100%;
999 998 height:100px;
1000 999 }
1001 1000
1002 1001 #content div.box div.form div.fields div.field div.textarea table {
1003 1002 width:100%;
1004 1003 border:none;
1005 1004 margin:0;
1006 1005 padding:0;
1007 1006 }
1008 1007
1009 1008 #content div.box div.form div.fields div.field div.textarea table td {
1010 1009 background:#DDD;
1011 1010 border:none;
1012 1011 padding:0;
1013 1012 }
1014 1013
1015 1014 #content div.box div.form div.fields div.field div.textarea table td table {
1016 1015 width:auto;
1017 1016 border:none;
1018 1017 margin:0;
1019 1018 padding:0;
1020 1019 }
1021 1020
1022 1021 #content div.box div.form div.fields div.field div.textarea table td table td {
1023 1022 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
1024 1023 font-size:11px;
1025 1024 padding:5px 5px 5px 0;
1026 1025 }
1027 1026
1028 1027 #content div.box div.form div.fields div.field input[type=text]:focus,#content div.box div.form div.fields div.field input[type=password]:focus,#content div.box div.form div.fields div.field input[type=file]:focus,#content div.box div.form div.fields div.field textarea:focus,#content div.box div.form div.fields div.field select:focus {
1029 1028 background:#f6f6f6;
1030 1029 border-color:#666;
1031 1030 }
1032 1031
1033 1032 div.form div.fields div.field div.button {
1034 1033 margin:0;
1035 1034 padding:0 0 0 8px;
1036 1035 }
1037 1036
1038 1037 div.form div.fields div.field div.highlight .ui-button {
1039 1038 background:#4e85bb url("../images/button_highlight.png") repeat-x;
1040 1039 border-top:1px solid #5c91a4;
1041 1040 border-left:1px solid #2a6f89;
1042 1041 border-right:1px solid #2b7089;
1043 1042 border-bottom:1px solid #1a6480;
1044 1043 color:#FFF;
1045 1044 margin:0;
1046 1045 padding:6px 12px;
1047 1046 }
1048 1047
1049 1048 div.form div.fields div.field div.highlight .ui-state-hover {
1050 1049 background:#46a0c1 url("../images/button_highlight_selected.png") repeat-x;
1051 1050 border-top:1px solid #78acbf;
1052 1051 border-left:1px solid #34819e;
1053 1052 border-right:1px solid #35829f;
1054 1053 border-bottom:1px solid #257897;
1055 1054 color:#FFF;
1056 1055 margin:0;
1057 1056 padding:6px 12px;
1058 1057 }
1059 1058
1060 1059 #content div.box div.form div.fields div.buttons div.highlight input.ui-button {
1061 1060 background:#4e85bb url("../images/button_highlight.png") repeat-x;
1062 1061 border-top:1px solid #5c91a4;
1063 1062 border-left:1px solid #2a6f89;
1064 1063 border-right:1px solid #2b7089;
1065 1064 border-bottom:1px solid #1a6480;
1066 1065 color:#fff;
1067 1066 margin:0;
1068 1067 padding:6px 12px;
1069 1068 }
1070 1069
1071 1070 #content div.box div.form div.fields div.buttons div.highlight input.ui-state-hover {
1072 1071 background:#46a0c1 url("../images/button_highlight_selected.png") repeat-x;
1073 1072 border-top:1px solid #78acbf;
1074 1073 border-left:1px solid #34819e;
1075 1074 border-right:1px solid #35829f;
1076 1075 border-bottom:1px solid #257897;
1077 1076 color:#fff;
1078 1077 margin:0;
1079 1078 padding:6px 12px;
1080 1079 }
1081 1080
1082 1081 #content div.box table {
1083 1082 width:100%;
1084 1083 border-collapse:collapse;
1085 1084 margin:0;
1086 1085 padding:0;
1087 1086 }
1088 1087
1089 1088 #content div.box table th {
1090 1089 background:#eee;
1091 1090 border-bottom:1px solid #ddd;
1092 1091 padding:5px 0px 5px 5px;
1093 1092 }
1094 1093
1095 1094 #content div.box table th.left {
1096 1095 text-align:left;
1097 1096 }
1098 1097
1099 1098 #content div.box table th.right {
1100 1099 text-align:right;
1101 1100 }
1102 1101
1103 1102 #content div.box table th.center {
1104 1103 text-align:center;
1105 1104 }
1106 1105
1107 1106 #content div.box table th.selected {
1108 1107 vertical-align:middle;
1109 1108 padding:0;
1110 1109 }
1111 1110
1112 1111 #content div.box table td {
1113 1112 background:#fff;
1114 1113 border-bottom:1px solid #cdcdcd;
1115 1114 vertical-align:middle;
1116 1115 padding:5px;
1117 1116 }
1118 1117
1119 1118 #content div.box table tr.selected td {
1120 1119 background:#FFC;
1121 1120 }
1122 1121
1123 1122 #content div.box table td.selected {
1124 1123 width:3%;
1125 1124 text-align:center;
1126 1125 vertical-align:middle;
1127 1126 padding:0;
1128 1127 }
1129 1128
1130 1129 #content div.box table td.action {
1131 1130 width:45%;
1132 1131 text-align:left;
1133 1132 }
1134 1133
1135 1134 #content div.box table td.date {
1136 1135 width:33%;
1137 1136 text-align:center;
1138 1137 }
1139 1138
1140 1139 #content div.box div.action {
1141 1140 float:right;
1142 1141 background:#FFF;
1143 1142 text-align:right;
1144 1143 margin:10px 0 0;
1145 1144 padding:0;
1146 1145 }
1147 1146
1148 1147 #content div.box div.action select {
1149 1148 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
1150 1149 font-size:11px;
1151 1150 margin:0;
1152 1151 }
1153 1152
1154 1153 #content div.box div.action .ui-selectmenu {
1155 1154 margin:0;
1156 1155 padding:0;
1157 1156 }
1158 1157
1159 1158 #content div.box div.pagination {
1160 1159 height:1%;
1161 1160 clear:both;
1162 1161 overflow:hidden;
1163 1162 margin:10px 0 0;
1164 1163 padding:0;
1165 1164 }
1166 1165
1167 1166 #content div.box div.pagination ul.pager {
1168 1167 float:right;
1169 1168 text-align:right;
1170 1169 margin:0;
1171 1170 padding:0;
1172 1171 }
1173 1172
1174 1173 #content div.box div.pagination ul.pager li {
1175 1174 height:1%;
1176 1175 float:left;
1177 1176 list-style:none;
1178 1177 background:#ebebeb url("../images/pager.png") repeat-x;
1179 1178 border-top:1px solid #dedede;
1180 1179 border-left:1px solid #cfcfcf;
1181 1180 border-right:1px solid #c4c4c4;
1182 1181 border-bottom:1px solid #c4c4c4;
1183 1182 color:#4A4A4A;
1184 1183 font-weight:700;
1185 1184 margin:0 0 0 4px;
1186 1185 padding:0;
1187 1186 }
1188 1187
1189 1188 #content div.box div.pagination ul.pager li.separator {
1190 1189 padding:6px;
1191 1190 }
1192 1191
1193 1192 #content div.box div.pagination ul.pager li.current {
1194 1193 background:#b4b4b4 url("../images/pager_selected.png") repeat-x;
1195 1194 border-top:1px solid #ccc;
1196 1195 border-left:1px solid #bebebe;
1197 1196 border-right:1px solid #b1b1b1;
1198 1197 border-bottom:1px solid #afafaf;
1199 1198 color:#515151;
1200 1199 padding:6px;
1201 1200 }
1202 1201
1203 1202 #content div.box div.pagination ul.pager li a {
1204 1203 height:1%;
1205 1204 display:block;
1206 1205 float:left;
1207 1206 color:#515151;
1208 1207 text-decoration:none;
1209 1208 margin:0;
1210 1209 padding:6px;
1211 1210 }
1212 1211
1213 1212 #content div.box div.pagination ul.pager li a:hover,#content div.box div.pagination ul.pager li a:active {
1214 1213 background:#b4b4b4 url("../images/pager_selected.png") repeat-x;
1215 1214 border-top:1px solid #ccc;
1216 1215 border-left:1px solid #bebebe;
1217 1216 border-right:1px solid #b1b1b1;
1218 1217 border-bottom:1px solid #afafaf;
1219 1218 margin:-1px;
1220 1219 }
1221 1220
1222 1221 #content div.box div.pagination-wh {
1223 1222 height:1%;
1224 1223 clear:both;
1225 1224 overflow:hidden;
1226 1225 text-align:right;
1227 1226 margin:10px 0 0;
1228 1227 padding:0;
1229 1228 }
1230 1229
1231 1230 #content div.box div.pagination-right {
1232 1231 float:right;
1233 1232 }
1234 1233
1235 1234 #content div.box div.pagination-wh a,#content div.box div.pagination-wh span.pager_dotdot {
1236 1235 height:1%;
1237 1236 float:left;
1238 1237 background:#ebebeb url("../images/pager.png") repeat-x;
1239 1238 border-top:1px solid #dedede;
1240 1239 border-left:1px solid #cfcfcf;
1241 1240 border-right:1px solid #c4c4c4;
1242 1241 border-bottom:1px solid #c4c4c4;
1243 1242 color:#4A4A4A;
1244 1243 font-weight:700;
1245 1244 margin:0 0 0 4px;
1246 1245 padding:6px;
1247 1246 }
1248 1247
1249 1248 #content div.box div.pagination-wh span.pager_curpage {
1250 1249 height:1%;
1251 1250 float:left;
1252 1251 background:#b4b4b4 url("../images/pager_selected.png") repeat-x;
1253 1252 border-top:1px solid #ccc;
1254 1253 border-left:1px solid #bebebe;
1255 1254 border-right:1px solid #b1b1b1;
1256 1255 border-bottom:1px solid #afafaf;
1257 1256 color:#515151;
1258 1257 font-weight:700;
1259 1258 margin:0 0 0 4px;
1260 1259 padding:6px;
1261 1260 }
1262 1261
1263 1262 #content div.box div.pagination-wh a:hover,#content div.box div.pagination-wh a:active {
1264 1263 background:#b4b4b4 url("../images/pager_selected.png") repeat-x;
1265 1264 border-top:1px solid #ccc;
1266 1265 border-left:1px solid #bebebe;
1267 1266 border-right:1px solid #b1b1b1;
1268 1267 border-bottom:1px solid #afafaf;
1269 1268 text-decoration:none;
1270 1269 }
1271 1270
1272 1271 #content div.box div.traffic div.legend {
1273 1272 clear:both;
1274 1273 overflow:hidden;
1275 1274 border-bottom:1px solid #ddd;
1276 1275 margin:0 0 10px;
1277 1276 padding:0 0 10px;
1278 1277 }
1279 1278
1280 1279 #content div.box div.traffic div.legend h6 {
1281 1280 float:left;
1282 1281 border:none;
1283 1282 margin:0;
1284 1283 padding:0;
1285 1284 }
1286 1285
1287 1286 #content div.box div.traffic div.legend li {
1288 1287 list-style:none;
1289 1288 float:left;
1290 1289 font-size:11px;
1291 1290 margin:0;
1292 1291 padding:0 8px 0 4px;
1293 1292 }
1294 1293
1295 1294 #content div.box div.traffic div.legend li.visits {
1296 1295 border-left:12px solid #edc240;
1297 1296 }
1298 1297
1299 1298 #content div.box div.traffic div.legend li.pageviews {
1300 1299 border-left:12px solid #afd8f8;
1301 1300 }
1302 1301
1303 1302 #content div.box div.traffic table {
1304 1303 width:auto;
1305 1304 }
1306 1305
1307 1306 #content div.box div.traffic table td {
1308 1307 background:transparent;
1309 1308 border:none;
1310 1309 padding:2px 3px 3px;
1311 1310 }
1312 1311
1313 1312 #content div.box div.traffic table td.legendLabel {
1314 1313 padding:0 3px 2px;
1315 1314 }
1316 1315
1317 1316 #summary{
1318 1317
1319 1318 }
1320 1319
1321 1320 #summary .desc{
1322 1321 white-space: pre;
1323 1322 width: 100%;
1324 1323 }
1325 1324
1326 1325 #summary .repo_name{
1327 1326 font-size: 1.6em;
1328 1327 font-weight: bold;
1329 1328 vertical-align: baseline;
1330 1329 clear:right
1331 1330 }
1332 1331
1333 1332
1334 1333 #footer {
1335 1334 clear:both;
1336 1335 overflow:hidden;
1337 1336 text-align:right;
1338 1337 margin:0;
1339 1338 padding:0 10px 4px;
1340 1339 margin:-10px 0 0;
1341 1340 }
1342 1341
1343 1342 #footer div#footer-inner {
1344 1343 background:url("../images/header_inner.png") repeat-x scroll 0 0 #003367;
1345 1344 border-top:2px solid #FFFFFF;
1346 1345 }
1347 1346
1348 1347 #footer div#footer-inner p {
1349 1348 padding:15px 25px 15px 0;
1350 1349 color:#FFF;
1351 1350 font-weight:700;
1352 1351 }
1353 1352 #footer div#footer-inner .footer-link {
1354 1353 float:left;
1355 1354 padding-left:10px;
1356 1355 }
1357 1356 #footer div#footer-inner .footer-link a,#footer div#footer-inner .footer-link-right a {
1358 1357 color:#FFF;
1359 1358 }
1360 1359
1361 1360 #login div.title {
1362 1361 width:420px;
1363 1362 clear:both;
1364 1363 overflow:hidden;
1365 1364 position:relative;
1366 1365 background:#003367 url("../images/header_inner.png") repeat-x;
1367 1366 margin:0 auto;
1368 1367 padding:0;
1369 1368 }
1370 1369
1371 1370 #login div.inner {
1372 1371 width:380px;
1373 1372 background:#FFF url("../images/login.png") no-repeat top left;
1374 1373 border-top:none;
1375 1374 border-bottom:none;
1376 1375 margin:0 auto;
1377 1376 padding:20px;
1378 1377 }
1379 1378
1380 1379 #login div.form div.fields div.field div.label {
1381 1380 width:173px;
1382 1381 float:left;
1383 1382 text-align:right;
1384 1383 margin:2px 10px 0 0;
1385 1384 padding:5px 0 0 5px;
1386 1385 }
1387 1386
1388 1387 #login div.form div.fields div.field div.input input {
1389 1388 width:176px;
1390 1389 background:#FFF;
1391 1390 border-top:1px solid #b3b3b3;
1392 1391 border-left:1px solid #b3b3b3;
1393 1392 border-right:1px solid #eaeaea;
1394 1393 border-bottom:1px solid #eaeaea;
1395 1394 color:#000;
1396 1395 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
1397 1396 font-size:11px;
1398 1397 margin:0;
1399 1398 padding:7px 7px 6px;
1400 1399 }
1401 1400
1402 1401 #login div.form div.fields div.buttons {
1403 1402 clear:both;
1404 1403 overflow:hidden;
1405 1404 border-top:1px solid #DDD;
1406 1405 text-align:right;
1407 1406 margin:0;
1408 1407 padding:10px 0 0;
1409 1408 }
1410 1409
1411 1410 #login div.form div.links {
1412 1411 clear:both;
1413 1412 overflow:hidden;
1414 1413 margin:10px 0 0;
1415 1414 padding:0 0 2px;
1416 1415 }
1417 1416
1418 1417 #quick_login{
1419 1418 top: 31px;
1420 1419 background-color: rgb(0, 51, 103);
1421 1420 z-index: 999;
1422 1421 height: 150px;
1423 1422 position: absolute;
1424 1423 margin-left: -16px;
1425 1424 width: 281px;
1426 1425 border-radius: 0 0 8px 8px;
1427 1426 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1428 1427 }
1429 1428
1430 1429 #quick_login .password_forgoten{
1431 1430 padding-right:10px;
1432 1431 padding-top:10px;
1433 1432 float:left;
1434 1433 }
1435 1434
1436 1435 #quick_login div.form div.fields{
1437 1436 padding-top: 2px;
1438 1437 padding-left:10px;
1439 1438 }
1440 1439
1441 1440 #quick_login div.form div.fields div.field{
1442 1441 padding: 5px;
1443 1442 }
1444 1443
1445 1444 #quick_login div.form div.fields div.field div.label label{
1446 1445 color:#fff;
1447 1446 padding-bottom: 3px;
1448 1447 }
1449 1448
1450 1449 #quick_login div.form div.fields div.field div.input input {
1451 1450 width:236px;
1452 1451 background:#FFF;
1453 1452 border-top:1px solid #b3b3b3;
1454 1453 border-left:1px solid #b3b3b3;
1455 1454 border-right:1px solid #eaeaea;
1456 1455 border-bottom:1px solid #eaeaea;
1457 1456 color:#000;
1458 1457 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
1459 1458 font-size:11px;
1460 1459 margin:0;
1461 1460 padding:5px 7px 4px;
1462 1461 }
1463 1462
1464 1463 #quick_login div.form div.fields div.buttons {
1465 1464 clear:both;
1466 1465 overflow:hidden;
1467 1466 text-align:right;
1468 1467 margin:0;
1469 1468 padding:10px 14px 0;
1470 1469 }
1471 1470
1472 1471 #quick_login div.form div.fields div.buttons input.ui-button{
1473 1472 background:#e5e3e3 url("../images/button.png") repeat-x;
1474 1473 border-top:1px solid #DDD;
1475 1474 border-left:1px solid #c6c6c6;
1476 1475 border-right:1px solid #DDD;
1477 1476 border-bottom:1px solid #c6c6c6;
1478 1477 color:#515151;
1479 1478 margin:0;
1480 1479 padding:4px 10px;
1481 1480 }
1482 1481
1483 1482 #quick_login div.form div.links {
1484 1483 clear:both;
1485 1484 overflow:hidden;
1486 1485 margin:10px 0 0;
1487 1486 padding:0 0 2px;
1488 1487 }
1489 1488
1490 1489 #register div.title {
1491 1490 clear:both;
1492 1491 overflow:hidden;
1493 1492 position:relative;
1494 1493 background:#003367 url("../images/header_inner.png") repeat-x;
1495 1494 margin:0 auto;
1496 1495 padding:0;
1497 1496 }
1498 1497
1499 1498 #register div.inner {
1500 1499 background:#FFF;
1501 1500 border-top:none;
1502 1501 border-bottom:none;
1503 1502 margin:0 auto;
1504 1503 padding:20px;
1505 1504 }
1506 1505
1507 1506 #register div.form div.fields div.field div.label {
1508 1507 width:135px;
1509 1508 float:left;
1510 1509 text-align:right;
1511 1510 margin:2px 10px 0 0;
1512 1511 padding:5px 0 0 5px;
1513 1512 }
1514 1513
1515 1514 #register div.form div.fields div.field div.input input {
1516 1515 width:300px;
1517 1516 background:#FFF;
1518 1517 border-top:1px solid #b3b3b3;
1519 1518 border-left:1px solid #b3b3b3;
1520 1519 border-right:1px solid #eaeaea;
1521 1520 border-bottom:1px solid #eaeaea;
1522 1521 color:#000;
1523 1522 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
1524 1523 font-size:11px;
1525 1524 margin:0;
1526 1525 padding:7px 7px 6px;
1527 1526 }
1528 1527
1529 1528 #register div.form div.fields div.buttons {
1530 1529 clear:both;
1531 1530 overflow:hidden;
1532 1531 border-top:1px solid #DDD;
1533 1532 text-align:left;
1534 1533 margin:0;
1535 1534 padding:10px 0 0 150px;
1536 1535 }
1537 1536
1538 1537 #register div.form div.fields div.buttons div.highlight input.ui-button {
1539 1538 background:url("../images/button_highlight.png") repeat-x scroll 0 0 #4E85BB;
1540 1539 color:#FFF;
1541 1540 border-color:#5C91A4 #2B7089 #1A6480 #2A6F89;
1542 1541 border-style:solid;
1543 1542 border-width:1px;
1544 1543 }
1545 1544
1546 1545 #register div.form div.activation_msg {
1547 1546 padding-top:4px;
1548 1547 padding-bottom:4px;
1549 1548 }
1550 1549
1551 1550 #journal .journal_day{
1552 1551 font-size:20px;
1553 1552 padding:10px 0px;
1554 1553 border-bottom:2px solid #DDD;
1555 1554 margin-left:10px;
1556 1555 margin-right:10px;
1557 1556 }
1558 1557
1559 1558 #journal .journal_container{
1560 1559 padding:5px;
1561 1560 clear:both;
1562 1561 margin:0px 5px 0px 10px;
1563 1562 }
1564 1563
1565 1564 #journal .journal_action_container{
1566 1565 padding-left:38px;
1567 1566 }
1568 1567
1569 1568 #journal .journal_user{
1570 1569 color: #747474;
1571 1570 font-size: 14px;
1572 1571 font-weight: bold;
1573 1572 height: 30px;
1574 1573 }
1575 1574 #journal .journal_icon{
1576 1575 clear: both;
1577 1576 float: left;
1578 1577 padding-right: 4px;
1579 1578 padding-top: 3px;
1580 1579 }
1581 1580 #journal .journal_action{
1582 1581 padding-top:4px;
1583 1582 min-height:2px;
1584 1583 float:left
1585 1584 }
1586 1585 #journal .journal_action_params{
1587 1586 clear: left;
1588 1587 padding-left: 22px;
1589 1588 }
1590 1589 #journal .journal_repo{
1591 1590 float: left;
1592 1591 margin-left: 6px;
1593 1592 padding-top: 3px;
1594 1593 }
1595 1594 #journal .date{
1596 1595 clear: both;
1597 1596 color: #777777;
1598 1597 font-size: 11px;
1599 1598 padding-left: 22px;
1600 1599 }
1601 1600 #journal .journal_repo .journal_repo_name{
1602 1601 font-weight: bold;
1603 1602 font-size: 1.1em;
1604 1603 }
1605 1604 #journal .compare_view{
1606 1605 padding: 5px 0px 5px 0px;
1607 1606 width: 95px;
1608 1607 }
1609 1608 .journal_highlight{
1610 1609 font-weight: bold;
1611 1610 padding: 0 2px;
1612 1611 vertical-align: bottom;
1613 1612 }
1614 1613 .trending_language_tbl,.trending_language_tbl td {
1615 1614 border:0 !important;
1616 1615 margin:0 !important;
1617 1616 padding:0 !important;
1618 1617 }
1619 1618
1620 1619 .trending_language {
1621 1620 background-color:#003367;
1622 1621 color:#FFF;
1623 1622 display:block;
1624 1623 min-width:20px;
1625 1624 text-decoration:none;
1626 1625 height:12px;
1627 1626 margin-bottom:4px;
1628 1627 margin-left:5px;
1629 1628 white-space:pre;
1630 1629 padding:3px;
1631 1630 }
1632 1631
1633 1632 h3.files_location {
1634 1633 font-size:1.8em;
1635 1634 font-weight:700;
1636 1635 border-bottom:none !important;
1637 1636 margin:10px 0 !important;
1638 1637 }
1639 1638
1640 1639 #files_data dl dt {
1641 1640 float:left;
1642 1641 width:115px;
1643 1642 margin:0 !important;
1644 1643 padding:5px;
1645 1644 }
1646 1645
1647 1646 #files_data dl dd {
1648 1647 margin:0 !important;
1649 1648 padding:5px !important;
1650 1649 }
1651 1650
1652 1651 #changeset_content {
1653 1652 border:1px solid #CCC;
1654 1653 padding:5px;
1655 1654 }
1656 1655 #changeset_compare_view_content{
1657 1656 border:1px solid #CCC;
1658 1657 padding:5px;
1659 1658 }
1660 1659
1661 1660 #changeset_content .container {
1662 1661 min-height:120px;
1663 1662 font-size:1.2em;
1664 1663 overflow:hidden;
1665 1664 }
1666 1665
1667 1666 #changeset_compare_view_content .compare_view_commits{
1668 1667 width: auto !important;
1669 1668 }
1670 1669
1671 1670 #changeset_compare_view_content .compare_view_commits td{
1672 1671 padding:0px 0px 0px 12px !important;
1673 1672 }
1674 1673
1675 1674 #changeset_content .container .right {
1676 1675 float:right;
1677 1676 width:25%;
1678 1677 text-align:right;
1679 1678 }
1680 1679
1681 1680 #changeset_content .container .left .message {
1682 1681 font-style:italic;
1683 1682 color:#556CB5;
1684 1683 white-space:pre-wrap;
1685 1684 }
1686 1685
1687 1686 .cs_files .cur_cs{
1688 1687 margin:10px 2px;
1689 1688 font-weight: bold;
1690 1689 }
1691 1690
1692 1691 .cs_files .node{
1693 1692 float: left;
1694 1693 }
1695 1694 .cs_files .changes{
1696 1695 float: right;
1697 1696 }
1698 1697 .cs_files .changes .added{
1699 1698 background-color: #BBFFBB;
1700 1699 float: left;
1701 1700 text-align: center;
1702 1701 font-size: 90%;
1703 1702 }
1704 1703 .cs_files .changes .deleted{
1705 1704 background-color: #FF8888;
1706 1705 float: left;
1707 1706 text-align: center;
1708 1707 font-size: 90%;
1709 1708 }
1710 1709 .cs_files .cs_added {
1711 1710 background:url("../images/icons/page_white_add.png") no-repeat scroll 3px;
1712 1711 height:16px;
1713 1712 padding-left:20px;
1714 1713 margin-top:7px;
1715 1714 text-align:left;
1716 1715 }
1717 1716
1718 1717 .cs_files .cs_changed {
1719 1718 background:url("../images/icons/page_white_edit.png") no-repeat scroll 3px;
1720 1719 height:16px;
1721 1720 padding-left:20px;
1722 1721 margin-top:7px;
1723 1722 text-align:left;
1724 1723 }
1725 1724
1726 1725 .cs_files .cs_removed {
1727 1726 background:url("../images/icons/page_white_delete.png") no-repeat scroll 3px;
1728 1727 height:16px;
1729 1728 padding-left:20px;
1730 1729 margin-top:7px;
1731 1730 text-align:left;
1732 1731 }
1733 1732
1734 1733 #graph {
1735 1734 overflow:hidden;
1736 1735 }
1737 1736
1738 1737 #graph_nodes {
1739 1738 float:left;
1740 1739 margin-top:5px;
1741 1740 }
1742 1741
1743 1742 #graph_content {
1744 1743 width:800px;
1745 1744 float:left;
1746 1745
1747 1746 }
1748 1747
1749 1748 #graph_content .container_header {
1750 1749 border:1px solid #CCC;
1751 1750 padding:10px;
1752 1751 }
1753 1752 #graph_content #rev_range_container{
1754 1753 padding:10px 0px;
1755 1754 }
1756 1755 #graph_content .container {
1757 1756 border-bottom:1px solid #CCC;
1758 1757 border-left:1px solid #CCC;
1759 1758 border-right:1px solid #CCC;
1760 1759 min-height:80px;
1761 1760 overflow:hidden;
1762 1761 font-size:1.2em;
1763 1762 }
1764 1763
1765 1764 #graph_content .container .right {
1766 1765 float:right;
1767 1766 width:28%;
1768 1767 text-align:right;
1769 1768 padding-bottom:5px;
1770 1769 }
1771 1770
1772 1771 #graph_content .container .left .date {
1773 1772 font-weight:700;
1774 1773 padding-bottom:5px;
1775 1774 }
1776 1775 #graph_content .container .left .date span{
1777 1776 vertical-align: text-top;
1778 1777 }
1779 1778
1780 1779 #graph_content .container .left .message {
1781 1780 font-size:100%;
1782 1781 padding-top:3px;
1783 1782 white-space:pre-wrap;
1784 1783 }
1785 1784
1786 1785 .right div {
1787 1786 clear:both;
1788 1787 }
1789 1788
1790 1789 .right .changes .changed_total{
1791 1790 border:1px solid #DDD;
1792 1791 display:block;
1793 1792 float:right;
1794 1793 text-align:center;
1795 1794 min-width:45px;
1796 1795 cursor: pointer;
1797 1796 background:#FD8;
1798 1797 font-weight: bold;
1799 1798 }
1800 1799 .right .changes .added,.changed,.removed {
1801 1800 border:1px solid #DDD;
1802 1801 display:block;
1803 1802 float:right;
1804 1803 text-align:center;
1805 1804 min-width:15px;
1806 1805 cursor: help;
1807 1806 }
1808 1807 .right .changes .large {
1809 1808 border:1px solid #DDD;
1810 1809 display:block;
1811 1810 float:right;
1812 1811 text-align:center;
1813 1812 min-width:45px;
1814 1813 cursor: help;
1815 1814 background: #54A9F7;
1816 1815 }
1817 1816
1818 1817 .right .changes .added {
1819 1818 background:#BFB;
1820 1819 }
1821 1820
1822 1821 .right .changes .changed {
1823 1822 background:#FD8;
1824 1823 }
1825 1824
1826 1825 .right .changes .removed {
1827 1826 background:#F88;
1828 1827 }
1829 1828
1830 1829 .right .merge {
1831 1830 vertical-align:top;
1832 1831 font-size:0.75em;
1833 1832 font-weight:700;
1834 1833 }
1835 1834
1836 1835 .right .parent {
1837 1836 font-size:90%;
1838 1837 font-family:monospace;
1839 1838 }
1840 1839
1841 1840 .right .logtags .branchtag {
1842 1841 background:#FFF url("../images/icons/arrow_branch.png") no-repeat right 6px;
1843 1842 display:block;
1844 1843 font-size:0.8em;
1845 1844 padding:11px 16px 0 0;
1846 1845 }
1847 1846
1848 1847 .right .logtags .tagtag {
1849 1848 background:#FFF url("../images/icons/tag_blue.png") no-repeat right 6px;
1850 1849 display:block;
1851 1850 font-size:0.8em;
1852 1851 padding:11px 16px 0 0;
1853 1852 }
1854 1853
1855 1854 div.browserblock {
1856 1855 overflow:hidden;
1857 1856 border:1px solid #ccc;
1858 1857 background:#f8f8f8;
1859 1858 font-size:100%;
1860 1859 line-height:125%;
1861 1860 padding:0;
1862 1861 }
1863 1862
1864 1863 div.browserblock .browser-header {
1865 1864 background:#FFF;
1866 padding:10px 0px 25px 0px;
1865 padding:10px 0px 15px 0px;
1867 1866 width: 100%;
1868 1867 }
1869 1868 div.browserblock .browser-nav {
1870 1869 float:left
1871 1870 }
1872 1871
1873 1872 div.browserblock .browser-branch {
1874 1873 float:left;
1875 1874 }
1876 1875
1877 1876 div.browserblock .browser-branch label {
1878 1877 color:#4A4A4A;
1879 1878 vertical-align:text-top;
1880 1879 }
1881 1880
1882 1881 div.browserblock .browser-header span {
1883 1882 margin-left:5px;
1884 1883 font-weight:700;
1885 1884 }
1886 1885
1886 div.browserblock .browser-search{
1887 clear:both;
1888 padding:8px 8px 0px 5px;
1889 }
1890
1891 div.browserblock .search_activate #filter_activate{
1892 vertical-align: sub;
1893 border: 1px solid;
1894 padding:2px;
1895 border-radius: 4px 4px 4px 4px;
1896 background: url("../images/button.png") repeat-x scroll 0 0 #E5E3E3;
1897 border-color: #DDDDDD #DDDDDD #C6C6C6 #C6C6C6;
1898 color: #515151;
1899 }
1900
1901 div.browserblock .search_activate a:hover{
1902 text-decoration: none !important;
1903 }
1904
1887 1905 div.browserblock .browser-body {
1888 1906 background:#EEE;
1889 1907 border-top:1px solid #CCC;
1890 1908 }
1891 1909
1892 1910 table.code-browser {
1893 1911 border-collapse:collapse;
1894 1912 width:100%;
1895 1913 }
1896 1914
1897 1915 table.code-browser tr {
1898 1916 margin:3px;
1899 1917 }
1900 1918
1901 1919 table.code-browser thead th {
1902 1920 background-color:#EEE;
1903 1921 height:20px;
1904 1922 font-size:1.1em;
1905 1923 font-weight:700;
1906 1924 text-align:left;
1907 1925 padding-left:10px;
1908 1926 }
1909 1927
1910 1928 table.code-browser tbody td {
1911 1929 padding-left:10px;
1912 1930 height:20px;
1913 1931 }
1914 1932
1915 1933 table.code-browser .browser-file {
1916 1934 background:url("../images/icons/document_16.png") no-repeat scroll 3px;
1917 1935 height:16px;
1918 1936 padding-left:20px;
1919 1937 text-align:left;
1920 1938 }
1921 1939 .diffblock .changeset_file{
1922 1940 background:url("../images/icons/file.png") no-repeat scroll 3px;
1923 1941 height:16px;
1924 1942 padding-left:22px;
1925 1943 text-align:left;
1926 1944 font-size: 14px;
1927 1945 }
1928 1946
1929 1947 .diffblock .changeset_header{
1930 1948 margin-left: 6px !important;
1931 1949 }
1932 1950
1933 1951 table.code-browser .browser-dir {
1934 1952 background:url("../images/icons/folder_16.png") no-repeat scroll 3px;
1935 1953 height:16px;
1936 1954 padding-left:20px;
1937 1955 text-align:left;
1938 1956 }
1939 1957
1940 1958 .box .search {
1941 1959 clear:both;
1942 1960 overflow:hidden;
1943 1961 margin:0;
1944 1962 padding:0 20px 10px;
1945 1963 }
1946 1964
1947 1965 .box .search div.search_path {
1948 1966 background:none repeat scroll 0 0 #EEE;
1949 1967 border:1px solid #CCC;
1950 1968 color:blue;
1951 1969 margin-bottom:10px;
1952 1970 padding:10px 0;
1953 1971 }
1954 1972
1955 1973 .box .search div.search_path div.link {
1956 1974 font-weight:700;
1957 1975 margin-left:25px;
1958 1976 }
1959 1977
1960 1978 .box .search div.search_path div.link a {
1961 1979 color:#003367;
1962 1980 cursor:pointer;
1963 1981 text-decoration:none;
1964 1982 }
1965 1983
1966 1984 #path_unlock {
1967 1985 color:red;
1968 1986 font-size:1.2em;
1969 1987 padding-left:4px;
1970 1988 }
1971 1989
1972 1990 .info_box span {
1973 1991 margin-left:3px;
1974 1992 margin-right:3px;
1975 1993 }
1976 1994
1977 1995 .info_box .rev {
1978 1996 color: #003367;
1979 1997 font-size: 1.6em;
1980 1998 font-weight: bold;
1981 1999 vertical-align: sub;
1982 2000 }
1983 2001
1984 2002
1985 2003 .info_box input#at_rev,.info_box input#size {
1986 2004 background:#FFF;
1987 2005 border-top:1px solid #b3b3b3;
1988 2006 border-left:1px solid #b3b3b3;
1989 2007 border-right:1px solid #eaeaea;
1990 2008 border-bottom:1px solid #eaeaea;
1991 2009 color:#000;
1992 2010 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
1993 2011 font-size:12px;
1994 2012 margin:0;
1995 2013 padding:1px 5px 1px;
1996 2014 }
1997 2015
1998 2016 .info_box input#view {
1999 2017 text-align:center;
2000 2018 padding:4px 3px 2px 2px;
2001 2019 }
2002 2020
2003 2021 .yui-overlay,.yui-panel-container {
2004 2022 visibility:hidden;
2005 2023 position:absolute;
2006 2024 z-index:2;
2007 2025 }
2008 2026
2009 2027 .yui-tt {
2010 2028 visibility:hidden;
2011 2029 position:absolute;
2012 2030 color:#666;
2013 2031 background-color:#FFF;
2014 2032 font-family:arial, helvetica, verdana, sans-serif;
2015 2033 border:2px solid #003367;
2016 2034 font:100% sans-serif;
2017 2035 width:auto;
2018 2036 opacity:1px;
2019 2037 padding:8px;
2020 2038 white-space: pre-wrap;
2021 2039 -webkit-border-radius: 8px 8px 8px 8px;
2022 2040 -khtml-border-radius: 8px 8px 8px 8px;
2023 2041 -moz-border-radius: 8px 8px 8px 8px;
2024 2042 border-radius: 8px 8px 8px 8px;
2025 2043 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
2026 2044 }
2027 2045
2028 2046 .ac {
2029 2047 vertical-align:top;
2030 2048 }
2031 2049
2032 2050 .ac .yui-ac {
2033 2051 position:relative;
2034 2052 font-family:arial;
2035 2053 font-size:100%;
2036 2054 }
2037 2055
2038 2056 .ac .perm_ac {
2039 2057 width:15em;
2040 2058 }
2041 2059
2042 2060 .ac .yui-ac-input {
2043 2061 width:100%;
2044 2062 }
2045 2063
2046 2064 .ac .yui-ac-container {
2047 2065 position:absolute;
2048 2066 top:1.6em;
2049 2067 width:100%;
2050 2068 }
2051 2069
2052 2070 .ac .yui-ac-content {
2053 2071 position:absolute;
2054 2072 width:100%;
2055 2073 border:1px solid gray;
2056 2074 background:#fff;
2057 2075 overflow:hidden;
2058 2076 z-index:9050;
2059 2077 }
2060 2078
2061 2079 .ac .yui-ac-shadow {
2062 2080 position:absolute;
2063 2081 width:100%;
2064 2082 background:#000;
2065 2083 -moz-opacity:0.1px;
2066 2084 opacity:.10;
2067 2085 filter:alpha(opacity = 10);
2068 2086 z-index:9049;
2069 2087 margin:.3em;
2070 2088 }
2071 2089
2072 2090 .ac .yui-ac-content ul {
2073 2091 width:100%;
2074 2092 margin:0;
2075 2093 padding:0;
2076 2094 }
2077 2095
2078 2096 .ac .yui-ac-content li {
2079 2097 cursor:default;
2080 2098 white-space:nowrap;
2081 2099 margin:0;
2082 2100 padding:2px 5px;
2083 2101 }
2084 2102
2085 2103 .ac .yui-ac-content li.yui-ac-prehighlight {
2086 2104 background:#B3D4FF;
2087 2105 }
2088 2106
2089 2107 .ac .yui-ac-content li.yui-ac-highlight {
2090 2108 background:#556CB5;
2091 2109 color:#FFF;
2092 2110 }
2093 2111
2094 2112
2095 2113 .follow{
2096 2114 background:url("../images/icons/heart_add.png") no-repeat scroll 3px;
2097 2115 height: 16px;
2098 2116 width: 20px;
2099 2117 cursor: pointer;
2100 2118 display: block;
2101 2119 float: right;
2102 2120 margin-top: 2px;
2103 2121 }
2104 2122
2105 2123 .following{
2106 2124 background:url("../images/icons/heart_delete.png") no-repeat scroll 3px;
2107 2125 height: 16px;
2108 2126 width: 20px;
2109 2127 cursor: pointer;
2110 2128 display: block;
2111 2129 float: right;
2112 2130 margin-top: 2px;
2113 2131 }
2114 2132
2115 2133 .currently_following{
2116 2134 padding-left: 10px;
2117 2135 padding-bottom:5px;
2118 2136 }
2119 2137
2120 2138 .add_icon {
2121 2139 background:url("../images/icons/add.png") no-repeat scroll 3px;
2122 2140 padding-left:20px;
2123 2141 padding-top:0px;
2124 2142 text-align:left;
2125 2143 }
2126 2144
2127 2145 .edit_icon {
2128 2146 background:url("../images/icons/folder_edit.png") no-repeat scroll 3px;
2129 2147 padding-left:20px;
2130 2148 padding-top:0px;
2131 2149 text-align:left;
2132 2150 }
2133 2151
2134 2152 .delete_icon {
2135 2153 background:url("../images/icons/delete.png") no-repeat scroll 3px;
2136 2154 padding-left:20px;
2137 2155 padding-top:0px;
2138 2156 text-align:left;
2139 2157 }
2140 2158
2141 2159 .refresh_icon {
2142 2160 background:url("../images/icons/arrow_refresh.png") no-repeat scroll 3px;
2143 2161 padding-left:20px;
2144 2162 padding-top:0px;
2145 2163 text-align:left;
2146 2164 }
2147 2165
2148 2166 .pull_icon {
2149 2167 background:url("../images/icons/connect.png") no-repeat scroll 3px;
2150 2168 padding-left:20px;
2151 2169 padding-top:0px;
2152 2170 text-align:left;
2153 2171 }
2154 2172
2155 2173 .rss_icon {
2156 2174 background:url("../images/icons/rss_16.png") no-repeat scroll 3px;
2157 2175 padding-left:20px;
2158 2176 padding-top:0px;
2159 2177 text-align:left;
2160 2178 }
2161 2179
2162 2180 .atom_icon {
2163 2181 background:url("../images/icons/atom.png") no-repeat scroll 3px;
2164 2182 padding-left:20px;
2165 2183 padding-top:0px;
2166 2184 text-align:left;
2167 2185 }
2168 2186
2169 2187 .archive_icon {
2170 2188 background:url("../images/icons/compress.png") no-repeat scroll 3px;
2171 2189 padding-left:20px;
2172 2190 text-align:left;
2173 2191 padding-top:1px;
2174 2192 }
2175 2193
2176 2194 .start_following_icon {
2177 2195 background:url("../images/icons/heart_add.png") no-repeat scroll 3px;
2178 2196 padding-left:20px;
2179 2197 text-align:left;
2180 2198 padding-top:0px;
2181 2199 }
2182 2200
2183 2201 .stop_following_icon {
2184 2202 background:url("../images/icons/heart_delete.png") no-repeat scroll 3px;
2185 2203 padding-left:20px;
2186 2204 text-align:left;
2187 2205 padding-top:0px;
2188 2206 }
2189 2207
2190 2208 .action_button {
2191 2209 border:0;
2192 2210 display:inline;
2193 2211 }
2194 2212
2195 2213 .action_button:hover {
2196 2214 border:0;
2197 2215 text-decoration:underline;
2198 2216 cursor:pointer;
2199 2217 }
2200 2218
2201 2219 #switch_repos {
2202 2220 position:absolute;
2203 2221 height:25px;
2204 2222 z-index:1;
2205 2223 }
2206 2224
2207 2225 #switch_repos select {
2208 2226 min-width:150px;
2209 2227 max-height:250px;
2210 2228 z-index:1;
2211 2229 }
2212 2230
2213 2231 .breadcrumbs {
2214 2232 border:medium none;
2215 2233 color:#FFF;
2216 2234 float:left;
2217 2235 text-transform:uppercase;
2218 2236 font-weight:700;
2219 2237 font-size:14px;
2220 2238 margin:0;
2221 2239 padding:11px 0 11px 10px;
2222 2240 }
2223 2241
2224 2242 .breadcrumbs a {
2225 2243 color:#FFF;
2226 2244 }
2227 2245
2228 2246 .flash_msg ul {
2229 2247 margin:0;
2230 2248 padding:0 0 10px;
2231 2249 }
2232 2250
2233 2251 .error_msg {
2234 2252 background-color:#FFCFCF;
2235 2253 background-image:url("../images/icons/error_msg.png");
2236 2254 border:1px solid #FF9595;
2237 2255 color:#C30;
2238 2256 }
2239 2257
2240 2258 .warning_msg {
2241 2259 background-color:#FFFBCC;
2242 2260 background-image:url("../images/icons/warning_msg.png");
2243 2261 border:1px solid #FFF35E;
2244 2262 color:#C69E00;
2245 2263 }
2246 2264
2247 2265 .success_msg {
2248 2266 background-color:#D5FFCF;
2249 2267 background-image:url("../images/icons/success_msg.png");
2250 2268 border:1px solid #97FF88;
2251 2269 color:#090;
2252 2270 }
2253 2271
2254 2272 .notice_msg {
2255 2273 background-color:#DCE3FF;
2256 2274 background-image:url("../images/icons/notice_msg.png");
2257 2275 border:1px solid #93A8FF;
2258 2276 color:#556CB5;
2259 2277 }
2260 2278
2261 2279 .success_msg,.error_msg,.notice_msg,.warning_msg {
2262 2280 background-position:10px center;
2263 2281 background-repeat:no-repeat;
2264 2282 font-size:12px;
2265 2283 font-weight:700;
2266 2284 min-height:14px;
2267 2285 line-height:14px;
2268 2286 margin-bottom:0;
2269 2287 margin-top:0;
2270 2288 display:block;
2271 2289 overflow:auto;
2272 2290 padding:6px 10px 6px 40px;
2273 2291 }
2274 2292
2275 2293 #msg_close {
2276 2294 background:transparent url("../icons/cross_grey_small.png") no-repeat scroll 0 0;
2277 2295 cursor:pointer;
2278 2296 height:16px;
2279 2297 position:absolute;
2280 2298 right:5px;
2281 2299 top:5px;
2282 2300 width:16px;
2283 2301 }
2284 2302
2285 2303 div#legend_container table,div#legend_choices table {
2286 2304 width:auto !important;
2287 2305 }
2288 2306
2289 2307 table#permissions_manage {
2290 2308 width:0 !important;
2291 2309 }
2292 2310
2293 2311 table#permissions_manage span.private_repo_msg {
2294 2312 font-size:0.8em;
2295 2313 opacity:0.6px;
2296 2314 }
2297 2315
2298 2316 table#permissions_manage td.private_repo_msg {
2299 2317 font-size:0.8em;
2300 2318 }
2301 2319
2302 2320 table#permissions_manage tr#add_perm_input td {
2303 2321 vertical-align:middle;
2304 2322 }
2305 2323
2306 2324 div.gravatar {
2307 2325 background-color:#FFF;
2308 2326 border:1px solid #D0D0D0;
2309 2327 float:left;
2310 2328 margin-right:0.7em;
2311 2329 padding:2px 2px 0;
2312 2330 }
2313 2331
2314 2332 #header,#content,#footer {
2315 2333 min-width:978px;
2316 2334 }
2317 2335
2318 2336 #content {
2319 2337 min-height:100%;
2320 2338 clear:both;
2321 2339 overflow:hidden;
2322 2340 padding:14px 10px;
2323 2341 }
2324 2342
2325 2343 #content div.box div.title div.search {
2326 2344 background:url("../images/title_link.png") no-repeat top left;
2327 2345 border-left:1px solid #316293;
2328 2346 }
2329 2347
2330 2348 #content div.box div.title div.search div.input input {
2331 2349 border:1px solid #316293;
2332 2350 }
2333 2351
2334 2352 #content div.box div.title div.search div.button input.ui-button {
2335 2353 background:#4e85bb url("../images/button_highlight.png") repeat-x;
2336 2354 border:1px solid #316293;
2337 2355 border-left:none;
2338 2356 color:#FFF;
2339 2357 }
2340 2358
2341 2359 #content div.box input.ui-button-small {
2342 2360 background:#e5e3e3 url("../images/button.png") repeat-x;
2343 2361 border-top:1px solid #DDD;
2344 2362 border-left:1px solid #c6c6c6;
2345 2363 border-right:1px solid #DDD;
2346 2364 border-bottom:1px solid #c6c6c6;
2347 2365 color:#515151;
2348 2366 outline:none;
2349 2367 margin:0;
2350 2368 }
2351 2369
2352 2370 #content div.box input.ui-button-small-blue {
2353 2371 background:#4e85bb url("../images/button_highlight.png") repeat-x;
2354 2372 border-top:1px solid #5c91a4;
2355 2373 border-left:1px solid #2a6f89;
2356 2374 border-right:1px solid #2b7089;
2357 2375 border-bottom:1px solid #1a6480;
2358 2376 color:#fff;
2359 2377 }
2360 2378
2361 2379 #content div.box input.ui-button-small submit,button{
2362 2380 cursor: pointer;
2363 2381 }
2364 2382
2365 2383 #content div.box div.title div.search div.button input.ui-state-hover {
2366 2384 background:#46a0c1 url("../images/button_highlight_selected.png") repeat-x;
2367 2385 border:1px solid #316293;
2368 2386 border-left:none;
2369 2387 color:#FFF;
2370 2388 }
2371 2389
2372 2390 #content div.box div.form div.fields div.field div.highlight .ui-button {
2373 2391 background:#4e85bb url("../images/button_highlight.png") repeat-x;
2374 2392 border-top:1px solid #5c91a4;
2375 2393 border-left:1px solid #2a6f89;
2376 2394 border-right:1px solid #2b7089;
2377 2395 border-bottom:1px solid #1a6480;
2378 2396 color:#fff;
2379 2397 }
2380 2398
2381 2399 #content div.box div.form div.fields div.field div.highlight .ui-state-hover {
2382 2400 background:#46a0c1 url("../images/button_highlight_selected.png") repeat-x;
2383 2401 border-top:1px solid #78acbf;
2384 2402 border-left:1px solid #34819e;
2385 2403 border-right:1px solid #35829f;
2386 2404 border-bottom:1px solid #257897;
2387 2405 color:#fff;
2388 2406 }
2389 2407
2390 2408 ins,div.options a:hover {
2391 2409 text-decoration:none;
2392 2410 }
2393 2411
2394 2412 img,#header #header-inner #quick li a:hover span.normal,#header #header-inner #quick li ul li.last,#content div.box div.form div.fields div.field div.textarea table td table td a,#clone_url {
2395 2413 border:none;
2396 2414 }
2397 2415
2398 2416 img.icon,.right .merge img {
2399 2417 vertical-align:bottom;
2400 2418 }
2401 2419
2402 2420 #header ul#logged-user,#content div.box div.title ul.links,#content div.box div.message div.dismiss,#content div.box div.traffic div.legend ul {
2403 2421 float:right;
2404 2422 margin:0;
2405 2423 padding:0;
2406 2424 }
2407 2425
2408 2426 #header #header-inner #home,#header #header-inner #logo,#content div.box ul.left,#content div.box ol.left,#content div.box div.pagination-left,div#commit_history,div#legend_data,div#legend_container,div#legend_choices {
2409 2427 float:left;
2410 2428 }
2411 2429
2412 2430 #header #header-inner #quick li:hover ul ul,#header #header-inner #quick li:hover ul ul ul,#header #header-inner #quick li:hover ul ul ul ul,#content #left #menu ul.closed,#content #left #menu li ul.collapsed,.yui-tt-shadow {
2413 2431 display:none;
2414 2432 }
2415 2433
2416 2434 #header #header-inner #quick li:hover ul,#header #header-inner #quick li li:hover ul,#header #header-inner #quick li li li:hover ul,#header #header-inner #quick li li li li:hover ul,#content #left #menu ul.opened,#content #left #menu li ul.expanded {
2417 2435 display:block;
2418 2436 }
2419 2437
2420 2438 #content div.graph{
2421 2439 padding:0 10px 10px;
2422 2440 }
2423 2441
2424 2442 #content div.box div.title ul.links li a:hover,#content div.box div.title ul.links li.ui-tabs-selected a {
2425 2443 color:#bfe3ff;
2426 2444 }
2427 2445
2428 2446 #content div.box ol.lower-roman,#content div.box ol.upper-roman,#content div.box ol.lower-alpha,#content div.box ol.upper-alpha,#content div.box ol.decimal {
2429 2447 margin:10px 24px 10px 44px;
2430 2448 }
2431 2449
2432 2450 #content div.box div.form,#content div.box div.table,#content div.box div.traffic {
2433 2451 clear:both;
2434 2452 overflow:hidden;
2435 2453 margin:0;
2436 2454 padding:0 20px 10px;
2437 2455 }
2438 2456
2439 2457 #content div.box div.form div.fields,#login div.form,#login div.form div.fields,#register div.form,#register div.form div.fields {
2440 2458 clear:both;
2441 2459 overflow:hidden;
2442 2460 margin:0;
2443 2461 padding:0;
2444 2462 }
2445 2463
2446 2464 #content div.box div.form div.fields div.field div.label span,#login div.form div.fields div.field div.label span,#register div.form div.fields div.field div.label span {
2447 2465 height:1%;
2448 2466 display:block;
2449 2467 color:#363636;
2450 2468 margin:0;
2451 2469 padding:2px 0 0;
2452 2470 }
2453 2471
2454 2472 #content div.box div.form div.fields div.field div.input input.error,#login div.form div.fields div.field div.input input.error,#register div.form div.fields div.field div.input input.error {
2455 2473 background:#FBE3E4;
2456 2474 border-top:1px solid #e1b2b3;
2457 2475 border-left:1px solid #e1b2b3;
2458 2476 border-right:1px solid #FBC2C4;
2459 2477 border-bottom:1px solid #FBC2C4;
2460 2478 }
2461 2479
2462 2480 #content div.box div.form div.fields div.field div.input input.success,#login div.form div.fields div.field div.input input.success,#register div.form div.fields div.field div.input input.success {
2463 2481 background:#E6EFC2;
2464 2482 border-top:1px solid #cebb98;
2465 2483 border-left:1px solid #cebb98;
2466 2484 border-right:1px solid #c6d880;
2467 2485 border-bottom:1px solid #c6d880;
2468 2486 }
2469 2487
2470 2488 #content div.box-left div.form div.fields div.field div.textarea,#content div.box-right div.form div.fields div.field div.textarea,#content div.box div.form div.fields div.field div.select select,#content div.box table th.selected input,#content div.box table td.selected input {
2471 2489 margin:0;
2472 2490 }
2473 2491
2474 2492 #content div.box-left div.form div.fields div.field div.select,#content div.box-left div.form div.fields div.field div.checkboxes,#content div.box-left div.form div.fields div.field div.radios,#content div.box-right div.form div.fields div.field div.select,#content div.box-right div.form div.fields div.field div.checkboxes,#content div.box-right div.form div.fields div.field div.radios{
2475 2493 margin:0 0 0 0px !important;
2476 2494 padding:0;
2477 2495 }
2478 2496
2479 2497 #content div.box div.form div.fields div.field div.select,#content div.box div.form div.fields div.field div.checkboxes,#content div.box div.form div.fields div.field div.radios {
2480 2498 margin:0 0 0 200px;
2481 2499 padding:0;
2482 2500 }
2483 2501
2484 2502
2485 2503 #content div.box div.form div.fields div.field div.select a:hover,#content div.box div.form div.fields div.field div.select a.ui-selectmenu:hover,#content div.box div.action a:hover {
2486 2504 color:#000;
2487 2505 text-decoration:none;
2488 2506 }
2489 2507
2490 2508 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus,#content div.box div.action a.ui-selectmenu-focus {
2491 2509 border:1px solid #666;
2492 2510 }
2493 2511
2494 2512 #content div.box div.form div.fields div.field div.checkboxes div.checkbox,#content div.box div.form div.fields div.field div.radios div.radio {
2495 2513 clear:both;
2496 2514 overflow:hidden;
2497 2515 margin:0;
2498 2516 padding:8px 0 2px;
2499 2517 }
2500 2518
2501 2519 #content div.box div.form div.fields div.field div.checkboxes div.checkbox input,#content div.box div.form div.fields div.field div.radios div.radio input {
2502 2520 float:left;
2503 2521 margin:0;
2504 2522 }
2505 2523
2506 2524 #content div.box div.form div.fields div.field div.checkboxes div.checkbox label,#content div.box div.form div.fields div.field div.radios div.radio label {
2507 2525 height:1%;
2508 2526 display:block;
2509 2527 float:left;
2510 2528 margin:2px 0 0 4px;
2511 2529 }
2512 2530
2513 2531 div.form div.fields div.field div.button input,#content div.box div.form div.fields div.buttons input,div.form div.fields div.buttons input,#content div.box div.action div.button input {
2514 2532 color:#000;
2515 2533 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
2516 2534 font-size:11px;
2517 2535 font-weight:700;
2518 2536 margin:0;
2519 2537 }
2520 2538
2521 2539 div.form div.fields div.field div.button .ui-button,#content div.box div.form div.fields div.buttons input.ui-button {
2522 2540 background:#e5e3e3 url("../images/button.png") repeat-x;
2523 2541 border-top:1px solid #DDD;
2524 2542 border-left:1px solid #c6c6c6;
2525 2543 border-right:1px solid #DDD;
2526 2544 border-bottom:1px solid #c6c6c6;
2527 2545 color:#515151;
2528 2546 outline:none;
2529 2547 margin:0;
2530 2548 padding:6px 12px;
2531 2549 }
2532 2550
2533 2551 div.form div.fields div.field div.button .ui-state-hover,#content div.box div.form div.fields div.buttons input.ui-state-hover {
2534 2552 background:#b4b4b4 url("../images/button_selected.png") repeat-x;
2535 2553 border-top:1px solid #ccc;
2536 2554 border-left:1px solid #bebebe;
2537 2555 border-right:1px solid #b1b1b1;
2538 2556 border-bottom:1px solid #afafaf;
2539 2557 color:#515151;
2540 2558 outline:none;
2541 2559 margin:0;
2542 2560 padding:6px 12px;
2543 2561 }
2544 2562
2545 2563 div.form div.fields div.field div.highlight,#content div.box div.form div.fields div.buttons div.highlight {
2546 2564 display:inline;
2547 2565 }
2548 2566
2549 2567 #content div.box div.form div.fields div.buttons,div.form div.fields div.buttons {
2550 2568 margin:10px 0 0 200px;
2551 2569 padding:0;
2552 2570 }
2553 2571
2554 2572 #content div.box-left div.form div.fields div.buttons,#content div.box-right div.form div.fields div.buttons,div.box-left div.form div.fields div.buttons,div.box-right div.form div.fields div.buttons {
2555 2573 margin:10px 0 0;
2556 2574 }
2557 2575
2558 2576 #content div.box table td.user,#content div.box table td.address {
2559 2577 width:10%;
2560 2578 text-align:center;
2561 2579 }
2562 2580
2563 2581 #content div.box div.action div.button,#login div.form div.fields div.field div.input div.link,#register div.form div.fields div.field div.input div.link {
2564 2582 text-align:right;
2565 2583 margin:6px 0 0;
2566 2584 padding:0;
2567 2585 }
2568 2586
2569 2587 #content div.box div.action div.button input.ui-button,#login div.form div.fields div.buttons input.ui-button,#register div.form div.fields div.buttons input.ui-button {
2570 2588 background:#e5e3e3 url("../images/button.png") repeat-x;
2571 2589 border-top:1px solid #DDD;
2572 2590 border-left:1px solid #c6c6c6;
2573 2591 border-right:1px solid #DDD;
2574 2592 border-bottom:1px solid #c6c6c6;
2575 2593 color:#515151;
2576 2594 margin:0;
2577 2595 padding:6px 12px;
2578 2596 }
2579 2597
2580 2598 #content div.box div.action div.button input.ui-state-hover,#login div.form div.fields div.buttons input.ui-state-hover,#register div.form div.fields div.buttons input.ui-state-hover {
2581 2599 background:#b4b4b4 url("../images/button_selected.png") repeat-x;
2582 2600 border-top:1px solid #ccc;
2583 2601 border-left:1px solid #bebebe;
2584 2602 border-right:1px solid #b1b1b1;
2585 2603 border-bottom:1px solid #afafaf;
2586 2604 color:#515151;
2587 2605 margin:0;
2588 2606 padding:6px 12px;
2589 2607 }
2590 2608
2591 2609 #content div.box div.pagination div.results,#content div.box div.pagination-wh div.results {
2592 2610 text-align:left;
2593 2611 float:left;
2594 2612 margin:0;
2595 2613 padding:0;
2596 2614 }
2597 2615
2598 2616 #content div.box div.pagination div.results span,#content div.box div.pagination-wh div.results span {
2599 2617 height:1%;
2600 2618 display:block;
2601 2619 float:left;
2602 2620 background:#ebebeb url("../images/pager.png") repeat-x;
2603 2621 border-top:1px solid #dedede;
2604 2622 border-left:1px solid #cfcfcf;
2605 2623 border-right:1px solid #c4c4c4;
2606 2624 border-bottom:1px solid #c4c4c4;
2607 2625 color:#4A4A4A;
2608 2626 font-weight:700;
2609 2627 margin:0;
2610 2628 padding:6px 8px;
2611 2629 }
2612 2630
2613 2631 #content div.box div.pagination ul.pager li.disabled,#content div.box div.pagination-wh a.disabled {
2614 2632 color:#B4B4B4;
2615 2633 padding:6px;
2616 2634 }
2617 2635
2618 2636 #login,#register {
2619 2637 width:520px;
2620 2638 margin:10% auto 0;
2621 2639 padding:0;
2622 2640 }
2623 2641
2624 2642 #login div.color,#register div.color {
2625 2643 clear:both;
2626 2644 overflow:hidden;
2627 2645 background:#FFF;
2628 2646 margin:10px auto 0;
2629 2647 padding:3px 3px 3px 0;
2630 2648 }
2631 2649
2632 2650 #login div.color a,#register div.color a {
2633 2651 width:20px;
2634 2652 height:20px;
2635 2653 display:block;
2636 2654 float:left;
2637 2655 margin:0 0 0 3px;
2638 2656 padding:0;
2639 2657 }
2640 2658
2641 2659 #login div.title h5,#register div.title h5 {
2642 2660 color:#fff;
2643 2661 margin:10px;
2644 2662 padding:0;
2645 2663 }
2646 2664
2647 2665 #login div.form div.fields div.field,#register div.form div.fields div.field {
2648 2666 clear:both;
2649 2667 overflow:hidden;
2650 2668 margin:0;
2651 2669 padding:0 0 10px;
2652 2670 }
2653 2671
2654 2672 #login div.form div.fields div.field span.error-message,#register div.form div.fields div.field span.error-message {
2655 2673 height:1%;
2656 2674 display:block;
2657 2675 color:red;
2658 2676 margin:8px 0 0;
2659 2677 padding:0;
2660 2678 max-width: 320px;
2661 2679 }
2662 2680
2663 2681 #login div.form div.fields div.field div.label label,#register div.form div.fields div.field div.label label {
2664 2682 color:#000;
2665 2683 font-weight:700;
2666 2684 }
2667 2685
2668 2686 #login div.form div.fields div.field div.input,#register div.form div.fields div.field div.input {
2669 2687 float:left;
2670 2688 margin:0;
2671 2689 padding:0;
2672 2690 }
2673 2691
2674 2692 #login div.form div.fields div.field div.checkbox,#register div.form div.fields div.field div.checkbox {
2675 2693 margin:0 0 0 184px;
2676 2694 padding:0;
2677 2695 }
2678 2696
2679 2697 #login div.form div.fields div.field div.checkbox label,#register div.form div.fields div.field div.checkbox label {
2680 2698 color:#565656;
2681 2699 font-weight:700;
2682 2700 }
2683 2701
2684 2702 #login div.form div.fields div.buttons input,#register div.form div.fields div.buttons input {
2685 2703 color:#000;
2686 2704 font-size:1em;
2687 2705 font-weight:700;
2688 2706 font-family:Verdana, Helvetica, Sans-Serif;
2689 2707 margin:0;
2690 2708 }
2691 2709
2692 2710 #changeset_content .container .wrapper,#graph_content .container .wrapper {
2693 2711 width:600px;
2694 2712 }
2695 2713
2696 2714 #changeset_content .container .left,#graph_content .container .left {
2697 2715 float:left;
2698 2716 width:70%;
2699 2717 padding-left:5px;
2700 2718 }
2701 2719
2702 2720 #changeset_content .container .left .date,.ac .match {
2703 2721 font-weight:700;
2704 2722 padding-top: 5px;
2705 2723 padding-bottom:5px;
2706 2724 }
2707 2725
2708 2726 div#legend_container table td,div#legend_choices table td {
2709 2727 border:none !important;
2710 2728 height:20px !important;
2711 2729 padding:0 !important;
2712 2730 }
2713 2731
2714 2732 #q_filter{
2715 2733 border:0 none;
2716 2734 color:#AAAAAA;
2717 2735 margin-bottom:-4px;
2718 2736 margin-top:-4px;
2719 2737 padding-left:3px;
2720 2738 }
2721 2739
2740 #node_filter{
2741 border:0px solid #545454;
2742 color:#AAAAAA;
2743 padding-left:3px;
2744 }
@@ -1,102 +1,219 b''
1 1 <%def name="file_class(node)">
2 2 %if node.is_file():
3 3 <%return "browser-file" %>
4 4 %else:
5 5 <%return "browser-dir"%>
6 6 %endif
7 7 </%def>
8 8 <div id="body" class="browserblock">
9 9 <div class="browser-header">
10 10 <div class="browser-nav">
11 11 ${h.form(h.url.current())}
12 12 <div class="info_box">
13 13 <span class="rev">${_('view')}@rev</span>
14 14 <a class="rev" href="${c.url_prev}" title="${_('previous revision')}">&laquo;</a>
15 ${h.text('at_rev',value=c.changeset.revision,size=3)}
15 ${h.text('at_rev',value=c.changeset.revision,size=5)}
16 16 <a class="rev" href="${c.url_next}" title="${_('next revision')}">&raquo;</a>
17 17 ## ${h.submit('view',_('view'),class_="ui-button-small")}
18 18 </div>
19 19 ${h.end_form()}
20 20 </div>
21 21 <div class="browser-branch">
22 22 ${h.checkbox('stay_at_branch',c.changeset.branch,c.changeset.branch==c.branch)}
23 23 <label>${_('follow current branch')}</label>
24 <script type="text/javascript">
25 YUE.on('stay_at_branch','click',function(e){
26 if(e.target.checked){
27 var uri = "${h.url.current(branch='__BRANCH__')}"
28 uri = uri.replace('__BRANCH__',e.target.value);
29 window.location = uri;
30 }
31 else{
32 window.location = "${h.url.current()}";
33 }
34
35 })
36 </script>
37 24 </div>
25 <div class="browser-search">
26 <div class="search_activate">
27 <a id="filter_activate" href="#">${_('search file list')}</a>
28 </div>
29
30
31 <div>
32 <div id="node_filter_box_loading" style="display:none">${_('Loading file list...')}</div>
33 <div id="node_filter_box" style="display:none">
34 ${h.files_breadcrumbs(c.repo_name,c.changeset.raw_id,c.files_list.path)}/<input type="text" value="type to search..." name="filter" size="25" id="node_filter" autocomplete="off">
35
36 <script type="text/javascript">
37
38 YUE.on('stay_at_branch','click',function(e){
39 if(e.target.checked){
40 var uri = "${h.url.current(branch='__BRANCH__')}"
41 uri = uri.replace('__BRANCH__',e.target.value);
42 window.location = uri;
43 }
44 else{
45 window.location = "${h.url.current()}";
46 }
47
48 })
49
50 var n_filter = YUD.get('node_filter');
51 var F = YAHOO.namespace('node_filter');
52
53 var url = '${h.url("files_nodelist_home",repo_name="__REPO__",revision="__REVISION__",f_path="__FPATH__")}';
54 var node_url = '${h.url("files_home",repo_name="__REPO__",revision="__REVISION__",f_path="__FPATH__")}';
55
56 url = url.replace('__REPO__','${c.repo_name}');
57 url = url.replace('__REVISION__','${c.changeset.raw_id}');
58 url = url.replace('__FPATH__','${c.files_list.path}');
59
60 node_url = node_url.replace('__REPO__','${c.repo_name}');
61 node_url = node_url.replace('__REVISION__','${c.changeset.raw_id}');
62
63
64 F.filterTimeout = null;
65 var nodes = null;
66
67
68 F.initFilter = function(){
69 YUD.setStyle('node_filter_box_loading','display','');
70 YUD.setStyle('filter_activate','display','none');
71 YUC.initHeader('X-PARTIAL-XHR',true);
72 YUC.asyncRequest('GET',url,{
73 success:function(o){
74 nodes = JSON.parse(o.responseText);
75 YUD.setStyle('node_filter_box_loading','display','none');
76 YUD.setStyle('node_filter_box','display','');
77 },
78 failure:function(o){
79 console.log('failed to load');
80 }
81 },null);
82 }
83
84 F.updateFilter = function(e) {
85
86 return function(){
87 // Reset timeout
88 F.filterTimeout = null;
89 var query = e.target.value;
90 var match = [];
91 var matches = 0;
92 var matches_max = 20;
93 if (query != ""){
94 for(var i=0;i<nodes.length;i++){
95 var pos = nodes[i].toLowerCase().indexOf(query)
96 if(query && pos != -1){
97
98 matches++
99 //show only certain amount to not kill browser
100 if (matches > matches_max){
101 break;
102 }
103
104 var n = nodes[i];
105 var n_hl = n.substring(0,pos)
106 +"<b>{0}</b>".format(n.substring(pos,pos+query.length))
107 +n.substring(pos+query.length)
108 match.push('<tr><td><a class="browser-file" href="{0}">{1}</a></td><td colspan="5"></td></tr>'.format(node_url.replace('__FPATH__',n),n_hl));
109 }
110 if(match.length >= matches_max){
111 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format("${_('search truncated')}"));
112 }
113
114 }
115 }
116
117 if(query != ""){
118 YUD.setStyle('tbody','display','none');
119 YUD.setStyle('tbody_filtered','display','');
120
121 if (match.length==0){
122 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format("${_('no matching files')}"));
123 }
124
125 YUD.get('tbody_filtered').innerHTML = match.join("");
126 }
127 else{
128 YUD.setStyle('tbody','display','');
129 YUD.setStyle('tbody_filtered','display','none');
130 }
131
132 }
133 }
134
135
136 YUE.on(YUD.get('filter_activate'),'click',function(){
137 F.initFilter();
138 })
139 YUE.on(n_filter,'click',function(){
140 n_filter.value = '';
141 });
142 YUE.on(n_filter,'keyup',function(e){
143 clearTimeout(F.filterTimeout);
144 F.filterTimeout = setTimeout(F.updateFilter(e),600);
145 });
146 </script>
147
148 </div>
149 </div>
150 </div>
38 151 </div>
39 152
40 153 <div class="browser-body">
41 154 <table class="code-browser">
42 155 <thead>
43 156 <tr>
44 157 <th>${_('Name')}</th>
45 158 <th>${_('Size')}</th>
46 159 <th>${_('Mimetype')}</th>
47 160 <th>${_('Revision')}</th>
48 161 <th>${_('Last modified')}</th>
49 162 <th>${_('Last commiter')}</th>
50 163 </tr>
51 164 </thead>
52
165
166 <tbody id="tbody">
53 167 %if c.files_list.parent:
54 168 <tr class="parity0">
55 169 <td>
56 170 ${h.link_to('..',h.url('files_home',repo_name=c.repo_name,revision=c.changeset.raw_id,f_path=c.files_list.parent.path),class_="browser-dir")}
57 171 </td>
58 172 <td></td>
59 173 <td></td>
60 174 <td></td>
61 175 <td></td>
62 176 <td></td>
63 177 </tr>
64 178 %endif
65 179
66 180 %for cnt,node in enumerate(c.files_list):
67 181 <tr class="parity${cnt%2}">
68 182 <td>
69 183 ${h.link_to(node.name,h.url('files_home',repo_name=c.repo_name,revision=c.changeset.raw_id,f_path=h.safe_unicode(node.path)),class_=file_class(node))}
70 184 </td>
71 185 <td>
72 186 %if node.is_file():
73 187 ${h.format_byte_size(node.size,binary=True)}
74 188 %endif
75 189 </td>
76 190 <td>
77 191 %if node.is_file():
78 192 ${node.mimetype}
79 193 %endif
80 194 </td>
81 195 <td>
82 196 %if node.is_file():
83 197 <span class="tooltip" title="${node.last_changeset.raw_id}">
84 198 ${'r%s:%s' % (node.last_changeset.revision,node.last_changeset.short_id)}</span>
85 199 %endif
86 200 </td>
87 201 <td>
88 202 %if node.is_file():
89 203 <span class="tooltip" title="${node.last_changeset.date}">
90 204 ${h.age(node.last_changeset.date)}</span>
91 205 %endif
92 206 </td>
93 207 <td>
94 208 %if node.is_file():
95 209 ${node.last_changeset.author}
96 210 %endif
97 211 </td>
98 212 </tr>
99 213 %endfor
214 </tbody>
215 <tbody id="tbody_filtered" style="display:none">
216 </tbody>
100 217 </table>
101 218 </div>
102 219 </div> No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now