##// END OF EJS Templates
merge
marcink -
r656:36f83988 merge beta
parent child Browse files
Show More
@@ -1,542 +1,537
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 # Utilities for RhodeCode
4 4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
5 5 # This program is free software; you can redistribute it and/or
6 6 # modify it under the terms of the GNU General Public License
7 7 # as published by the Free Software Foundation; version 2
8 8 # of the License or (at your opinion) any later version of the license.
9 9 #
10 10 # This program is distributed in the hope that it will be useful,
11 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 13 # GNU General Public License for more details.
14 14 #
15 15 # You should have received a copy of the GNU General Public License
16 16 # along with this program; if not, write to the Free Software
17 17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18 18 # MA 02110-1301, USA.
19 19 """
20 20 Created on April 18, 2010
21 21 Utilities for RhodeCode
22 22 @author: marcink
23 23 """
24 24
25 25 from UserDict import DictMixin
26 26 from mercurial import ui, config, hg
27 27 from mercurial.error import RepoError
28 28 from rhodecode.model import meta
29 29 from rhodecode.model.caching_query import FromCache
30 30 from rhodecode.model.db import Repository, User, RhodeCodeUi, RhodeCodeSettings, \
31 31 UserLog
32 32 from rhodecode.model.repo import RepoModel
33 33 from rhodecode.model.user import UserModel
34 34 from vcs.backends.base import BaseChangeset
35 35 from vcs.backends.git import GitRepository
36 36 from vcs.backends.hg import MercurialRepository
37 37 from vcs.utils.lazy import LazyProperty
38 38 import traceback
39 39 import datetime
40 40 import logging
41 41 import os
42 42
43 43 log = logging.getLogger(__name__)
44 44
45 45
46 46 def get_repo_slug(request):
47 47 return request.environ['pylons.routes_dict'].get('repo_name')
48 48
49 49 def is_mercurial(environ):
50 50 """
51 51 Returns True if request's target is mercurial server - header
52 52 ``HTTP_ACCEPT`` of such request would start with ``application/mercurial``.
53 53 """
54 54 http_accept = environ.get('HTTP_ACCEPT')
55 55 if http_accept and http_accept.startswith('application/mercurial'):
56 56 return True
57 57 return False
58 58
59 59 def is_git(environ):
60 60 """
61 61 Returns True if request's target is git server. ``HTTP_USER_AGENT`` would
62 62 then have git client version given.
63 63
64 64 :param environ:
65 65 """
66 66 http_user_agent = environ.get('HTTP_USER_AGENT')
67 67 if http_user_agent.startswith('git'):
68 68 return True
69 69 return False
70 70
71 71 def action_logger(user, action, repo, ipaddr, sa=None):
72 72 """
73 73 Action logger for various action made by users
74 74 """
75 75
76 76 if not sa:
77 77 sa = meta.Session()
78 78
79 79 try:
80 80 if hasattr(user, 'user_id'):
81 81 user_obj = user
82 82 elif isinstance(user, basestring):
83 83 user_obj = UserModel(sa).get_by_username(user, cache=False)
84 84 else:
85 85 raise Exception('You have to provide user object or username')
86 86
87 87 repo_name = repo.lstrip('/')
88 88 user_log = UserLog()
89 89 user_log.user_id = user_obj.user_id
90 90 user_log.action = action
91 91 user_log.repository_name = repo_name
92 92 user_log.repository = RepoModel(sa).get(repo_name, cache=False)
93 93 user_log.action_date = datetime.datetime.now()
94 94 user_log.user_ip = ipaddr
95 95 sa.add(user_log)
96 96 sa.commit()
97 97
98 98 log.info('Adding user %s, action %s on %s',
99 99 user_obj.username, action, repo)
100 100 except:
101 101 log.error(traceback.format_exc())
102 102 sa.rollback()
103 103
104 104 def get_repos(path, recursive=False, initial=False):
105 105 """
106 106 Scans given path for repos and return (name,(type,path)) tuple
107 107 :param prefix:
108 108 :param path:
109 109 :param recursive:
110 110 :param initial:
111 111 """
112 112 from vcs.utils.helpers import get_scm
113 113 from vcs.exceptions import VCSError
114 114
115 115 try:
116 116 scm = get_scm(path)
117 117 except:
118 118 pass
119 119 else:
120 120 raise Exception('The given path %s should not be a repository got %s',
121 121 path, scm)
122 122
123 123 for dirpath in os.listdir(path):
124 124 try:
125 125 yield dirpath, get_scm(os.path.join(path, dirpath))
126 126 except VCSError:
127 127 pass
128 128
129 129 if __name__ == '__main__':
130 130 get_repos('', '/home/marcink/workspace-python')
131 131
132 132
133 133 def check_repo_fast(repo_name, base_path):
134 134 if os.path.isdir(os.path.join(base_path, repo_name)):return False
135 135 return True
136 136
137 137 def check_repo(repo_name, base_path, verify=True):
138 138
139 139 repo_path = os.path.join(base_path, repo_name)
140 140
141 141 try:
142 142 if not check_repo_fast(repo_name, base_path):
143 143 return False
144 144 r = hg.repository(ui.ui(), repo_path)
145 145 if verify:
146 146 hg.verify(r)
147 147 #here we hnow that repo exists it was verified
148 148 log.info('%s repo is already created', repo_name)
149 149 return False
150 150 except RepoError:
151 151 #it means that there is no valid repo there...
152 152 log.info('%s repo is free for creation', repo_name)
153 153 return True
154 154
155 155 def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
156 156 while True:
157 157 ok = raw_input(prompt)
158 158 if ok in ('y', 'ye', 'yes'): return True
159 159 if ok in ('n', 'no', 'nop', 'nope'): return False
160 160 retries = retries - 1
161 161 if retries < 0: raise IOError
162 162 print complaint
163 163
164 164 def get_hg_ui_cached():
165 165 try:
166 166 sa = meta.Session
167 167 ret = sa.query(RhodeCodeUi)\
168 168 .options(FromCache("sql_cache_short", "get_hg_ui_settings"))\
169 169 .all()
170 170 except:
171 171 pass
172 172 finally:
173 173 meta.Session.remove()
174 174 return ret
175 175
176 176
177 177 def get_hg_settings():
178 178 try:
179 179 sa = meta.Session()
180 180 ret = sa.query(RhodeCodeSettings)\
181 181 .options(FromCache("sql_cache_short", "get_hg_settings"))\
182 182 .all()
183 183 except:
184 184 pass
185 185 finally:
186 186 meta.Session.remove()
187 187
188 188 if not ret:
189 189 raise Exception('Could not get application settings !')
190 190 settings = {}
191 191 for each in ret:
192 192 settings['rhodecode_' + each.app_settings_name] = each.app_settings_value
193 193
194 194 return settings
195 195
196 196 def get_hg_ui_settings():
197 197 try:
198 198 sa = meta.Session()
199 199 ret = sa.query(RhodeCodeUi).all()
200 200 except:
201 201 pass
202 202 finally:
203 203 meta.Session.remove()
204 204
205 205 if not ret:
206 206 raise Exception('Could not get application ui settings !')
207 207 settings = {}
208 208 for each in ret:
209 209 k = each.ui_key
210 210 v = each.ui_value
211 211 if k == '/':
212 212 k = 'root_path'
213 213
214 214 if k.find('.') != -1:
215 215 k = k.replace('.', '_')
216 216
217 217 if each.ui_section == 'hooks':
218 218 v = each.ui_active
219 219
220 220 settings[each.ui_section + '_' + k] = v
221 221
222 222 return settings
223 223
224 224 #propagated from mercurial documentation
225 225 ui_sections = ['alias', 'auth',
226 226 'decode/encode', 'defaults',
227 227 'diff', 'email',
228 228 'extensions', 'format',
229 229 'merge-patterns', 'merge-tools',
230 230 'hooks', 'http_proxy',
231 231 'smtp', 'patch',
232 232 'paths', 'profiling',
233 233 'server', 'trusted',
234 234 'ui', 'web', ]
235 235
236 236 def make_ui(read_from='file', path=None, checkpaths=True):
237 237 """
238 238 A function that will read python rc files or database
239 239 and make an mercurial ui object from read options
240 240
241 241 :param path: path to mercurial config file
242 242 :param checkpaths: check the path
243 243 :param read_from: read from 'file' or 'db'
244 244 """
245 245
246 246 baseui = ui.ui()
247 247
248 248 if read_from == 'file':
249 249 if not os.path.isfile(path):
250 250 log.warning('Unable to read config file %s' % path)
251 251 return False
252 252 log.debug('reading hgrc from %s', path)
253 253 cfg = config.config()
254 254 cfg.read(path)
255 255 for section in ui_sections:
256 256 for k, v in cfg.items(section):
257 257 baseui.setconfig(section, k, v)
258 258 log.debug('settings ui from file[%s]%s:%s', section, k, v)
259 259
260 260 elif read_from == 'db':
261 261 hg_ui = get_hg_ui_cached()
262 262 for ui_ in hg_ui:
263 263 if ui_.ui_active:
264 264 log.debug('settings ui from db[%s]%s:%s', ui_.ui_section, ui_.ui_key, ui_.ui_value)
265 265 baseui.setconfig(ui_.ui_section, ui_.ui_key, ui_.ui_value)
266 266
267 267
268 268 return baseui
269 269
270 270
271 271 def set_rhodecode_config(config):
272 272 hgsettings = get_hg_settings()
273 273
274 274 for k, v in hgsettings.items():
275 275 config[k] = v
276 276
277 277 def invalidate_cache(name, *args):
278 278 """Invalidates given name cache"""
279 279
280 280 from beaker.cache import region_invalidate
281 281 log.info('INVALIDATING CACHE FOR %s', name)
282 282
283 283 """propagate our arguments to make sure invalidation works. First
284 284 argument has to be the name of cached func name give to cache decorator
285 285 without that the invalidation would not work"""
286 286 tmp = [name]
287 287 tmp.extend(args)
288 288 args = tuple(tmp)
289 289
290 290 if name == 'cached_repo_list':
291 291 from rhodecode.model.hg import _get_repos_cached
292 292 region_invalidate(_get_repos_cached, None, *args)
293 293
294 294 if name == 'full_changelog':
295 295 from rhodecode.model.hg import _full_changelog_cached
296 296 region_invalidate(_full_changelog_cached, None, *args)
297 297
298 298 class EmptyChangeset(BaseChangeset):
299 299 """
300 300 An dummy empty changeset. It's possible to pass hash when creating
301 301 an EmptyChangeset
302 302 """
303 303
304 304 def __init__(self, cs='0' * 40):
305 305 self._empty_cs = cs
306 306 self.revision = -1
307 307 self.message = ''
308 308 self.author = ''
309 309 self.date = ''
310 310
311 311 @LazyProperty
312 312 def raw_id(self):
313 313 """
314 314 Returns raw string identifying this changeset, useful for web
315 315 representation.
316 316 """
317 317 return self._empty_cs
318 318
319 319 @LazyProperty
320 320 def short_id(self):
321 321 return self.raw_id[:12]
322 322
323 323 def get_file_changeset(self, path):
324 324 return self
325 325
326 326 def get_file_content(self, path):
327 327 return u''
328 328
329 329 def get_file_size(self, path):
330 330 return 0
331 331
332 332 def repo2db_mapper(initial_repo_list, remove_obsolete=False):
333 333 """
334 334 maps all found repositories into db
335 335 """
336 336
337 337 sa = meta.Session()
338 338 rm = RepoModel(sa)
339 339 user = sa.query(User).filter(User.admin == True).first()
340 340
341 341 for name, repo in initial_repo_list.items():
342 342 if not rm.get(name, cache=False):
343 343 log.info('repository %s not found creating default', name)
344 344
345 if isinstance(repo, MercurialRepository):
346 repo_type = 'hg'
347 if isinstance(repo, GitRepository):
348 repo_type = 'git'
349
350 345 form_data = {
351 346 'repo_name':name,
352 'repo_type':repo_type,
347 'repo_type':repo.alias,
353 348 'description':repo.description if repo.description != 'unknown' else \
354 349 'auto description for %s' % name,
355 350 'private':False
356 351 }
357 352 rm.create(form_data, user, just_db=True)
358 353
359 354
360 355 if remove_obsolete:
361 356 #remove from database those repositories that are not in the filesystem
362 357 for repo in sa.query(Repository).all():
363 358 if repo.repo_name not in initial_repo_list.keys():
364 359 sa.delete(repo)
365 360 sa.commit()
366 361
367 362
368 363 meta.Session.remove()
369 364
370 365
371 366 class OrderedDict(dict, DictMixin):
372 367
373 368 def __init__(self, *args, **kwds):
374 369 if len(args) > 1:
375 370 raise TypeError('expected at most 1 arguments, got %d' % len(args))
376 371 try:
377 372 self.__end
378 373 except AttributeError:
379 374 self.clear()
380 375 self.update(*args, **kwds)
381 376
382 377 def clear(self):
383 378 self.__end = end = []
384 379 end += [None, end, end] # sentinel node for doubly linked list
385 380 self.__map = {} # key --> [key, prev, next]
386 381 dict.clear(self)
387 382
388 383 def __setitem__(self, key, value):
389 384 if key not in self:
390 385 end = self.__end
391 386 curr = end[1]
392 387 curr[2] = end[1] = self.__map[key] = [key, curr, end]
393 388 dict.__setitem__(self, key, value)
394 389
395 390 def __delitem__(self, key):
396 391 dict.__delitem__(self, key)
397 392 key, prev, next = self.__map.pop(key)
398 393 prev[2] = next
399 394 next[1] = prev
400 395
401 396 def __iter__(self):
402 397 end = self.__end
403 398 curr = end[2]
404 399 while curr is not end:
405 400 yield curr[0]
406 401 curr = curr[2]
407 402
408 403 def __reversed__(self):
409 404 end = self.__end
410 405 curr = end[1]
411 406 while curr is not end:
412 407 yield curr[0]
413 408 curr = curr[1]
414 409
415 410 def popitem(self, last=True):
416 411 if not self:
417 412 raise KeyError('dictionary is empty')
418 413 if last:
419 414 key = reversed(self).next()
420 415 else:
421 416 key = iter(self).next()
422 417 value = self.pop(key)
423 418 return key, value
424 419
425 420 def __reduce__(self):
426 421 items = [[k, self[k]] for k in self]
427 422 tmp = self.__map, self.__end
428 423 del self.__map, self.__end
429 424 inst_dict = vars(self).copy()
430 425 self.__map, self.__end = tmp
431 426 if inst_dict:
432 427 return (self.__class__, (items,), inst_dict)
433 428 return self.__class__, (items,)
434 429
435 430 def keys(self):
436 431 return list(self)
437 432
438 433 setdefault = DictMixin.setdefault
439 434 update = DictMixin.update
440 435 pop = DictMixin.pop
441 436 values = DictMixin.values
442 437 items = DictMixin.items
443 438 iterkeys = DictMixin.iterkeys
444 439 itervalues = DictMixin.itervalues
445 440 iteritems = DictMixin.iteritems
446 441
447 442 def __repr__(self):
448 443 if not self:
449 444 return '%s()' % (self.__class__.__name__,)
450 445 return '%s(%r)' % (self.__class__.__name__, self.items())
451 446
452 447 def copy(self):
453 448 return self.__class__(self)
454 449
455 450 @classmethod
456 451 def fromkeys(cls, iterable, value=None):
457 452 d = cls()
458 453 for key in iterable:
459 454 d[key] = value
460 455 return d
461 456
462 457 def __eq__(self, other):
463 458 if isinstance(other, OrderedDict):
464 459 return len(self) == len(other) and self.items() == other.items()
465 460 return dict.__eq__(self, other)
466 461
467 462 def __ne__(self, other):
468 463 return not self == other
469 464
470 465
471 466 #===============================================================================
472 467 # TEST FUNCTIONS AND CREATORS
473 468 #===============================================================================
474 469 def create_test_index(repo_location, full_index):
475 470 """Makes default test index
476 471 :param repo_location:
477 472 :param full_index:
478 473 """
479 474 from rhodecode.lib.indexers.daemon import WhooshIndexingDaemon
480 475 from rhodecode.lib.pidlock import DaemonLock, LockHeld
481 476 from rhodecode.lib.indexers import IDX_LOCATION
482 477 import shutil
483 478
484 479 if os.path.exists(IDX_LOCATION):
485 480 shutil.rmtree(IDX_LOCATION)
486 481
487 482 try:
488 483 l = DaemonLock()
489 484 WhooshIndexingDaemon(repo_location=repo_location)\
490 485 .run(full_index=full_index)
491 486 l.release()
492 487 except LockHeld:
493 488 pass
494 489
495 490 def create_test_env(repos_test_path, config):
496 491 """Makes a fresh database and
497 492 install test repository into tmp dir
498 493 """
499 494 from rhodecode.lib.db_manage import DbManage
500 495 import tarfile
501 496 import shutil
502 497 from os.path import dirname as dn, join as jn, abspath
503 498
504 499 log = logging.getLogger('TestEnvCreator')
505 500 # create logger
506 501 log.setLevel(logging.DEBUG)
507 502 log.propagate = True
508 503 # create console handler and set level to debug
509 504 ch = logging.StreamHandler()
510 505 ch.setLevel(logging.DEBUG)
511 506
512 507 # create formatter
513 508 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
514 509
515 510 # add formatter to ch
516 511 ch.setFormatter(formatter)
517 512
518 513 # add ch to logger
519 514 log.addHandler(ch)
520 515
521 516 #PART ONE create db
522 517 dbname = config['sqlalchemy.db1.url'].split('/')[-1]
523 518 log.debug('making test db %s', dbname)
524 519
525 520 dbmanage = DbManage(log_sql=True, dbname=dbname, root=config['here'],
526 521 tests=True)
527 522 dbmanage.create_tables(override=True)
528 523 dbmanage.config_prompt(repos_test_path)
529 524 dbmanage.create_default_user()
530 525 dbmanage.admin_prompt()
531 526 dbmanage.create_permissions()
532 527 dbmanage.populate_default_permissions()
533 528
534 529 #PART TWO make test repo
535 530 log.debug('making test vcs repo')
536 531 if os.path.isdir('/tmp/vcs_test'):
537 532 shutil.rmtree('/tmp/vcs_test')
538 533
539 534 cur_dir = dn(dn(abspath(__file__)))
540 535 tar = tarfile.open(jn(cur_dir, 'tests', "vcs_test.tar.gz"))
541 536 tar.extractall('/tmp')
542 537 tar.close()
@@ -1,209 +1,210
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 # model for handling repositories actions
4 4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
5 5 # This program is free software; you can redistribute it and/or
6 6 # modify it under the terms of the GNU General Public License
7 7 # as published by the Free Software Foundation; version 2
8 8 # of the License or (at your opinion) any later version of the license.
9 9 #
10 10 # This program is distributed in the hope that it will be useful,
11 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 13 # GNU General Public License for more details.
14 14 #
15 15 # You should have received a copy of the GNU General Public License
16 16 # along with this program; if not, write to the Free Software
17 17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18 18 # MA 02110-1301, USA.
19 19 """
20 20 Created on Jun 5, 2010
21 21 model for handling repositories actions
22 22 :author: marcink
23 23 """
24 24
25 25 from datetime import datetime
26 26 from pylons import app_globals as g
27 27 from rhodecode.model.db import Repository, RepoToPerm, User, Permission
28 28 from rhodecode.model.meta import Session
29 29 from rhodecode.model.user import UserModel
30 30 from rhodecode.model.caching_query import FromCache
31 31 import logging
32 32 import os
33 33 import shutil
34 34 import traceback
35 35 log = logging.getLogger(__name__)
36 36
37 37 class RepoModel(object):
38 38
39 39 def __init__(self, sa=None):
40 40 if not sa:
41 41 self.sa = Session()
42 42 else:
43 43 self.sa = sa
44 44
45 45 def get(self, repo_id, cache=False):
46 46 repo = self.sa.query(Repository)\
47 47 .filter(Repository.repo_name == repo_id)
48 48
49 49 if cache:
50 50 repo = repo.options(FromCache("sql_cache_short",
51 51 "get_repo_%s" % repo))
52 52 return repo.scalar()
53 53
54 54 def get_users_js(self):
55 55
56 56 users = self.sa.query(User).filter(User.active == True).all()
57 57 u_tmpl = '''{id:%s, fname:"%s", lname:"%s", nname:"%s"},'''
58 58 users_array = '[%s];' % '\n'.join([u_tmpl % (u.user_id, u.name,
59 59 u.lastname, u.username)
60 60 for u in users])
61 61 return users_array
62 62
63 63
64 64 def update(self, repo_name, form_data):
65 65 try:
66 66
67 67 #update permissions
68 68 for username, perm in form_data['perms_updates']:
69 69 r2p = self.sa.query(RepoToPerm)\
70 70 .filter(RepoToPerm.user == UserModel(self.sa).get_by_username(username, cache=False))\
71 71 .filter(RepoToPerm.repository == self.get(repo_name))\
72 72 .one()
73 73
74 74 r2p.permission_id = self.sa.query(Permission).filter(
75 75 Permission.permission_name ==
76 76 perm).one().permission_id
77 77 self.sa.add(r2p)
78 78
79 79 #set new permissions
80 80 for username, perm in form_data['perms_new']:
81 81 r2p = RepoToPerm()
82 82 r2p.repository = self.get(repo_name)
83 83 r2p.user = UserModel(self.sa).get_by_username(username, cache=False)
84 84
85 85 r2p.permission_id = self.sa.query(Permission).filter(
86 86 Permission.permission_name == perm)\
87 87 .one().permission_id
88 88 self.sa.add(r2p)
89 89
90 90 #update current repo
91 91 cur_repo = self.get(repo_name, cache=False)
92 92
93 93 for k, v in form_data.items():
94 94 if k == 'user':
95 95 cur_repo.user_id = v
96 96 else:
97 97 setattr(cur_repo, k, v)
98 98
99 99 self.sa.add(cur_repo)
100 100
101 101 if repo_name != form_data['repo_name']:
102 102 #rename our data
103 103 self.__rename_repo(repo_name, form_data['repo_name'])
104 104
105 105 self.sa.commit()
106 106 except:
107 107 log.error(traceback.format_exc())
108 108 self.sa.rollback()
109 109 raise
110 110
111 111 def create(self, form_data, cur_user, just_db=False, fork=False):
112 112 try:
113 113 if fork:
114 #force str since hg doesn't go with unicode
114 115 repo_name = str(form_data['fork_name'])
115 116 org_name = str(form_data['repo_name'])
116 117
117 118 else:
118 119 org_name = repo_name = str(form_data['repo_name'])
119 120 new_repo = Repository()
120 121 for k, v in form_data.items():
121 122 if k == 'repo_name':
122 123 v = repo_name
123 124 setattr(new_repo, k, v)
124 125
125 126 if fork:
126 127 parent_repo = self.sa.query(Repository)\
127 128 .filter(Repository.repo_name == org_name).scalar()
128 129 new_repo.fork = parent_repo
129 130
130 131 new_repo.user_id = cur_user.user_id
131 132 self.sa.add(new_repo)
132 133
133 134 #create default permission
134 135 repo_to_perm = RepoToPerm()
135 136 default = 'repository.read'
136 137 for p in UserModel(self.sa).get_by_username('default', cache=False).user_perms:
137 138 if p.permission.permission_name.startswith('repository.'):
138 139 default = p.permission.permission_name
139 140 break
140 141
141 142 default_perm = 'repository.none' if form_data['private'] else default
142 143
143 144 repo_to_perm.permission_id = self.sa.query(Permission)\
144 145 .filter(Permission.permission_name == default_perm)\
145 146 .one().permission_id
146 147
147 148 repo_to_perm.repository_id = new_repo.repo_id
148 149 repo_to_perm.user_id = UserModel(self.sa).get_by_username('default', cache=False).user_id
149 150
150 151 self.sa.add(repo_to_perm)
151 152 self.sa.commit()
152 153 if not just_db:
153 154 self.__create_repo(repo_name)
154 155 except:
155 156 log.error(traceback.format_exc())
156 157 self.sa.rollback()
157 158 raise
158 159
159 160 def create_fork(self, form_data, cur_user):
160 161 from rhodecode.lib.celerylib import tasks, run_task
161 162 run_task(tasks.create_repo_fork, form_data, cur_user)
162 163
163 164 def delete(self, repo):
164 165 try:
165 166 self.sa.delete(repo)
166 167 self.sa.commit()
167 168 self.__delete_repo(repo.repo_name)
168 169 except:
169 170 log.error(traceback.format_exc())
170 171 self.sa.rollback()
171 172 raise
172 173
173 174 def delete_perm_user(self, form_data, repo_name):
174 175 try:
175 176 self.sa.query(RepoToPerm)\
176 177 .filter(RepoToPerm.repository == self.get(repo_name))\
177 178 .filter(RepoToPerm.user_id == form_data['user_id']).delete()
178 179 self.sa.commit()
179 180 except:
180 181 log.error(traceback.format_exc())
181 182 self.sa.rollback()
182 183 raise
183 184
184 185 def __create_repo(self, repo_name):
185 186 from rhodecode.lib.utils import check_repo
186 187 repo_path = os.path.join(g.base_path, repo_name)
187 188 if check_repo(repo_name, g.base_path):
188 189 log.info('creating repo %s in %s', repo_name, repo_path)
189 190 from vcs.backends.hg import MercurialRepository
190 191 MercurialRepository(repo_path, create=True)
191 192
192 193 def __rename_repo(self, old, new):
193 194 log.info('renaming repo from %s to %s', old, new)
194 195
195 196 old_path = os.path.join(g.base_path, old)
196 197 new_path = os.path.join(g.base_path, new)
197 198 if os.path.isdir(new_path):
198 199 raise Exception('Was trying to rename to already existing dir %s',
199 200 new_path)
200 201 shutil.move(old_path, new_path)
201 202
202 203 def __delete_repo(self, name):
203 204 rm_path = os.path.join(g.base_path, name)
204 205 log.info("Removing %s", rm_path)
205 206 #disable hg
206 207 shutil.move(os.path.join(rm_path, '.hg'), os.path.join(rm_path, 'rm__.hg'))
207 208 #disable repo
208 209 shutil.move(rm_path, os.path.join(g.base_path, 'rm__%s__%s' \
209 210 % (datetime.today(), name)))
@@ -1,2321 +1,2323
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 55 font-weight:700;
56 56 }
57 57
58 58 a:hover {
59 59 color:#316293;
60 60 text-decoration:underline;
61 61 }
62 62
63 63 h1,h2,h3,h4,h5,h6 {
64 64 color:#292929;
65 65 font-weight:700;
66 66 }
67 67
68 68 h1 {
69 69 font-size:22px;
70 70 }
71 71
72 72 h2 {
73 73 font-size:20px;
74 74 }
75 75
76 76 h3 {
77 77 font-size:18px;
78 78 }
79 79
80 80 h4 {
81 81 font-size:16px;
82 82 }
83 83
84 84 h5 {
85 85 font-size:14px;
86 86 }
87 87
88 88 h6 {
89 89 font-size:11px;
90 90 }
91 91
92 92 ul.circle {
93 93 list-style-type:circle;
94 94 }
95 95
96 96 ul.disc {
97 97 list-style-type:disc;
98 98 }
99 99
100 100 ul.square {
101 101 list-style-type:square;
102 102 }
103 103
104 104 ol.lower-roman {
105 105 list-style-type:lower-roman;
106 106 }
107 107
108 108 ol.upper-roman {
109 109 list-style-type:upper-roman;
110 110 }
111 111
112 112 ol.lower-alpha {
113 113 list-style-type:lower-alpha;
114 114 }
115 115
116 116 ol.upper-alpha {
117 117 list-style-type:upper-alpha;
118 118 }
119 119
120 120 ol.decimal {
121 121 list-style-type:decimal;
122 122 }
123 123
124 124 div.color {
125 125 clear:both;
126 126 overflow:hidden;
127 127 position:absolute;
128 128 background:#FFF;
129 129 margin:7px 0 0 60px;
130 130 padding:1px 1px 1px 0;
131 131 }
132 132
133 133 div.color a {
134 134 width:15px;
135 135 height:15px;
136 136 display:block;
137 137 float:left;
138 138 margin:0 0 0 1px;
139 139 padding:0;
140 140 }
141 141
142 142 div.options {
143 143 clear:both;
144 144 overflow:hidden;
145 145 position:absolute;
146 146 background:#FFF;
147 147 margin:7px 0 0 162px;
148 148 padding:0;
149 149 }
150 150
151 151 div.options a {
152 152 height:1%;
153 153 display:block;
154 154 text-decoration:none;
155 155 margin:0;
156 156 padding:3px 8px;
157 157 }
158 158
159 159 .top-left-rounded-corner {
160 160 -webkit-border-top-left-radius: 8px;
161 161 -khtml-border-radius-topleft: 8px;
162 162 -moz-border-radius-topleft: 8px;
163 163 border-top-left-radius: 8px;
164 164 }
165 165
166 166 .top-right-rounded-corner {
167 167 -webkit-border-top-right-radius: 8px;
168 168 -khtml-border-radius-topright: 8px;
169 169 -moz-border-radius-topright: 8px;
170 170 border-top-right-radius: 8px;
171 171 }
172 172
173 173 .bottom-left-rounded-corner {
174 174 -webkit-border-bottom-left-radius: 8px;
175 175 -khtml-border-radius-bottomleft: 8px;
176 176 -moz-border-radius-bottomleft: 8px;
177 177 border-bottom-left-radius: 8px;
178 178 }
179 179
180 180 .bottom-right-rounded-corner {
181 181 -webkit-border-bottom-right-radius: 8px;
182 182 -khtml-border-radius-bottomright: 8px;
183 183 -moz-border-radius-bottomright: 8px;
184 184 border-bottom-right-radius: 8px;
185 185 }
186 186
187 187
188 188 #header {
189 189 margin:0;
190 190 padding:0 30px;
191 191 }
192 192
193 193 #header ul#logged-user li {
194 194 list-style:none;
195 195 float:left;
196 196 border-left:1px solid #bbb;
197 197 border-right:1px solid #a5a5a5;
198 198 margin:-2px 0 0;
199 199 padding:10px 12px;
200 200 }
201 201
202 202 #header ul#logged-user li.first {
203 203 border-left:none;
204 204 margin:-6px;
205 205 }
206 206
207 207 #header ul#logged-user li.first div.account {
208 208 padding-top:4px;
209 209 float:left;
210 210 }
211 211
212 212 #header ul#logged-user li.last {
213 213 border-right:none;
214 214 }
215 215
216 216 #header ul#logged-user li a {
217 217 color:#4e4e4e;
218 218 font-weight:700;
219 219 text-decoration:none;
220 220 }
221 221
222 222 #header ul#logged-user li a:hover {
223 223 color:#376ea6;
224 224 text-decoration:underline;
225 225 }
226 226
227 227 #header ul#logged-user li.highlight a {
228 228 color:#fff;
229 229 }
230 230
231 231 #header ul#logged-user li.highlight a:hover {
232 232 color:#376ea6;
233 233 }
234 234
235 235 #header #header-inner {
236 236 height:40px;
237 237 clear:both;
238 238 position:relative;
239 239 background:#003367 url("../images/header_inner.png") repeat-x;
240 240 border-bottom:2px solid #fff;
241 241 margin:0;
242 242 padding:0;
243 243 }
244 244
245 245 #header #header-inner #home a {
246 246 height:40px;
247 247 width:46px;
248 248 display:block;
249 249 background:url("../images/button_home.png");
250 250 background-position:0 0;
251 251 margin:0;
252 252 padding:0;
253 253 }
254 254
255 255 #header #header-inner #home a:hover {
256 256 background-position:0 -40px;
257 257 }
258 258
259 259 #header #header-inner #logo h1 {
260 260 color:#FFF;
261 261 font-size:14px;
262 262 text-transform:uppercase;
263 263 margin:13px 0 0 13px;
264 264 padding:0;
265 265 }
266 266
267 267 #header #header-inner #logo a {
268 268 color:#fff;
269 269 text-decoration:none;
270 270 }
271 271
272 272 #header #header-inner #logo a:hover {
273 273 color:#bfe3ff;
274 274 }
275 275
276 276 #header #header-inner #quick,#header #header-inner #quick ul {
277 277 position:relative;
278 278 float:right;
279 279 list-style-type:none;
280 280 list-style-position:outside;
281 281 margin:10px 5px 0 0;
282 282 padding:0;
283 283 }
284 284
285 285 #header #header-inner #quick li {
286 286 position:relative;
287 287 float:left;
288 288 margin:0 5px 0 0;
289 289 padding:0;
290 290 }
291 291
292 292 #header #header-inner #quick li a {
293 293 top:0;
294 294 left:0;
295 295 height:1%;
296 296 display:block;
297 297 clear:both;
298 298 overflow:hidden;
299 299 color:#FFF;
300 300 font-weight:700;
301 301 text-decoration:none;
302 302 background:#369 url("../../images/quick_l.png") no-repeat top left;
303 303 padding:0;
304 304 }
305 305
306 306 #header #header-inner #quick li span {
307 307 top:0;
308 308 right:0;
309 309 height:1%;
310 310 display:block;
311 311 float:left;
312 312 background:url("../../images/quick_r.png") no-repeat top right;
313 313 border-left:1px solid #3f6f9f;
314 314 margin:0;
315 315 padding:10px 12px 8px 10px;
316 316 }
317 317
318 318 #header #header-inner #quick li span.normal {
319 319 border:none;
320 320 padding:10px 12px 8px;
321 321 }
322 322
323 323 #header #header-inner #quick li span.icon {
324 324 top:0;
325 325 left:0;
326 326 border-left:none;
327 327 background:url("../../images/quick_l.png") no-repeat top left;
328 328 border-right:1px solid #2e5c89;
329 329 padding:8px 8px 4px;
330 330 }
331 331
332 332 #header #header-inner #quick li a:hover {
333 333 background:#4e4e4e url("../../images/quick_l_selected.png") no-repeat top left;
334 334 }
335 335
336 336 #header #header-inner #quick li a:hover span {
337 337 border-left:1px solid #545454;
338 338 background:url("../../images/quick_r_selected.png") no-repeat top right;
339 339 }
340 340
341 341 #header #header-inner #quick li a:hover span.icon {
342 342 border-left:none;
343 343 border-right:1px solid #464646;
344 344 background:url("../../images/quick_l_selected.png") no-repeat top left;
345 345 }
346 346
347 347 #header #header-inner #quick ul {
348 348 top:29px;
349 349 right:0;
350 350 min-width:200px;
351 351 display:none;
352 352 position:absolute;
353 353 background:#FFF;
354 354 border:1px solid #666;
355 355 border-top:1px solid #003367;
356 356 z-index:100;
357 357 margin:0;
358 358 padding:0;
359 359 }
360 360
361 361 #header #header-inner #quick ul.repo_switcher {
362 362 max-height:275px;
363 363 overflow-x:hidden;
364 364 overflow-y:auto;
365 365 }
366 366
367 367 #header #header-inner #quick li ul li {
368 368 border-bottom:1px solid #ddd;
369 369 }
370 370
371 371 #header #header-inner #quick li ul li a {
372 372 width:182px;
373 373 height:auto;
374 374 display:block;
375 375 float:left;
376 376 background:#FFF;
377 377 color:#003367;
378 378 font-weight:400;
379 379 margin:0;
380 380 padding:7px 9px;
381 381 }
382 382
383 383 #header #header-inner #quick li ul li a:hover {
384 384 color:#000;
385 385 background:#FFF;
386 386 }
387 387
388 388 #header #header-inner #quick ul ul {
389 389 top:auto;
390 390 }
391 391
392 392 #header #header-inner #quick li ul ul {
393 393 right:200px;
394 394 max-height:275px;
395 395 overflow:auto;
396 396 overflow-x:hidden;
397 397 white-space:nowrap;
398 398 }
399 399
400 400 #header #header-inner #quick li ul li a.journal,#header #header-inner #quick li ul li a.journal:hover {
401 401 background:url("../images/icons/book.png") no-repeat scroll 4px 9px #FFF;
402 402 width:167px;
403 403 margin:0;
404 404 padding:12px 9px 7px 24px;
405 405 }
406 406
407 407 #header #header-inner #quick li ul li a.private_repo,#header #header-inner #quick li ul li a.private_repo:hover {
408 408 background:url("../images/icons/lock.png") no-repeat scroll 4px 9px #FFF;
409 409 min-width:167px;
410 410 margin:0;
411 411 padding:12px 9px 7px 24px;
412 412 }
413 413
414 414 #header #header-inner #quick li ul li a.public_repo,#header #header-inner #quick li ul li a.public_repo:hover {
415 415 background:url("../images/icons/lock_open.png") no-repeat scroll 4px 9px #FFF;
416 416 min-width:167px;
417 417 margin:0;
418 418 padding:12px 9px 7px 24px;
419 419 }
420 420
421 421 #header #header-inner #quick li ul li a.repos,#header #header-inner #quick li ul li a.repos:hover {
422 422 background:url("../images/icons/folder_edit.png") no-repeat scroll 4px 9px #FFF;
423 423 width:167px;
424 424 margin:0;
425 425 padding:12px 9px 7px 24px;
426 426 }
427 427
428 428 #header #header-inner #quick li ul li a.users,#header #header-inner #quick li ul li a.users:hover {
429 429 background:#FFF url("../images/icons/user_edit.png") no-repeat 4px 9px;
430 430 width:167px;
431 431 margin:0;
432 432 padding:12px 9px 7px 24px;
433 433 }
434 434
435 435 #header #header-inner #quick li ul li a.settings,#header #header-inner #quick li ul li a.settings:hover {
436 436 background:#FFF url("../images/icons/cog.png") no-repeat 4px 9px;
437 437 width:167px;
438 438 margin:0;
439 439 padding:12px 9px 7px 24px;
440 440 }
441 441
442 442 #header #header-inner #quick li ul li a.permissions,#header #header-inner #quick li ul li a.permissions:hover {
443 443 background:#FFF url("../images/icons/key.png") no-repeat 4px 9px;
444 444 width:167px;
445 445 margin:0;
446 446 padding:12px 9px 7px 24px;
447 447 }
448 448
449 449 #header #header-inner #quick li ul li a.fork,#header #header-inner #quick li ul li a.fork:hover {
450 450 background:#FFF url("../images/icons/arrow_divide.png") no-repeat 4px 9px;
451 451 width:167px;
452 452 margin:0;
453 453 padding:12px 9px 7px 24px;
454 454 }
455 455
456 456 #header #header-inner #quick li ul li a.search,#header #header-inner #quick li ul li a.search:hover {
457 457 background:#FFF url("../images/icons/search_16.png") no-repeat 4px 9px;
458 458 width:167px;
459 459 margin:0;
460 460 padding:12px 9px 7px 24px;
461 461 }
462 462
463 463 #header #header-inner #quick li ul li a.delete,#header #header-inner #quick li ul li a.delete:hover {
464 464 background:#FFF url("../images/icons/delete.png") no-repeat 4px 9px;
465 465 width:167px;
466 466 margin:0;
467 467 padding:12px 9px 7px 24px;
468 468 }
469 469
470 470 #header #header-inner #quick li ul li a.branches,#header #header-inner #quick li ul li a.branches:hover {
471 471 background:#FFF url("../images/icons/arrow_branch.png") no-repeat 4px 9px;
472 472 width:167px;
473 473 margin:0;
474 474 padding:12px 9px 7px 24px;
475 475 }
476 476
477 477 #header #header-inner #quick li ul li a.tags,#header #header-inner #quick li ul li a.tags:hover {
478 478 background:#FFF url("../images/icons/tag_blue.png") no-repeat 4px 9px;
479 479 width:167px;
480 480 margin:0;
481 481 padding:12px 9px 7px 24px;
482 482 }
483 483
484 484 #header #header-inner #quick li ul li a.admin,#header #header-inner #quick li ul li a.admin:hover {
485 485 background:#FFF url("../images/icons/cog_edit.png") no-repeat 4px 9px;
486 486 width:167px;
487 487 margin:0;
488 488 padding:12px 9px 7px 24px;
489 489 }
490 490
491 491 #content #left {
492 492 left:0;
493 493 width:280px;
494 494 position:absolute;
495 495 }
496 496
497 497 #content #right {
498 498 margin:0 60px 10px 290px;
499 499 }
500 500
501 501 #content div.box {
502 502 clear:both;
503 503 overflow:hidden;
504 504 background:#fff;
505 505 margin:0 0 10px;
506 506 padding:0 0 10px;
507 507 }
508 508
509 509 #content div.box-left {
510 510 width:49%;
511 511 clear:none;
512 512 float:left;
513 513 margin:0 0 10px;
514 514 }
515 515
516 516 #content div.box-right {
517 517 width:49%;
518 518 clear:none;
519 519 float:right;
520 520 margin:0 0 10px;
521 521 }
522 522
523 523 #content div.box div.title {
524 524 clear:both;
525 525 overflow:hidden;
526 526 background:#369 url("../images/header_inner.png") repeat-x;
527 527 margin:0 0 20px;
528 528 padding:0;
529 529 }
530 530
531 531 #content div.box div.title h5 {
532 532 float:left;
533 533 border:none;
534 534 color:#fff;
535 535 text-transform:uppercase;
536 536 margin:0;
537 537 padding:11px 0 11px 10px;
538 538 }
539 539
540 540 #content div.box div.title ul.links li {
541 541 list-style:none;
542 542 float:left;
543 543 margin:0;
544 544 padding:0;
545 545 }
546 546
547 547 #content div.box div.title ul.links li a {
548 548 height:1%;
549 549 display:block;
550 550 float:left;
551 551 border-left:1px solid #316293;
552 552 color:#fff;
553 553 font-size:11px;
554 554 font-weight:700;
555 555 text-decoration:none;
556 556 margin:0;
557 557 padding:13px 16px 12px;
558 558 }
559 559
560 560 #content div.box h1,#content div.box h2,#content div.box h3,#content div.box h4,#content div.box h5,#content div.box h6 {
561 561 clear:both;
562 562 overflow:hidden;
563 563 border-bottom:1px solid #DDD;
564 564 margin:10px 20px;
565 565 padding:0 0 15px;
566 566 }
567 567
568 568 #content div.box p {
569 569 color:#5f5f5f;
570 570 font-size:12px;
571 571 line-height:150%;
572 572 margin:0 24px 10px;
573 573 padding:0;
574 574 }
575 575
576 576 #content div.box blockquote {
577 577 border-left:4px solid #DDD;
578 578 color:#5f5f5f;
579 579 font-size:11px;
580 580 line-height:150%;
581 581 margin:0 34px;
582 582 padding:0 0 0 14px;
583 583 }
584 584
585 585 #content div.box blockquote p {
586 586 margin:10px 0;
587 587 padding:0;
588 588 }
589 589
590 590 #content div.box dl {
591 591 margin:10px 24px;
592 592 }
593 593
594 594 #content div.box dt {
595 595 font-size:12px;
596 596 margin:0;
597 597 }
598 598
599 599 #content div.box dd {
600 600 font-size:12px;
601 601 margin:0;
602 602 padding:8px 0 8px 15px;
603 603 }
604 604
605 605 #content div.box li {
606 606 font-size:12px;
607 607 padding:4px 0;
608 608 }
609 609
610 610 #content div.box ul.disc,#content div.box ul.circle {
611 611 margin:10px 24px 10px 38px;
612 612 }
613 613
614 614 #content div.box ul.square {
615 615 margin:10px 24px 10px 40px;
616 616 }
617 617
618 618 #content div.box img.left {
619 619 border:none;
620 620 float:left;
621 621 margin:10px 10px 10px 0;
622 622 }
623 623
624 624 #content div.box img.right {
625 625 border:none;
626 626 float:right;
627 627 margin:10px 0 10px 10px;
628 628 }
629 629
630 630 #content div.box div.messages {
631 631 clear:both;
632 632 overflow:hidden;
633 633 margin:0 20px;
634 634 padding:0;
635 635 }
636 636
637 637 #content div.box div.message {
638 638 clear:both;
639 639 overflow:hidden;
640 640 margin:0;
641 641 padding:10px 0;
642 642 }
643 643
644 644 #content div.box div.message a {
645 645 font-weight:400 !important;
646 646 }
647 647
648 648 #content div.box div.message div.image {
649 649 float:left;
650 650 margin:9px 0 0 5px;
651 651 padding:6px;
652 652 }
653 653
654 654 #content div.box div.message div.image img {
655 655 vertical-align:middle;
656 656 margin:0;
657 657 }
658 658
659 659 #content div.box div.message div.text {
660 660 float:left;
661 661 margin:0;
662 662 padding:9px 6px;
663 663 }
664 664
665 665 #content div.box div.message div.dismiss a {
666 666 height:16px;
667 667 width:16px;
668 668 display:block;
669 669 background:url("../images/icons/cross.png") no-repeat;
670 670 margin:15px 14px 0 0;
671 671 padding:0;
672 672 }
673 673
674 674 #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 {
675 675 border:none;
676 676 margin:0;
677 677 padding:0;
678 678 }
679 679
680 680 #content div.box div.message div.text span {
681 681 height:1%;
682 682 display:block;
683 683 margin:0;
684 684 padding:5px 0 0;
685 685 }
686 686
687 687 #content div.box div.message-error {
688 688 height:1%;
689 689 clear:both;
690 690 overflow:hidden;
691 691 background:#FBE3E4;
692 692 border:1px solid #FBC2C4;
693 693 color:#860006;
694 694 }
695 695
696 696 #content div.box div.message-error h6 {
697 697 color:#860006;
698 698 }
699 699
700 700 #content div.box div.message-warning {
701 701 height:1%;
702 702 clear:both;
703 703 overflow:hidden;
704 704 background:#FFF6BF;
705 705 border:1px solid #FFD324;
706 706 color:#5f5200;
707 707 }
708 708
709 709 #content div.box div.message-warning h6 {
710 710 color:#5f5200;
711 711 }
712 712
713 713 #content div.box div.message-notice {
714 714 height:1%;
715 715 clear:both;
716 716 overflow:hidden;
717 717 background:#8FBDE0;
718 718 border:1px solid #6BACDE;
719 719 color:#003863;
720 720 }
721 721
722 722 #content div.box div.message-notice h6 {
723 723 color:#003863;
724 724 }
725 725
726 726 #content div.box div.message-success {
727 727 height:1%;
728 728 clear:both;
729 729 overflow:hidden;
730 730 background:#E6EFC2;
731 731 border:1px solid #C6D880;
732 732 color:#4e6100;
733 733 }
734 734
735 735 #content div.box div.message-success h6 {
736 736 color:#4e6100;
737 737 }
738 738
739 739 #content div.box div.form div.fields div.field {
740 740 height:1%;
741 741 border-bottom:1px solid #DDD;
742 742 clear:both;
743 743 margin:0;
744 744 padding:10px 0;
745 745 }
746 746
747 747 #content div.box div.form div.fields div.field-first {
748 748 padding:0 0 10px;
749 749 }
750 750
751 751 #content div.box div.form div.fields div.field-noborder {
752 752 border-bottom:0 !important;
753 753 }
754 754
755 755 #content div.box div.form div.fields div.field span.error-message {
756 756 height:1%;
757 757 display:inline-block;
758 758 color:red;
759 759 margin:8px 0 0 4px;
760 760 padding:0;
761 761 }
762 762
763 763 #content div.box div.form div.fields div.field span.success {
764 764 height:1%;
765 765 display:block;
766 766 color:#316309;
767 767 margin:8px 0 0;
768 768 padding:0;
769 769 }
770 770
771 771 #content div.box div.form div.fields div.field div.label {
772 772 left:80px;
773 773 width:auto;
774 774 position:absolute;
775 775 margin:0;
776 776 padding:8px 0 0 5px;
777 777 }
778 778
779 779 #content div.box-left div.form div.fields div.field div.label,#content div.box-right div.form div.fields div.field div.label {
780 780 clear:both;
781 781 overflow:hidden;
782 782 left:0;
783 783 width:auto;
784 784 position:relative;
785 785 margin:0;
786 786 padding:0 0 8px;
787 787 }
788 788
789 789 #content div.box div.form div.fields div.field div.label-select {
790 790 padding:2px 0 0 5px;
791 791 }
792 792
793 793 #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 {
794 794 padding:0 0 8px;
795 795 }
796 796
797 797 #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 {
798 798 padding:0 0 8px !important;
799 799 }
800 800
801 801 #content div.box div.form div.fields div.field div.label label {
802 802 color:#393939;
803 803 font-weight:700;
804 804 }
805 805
806 806 #content div.box div.form div.fields div.field div.input {
807 807 margin:0 0 0 200px;
808 808 }
809 809
810 810 #content div.box-left div.form div.fields div.field div.input,#content div.box-right div.form div.fields div.field div.input {
811 811 clear:both;
812 812 overflow:hidden;
813 813 border-top:1px solid #b3b3b3;
814 814 border-left:1px solid #b3b3b3;
815 815 border-right:1px solid #eaeaea;
816 816 border-bottom:1px solid #eaeaea;
817 817 margin:0;
818 818 padding:7px 7px 6px;
819 819 }
820 820
821 821 #content div.box div.form div.fields div.field div.input input {
822 822 background:#FFF;
823 823 border-top:1px solid #b3b3b3;
824 824 border-left:1px solid #b3b3b3;
825 825 border-right:1px solid #eaeaea;
826 826 border-bottom:1px solid #eaeaea;
827 827 color:#000;
828 828 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
829 829 font-size:11px;
830 830 margin:0;
831 831 padding:7px 7px 6px;
832 832 }
833 833
834 834 #content div.box-left div.form div.fields div.field div.input input,#content div.box-right div.form div.fields div.field div.input input {
835 835 width:100%;
836 836 border:none;
837 837 padding:0;
838 838 }
839 839
840 840 #content div.box div.form div.fields div.field div.input input.small {
841 841 width:30%;
842 842 }
843 843
844 844 #content div.box div.form div.fields div.field div.input input.medium {
845 845 width:55%;
846 846 }
847 847
848 848 #content div.box div.form div.fields div.field div.input input.large {
849 849 width:85%;
850 850 }
851 851
852 852 #content div.box div.form div.fields div.field div.input input.date {
853 853 width:177px;
854 854 }
855 855
856 856 #content div.box div.form div.fields div.field div.input input.button {
857 857 background:#D4D0C8;
858 858 border-top:1px solid #FFF;
859 859 border-left:1px solid #FFF;
860 860 border-right:1px solid #404040;
861 861 border-bottom:1px solid #404040;
862 862 color:#000;
863 863 margin:0;
864 864 padding:4px 8px;
865 865 }
866 866
867 867 #content div.box div.form div.fields div.field div.input a.ui-input-file {
868 868 width:28px;
869 869 height:28px;
870 870 display:inline;
871 871 position:absolute;
872 872 overflow:hidden;
873 873 cursor:pointer;
874 874 background:#e5e3e3 url("../images/button_browse.png") no-repeat;
875 875 border:none;
876 876 text-decoration:none;
877 877 margin:0 0 0 6px;
878 878 padding:0;
879 879 }
880 880
881 881 #content div.box div.form div.fields div.field div.textarea {
882 882 border-top:1px solid #b3b3b3;
883 883 border-left:1px solid #b3b3b3;
884 884 border-right:1px solid #eaeaea;
885 885 border-bottom:1px solid #eaeaea;
886 886 margin:0 0 0 200px;
887 887 padding:10px;
888 888 }
889 889
890 890 #content div.box div.form div.fields div.field div.textarea-editor {
891 891 border:1px solid #ddd;
892 892 padding:0;
893 893 }
894 894
895 895 #content div.box div.form div.fields div.field div.textarea textarea {
896 896 width:100%;
897 897 height:220px;
898 898 overflow:hidden;
899 899 background:#FFF;
900 900 color:#000;
901 901 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
902 902 font-size:11px;
903 903 outline:none;
904 904 border-width:0;
905 905 margin:0;
906 906 padding:0;
907 907 }
908 908
909 909 #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 {
910 910 width:100%;
911 911 height:100px;
912 912 }
913 913
914 914 #content div.box div.form div.fields div.field div.textarea table {
915 915 width:100%;
916 916 border:none;
917 917 margin:0;
918 918 padding:0;
919 919 }
920 920
921 921 #content div.box div.form div.fields div.field div.textarea table td {
922 922 background:#DDD;
923 923 border:none;
924 924 padding:0;
925 925 }
926 926
927 927 #content div.box div.form div.fields div.field div.textarea table td table {
928 928 width:auto;
929 929 border:none;
930 930 margin:0;
931 931 padding:0;
932 932 }
933 933
934 934 #content div.box div.form div.fields div.field div.textarea table td table td {
935 935 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
936 936 font-size:11px;
937 937 padding:5px 5px 5px 0;
938 938 }
939 939
940 940 #content div.box div.form div.fields div.field div.textarea table td table td a.mceButtonActive {
941 941 background:#b1b1b1;
942 942 }
943 943
944 944 #content div.box div.form div.fields div.field div.select a.ui-selectmenu {
945 945 color:#565656;
946 946 text-decoration:none;
947 947 }
948 948
949 949 #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 {
950 950 background:#f6f6f6;
951 951 border-color:#666;
952 952 }
953 953
954 954 div.form div.fields div.field div.button {
955 955 margin:0;
956 956 padding:0 0 0 8px;
957 957 }
958 958
959 959 div.form div.fields div.field div.highlight .ui-state-default {
960 960 background:#4e85bb url("../images/button_highlight.png") repeat-x;
961 961 border-top:1px solid #5c91a4;
962 962 border-left:1px solid #2a6f89;
963 963 border-right:1px solid #2b7089;
964 964 border-bottom:1px solid #1a6480;
965 965 color:#FFF;
966 966 margin:0;
967 967 padding:6px 12px;
968 968 }
969 969
970 970 div.form div.fields div.field div.highlight .ui-state-hover {
971 971 background:#46a0c1 url("../images/button_highlight_selected.png") repeat-x;
972 972 border-top:1px solid #78acbf;
973 973 border-left:1px solid #34819e;
974 974 border-right:1px solid #35829f;
975 975 border-bottom:1px solid #257897;
976 976 color:#FFF;
977 977 margin:0;
978 978 padding:6px 12px;
979 979 }
980 980
981 981 #content div.box div.form div.fields div.buttons div.highlight input.ui-state-default {
982 982 background:#4e85bb url("../../images/button_highlight.png") repeat-x;
983 983 border-top:1px solid #5c91a4;
984 984 border-left:1px solid #2a6f89;
985 985 border-right:1px solid #2b7089;
986 986 border-bottom:1px solid #1a6480;
987 987 color:#fff;
988 988 margin:0;
989 989 padding:6px 12px;
990 990 }
991 991
992 992 #content div.box div.form div.fields div.buttons div.highlight input.ui-state-hover {
993 993 background:#46a0c1 url("../../images/button_highlight_selected.png") repeat-x;
994 994 border-top:1px solid #78acbf;
995 995 border-left:1px solid #34819e;
996 996 border-right:1px solid #35829f;
997 997 border-bottom:1px solid #257897;
998 998 color:#fff;
999 999 margin:0;
1000 1000 padding:6px 12px;
1001 1001 }
1002 1002
1003 1003 #content div.box table {
1004 1004 width:100%;
1005 1005 border-collapse:collapse;
1006 1006 margin:0;
1007 1007 padding:0;
1008 1008 }
1009 1009
1010 1010 #content div.box table th {
1011 1011 background:#eee;
1012 1012 border-bottom:1px solid #ddd;
1013 1013 padding:5px 0px 5px 5px;
1014 1014 }
1015 1015
1016 1016 #content div.box table th.left {
1017 1017 text-align:left;
1018 1018 }
1019 1019
1020 1020 #content div.box table th.right {
1021 1021 text-align:right;
1022 1022 }
1023 1023
1024 1024 #content div.box table th.center {
1025 1025 text-align:center;
1026 1026 }
1027 1027
1028 1028 #content div.box table th.selected {
1029 1029 vertical-align:middle;
1030 1030 padding:0;
1031 1031 }
1032 1032
1033 1033 #content div.box table td {
1034 1034 background:#fff;
1035 1035 border-bottom:1px solid #cdcdcd;
1036 1036 vertical-align:middle;
1037 1037 padding:5px;
1038 1038 }
1039 1039
1040 1040 #content div.box table tr.selected td {
1041 1041 background:#FFC;
1042 1042 }
1043 1043
1044 1044 #content div.box table td.selected {
1045 1045 width:3%;
1046 1046 text-align:center;
1047 1047 vertical-align:middle;
1048 1048 padding:0;
1049 1049 }
1050 1050
1051 1051 #content div.box table td.action {
1052 1052 width:45%;
1053 1053 text-align:left;
1054 1054 }
1055 1055
1056 1056 #content div.box table td.date {
1057 1057 width:33%;
1058 1058 text-align:center;
1059 1059 }
1060 1060
1061 1061 #content div.box div.action {
1062 1062 float:right;
1063 1063 background:#FFF;
1064 1064 text-align:right;
1065 1065 margin:10px 0 0;
1066 1066 padding:0;
1067 1067 }
1068 1068
1069 1069 #content div.box div.action select {
1070 1070 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
1071 1071 font-size:11px;
1072 1072 margin:0;
1073 1073 }
1074 1074
1075 1075 #content div.box div.action .ui-selectmenu {
1076 1076 margin:0;
1077 1077 padding:0;
1078 1078 }
1079 1079
1080 1080 #content div.box div.pagination {
1081 1081 height:1%;
1082 1082 clear:both;
1083 1083 overflow:hidden;
1084 1084 margin:10px 0 0;
1085 1085 padding:0;
1086 1086 }
1087 1087
1088 1088 #content div.box div.pagination ul.pager {
1089 1089 float:right;
1090 1090 text-align:right;
1091 1091 margin:0;
1092 1092 padding:0;
1093 1093 }
1094 1094
1095 1095 #content div.box div.pagination ul.pager li {
1096 1096 height:1%;
1097 1097 float:left;
1098 1098 list-style:none;
1099 1099 background:#ebebeb url("../images/pager.png") repeat-x;
1100 1100 border-top:1px solid #dedede;
1101 1101 border-left:1px solid #cfcfcf;
1102 1102 border-right:1px solid #c4c4c4;
1103 1103 border-bottom:1px solid #c4c4c4;
1104 1104 color:#4A4A4A;
1105 1105 font-weight:700;
1106 1106 margin:0 0 0 4px;
1107 1107 padding:0;
1108 1108 }
1109 1109
1110 1110 #content div.box div.pagination ul.pager li.separator {
1111 1111 padding:6px;
1112 1112 }
1113 1113
1114 1114 #content div.box div.pagination ul.pager li.current {
1115 1115 background:#b4b4b4 url("../images/pager_selected.png") repeat-x;
1116 1116 border-top:1px solid #ccc;
1117 1117 border-left:1px solid #bebebe;
1118 1118 border-right:1px solid #b1b1b1;
1119 1119 border-bottom:1px solid #afafaf;
1120 1120 color:#515151;
1121 1121 padding:6px;
1122 1122 }
1123 1123
1124 1124 #content div.box div.pagination ul.pager li a {
1125 1125 height:1%;
1126 1126 display:block;
1127 1127 float:left;
1128 1128 color:#515151;
1129 1129 text-decoration:none;
1130 1130 margin:0;
1131 1131 padding:6px;
1132 1132 }
1133 1133
1134 1134 #content div.box div.pagination ul.pager li a:hover,#content div.box div.pagination ul.pager li a:active {
1135 1135 background:#b4b4b4 url("../images/pager_selected.png") repeat-x;
1136 1136 border-top:1px solid #ccc;
1137 1137 border-left:1px solid #bebebe;
1138 1138 border-right:1px solid #b1b1b1;
1139 1139 border-bottom:1px solid #afafaf;
1140 1140 margin:-1px;
1141 1141 }
1142 1142
1143 1143 #content div.box div.pagination-wh {
1144 1144 height:1%;
1145 1145 clear:both;
1146 1146 overflow:hidden;
1147 1147 text-align:right;
1148 1148 margin:10px 0 0;
1149 1149 padding:0;
1150 1150 }
1151 1151
1152 1152 #content div.box div.pagination-right {
1153 1153 float:right;
1154 1154 }
1155 1155
1156 1156 #content div.box div.pagination-wh a,#content div.box div.pagination-wh span.pager_dotdot {
1157 1157 height:1%;
1158 1158 float:left;
1159 1159 background:#ebebeb url("../images/pager.png") repeat-x;
1160 1160 border-top:1px solid #dedede;
1161 1161 border-left:1px solid #cfcfcf;
1162 1162 border-right:1px solid #c4c4c4;
1163 1163 border-bottom:1px solid #c4c4c4;
1164 1164 color:#4A4A4A;
1165 1165 font-weight:700;
1166 1166 margin:0 0 0 4px;
1167 1167 padding:6px;
1168 1168 }
1169 1169
1170 1170 #content div.box div.pagination-wh span.pager_curpage {
1171 1171 height:1%;
1172 1172 float:left;
1173 1173 background:#b4b4b4 url("../images/pager_selected.png") repeat-x;
1174 1174 border-top:1px solid #ccc;
1175 1175 border-left:1px solid #bebebe;
1176 1176 border-right:1px solid #b1b1b1;
1177 1177 border-bottom:1px solid #afafaf;
1178 1178 color:#515151;
1179 1179 font-weight:700;
1180 1180 margin:0 0 0 4px;
1181 1181 padding:6px;
1182 1182 }
1183 1183
1184 1184 #content div.box div.pagination-wh a:hover,#content div.box div.pagination-wh a:active {
1185 1185 background:#b4b4b4 url("../images/pager_selected.png") repeat-x;
1186 1186 border-top:1px solid #ccc;
1187 1187 border-left:1px solid #bebebe;
1188 1188 border-right:1px solid #b1b1b1;
1189 1189 border-bottom:1px solid #afafaf;
1190 1190 text-decoration:none;
1191 1191 }
1192 1192
1193 1193 #content div.box div.traffic div.legend {
1194 1194 clear:both;
1195 1195 overflow:hidden;
1196 1196 border-bottom:1px solid #ddd;
1197 1197 margin:0 0 10px;
1198 1198 padding:0 0 10px;
1199 1199 }
1200 1200
1201 1201 #content div.box div.traffic div.legend h6 {
1202 1202 float:left;
1203 1203 border:none;
1204 1204 margin:0;
1205 1205 padding:0;
1206 1206 }
1207 1207
1208 1208 #content div.box div.traffic div.legend li {
1209 1209 list-style:none;
1210 1210 float:left;
1211 1211 font-size:11px;
1212 1212 margin:0;
1213 1213 padding:0 8px 0 4px;
1214 1214 }
1215 1215
1216 1216 #content div.box div.traffic div.legend li.visits {
1217 1217 border-left:12px solid #edc240;
1218 1218 }
1219 1219
1220 1220 #content div.box div.traffic div.legend li.pageviews {
1221 1221 border-left:12px solid #afd8f8;
1222 1222 }
1223 1223
1224 1224 #content div.box div.traffic table {
1225 1225 width:auto;
1226 1226 }
1227 1227
1228 1228 #content div.box div.traffic table td {
1229 1229 background:transparent;
1230 1230 border:none;
1231 1231 padding:2px 3px 3px;
1232 1232 }
1233 1233
1234 1234 #content div.box div.traffic table td.legendLabel {
1235 1235 padding:0 3px 2px;
1236 1236 }
1237 1237
1238 1238 #footer {
1239 1239 clear:both;
1240 1240 overflow:hidden;
1241 1241 text-align:right;
1242 1242 margin:0;
1243 1243 padding:0 30px 4px;
1244 1244 margin:-10px 0 0;
1245 1245 }
1246 1246
1247 1247 #footer div#footer-inner {
1248 1248 background:url("../images/header_inner.png") repeat-x scroll 0 0 #003367;
1249 1249 border-top:2px solid #FFFFFF;
1250 1250 }
1251 1251
1252 1252 #footer div#footer-inner p {
1253 1253 padding:15px 25px 15px 0;
1254 1254 color:#FFF;
1255 1255 font-weight:700;
1256 1256 }
1257 1257 #footer div#footer-inner .footer-link {
1258 1258 float:left;
1259 1259 padding-left:10px;
1260 1260 }
1261 1261 #footer div#footer-inner .footer-link a {
1262 1262 color:#FFF;
1263 1263 }
1264 1264
1265 1265 #login div.title {
1266 1266 width:420px;
1267 1267 clear:both;
1268 1268 overflow:hidden;
1269 1269 position:relative;
1270 1270 background:#003367 url("../../images/header_inner.png") repeat-x;
1271 1271 margin:0 auto;
1272 1272 padding:0;
1273 1273 }
1274 1274
1275 1275 #login div.inner {
1276 1276 width:380px;
1277 1277 background:#FFF url("../images/login.png") no-repeat top left;
1278 1278 border-top:none;
1279 1279 border-bottom:none;
1280 1280 margin:0 auto;
1281 1281 padding:20px;
1282 1282 }
1283 1283
1284 1284 #login div.form div.fields div.field div.label {
1285 1285 width:173px;
1286 1286 float:left;
1287 1287 text-align:right;
1288 1288 margin:2px 10px 0 0;
1289 1289 padding:5px 0 0 5px;
1290 1290 }
1291 1291
1292 1292 #login div.form div.fields div.field div.input input {
1293 1293 width:176px;
1294 1294 background:#FFF;
1295 1295 border-top:1px solid #b3b3b3;
1296 1296 border-left:1px solid #b3b3b3;
1297 1297 border-right:1px solid #eaeaea;
1298 1298 border-bottom:1px solid #eaeaea;
1299 1299 color:#000;
1300 1300 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
1301 1301 font-size:11px;
1302 1302 margin:0;
1303 1303 padding:7px 7px 6px;
1304 1304 }
1305 1305
1306 1306 #login div.form div.fields div.buttons {
1307 1307 clear:both;
1308 1308 overflow:hidden;
1309 1309 border-top:1px solid #DDD;
1310 1310 text-align:right;
1311 1311 margin:0;
1312 1312 padding:10px 0 0;
1313 1313 }
1314 1314
1315 1315 #login div.form div.links {
1316 1316 clear:both;
1317 1317 overflow:hidden;
1318 1318 margin:10px 0 0;
1319 1319 padding:0 0 2px;
1320 1320 }
1321 1321
1322 1322 #register div.title {
1323 1323 width:420px;
1324 1324 clear:both;
1325 1325 overflow:hidden;
1326 1326 position:relative;
1327 1327 background:#003367 url("../images/header_inner.png") repeat-x;
1328 1328 margin:0 auto;
1329 1329 padding:0;
1330 1330 }
1331 1331
1332 1332 #register div.inner {
1333 1333 width:380px;
1334 1334 background:#FFF;
1335 1335 border-top:none;
1336 1336 border-bottom:none;
1337 1337 margin:0 auto;
1338 1338 padding:20px;
1339 1339 }
1340 1340
1341 1341 #register div.form div.fields div.field div.label {
1342 1342 width:100px;
1343 1343 float:left;
1344 1344 text-align:right;
1345 1345 margin:2px 10px 0 0;
1346 1346 padding:5px 0 0 5px;
1347 1347 }
1348 1348
1349 1349 #register div.form div.fields div.field div.input input {
1350 1350 width:245px;
1351 1351 background:#FFF;
1352 1352 border-top:1px solid #b3b3b3;
1353 1353 border-left:1px solid #b3b3b3;
1354 1354 border-right:1px solid #eaeaea;
1355 1355 border-bottom:1px solid #eaeaea;
1356 1356 color:#000;
1357 1357 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
1358 1358 font-size:11px;
1359 1359 margin:0;
1360 1360 padding:7px 7px 6px;
1361 1361 }
1362 1362
1363 1363 #register div.form div.fields div.buttons {
1364 1364 clear:both;
1365 1365 overflow:hidden;
1366 1366 border-top:1px solid #DDD;
1367 1367 text-align:left;
1368 1368 margin:0;
1369 1369 padding:10px 0 0 114px;
1370 1370 }
1371 1371
1372 1372 #register div.form div.fields div.buttons div.highlight input.ui-state-default {
1373 1373 background:url("../images/button_highlight.png") repeat-x scroll 0 0 #4E85BB;
1374 1374 color:#FFF;
1375 1375 border-color:#5C91A4 #2B7089 #1A6480 #2A6F89;
1376 1376 border-style:solid;
1377 1377 border-width:1px;
1378 1378 }
1379 1379
1380 1380 #register div.form div.activation_msg {
1381 1381 padding-top:4px;
1382 1382 padding-bottom:4px;
1383 1383 }
1384 1384
1385 1385 .trending_language_tbl,.trending_language_tbl td {
1386 1386 border:0 !important;
1387 1387 margin:0 !important;
1388 1388 padding:0 !important;
1389 1389 }
1390 1390
1391 1391 .trending_language {
1392 1392 background-color:#003367;
1393 1393 color:#FFF;
1394 1394 display:block;
1395 1395 min-width:20px;
1396 1396 max-width:400px;
1397 1397 text-decoration:none;
1398 1398 height:12px;
1399 1399 margin-bottom:4px;
1400 1400 margin-left:5px;
1401 1401 white-space:pre;
1402 1402 padding:3px;
1403 1403 }
1404 1404
1405 1405 h3.files_location {
1406 1406 font-size:1.8em;
1407 1407 font-weight:700;
1408 1408 border-bottom:none !important;
1409 1409 margin:10px 0 !important;
1410 1410 }
1411 1411
1412 1412 #files_data dl dt {
1413 1413 float:left;
1414 1414 width:115px;
1415 1415 margin:0 !important;
1416 1416 padding:5px;
1417 1417 }
1418 1418
1419 1419 #files_data dl dd {
1420 1420 margin:0 !important;
1421 1421 padding:5px !important;
1422 1422 }
1423 1423
1424 1424 #changeset_content {
1425 1425 border:1px solid #CCC;
1426 1426 padding:5px;
1427 1427 }
1428 1428
1429 1429 #changeset_content .container {
1430 1430 min-height:120px;
1431 1431 font-size:1.2em;
1432 1432 overflow:hidden;
1433 1433 }
1434 1434
1435 1435 #changeset_content .container .right {
1436 1436 float:right;
1437 1437 width:25%;
1438 1438 text-align:right;
1439 1439 }
1440 1440
1441 1441 #changeset_content .container .left .message {
1442 1442 font-style:italic;
1443 1443 color:#556CB5;
1444 1444 white-space:pre-wrap;
1445 1445 }
1446 1446
1447 1447 .cs_files .cs_added {
1448 1448 background:url("../images/icons/page_white_add.png") no-repeat scroll 3px;
1449 1449 height:16px;
1450 1450 padding-left:20px;
1451 1451 margin-top:7px;
1452 1452 text-align:left;
1453 1453 }
1454 1454
1455 1455 .cs_files .cs_changed {
1456 1456 background:url("../images/icons/page_white_edit.png") no-repeat scroll 3px;
1457 1457 height:16px;
1458 1458 padding-left:20px;
1459 1459 margin-top:7px;
1460 1460 text-align:left;
1461 1461 }
1462 1462
1463 1463 .cs_files .cs_removed {
1464 1464 background:url("../images/icons/page_white_delete.png") no-repeat scroll 3px;
1465 1465 height:16px;
1466 1466 padding-left:20px;
1467 1467 margin-top:7px;
1468 1468 text-align:left;
1469 1469 }
1470 1470
1471 1471 #graph {
1472 1472 overflow:hidden;
1473 1473 }
1474 1474
1475 1475 #graph_nodes {
1476 1476 width:160px;
1477 1477 float:left;
1478 1478 margin-left:-50px;
1479 1479 margin-top:5px;
1480 1480 }
1481 1481
1482 1482 #graph_content {
1483 1483 width:800px;
1484 1484 float:left;
1485 1485 }
1486 1486
1487 1487 #graph_content .container_header {
1488 1488 border:1px solid #CCC;
1489 1489 padding:10px;
1490 1490 }
1491 1491
1492 1492 #graph_content .container {
1493 1493 border-bottom:1px solid #CCC;
1494 1494 border-left:1px solid #CCC;
1495 1495 border-right:1px solid #CCC;
1496 1496 min-height:80px;
1497 1497 overflow:hidden;
1498 1498 font-size:1.2em;
1499 1499 }
1500 1500
1501 1501 #graph_content .container .right {
1502 1502 float:right;
1503 1503 width:28%;
1504 1504 text-align:right;
1505 1505 padding-bottom:5px;
1506 1506 }
1507 1507
1508 1508 #graph_content .container .left .date {
1509 1509 font-weight:700;
1510 1510 padding-bottom:5px;
1511 1511 }
1512 1512
1513 1513 #graph_content .container .left .message {
1514 1514 font-size:100%;
1515 1515 padding-top:3px;
1516 1516 white-space:pre-wrap;
1517 1517 }
1518 1518
1519 1519 .right div {
1520 1520 clear:both;
1521 1521 }
1522 1522
1523 1523 .right .changes .added,.changed,.removed {
1524 1524 border:1px solid #DDD;
1525 1525 display:block;
1526 1526 float:right;
1527 1527 text-align:center;
1528 1528 min-width:15px;
1529 1529 }
1530 1530
1531 1531 .right .changes .added {
1532 1532 background:#BFB;
1533 1533 }
1534 1534
1535 1535 .right .changes .changed {
1536 1536 background:#FD8;
1537 1537 }
1538 1538
1539 1539 .right .changes .removed {
1540 1540 background:#F88;
1541 1541 }
1542 1542
1543 1543 .right .merge {
1544 1544 vertical-align:top;
1545 font-size:60%;
1545 font-size:0.75em;
1546 1546 font-weight:700;
1547 1547 }
1548 1548
1549 1549 .right .parent {
1550 1550 font-size:90%;
1551 1551 font-family:monospace;
1552 1552 }
1553 1553
1554 1554 .right .logtags .branchtag {
1555 1555 background:#FFF url("../images/icons/arrow_branch.png") no-repeat right 6px;
1556 1556 display:block;
1557 padding:8px 16px 0 0;
1557 font-size:0.8em;
1558 padding:11px 16px 0 0;
1558 1559 }
1559 1560
1560 1561 .right .logtags .tagtag {
1561 1562 background:#FFF url("../images/icons/tag_blue.png") no-repeat right 6px;
1562 1563 display:block;
1563 padding:6px 18px 0 0;
1564 font-size:0.8em;
1565 padding:11px 16px 0 0;
1564 1566 }
1565 1567
1566 1568 div.browserblock {
1567 1569 overflow:hidden;
1568 1570 border:1px solid #ccc;
1569 1571 background:#f8f8f8;
1570 1572 font-size:100%;
1571 1573 line-height:125%;
1572 1574 padding:0;
1573 1575 }
1574 1576
1575 1577 div.browserblock .browser-header {
1576 1578 border-bottom:1px solid #CCC;
1577 1579 background:#FFF;
1578 1580 color:blue;
1579 1581 padding:10px 0;
1580 1582 }
1581 1583
1582 1584 div.browserblock .browser-header span {
1583 1585 margin-left:25px;
1584 1586 font-weight:700;
1585 1587 }
1586 1588
1587 1589 div.browserblock .browser-body {
1588 1590 background:#EEE;
1589 1591 }
1590 1592
1591 1593 table.code-browser {
1592 1594 border-collapse:collapse;
1593 1595 width:100%;
1594 1596 }
1595 1597
1596 1598 table.code-browser tr {
1597 1599 margin:3px;
1598 1600 }
1599 1601
1600 1602 table.code-browser thead th {
1601 1603 background-color:#EEE;
1602 1604 height:20px;
1603 1605 font-size:1.1em;
1604 1606 font-weight:700;
1605 1607 text-align:left;
1606 1608 padding-left:10px;
1607 1609 }
1608 1610
1609 1611 table.code-browser tbody td {
1610 1612 padding-left:10px;
1611 1613 height:20px;
1612 1614 }
1613 1615
1614 1616 table.code-browser .browser-file {
1615 1617 background:url("../images/icons/document_16.png") no-repeat scroll 3px;
1616 1618 height:16px;
1617 1619 padding-left:20px;
1618 1620 text-align:left;
1619 1621 }
1620 1622
1621 1623 table.code-browser .browser-dir {
1622 1624 background:url("../images/icons/folder_16.png") no-repeat scroll 3px;
1623 1625 height:16px;
1624 1626 padding-left:20px;
1625 1627 text-align:left;
1626 1628 }
1627 1629
1628 1630 .box .search {
1629 1631 clear:both;
1630 1632 overflow:hidden;
1631 1633 margin:0;
1632 1634 padding:0 20px 10px;
1633 1635 }
1634 1636
1635 1637 .box .search div.search_path {
1636 1638 background:none repeat scroll 0 0 #EEE;
1637 1639 border:1px solid #CCC;
1638 1640 color:blue;
1639 1641 margin-bottom:10px;
1640 1642 padding:10px 0;
1641 1643 }
1642 1644
1643 1645 .box .search div.search_path div.link {
1644 1646 font-weight:700;
1645 1647 margin-left:25px;
1646 1648 }
1647 1649
1648 1650 .box .search div.search_path div.link a {
1649 1651 color:#003367;
1650 1652 cursor:pointer;
1651 1653 text-decoration:none;
1652 1654 }
1653 1655
1654 1656 #path_unlock {
1655 1657 color:red;
1656 1658 font-size:1.2em;
1657 1659 padding-left:4px;
1658 1660 }
1659 1661
1660 1662 .info_box * {
1661 1663 background:url("../../images/pager.png") repeat-x scroll 0 0 #EBEBEB;
1662 1664 color:#4A4A4A;
1663 1665 font-weight:700;
1664 1666 height:1%;
1665 1667 display:inline;
1666 1668 border-color:#DEDEDE #C4C4C4 #C4C4C4 #CFCFCF;
1667 1669 border-style:solid;
1668 1670 border-width:1px;
1669 1671 padding:4px 6px;
1670 1672 }
1671 1673
1672 1674 .info_box span {
1673 1675 margin-left:3px;
1674 1676 margin-right:3px;
1675 1677 }
1676 1678
1677 1679 .info_box input#at_rev {
1678 1680 text-align:center;
1679 1681 padding:5px 3px 3px 2px;
1680 1682 }
1681 1683
1682 1684 .info_box input#view {
1683 1685 text-align:center;
1684 1686 padding:4px 3px 2px 2px;
1685 1687 }
1686 1688
1687 1689 .yui-overlay,.yui-panel-container {
1688 1690 visibility:hidden;
1689 1691 position:absolute;
1690 1692 z-index:2;
1691 1693 }
1692 1694
1693 1695 .yui-tt {
1694 1696 visibility:hidden;
1695 1697 position:absolute;
1696 1698 color:#666;
1697 1699 background-color:#FFF;
1698 1700 font-family:arial, helvetica, verdana, sans-serif;
1699 1701 border:2px solid #003367;
1700 1702 font:100% sans-serif;
1701 1703 width:auto;
1702 1704 opacity:1px;
1703 1705 padding:8px;
1704 1706 white-space: pre;
1705 1707 }
1706 1708
1707 1709 .ac {
1708 1710 vertical-align:top;
1709 1711 }
1710 1712
1711 1713 .ac .yui-ac {
1712 1714 position:relative;
1713 1715 font-family:arial;
1714 1716 font-size:100%;
1715 1717 }
1716 1718
1717 1719 .ac .perm_ac {
1718 1720 width:15em;
1719 1721 }
1720 1722
1721 1723 .ac .yui-ac-input {
1722 1724 width:100%;
1723 1725 }
1724 1726
1725 1727 .ac .yui-ac-container {
1726 1728 position:absolute;
1727 1729 top:1.6em;
1728 1730 width:100%;
1729 1731 }
1730 1732
1731 1733 .ac .yui-ac-content {
1732 1734 position:absolute;
1733 1735 width:100%;
1734 1736 border:1px solid gray;
1735 1737 background:#fff;
1736 1738 overflow:hidden;
1737 1739 z-index:9050;
1738 1740 }
1739 1741
1740 1742 .ac .yui-ac-shadow {
1741 1743 position:absolute;
1742 1744 width:100%;
1743 1745 background:#000;
1744 1746 -moz-opacity:0.1px;
1745 1747 opacity:.10;
1746 1748 filter:alpha(opacity = 10);
1747 1749 z-index:9049;
1748 1750 margin:.3em;
1749 1751 }
1750 1752
1751 1753 .ac .yui-ac-content ul {
1752 1754 width:100%;
1753 1755 margin:0;
1754 1756 padding:0;
1755 1757 }
1756 1758
1757 1759 .ac .yui-ac-content li {
1758 1760 cursor:default;
1759 1761 white-space:nowrap;
1760 1762 margin:0;
1761 1763 padding:2px 5px;
1762 1764 }
1763 1765
1764 1766 .ac .yui-ac-content li.yui-ac-prehighlight {
1765 1767 background:#B3D4FF;
1766 1768 }
1767 1769
1768 1770 .ac .yui-ac-content li.yui-ac-highlight {
1769 1771 background:#556CB5;
1770 1772 color:#FFF;
1771 1773 }
1772 1774
1773 1775 .add_icon {
1774 1776 background:url("../images/icons/add.png") no-repeat scroll 3px;
1775 1777 height:16px;
1776 1778 padding-left:20px;
1777 1779 padding-top:1px;
1778 1780 text-align:left;
1779 1781 }
1780 1782
1781 1783 .edit_icon {
1782 1784 background:url("../images/icons/folder_edit.png") no-repeat scroll 3px;
1783 1785 height:16px;
1784 1786 padding-left:20px;
1785 1787 padding-top:1px;
1786 1788 text-align:left;
1787 1789 }
1788 1790
1789 1791 .delete_icon {
1790 1792 background:url("../images/icons/delete.png") no-repeat scroll 3px;
1791 1793 height:16px;
1792 1794 padding-left:20px;
1793 1795 padding-top:1px;
1794 1796 text-align:left;
1795 1797 }
1796 1798
1797 1799 .rss_icon {
1798 1800 background:url("../images/icons/rss_16.png") no-repeat scroll 3px;
1799 1801 height:16px;
1800 1802 padding-left:20px;
1801 1803 padding-top:1px;
1802 1804 text-align:left;
1803 1805 }
1804 1806
1805 1807 .atom_icon {
1806 1808 background:url("../images/icons/atom.png") no-repeat scroll 3px;
1807 1809 height:16px;
1808 1810 padding-left:20px;
1809 1811 padding-top:1px;
1810 1812 text-align:left;
1811 1813 }
1812 1814
1813 1815 .archive_icon {
1814 1816 background:url("../images/icons/compress.png") no-repeat scroll 3px;
1815 1817 height:16px;
1816 1818 padding-left:20px;
1817 1819 text-align:left;
1818 1820 padding-top:1px;
1819 1821 }
1820 1822
1821 1823 .action_button {
1822 1824 border:0;
1823 1825 display:block;
1824 1826 }
1825 1827
1826 1828 .action_button:hover {
1827 1829 border:0;
1828 1830 text-decoration:underline;
1829 1831 cursor:pointer;
1830 1832 }
1831 1833
1832 1834 #switch_repos {
1833 1835 position:absolute;
1834 1836 height:25px;
1835 1837 z-index:1;
1836 1838 }
1837 1839
1838 1840 #switch_repos select {
1839 1841 min-width:150px;
1840 1842 max-height:250px;
1841 1843 z-index:1;
1842 1844 }
1843 1845
1844 1846 .breadcrumbs {
1845 1847 border:medium none;
1846 1848 color:#FFF;
1847 1849 float:left;
1848 1850 text-transform:uppercase;
1849 1851 font-weight:700;
1850 1852 font-size:14px;
1851 1853 margin:0;
1852 1854 padding:11px 0 11px 10px;
1853 1855 }
1854 1856
1855 1857 .breadcrumbs a {
1856 1858 color:#FFF;
1857 1859 }
1858 1860
1859 1861 .flash_msg ul {
1860 1862 margin:0;
1861 1863 padding:0 0 10px;
1862 1864 }
1863 1865
1864 1866 .error_msg {
1865 1867 background-color:#FFCFCF;
1866 1868 background-image:url("../../images/icons/error_msg.png");
1867 1869 border:1px solid #FF9595;
1868 1870 color:#C30;
1869 1871 }
1870 1872
1871 1873 .warning_msg {
1872 1874 background-color:#FFFBCC;
1873 1875 background-image:url("../../images/icons/warning_msg.png");
1874 1876 border:1px solid #FFF35E;
1875 1877 color:#C69E00;
1876 1878 }
1877 1879
1878 1880 .success_msg {
1879 1881 background-color:#D5FFCF;
1880 1882 background-image:url("../../images/icons/success_msg.png");
1881 1883 border:1px solid #97FF88;
1882 1884 color:#090;
1883 1885 }
1884 1886
1885 1887 .notice_msg {
1886 1888 background-color:#DCE3FF;
1887 1889 background-image:url("../../images/icons/notice_msg.png");
1888 1890 border:1px solid #93A8FF;
1889 1891 color:#556CB5;
1890 1892 }
1891 1893
1892 1894 .success_msg,.error_msg,.notice_msg,.warning_msg {
1893 1895 background-position:10px center;
1894 1896 background-repeat:no-repeat;
1895 1897 font-size:12px;
1896 1898 font-weight:700;
1897 1899 min-height:14px;
1898 1900 line-height:14px;
1899 1901 margin-bottom:0;
1900 1902 margin-top:0;
1901 1903 display:block;
1902 1904 overflow:auto;
1903 1905 padding:6px 10px 6px 40px;
1904 1906 }
1905 1907
1906 1908 #msg_close {
1907 1909 background:transparent url("../../icons/cross_grey_small.png") no-repeat scroll 0 0;
1908 1910 cursor:pointer;
1909 1911 height:16px;
1910 1912 position:absolute;
1911 1913 right:5px;
1912 1914 top:5px;
1913 1915 width:16px;
1914 1916 }
1915 1917
1916 1918 div#legend_container table,div#legend_choices table {
1917 1919 width:auto !important;
1918 1920 }
1919 1921
1920 1922 table#permissions_manage {
1921 1923 width:0 !important;
1922 1924 }
1923 1925
1924 1926 table#permissions_manage span.private_repo_msg {
1925 1927 font-size:0.8em;
1926 1928 opacity:0.6px;
1927 1929 }
1928 1930
1929 1931 table#permissions_manage td.private_repo_msg {
1930 1932 font-size:0.8em;
1931 1933 }
1932 1934
1933 1935 table#permissions_manage tr#add_perm_input td {
1934 1936 vertical-align:middle;
1935 1937 }
1936 1938
1937 1939 div.gravatar {
1938 1940 background-color:#FFF;
1939 1941 border:1px solid #D0D0D0;
1940 1942 float:left;
1941 1943 margin-right:0.7em;
1942 1944 padding:2px 2px 0;
1943 1945 }
1944 1946
1945 1947 #header,#content,#footer {
1946 1948 min-width:1224px;
1947 1949 }
1948 1950
1949 1951 #content {
1950 1952 min-height:100%;
1951 1953 clear:both;
1952 1954 overflow:hidden;
1953 1955 padding:14px 30px;
1954 1956 }
1955 1957
1956 1958 #content div.box div.title div.search {
1957 1959 background:url("../../images/title_link.png") no-repeat top left;
1958 1960 border-left:1px solid #316293;
1959 1961 }
1960 1962
1961 1963 #content div.box div.title div.search div.input input {
1962 1964 border:1px solid #316293;
1963 1965 }
1964 1966
1965 1967 #content div.box div.title div.search div.button input.ui-state-default {
1966 1968 background:#4e85bb url("../../images/button_highlight.png") repeat-x;
1967 1969 border:1px solid #316293;
1968 1970 border-left:none;
1969 1971 color:#FFF;
1970 1972 }
1971 1973
1972 1974 #content div.box div.title div.search div.button input.ui-state-hover {
1973 1975 background:#46a0c1 url("../../images/button_highlight_selected.png") repeat-x;
1974 1976 border:1px solid #316293;
1975 1977 border-left:none;
1976 1978 color:#FFF;
1977 1979 }
1978 1980
1979 1981 #content div.box div.form div.fields div.field div.highlight .ui-state-default {
1980 1982 background:#4e85bb url("../../images/button_highlight.png") repeat-x;
1981 1983 border-top:1px solid #5c91a4;
1982 1984 border-left:1px solid #2a6f89;
1983 1985 border-right:1px solid #2b7089;
1984 1986 border-bottom:1px solid #1a6480;
1985 1987 color:#fff;
1986 1988 }
1987 1989
1988 1990 #content div.box div.form div.fields div.field div.highlight .ui-state-hover {
1989 1991 background:#46a0c1 url("../../images/button_highlight_selected.png") repeat-x;
1990 1992 border-top:1px solid #78acbf;
1991 1993 border-left:1px solid #34819e;
1992 1994 border-right:1px solid #35829f;
1993 1995 border-bottom:1px solid #257897;
1994 1996 color:#fff;
1995 1997 }
1996 1998
1997 1999 ins,div.options a:hover {
1998 2000 text-decoration:none;
1999 2001 }
2000 2002
2001 2003 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 {
2002 2004 border:none;
2003 2005 }
2004 2006
2005 2007 img.icon,.right .merge img {
2006 2008 vertical-align:bottom;
2007 2009 }
2008 2010
2009 2011 #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 {
2010 2012 float:right;
2011 2013 margin:0;
2012 2014 padding:0;
2013 2015 }
2014 2016
2015 2017 #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 {
2016 2018 float:left;
2017 2019 }
2018 2020
2019 2021 #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 {
2020 2022 display:none;
2021 2023 }
2022 2024
2023 2025 #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 {
2024 2026 display:block;
2025 2027 }
2026 2028
2027 2029 #content div.box div.title ul.links li a:hover,#content div.box div.title ul.links li.ui-tabs-selected a {
2028 2030 color:#bfe3ff;
2029 2031 }
2030 2032
2031 2033 #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 {
2032 2034 margin:10px 24px 10px 44px;
2033 2035 }
2034 2036
2035 2037 #content div.box div.form,#content div.box div.table,#content div.box div.traffic {
2036 2038 clear:both;
2037 2039 overflow:hidden;
2038 2040 margin:0;
2039 2041 padding:0 20px 10px;
2040 2042 }
2041 2043
2042 2044 #content div.box div.form div.fields,#login div.form,#login div.form div.fields,#register div.form,#register div.form div.fields {
2043 2045 clear:both;
2044 2046 overflow:hidden;
2045 2047 margin:0;
2046 2048 padding:0;
2047 2049 }
2048 2050
2049 2051 #content div.box div.form div.fields div.field div.label-checkbox,#content div.box div.form div.fields div.field div.label-radio,#content div.box div.form div.fields div.field div.label-textarea {
2050 2052 padding:0 0 0 5px !important;
2051 2053 }
2052 2054
2053 2055 #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 {
2054 2056 height:1%;
2055 2057 display:block;
2056 2058 color:#363636;
2057 2059 margin:0;
2058 2060 padding:2px 0 0;
2059 2061 }
2060 2062
2061 2063 #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 {
2062 2064 background:#FBE3E4;
2063 2065 border-top:1px solid #e1b2b3;
2064 2066 border-left:1px solid #e1b2b3;
2065 2067 border-right:1px solid #FBC2C4;
2066 2068 border-bottom:1px solid #FBC2C4;
2067 2069 }
2068 2070
2069 2071 #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 {
2070 2072 background:#E6EFC2;
2071 2073 border-top:1px solid #cebb98;
2072 2074 border-left:1px solid #cebb98;
2073 2075 border-right:1px solid #c6d880;
2074 2076 border-bottom:1px solid #c6d880;
2075 2077 }
2076 2078
2077 2079 #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 {
2078 2080 margin:0;
2079 2081 }
2080 2082
2081 2083 #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 {
2082 2084 margin:0 0 0 200px;
2083 2085 padding:0;
2084 2086 }
2085 2087
2086 2088 #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 {
2087 2089 color:#000;
2088 2090 text-decoration:none;
2089 2091 }
2090 2092
2091 2093 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus,#content div.box div.action a.ui-selectmenu-focus {
2092 2094 border:1px solid #666;
2093 2095 }
2094 2096
2095 2097 #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 {
2096 2098 clear:both;
2097 2099 overflow:hidden;
2098 2100 margin:0;
2099 2101 padding:2px 0;
2100 2102 }
2101 2103
2102 2104 #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 {
2103 2105 float:left;
2104 2106 margin:0;
2105 2107 }
2106 2108
2107 2109 #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 {
2108 2110 height:1%;
2109 2111 display:block;
2110 2112 float:left;
2111 2113 margin:3px 0 0 4px;
2112 2114 }
2113 2115
2114 2116 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 {
2115 2117 color:#000;
2116 2118 font-family:Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
2117 2119 font-size:11px;
2118 2120 font-weight:700;
2119 2121 margin:0;
2120 2122 }
2121 2123
2122 2124 div.form div.fields div.field div.button .ui-state-default,#content div.box div.form div.fields div.buttons input.ui-state-default {
2123 2125 background:#e5e3e3 url("../images/button.png") repeat-x;
2124 2126 border-top:1px solid #DDD;
2125 2127 border-left:1px solid #c6c6c6;
2126 2128 border-right:1px solid #DDD;
2127 2129 border-bottom:1px solid #c6c6c6;
2128 2130 color:#515151;
2129 2131 outline:none;
2130 2132 margin:0;
2131 2133 padding:6px 12px;
2132 2134 }
2133 2135
2134 2136 div.form div.fields div.field div.button .ui-state-hover,#content div.box div.form div.fields div.buttons input.ui-state-hover {
2135 2137 background:#b4b4b4 url("../images/button_selected.png") repeat-x;
2136 2138 border-top:1px solid #ccc;
2137 2139 border-left:1px solid #bebebe;
2138 2140 border-right:1px solid #b1b1b1;
2139 2141 border-bottom:1px solid #afafaf;
2140 2142 color:#515151;
2141 2143 outline:none;
2142 2144 margin:0;
2143 2145 padding:6px 12px;
2144 2146 }
2145 2147
2146 2148 div.form div.fields div.field div.highlight,#content div.box div.form div.fields div.buttons div.highlight {
2147 2149 display:inline;
2148 2150 }
2149 2151
2150 2152 #content div.box div.form div.fields div.buttons,div.form div.fields div.buttons {
2151 2153 margin:10px 0 0 200px;
2152 2154 padding:0;
2153 2155 }
2154 2156
2155 2157 #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 {
2156 2158 margin:10px 0 0;
2157 2159 }
2158 2160
2159 2161 #content div.box table td.user,#content div.box table td.address {
2160 2162 width:10%;
2161 2163 text-align:center;
2162 2164 }
2163 2165
2164 2166 #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 {
2165 2167 text-align:right;
2166 2168 margin:6px 0 0;
2167 2169 padding:0;
2168 2170 }
2169 2171
2170 2172 #content div.box div.action div.button input.ui-state-default,#login div.form div.fields div.buttons input.ui-state-default,#register div.form div.fields div.buttons input.ui-state-default {
2171 2173 background:#e5e3e3 url("../images/button.png") repeat-x;
2172 2174 border-top:1px solid #DDD;
2173 2175 border-left:1px solid #c6c6c6;
2174 2176 border-right:1px solid #DDD;
2175 2177 border-bottom:1px solid #c6c6c6;
2176 2178 color:#515151;
2177 2179 margin:0;
2178 2180 padding:6px 12px;
2179 2181 }
2180 2182
2181 2183 #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 {
2182 2184 background:#b4b4b4 url("../images/button_selected.png") repeat-x;
2183 2185 border-top:1px solid #ccc;
2184 2186 border-left:1px solid #bebebe;
2185 2187 border-right:1px solid #b1b1b1;
2186 2188 border-bottom:1px solid #afafaf;
2187 2189 color:#515151;
2188 2190 margin:0;
2189 2191 padding:6px 12px;
2190 2192 }
2191 2193
2192 2194 #content div.box div.pagination div.results,#content div.box div.pagination-wh div.results {
2193 2195 text-align:left;
2194 2196 float:left;
2195 2197 margin:0;
2196 2198 padding:0;
2197 2199 }
2198 2200
2199 2201 #content div.box div.pagination div.results span,#content div.box div.pagination-wh div.results span {
2200 2202 height:1%;
2201 2203 display:block;
2202 2204 float:left;
2203 2205 background:#ebebeb url("../images/pager.png") repeat-x;
2204 2206 border-top:1px solid #dedede;
2205 2207 border-left:1px solid #cfcfcf;
2206 2208 border-right:1px solid #c4c4c4;
2207 2209 border-bottom:1px solid #c4c4c4;
2208 2210 color:#4A4A4A;
2209 2211 font-weight:700;
2210 2212 margin:0;
2211 2213 padding:6px 8px;
2212 2214 }
2213 2215
2214 2216 #content div.box div.pagination ul.pager li.disabled,#content div.box div.pagination-wh a.disabled {
2215 2217 color:#B4B4B4;
2216 2218 padding:6px;
2217 2219 }
2218 2220
2219 2221 #login,#register {
2220 2222 width:420px;
2221 2223 margin:10% auto 0;
2222 2224 padding:0;
2223 2225 }
2224 2226
2225 2227 #login div.color,#register div.color {
2226 2228 clear:both;
2227 2229 overflow:hidden;
2228 2230 background:#FFF;
2229 2231 margin:10px auto 0;
2230 2232 padding:3px 3px 3px 0;
2231 2233 }
2232 2234
2233 2235 #login div.color a,#register div.color a {
2234 2236 width:20px;
2235 2237 height:20px;
2236 2238 display:block;
2237 2239 float:left;
2238 2240 margin:0 0 0 3px;
2239 2241 padding:0;
2240 2242 }
2241 2243
2242 2244 #login div.title h5,#register div.title h5 {
2243 2245 color:#fff;
2244 2246 margin:10px;
2245 2247 padding:0;
2246 2248 }
2247 2249
2248 2250 #login div.form div.fields div.field,#register div.form div.fields div.field {
2249 2251 clear:both;
2250 2252 overflow:hidden;
2251 2253 margin:0;
2252 2254 padding:0 0 10px;
2253 2255 }
2254 2256
2255 2257 #login div.form div.fields div.field span.error-message,#register div.form div.fields div.field span.error-message {
2256 2258 height:1%;
2257 2259 display:block;
2258 2260 color:red;
2259 2261 margin:8px 0 0;
2260 2262 padding:0;
2261 2263 }
2262 2264
2263 2265 #login div.form div.fields div.field div.label label,#register div.form div.fields div.field div.label label {
2264 2266 color:#000;
2265 2267 font-weight:700;
2266 2268 }
2267 2269
2268 2270 #login div.form div.fields div.field div.input,#register div.form div.fields div.field div.input {
2269 2271 float:left;
2270 2272 margin:0;
2271 2273 padding:0;
2272 2274 }
2273 2275
2274 2276 #login div.form div.fields div.field div.checkbox,#register div.form div.fields div.field div.checkbox {
2275 2277 margin:0 0 0 184px;
2276 2278 padding:0;
2277 2279 }
2278 2280
2279 2281 #login div.form div.fields div.field div.checkbox label,#register div.form div.fields div.field div.checkbox label {
2280 2282 color:#565656;
2281 2283 font-weight:700;
2282 2284 }
2283 2285
2284 2286 #login div.form div.fields div.buttons input,#register div.form div.fields div.buttons input {
2285 2287 color:#000;
2286 2288 font-size:1em;
2287 2289 font-weight:700;
2288 2290 font-family:Verdana, Helvetica, Sans-Serif;
2289 2291 margin:0;
2290 2292 }
2291 2293
2292 2294 #changeset_content .container .wrapper,#graph_content .container .wrapper {
2293 2295 width:600px;
2294 2296 }
2295 2297
2296 2298 #changeset_content .container .left,#graph_content .container .left {
2297 2299 float:left;
2298 2300 width:70%;
2299 2301 padding-left:5px;
2300 2302 }
2301 2303
2302 2304 #changeset_content .container .left .date,.ac .match {
2303 2305 font-weight:700;
2304 2306 padding-top: 5px;
2305 2307 padding-bottom:5px;
2306 2308 }
2307 2309
2308 2310 div#legend_container table td,div#legend_choices table td {
2309 2311 border:none !important;
2310 2312 height:20px !important;
2311 2313 padding:0 !important;
2312 2314 }
2313 2315
2314 2316 #q_filter{
2315 2317 border:0 none;
2316 2318 color:#CDCDCD;
2317 2319 margin-bottom:-4px;
2318 2320 margin-top:-4px;
2319 2321 padding-left:3px;
2320 2322 }
2321 2323
@@ -1,121 +1,124
1 1 ## -*- coding: utf-8 -*-
2 2
3 3 <%inherit file="/base/base.html"/>
4 4
5 5 <%def name="title()">
6 6 ${c.repo_name} ${_('Changelog')} - ${c.rhodecode_name}
7 7 </%def>
8 8
9 9 <%def name="breadcrumbs_links()">
10 10 ${h.link_to(u'Home',h.url('/'))}
11 11 &raquo;
12 12 ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))}
13 13 &raquo;
14 14 ${_('Changelog')} - ${_('showing ')} ${c.size if c.size <= c.total_cs else c.total_cs} ${_('out of')} ${c.total_cs} ${_('revisions')}
15 15 </%def>
16 16
17 17 <%def name="page_nav()">
18 18 ${self.menu('changelog')}
19 19 </%def>
20 20
21 21 <%def name="main()">
22 22 <div class="box">
23 23 <!-- box / title -->
24 24 <div class="title">
25 25 ${self.breadcrumbs()}
26 26 </div>
27 27 <div class="table">
28 28 % if c.pagination:
29 29 <div id="graph">
30 30 <div id="graph_nodes">
31 31 <canvas id="graph_canvas"></canvas>
32 32 </div>
33 33 <div id="graph_content">
34 34 <div class="container_header">
35 35
36 36 ${h.form(h.url.current(),method='get')}
37 37 <div class="info_box">
38 38 <span>${_('Show')}:</span>
39 39 ${h.text('size',size=1,value=c.size)}
40 40 <span>${_('revisions')}</span>
41 41 ${h.submit('set',_('set'))}
42 42 </div>
43 43 ${h.end_form()}
44 44
45 45 </div>
46 46 %for cnt,cs in enumerate(c.pagination):
47 47 <div id="chg_${cnt+1}" class="container">
48 48 <div class="left">
49 49 <div class="date">${_('commit')} ${cs.revision}: ${h.short_id(cs.raw_id)}@${cs.date}</div>
50 50 <div class="author">
51 51 <div class="gravatar">
52 52 <img alt="gravatar" src="${h.gravatar_url(h.email(cs.author),20)}"/>
53 53 </div>
54 54 <span>${h.person(cs.author)}</span><br/>
55 55 <span><a href="mailto:${h.email_or_none(cs.author)}">${h.email_or_none(cs.author)}</a></span><br/>
56 56 </div>
57 57 <div class="message">${h.link_to(h.wrap_paragraphs(cs.message),h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}</div>
58 58 </div>
59 59 <div class="right">
60 60 <div class="changes">
61 <span class="removed" title="${_('removed')}">${len(cs.removed)}</span>
62 <span class="changed" title="${_('changed')}">${len(cs.changed)}</span>
63 <span class="added" title="${_('added')}">${len(cs.added)}</span>
61 <span class="removed" title="${_('removed')}: ${' | '.join([x.name for x in cs.removed])}">
62 ${len(cs.removed)}</span>
63 <span class="changed" title="${_('changed')}: ${' | '.join([x.name for x in cs.changed])}">
64 ${len(cs.changed)}</span>
65 <span class="added" title="${_('added')}: ${' | '.join([x.name for x in cs.added])}">
66 ${len(cs.added)}</span>
64 67 </div>
65 68 %if len(cs.parents)>1:
66 69 <div class="merge">
67 70 ${_('merge')}<img alt="merge" src="/images/icons/arrow_join.png"/>
68 71 </div>
69 72 %endif
70 73 %if cs.parents:
71 74 %for p_cs in reversed(cs.parents):
72 75 <div class="parent">${_('Parent')} ${p_cs.revision}: ${h.link_to(h.short_id(p_cs.raw_id),
73 76 h.url('changeset_home',repo_name=c.repo_name,revision=p_cs.raw_id),title=p_cs.message)}
74 77 </div>
75 78 %endfor
76 79 %else:
77 80 <div class="parent">${_('No parents')}</div>
78 81 %endif
79 82
80 83 <span class="logtags">
81 84 <span class="branchtag" title="${'%s %s' % (_('branch'),cs.branch)}">
82 85 ${h.link_to(cs.branch,h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}</span>
83 86 %for tag in cs.tags:
84 87 <span class="tagtag" title="${'%s %s' % (_('tag'),tag)}">
85 88 ${h.link_to(tag,h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}</span>
86 89 %endfor
87 90 </span>
88 91 </div>
89 92 </div>
90 93
91 94 %endfor
92 95 <div class="pagination-wh pagination-left">
93 96 ${c.pagination.pager('$link_previous ~2~ $link_next')}
94 97 </div>
95 98 </div>
96 99 </div>
97 100
98 101 <script type="text/javascript" src="/js/graph.js"></script>
99 102 <script type="text/javascript">
100 103 YAHOO.util.Event.onDOMReady(function(){
101 104 function set_canvas() {
102 105 var c = document.getElementById('graph_nodes');
103 106 var t = document.getElementById('graph_content');
104 107 canvas = document.getElementById('graph_canvas');
105 108 var div_h = t.clientHeight;
106 109 c.style.height=div_h+'px';
107 110 canvas.setAttribute('height',div_h);
108 111 canvas.setAttribute('width',160);
109 112 };
110 113 set_canvas();
111 114 var jsdata = ${c.jsdata|n};
112 115 var r = new BranchRenderer();
113 116 r.render(jsdata);
114 117 });
115 118 </script>
116 119 %else:
117 120 ${_('There are no changes yet')}
118 121 %endif
119 122 </div>
120 123 </div>
121 124 </%def> No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now