##// END OF EJS Templates
comments: avoid storing 'No comments' text when changing status...
Thomas De Schampheleire -
r5068:140f2811 default
parent child Browse files
Show More
@@ -1,476 +1,476 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 # This program is free software: you can redistribute it and/or modify
2 # This program is free software: you can redistribute it and/or modify
3 # it under the terms of the GNU General Public License as published by
3 # it under the terms of the GNU General Public License as published by
4 # the Free Software Foundation, either version 3 of the License, or
4 # the Free Software Foundation, either version 3 of the License, or
5 # (at your option) any later version.
5 # (at your option) any later version.
6 #
6 #
7 # This program is distributed in the hope that it will be useful,
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
10 # GNU General Public License for more details.
11 #
11 #
12 # You should have received a copy of the GNU General Public License
12 # You should have received a copy of the GNU General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 """
14 """
15 kallithea.controllers.changeset
15 kallithea.controllers.changeset
16 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
16 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
17
17
18 changeset controller for pylons showing changes between
18 changeset controller for pylons showing changes between
19 revisions
19 revisions
20
20
21 This file was forked by the Kallithea project in July 2014.
21 This file was forked by the Kallithea project in July 2014.
22 Original author and date, and relevant copyright and licensing information is below:
22 Original author and date, and relevant copyright and licensing information is below:
23 :created_on: Apr 25, 2010
23 :created_on: Apr 25, 2010
24 :author: marcink
24 :author: marcink
25 :copyright: (c) 2013 RhodeCode GmbH, and others.
25 :copyright: (c) 2013 RhodeCode GmbH, and others.
26 :license: GPLv3, see LICENSE.md for more details.
26 :license: GPLv3, see LICENSE.md for more details.
27 """
27 """
28
28
29 import logging
29 import logging
30 import traceback
30 import traceback
31 from collections import defaultdict
31 from collections import defaultdict
32 from webob.exc import HTTPForbidden, HTTPBadRequest, HTTPNotFound
32 from webob.exc import HTTPForbidden, HTTPBadRequest, HTTPNotFound
33
33
34 from pylons import tmpl_context as c, request, response
34 from pylons import tmpl_context as c, request, response
35 from pylons.i18n.translation import _
35 from pylons.i18n.translation import _
36 from pylons.controllers.util import redirect
36 from pylons.controllers.util import redirect
37 from kallithea.lib.utils import jsonify
37 from kallithea.lib.utils import jsonify
38
38
39 from kallithea.lib.vcs.exceptions import RepositoryError, \
39 from kallithea.lib.vcs.exceptions import RepositoryError, \
40 ChangesetDoesNotExistError
40 ChangesetDoesNotExistError
41
41
42 from kallithea.lib.compat import json
42 from kallithea.lib.compat import json
43 import kallithea.lib.helpers as h
43 import kallithea.lib.helpers as h
44 from kallithea.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator,\
44 from kallithea.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator,\
45 NotAnonymous
45 NotAnonymous
46 from kallithea.lib.base import BaseRepoController, render
46 from kallithea.lib.base import BaseRepoController, render
47 from kallithea.lib.utils import action_logger
47 from kallithea.lib.utils import action_logger
48 from kallithea.lib.compat import OrderedDict
48 from kallithea.lib.compat import OrderedDict
49 from kallithea.lib import diffs
49 from kallithea.lib import diffs
50 from kallithea.model.db import ChangesetComment, ChangesetStatus
50 from kallithea.model.db import ChangesetComment, ChangesetStatus
51 from kallithea.model.comment import ChangesetCommentsModel
51 from kallithea.model.comment import ChangesetCommentsModel
52 from kallithea.model.changeset_status import ChangesetStatusModel
52 from kallithea.model.changeset_status import ChangesetStatusModel
53 from kallithea.model.meta import Session
53 from kallithea.model.meta import Session
54 from kallithea.model.repo import RepoModel
54 from kallithea.model.repo import RepoModel
55 from kallithea.lib.diffs import LimitedDiffContainer
55 from kallithea.lib.diffs import LimitedDiffContainer
56 from kallithea.lib.exceptions import StatusChangeOnClosedPullRequestError
56 from kallithea.lib.exceptions import StatusChangeOnClosedPullRequestError
57 from kallithea.lib.vcs.backends.base import EmptyChangeset
57 from kallithea.lib.vcs.backends.base import EmptyChangeset
58 from kallithea.lib.utils2 import safe_unicode
58 from kallithea.lib.utils2 import safe_unicode
59 from kallithea.lib.graphmod import graph_data
59 from kallithea.lib.graphmod import graph_data
60
60
61 log = logging.getLogger(__name__)
61 log = logging.getLogger(__name__)
62
62
63
63
64 def _update_with_GET(params, GET):
64 def _update_with_GET(params, GET):
65 for k in ['diff1', 'diff2', 'diff']:
65 for k in ['diff1', 'diff2', 'diff']:
66 params[k] += GET.getall(k)
66 params[k] += GET.getall(k)
67
67
68
68
69 def anchor_url(revision, path, GET):
69 def anchor_url(revision, path, GET):
70 fid = h.FID(revision, path)
70 fid = h.FID(revision, path)
71 return h.url.current(anchor=fid, **dict(GET))
71 return h.url.current(anchor=fid, **dict(GET))
72
72
73
73
74 def get_ignore_ws(fid, GET):
74 def get_ignore_ws(fid, GET):
75 ig_ws_global = GET.get('ignorews')
75 ig_ws_global = GET.get('ignorews')
76 ig_ws = filter(lambda k: k.startswith('WS'), GET.getall(fid))
76 ig_ws = filter(lambda k: k.startswith('WS'), GET.getall(fid))
77 if ig_ws:
77 if ig_ws:
78 try:
78 try:
79 return int(ig_ws[0].split(':')[-1])
79 return int(ig_ws[0].split(':')[-1])
80 except ValueError:
80 except ValueError:
81 raise HTTPBadRequest()
81 raise HTTPBadRequest()
82 return ig_ws_global
82 return ig_ws_global
83
83
84
84
85 def _ignorews_url(GET, fileid=None):
85 def _ignorews_url(GET, fileid=None):
86 fileid = str(fileid) if fileid else None
86 fileid = str(fileid) if fileid else None
87 params = defaultdict(list)
87 params = defaultdict(list)
88 _update_with_GET(params, GET)
88 _update_with_GET(params, GET)
89 lbl = _('Show whitespace')
89 lbl = _('Show whitespace')
90 ig_ws = get_ignore_ws(fileid, GET)
90 ig_ws = get_ignore_ws(fileid, GET)
91 ln_ctx = get_line_ctx(fileid, GET)
91 ln_ctx = get_line_ctx(fileid, GET)
92 # global option
92 # global option
93 if fileid is None:
93 if fileid is None:
94 if ig_ws is None:
94 if ig_ws is None:
95 params['ignorews'] += [1]
95 params['ignorews'] += [1]
96 lbl = _('Ignore whitespace')
96 lbl = _('Ignore whitespace')
97 ctx_key = 'context'
97 ctx_key = 'context'
98 ctx_val = ln_ctx
98 ctx_val = ln_ctx
99 # per file options
99 # per file options
100 else:
100 else:
101 if ig_ws is None:
101 if ig_ws is None:
102 params[fileid] += ['WS:1']
102 params[fileid] += ['WS:1']
103 lbl = _('Ignore whitespace')
103 lbl = _('Ignore whitespace')
104
104
105 ctx_key = fileid
105 ctx_key = fileid
106 ctx_val = 'C:%s' % ln_ctx
106 ctx_val = 'C:%s' % ln_ctx
107 # if we have passed in ln_ctx pass it along to our params
107 # if we have passed in ln_ctx pass it along to our params
108 if ln_ctx:
108 if ln_ctx:
109 params[ctx_key] += [ctx_val]
109 params[ctx_key] += [ctx_val]
110
110
111 params['anchor'] = fileid
111 params['anchor'] = fileid
112 icon = h.literal('<i class="icon-strike"></i>')
112 icon = h.literal('<i class="icon-strike"></i>')
113 return h.link_to(icon, h.url.current(**params), title=lbl, class_='tooltip')
113 return h.link_to(icon, h.url.current(**params), title=lbl, class_='tooltip')
114
114
115
115
116 def get_line_ctx(fid, GET):
116 def get_line_ctx(fid, GET):
117 ln_ctx_global = GET.get('context')
117 ln_ctx_global = GET.get('context')
118 if fid:
118 if fid:
119 ln_ctx = filter(lambda k: k.startswith('C'), GET.getall(fid))
119 ln_ctx = filter(lambda k: k.startswith('C'), GET.getall(fid))
120 else:
120 else:
121 _ln_ctx = filter(lambda k: k.startswith('C'), GET)
121 _ln_ctx = filter(lambda k: k.startswith('C'), GET)
122 ln_ctx = GET.get(_ln_ctx[0]) if _ln_ctx else ln_ctx_global
122 ln_ctx = GET.get(_ln_ctx[0]) if _ln_ctx else ln_ctx_global
123 if ln_ctx:
123 if ln_ctx:
124 ln_ctx = [ln_ctx]
124 ln_ctx = [ln_ctx]
125
125
126 if ln_ctx:
126 if ln_ctx:
127 retval = ln_ctx[0].split(':')[-1]
127 retval = ln_ctx[0].split(':')[-1]
128 else:
128 else:
129 retval = ln_ctx_global
129 retval = ln_ctx_global
130
130
131 try:
131 try:
132 return int(retval)
132 return int(retval)
133 except Exception:
133 except Exception:
134 return 3
134 return 3
135
135
136
136
137 def _context_url(GET, fileid=None):
137 def _context_url(GET, fileid=None):
138 """
138 """
139 Generates url for context lines
139 Generates url for context lines
140
140
141 :param fileid:
141 :param fileid:
142 """
142 """
143
143
144 fileid = str(fileid) if fileid else None
144 fileid = str(fileid) if fileid else None
145 ig_ws = get_ignore_ws(fileid, GET)
145 ig_ws = get_ignore_ws(fileid, GET)
146 ln_ctx = (get_line_ctx(fileid, GET) or 3) * 2
146 ln_ctx = (get_line_ctx(fileid, GET) or 3) * 2
147
147
148 params = defaultdict(list)
148 params = defaultdict(list)
149 _update_with_GET(params, GET)
149 _update_with_GET(params, GET)
150
150
151 # global option
151 # global option
152 if fileid is None:
152 if fileid is None:
153 if ln_ctx > 0:
153 if ln_ctx > 0:
154 params['context'] += [ln_ctx]
154 params['context'] += [ln_ctx]
155
155
156 if ig_ws:
156 if ig_ws:
157 ig_ws_key = 'ignorews'
157 ig_ws_key = 'ignorews'
158 ig_ws_val = 1
158 ig_ws_val = 1
159
159
160 # per file option
160 # per file option
161 else:
161 else:
162 params[fileid] += ['C:%s' % ln_ctx]
162 params[fileid] += ['C:%s' % ln_ctx]
163 ig_ws_key = fileid
163 ig_ws_key = fileid
164 ig_ws_val = 'WS:%s' % 1
164 ig_ws_val = 'WS:%s' % 1
165
165
166 if ig_ws:
166 if ig_ws:
167 params[ig_ws_key] += [ig_ws_val]
167 params[ig_ws_key] += [ig_ws_val]
168
168
169 lbl = _('increase diff context to %(num)s lines') % {'num': ln_ctx}
169 lbl = _('increase diff context to %(num)s lines') % {'num': ln_ctx}
170
170
171 params['anchor'] = fileid
171 params['anchor'] = fileid
172 icon = h.literal('<i class="icon-sort"></i>')
172 icon = h.literal('<i class="icon-sort"></i>')
173 return h.link_to(icon, h.url.current(**params), title=lbl, class_='tooltip')
173 return h.link_to(icon, h.url.current(**params), title=lbl, class_='tooltip')
174
174
175
175
176 class ChangesetController(BaseRepoController):
176 class ChangesetController(BaseRepoController):
177
177
178 def __before__(self):
178 def __before__(self):
179 super(ChangesetController, self).__before__()
179 super(ChangesetController, self).__before__()
180 c.affected_files_cut_off = 60
180 c.affected_files_cut_off = 60
181
181
182 def __load_data(self):
182 def __load_data(self):
183 repo_model = RepoModel()
183 repo_model = RepoModel()
184 c.users_array = repo_model.get_users_js()
184 c.users_array = repo_model.get_users_js()
185 c.user_groups_array = repo_model.get_user_groups_js()
185 c.user_groups_array = repo_model.get_user_groups_js()
186
186
187 def _index(self, revision, method):
187 def _index(self, revision, method):
188 c.anchor_url = anchor_url
188 c.anchor_url = anchor_url
189 c.ignorews_url = _ignorews_url
189 c.ignorews_url = _ignorews_url
190 c.context_url = _context_url
190 c.context_url = _context_url
191 c.fulldiff = fulldiff = request.GET.get('fulldiff')
191 c.fulldiff = fulldiff = request.GET.get('fulldiff')
192 #get ranges of revisions if preset
192 #get ranges of revisions if preset
193 rev_range = revision.split('...')[:2]
193 rev_range = revision.split('...')[:2]
194 enable_comments = True
194 enable_comments = True
195 c.cs_repo = c.db_repo
195 c.cs_repo = c.db_repo
196 try:
196 try:
197 if len(rev_range) == 2:
197 if len(rev_range) == 2:
198 enable_comments = False
198 enable_comments = False
199 rev_start = rev_range[0]
199 rev_start = rev_range[0]
200 rev_end = rev_range[1]
200 rev_end = rev_range[1]
201 rev_ranges = c.db_repo_scm_instance.get_changesets(start=rev_start,
201 rev_ranges = c.db_repo_scm_instance.get_changesets(start=rev_start,
202 end=rev_end)
202 end=rev_end)
203 else:
203 else:
204 rev_ranges = [c.db_repo_scm_instance.get_changeset(revision)]
204 rev_ranges = [c.db_repo_scm_instance.get_changeset(revision)]
205
205
206 c.cs_ranges = list(rev_ranges)
206 c.cs_ranges = list(rev_ranges)
207 if not c.cs_ranges:
207 if not c.cs_ranges:
208 raise RepositoryError('Changeset range returned empty result')
208 raise RepositoryError('Changeset range returned empty result')
209
209
210 except(ChangesetDoesNotExistError,), e:
210 except(ChangesetDoesNotExistError,), e:
211 log.error(traceback.format_exc())
211 log.error(traceback.format_exc())
212 msg = _('Such revision does not exist for this repository')
212 msg = _('Such revision does not exist for this repository')
213 h.flash(msg, category='error')
213 h.flash(msg, category='error')
214 raise HTTPNotFound()
214 raise HTTPNotFound()
215
215
216 c.changes = OrderedDict()
216 c.changes = OrderedDict()
217
217
218 c.lines_added = 0 # count of lines added
218 c.lines_added = 0 # count of lines added
219 c.lines_deleted = 0 # count of lines removes
219 c.lines_deleted = 0 # count of lines removes
220
220
221 c.changeset_statuses = ChangesetStatus.STATUSES
221 c.changeset_statuses = ChangesetStatus.STATUSES
222 comments = dict()
222 comments = dict()
223 c.statuses = []
223 c.statuses = []
224 c.inline_comments = []
224 c.inline_comments = []
225 c.inline_cnt = 0
225 c.inline_cnt = 0
226
226
227 # Iterate over ranges (default changeset view is always one changeset)
227 # Iterate over ranges (default changeset view is always one changeset)
228 for changeset in c.cs_ranges:
228 for changeset in c.cs_ranges:
229 inlines = []
229 inlines = []
230 if method == 'show':
230 if method == 'show':
231 c.statuses.extend([ChangesetStatusModel().get_status(
231 c.statuses.extend([ChangesetStatusModel().get_status(
232 c.db_repo.repo_id, changeset.raw_id)])
232 c.db_repo.repo_id, changeset.raw_id)])
233
233
234 # Changeset comments
234 # Changeset comments
235 comments.update((com.comment_id, com)
235 comments.update((com.comment_id, com)
236 for com in ChangesetCommentsModel()
236 for com in ChangesetCommentsModel()
237 .get_comments(c.db_repo.repo_id,
237 .get_comments(c.db_repo.repo_id,
238 revision=changeset.raw_id))
238 revision=changeset.raw_id))
239
239
240 # Status change comments - mostly from pull requests
240 # Status change comments - mostly from pull requests
241 comments.update((st.changeset_comment_id, st.comment)
241 comments.update((st.changeset_comment_id, st.comment)
242 for st in ChangesetStatusModel()
242 for st in ChangesetStatusModel()
243 .get_statuses(c.db_repo.repo_id,
243 .get_statuses(c.db_repo.repo_id,
244 changeset.raw_id, with_revisions=True))
244 changeset.raw_id, with_revisions=True))
245
245
246 inlines = ChangesetCommentsModel()\
246 inlines = ChangesetCommentsModel()\
247 .get_inline_comments(c.db_repo.repo_id,
247 .get_inline_comments(c.db_repo.repo_id,
248 revision=changeset.raw_id)
248 revision=changeset.raw_id)
249 c.inline_comments.extend(inlines)
249 c.inline_comments.extend(inlines)
250
250
251 c.changes[changeset.raw_id] = []
251 c.changes[changeset.raw_id] = []
252
252
253 cs2 = changeset.raw_id
253 cs2 = changeset.raw_id
254 cs1 = changeset.parents[0].raw_id if changeset.parents else EmptyChangeset().raw_id
254 cs1 = changeset.parents[0].raw_id if changeset.parents else EmptyChangeset().raw_id
255 context_lcl = get_line_ctx('', request.GET)
255 context_lcl = get_line_ctx('', request.GET)
256 ign_whitespace_lcl = ign_whitespace_lcl = get_ignore_ws('', request.GET)
256 ign_whitespace_lcl = ign_whitespace_lcl = get_ignore_ws('', request.GET)
257
257
258 _diff = c.db_repo_scm_instance.get_diff(cs1, cs2,
258 _diff = c.db_repo_scm_instance.get_diff(cs1, cs2,
259 ignore_whitespace=ign_whitespace_lcl, context=context_lcl)
259 ignore_whitespace=ign_whitespace_lcl, context=context_lcl)
260 diff_limit = self.cut_off_limit if not fulldiff else None
260 diff_limit = self.cut_off_limit if not fulldiff else None
261 diff_processor = diffs.DiffProcessor(_diff,
261 diff_processor = diffs.DiffProcessor(_diff,
262 vcs=c.db_repo_scm_instance.alias,
262 vcs=c.db_repo_scm_instance.alias,
263 format='gitdiff',
263 format='gitdiff',
264 diff_limit=diff_limit)
264 diff_limit=diff_limit)
265 cs_changes = OrderedDict()
265 cs_changes = OrderedDict()
266 if method == 'show':
266 if method == 'show':
267 _parsed = diff_processor.prepare()
267 _parsed = diff_processor.prepare()
268 c.limited_diff = False
268 c.limited_diff = False
269 if isinstance(_parsed, LimitedDiffContainer):
269 if isinstance(_parsed, LimitedDiffContainer):
270 c.limited_diff = True
270 c.limited_diff = True
271 for f in _parsed:
271 for f in _parsed:
272 st = f['stats']
272 st = f['stats']
273 c.lines_added += st['added']
273 c.lines_added += st['added']
274 c.lines_deleted += st['deleted']
274 c.lines_deleted += st['deleted']
275 fid = h.FID(changeset.raw_id, f['filename'])
275 fid = h.FID(changeset.raw_id, f['filename'])
276 diff = diff_processor.as_html(enable_comments=enable_comments,
276 diff = diff_processor.as_html(enable_comments=enable_comments,
277 parsed_lines=[f])
277 parsed_lines=[f])
278 cs_changes[fid] = [cs1, cs2, f['operation'], f['filename'],
278 cs_changes[fid] = [cs1, cs2, f['operation'], f['filename'],
279 diff, st]
279 diff, st]
280 else:
280 else:
281 # downloads/raw we only need RAW diff nothing else
281 # downloads/raw we only need RAW diff nothing else
282 diff = diff_processor.as_raw()
282 diff = diff_processor.as_raw()
283 cs_changes[''] = [None, None, None, None, diff, None]
283 cs_changes[''] = [None, None, None, None, diff, None]
284 c.changes[changeset.raw_id] = cs_changes
284 c.changes[changeset.raw_id] = cs_changes
285
285
286 #sort comments in creation order
286 #sort comments in creation order
287 c.comments = [com for com_id, com in sorted(comments.items())]
287 c.comments = [com for com_id, com in sorted(comments.items())]
288
288
289 # count inline comments
289 # count inline comments
290 for __, lines in c.inline_comments:
290 for __, lines in c.inline_comments:
291 for comments in lines.values():
291 for comments in lines.values():
292 c.inline_cnt += len(comments)
292 c.inline_cnt += len(comments)
293
293
294 if len(c.cs_ranges) == 1:
294 if len(c.cs_ranges) == 1:
295 c.changeset = c.cs_ranges[0]
295 c.changeset = c.cs_ranges[0]
296 c.parent_tmpl = ''.join(['# Parent %s\n' % x.raw_id
296 c.parent_tmpl = ''.join(['# Parent %s\n' % x.raw_id
297 for x in c.changeset.parents])
297 for x in c.changeset.parents])
298 if method == 'download':
298 if method == 'download':
299 response.content_type = 'text/plain'
299 response.content_type = 'text/plain'
300 response.content_disposition = 'attachment; filename=%s.diff' \
300 response.content_disposition = 'attachment; filename=%s.diff' \
301 % revision[:12]
301 % revision[:12]
302 return diff
302 return diff
303 elif method == 'patch':
303 elif method == 'patch':
304 response.content_type = 'text/plain'
304 response.content_type = 'text/plain'
305 c.diff = safe_unicode(diff)
305 c.diff = safe_unicode(diff)
306 return render('changeset/patch_changeset.html')
306 return render('changeset/patch_changeset.html')
307 elif method == 'raw':
307 elif method == 'raw':
308 response.content_type = 'text/plain'
308 response.content_type = 'text/plain'
309 return diff
309 return diff
310 elif method == 'show':
310 elif method == 'show':
311 self.__load_data()
311 self.__load_data()
312 if len(c.cs_ranges) == 1:
312 if len(c.cs_ranges) == 1:
313 return render('changeset/changeset.html')
313 return render('changeset/changeset.html')
314 else:
314 else:
315 c.cs_ranges_org = None
315 c.cs_ranges_org = None
316 c.cs_comments = {}
316 c.cs_comments = {}
317 revs = [ctx.revision for ctx in reversed(c.cs_ranges)]
317 revs = [ctx.revision for ctx in reversed(c.cs_ranges)]
318 c.jsdata = json.dumps(graph_data(c.db_repo_scm_instance, revs))
318 c.jsdata = json.dumps(graph_data(c.db_repo_scm_instance, revs))
319 return render('changeset/changeset_range.html')
319 return render('changeset/changeset_range.html')
320
320
321 @LoginRequired()
321 @LoginRequired()
322 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
322 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
323 'repository.admin')
323 'repository.admin')
324 def index(self, revision, method='show'):
324 def index(self, revision, method='show'):
325 return self._index(revision, method=method)
325 return self._index(revision, method=method)
326
326
327 @LoginRequired()
327 @LoginRequired()
328 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
328 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
329 'repository.admin')
329 'repository.admin')
330 def changeset_raw(self, revision):
330 def changeset_raw(self, revision):
331 return self._index(revision, method='raw')
331 return self._index(revision, method='raw')
332
332
333 @LoginRequired()
333 @LoginRequired()
334 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
334 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
335 'repository.admin')
335 'repository.admin')
336 def changeset_patch(self, revision):
336 def changeset_patch(self, revision):
337 return self._index(revision, method='patch')
337 return self._index(revision, method='patch')
338
338
339 @LoginRequired()
339 @LoginRequired()
340 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
340 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
341 'repository.admin')
341 'repository.admin')
342 def changeset_download(self, revision):
342 def changeset_download(self, revision):
343 return self._index(revision, method='download')
343 return self._index(revision, method='download')
344
344
345 @LoginRequired()
345 @LoginRequired()
346 @NotAnonymous()
346 @NotAnonymous()
347 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
347 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
348 'repository.admin')
348 'repository.admin')
349 @jsonify
349 @jsonify
350 def comment(self, repo_name, revision):
350 def comment(self, repo_name, revision):
351 status = request.POST.get('changeset_status')
351 status = request.POST.get('changeset_status')
352 text = request.POST.get('text', '').strip() or _('No comments.')
352 text = request.POST.get('text', '').strip()
353
353
354 c.co = comm = ChangesetCommentsModel().create(
354 c.co = comm = ChangesetCommentsModel().create(
355 text=text,
355 text=text,
356 repo=c.db_repo.repo_id,
356 repo=c.db_repo.repo_id,
357 user=c.authuser.user_id,
357 user=c.authuser.user_id,
358 revision=revision,
358 revision=revision,
359 f_path=request.POST.get('f_path'),
359 f_path=request.POST.get('f_path'),
360 line_no=request.POST.get('line'),
360 line_no=request.POST.get('line'),
361 status_change=(ChangesetStatus.get_status_lbl(status)
361 status_change=(ChangesetStatus.get_status_lbl(status)
362 if status else None)
362 if status else None)
363 )
363 )
364
364
365 # get status if set !
365 # get status if set !
366 if status:
366 if status:
367 # if latest status was from pull request and it's closed
367 # if latest status was from pull request and it's closed
368 # disallow changing status !
368 # disallow changing status !
369 # dont_allow_on_closed_pull_request = True !
369 # dont_allow_on_closed_pull_request = True !
370
370
371 try:
371 try:
372 ChangesetStatusModel().set_status(
372 ChangesetStatusModel().set_status(
373 c.db_repo.repo_id,
373 c.db_repo.repo_id,
374 status,
374 status,
375 c.authuser.user_id,
375 c.authuser.user_id,
376 comm,
376 comm,
377 revision=revision,
377 revision=revision,
378 dont_allow_on_closed_pull_request=True
378 dont_allow_on_closed_pull_request=True
379 )
379 )
380 except StatusChangeOnClosedPullRequestError:
380 except StatusChangeOnClosedPullRequestError:
381 log.error(traceback.format_exc())
381 log.error(traceback.format_exc())
382 msg = _('Changing status on a changeset associated with '
382 msg = _('Changing status on a changeset associated with '
383 'a closed pull request is not allowed')
383 'a closed pull request is not allowed')
384 h.flash(msg, category='warning')
384 h.flash(msg, category='warning')
385 return redirect(h.url('changeset_home', repo_name=repo_name,
385 return redirect(h.url('changeset_home', repo_name=repo_name,
386 revision=revision))
386 revision=revision))
387 action_logger(self.authuser,
387 action_logger(self.authuser,
388 'user_commented_revision:%s' % revision,
388 'user_commented_revision:%s' % revision,
389 c.db_repo, self.ip_addr, self.sa)
389 c.db_repo, self.ip_addr, self.sa)
390
390
391 Session().commit()
391 Session().commit()
392
392
393 if not request.environ.get('HTTP_X_PARTIAL_XHR'):
393 if not request.environ.get('HTTP_X_PARTIAL_XHR'):
394 return redirect(h.url('changeset_home', repo_name=repo_name,
394 return redirect(h.url('changeset_home', repo_name=repo_name,
395 revision=revision))
395 revision=revision))
396 #only ajax below
396 #only ajax below
397 data = {
397 data = {
398 'target_id': h.safeid(h.safe_unicode(request.POST.get('f_path'))),
398 'target_id': h.safeid(h.safe_unicode(request.POST.get('f_path'))),
399 }
399 }
400 if comm:
400 if comm:
401 data.update(comm.get_dict())
401 data.update(comm.get_dict())
402 data.update({'rendered_text':
402 data.update({'rendered_text':
403 render('changeset/changeset_comment_block.html')})
403 render('changeset/changeset_comment_block.html')})
404
404
405 return data
405 return data
406
406
407 @LoginRequired()
407 @LoginRequired()
408 @NotAnonymous()
408 @NotAnonymous()
409 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
409 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
410 'repository.admin')
410 'repository.admin')
411 def preview_comment(self):
411 def preview_comment(self):
412 if not request.environ.get('HTTP_X_PARTIAL_XHR'):
412 if not request.environ.get('HTTP_X_PARTIAL_XHR'):
413 raise HTTPBadRequest()
413 raise HTTPBadRequest()
414 text = request.POST.get('text')
414 text = request.POST.get('text')
415 if text:
415 if text:
416 return h.rst_w_mentions(text)
416 return h.rst_w_mentions(text)
417 return ''
417 return ''
418
418
419 @LoginRequired()
419 @LoginRequired()
420 @NotAnonymous()
420 @NotAnonymous()
421 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
421 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
422 'repository.admin')
422 'repository.admin')
423 @jsonify
423 @jsonify
424 def delete_comment(self, repo_name, comment_id):
424 def delete_comment(self, repo_name, comment_id):
425 co = ChangesetComment.get(comment_id)
425 co = ChangesetComment.get(comment_id)
426 if not co:
426 if not co:
427 raise HTTPBadRequest()
427 raise HTTPBadRequest()
428 owner = co.author.user_id == c.authuser.user_id
428 owner = co.author.user_id == c.authuser.user_id
429 repo_admin = h.HasRepoPermissionAny('repository.admin')
429 repo_admin = h.HasRepoPermissionAny('repository.admin')
430 if h.HasPermissionAny('hg.admin')() or repo_admin or owner:
430 if h.HasPermissionAny('hg.admin')() or repo_admin or owner:
431 ChangesetCommentsModel().delete(comment=co)
431 ChangesetCommentsModel().delete(comment=co)
432 Session().commit()
432 Session().commit()
433 return True
433 return True
434 else:
434 else:
435 raise HTTPForbidden()
435 raise HTTPForbidden()
436
436
437 @LoginRequired()
437 @LoginRequired()
438 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
438 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
439 'repository.admin')
439 'repository.admin')
440 @jsonify
440 @jsonify
441 def changeset_info(self, repo_name, revision):
441 def changeset_info(self, repo_name, revision):
442 if request.is_xhr:
442 if request.is_xhr:
443 try:
443 try:
444 return c.db_repo_scm_instance.get_changeset(revision)
444 return c.db_repo_scm_instance.get_changeset(revision)
445 except ChangesetDoesNotExistError, e:
445 except ChangesetDoesNotExistError, e:
446 return EmptyChangeset(message=str(e))
446 return EmptyChangeset(message=str(e))
447 else:
447 else:
448 raise HTTPBadRequest()
448 raise HTTPBadRequest()
449
449
450 @LoginRequired()
450 @LoginRequired()
451 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
451 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
452 'repository.admin')
452 'repository.admin')
453 @jsonify
453 @jsonify
454 def changeset_children(self, repo_name, revision):
454 def changeset_children(self, repo_name, revision):
455 if request.is_xhr:
455 if request.is_xhr:
456 changeset = c.db_repo_scm_instance.get_changeset(revision)
456 changeset = c.db_repo_scm_instance.get_changeset(revision)
457 result = {"results": []}
457 result = {"results": []}
458 if changeset.children:
458 if changeset.children:
459 result = {"results": changeset.children}
459 result = {"results": changeset.children}
460 return result
460 return result
461 else:
461 else:
462 raise HTTPBadRequest()
462 raise HTTPBadRequest()
463
463
464 @LoginRequired()
464 @LoginRequired()
465 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
465 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
466 'repository.admin')
466 'repository.admin')
467 @jsonify
467 @jsonify
468 def changeset_parents(self, repo_name, revision):
468 def changeset_parents(self, repo_name, revision):
469 if request.is_xhr:
469 if request.is_xhr:
470 changeset = c.db_repo_scm_instance.get_changeset(revision)
470 changeset = c.db_repo_scm_instance.get_changeset(revision)
471 result = {"results": []}
471 result = {"results": []}
472 if changeset.parents:
472 if changeset.parents:
473 result = {"results": changeset.parents}
473 result = {"results": changeset.parents}
474 return result
474 return result
475 else:
475 else:
476 raise HTTPBadRequest()
476 raise HTTPBadRequest()
@@ -1,770 +1,770 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 # This program is free software: you can redistribute it and/or modify
2 # This program is free software: you can redistribute it and/or modify
3 # it under the terms of the GNU General Public License as published by
3 # it under the terms of the GNU General Public License as published by
4 # the Free Software Foundation, either version 3 of the License, or
4 # the Free Software Foundation, either version 3 of the License, or
5 # (at your option) any later version.
5 # (at your option) any later version.
6 #
6 #
7 # This program is distributed in the hope that it will be useful,
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
10 # GNU General Public License for more details.
11 #
11 #
12 # You should have received a copy of the GNU General Public License
12 # You should have received a copy of the GNU General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 """
14 """
15 kallithea.controllers.pullrequests
15 kallithea.controllers.pullrequests
16 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
16 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
17
17
18 pull requests controller for Kallithea for initializing pull requests
18 pull requests controller for Kallithea for initializing pull requests
19
19
20 This file was forked by the Kallithea project in July 2014.
20 This file was forked by the Kallithea project in July 2014.
21 Original author and date, and relevant copyright and licensing information is below:
21 Original author and date, and relevant copyright and licensing information is below:
22 :created_on: May 7, 2012
22 :created_on: May 7, 2012
23 :author: marcink
23 :author: marcink
24 :copyright: (c) 2013 RhodeCode GmbH, and others.
24 :copyright: (c) 2013 RhodeCode GmbH, and others.
25 :license: GPLv3, see LICENSE.md for more details.
25 :license: GPLv3, see LICENSE.md for more details.
26 """
26 """
27
27
28 import logging
28 import logging
29 import traceback
29 import traceback
30 import formencode
30 import formencode
31 import re
31 import re
32
32
33 from webob.exc import HTTPNotFound, HTTPForbidden, HTTPBadRequest
33 from webob.exc import HTTPNotFound, HTTPForbidden, HTTPBadRequest
34
34
35 from pylons import request, tmpl_context as c, url
35 from pylons import request, tmpl_context as c, url
36 from pylons.controllers.util import redirect
36 from pylons.controllers.util import redirect
37 from pylons.i18n.translation import _
37 from pylons.i18n.translation import _
38
38
39 from kallithea.lib.vcs.utils.hgcompat import unionrepo
39 from kallithea.lib.vcs.utils.hgcompat import unionrepo
40 from kallithea.lib.compat import json
40 from kallithea.lib.compat import json
41 from kallithea.lib.base import BaseRepoController, render
41 from kallithea.lib.base import BaseRepoController, render
42 from kallithea.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator,\
42 from kallithea.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator,\
43 NotAnonymous
43 NotAnonymous
44 from kallithea.lib.helpers import Page
44 from kallithea.lib.helpers import Page
45 from kallithea.lib import helpers as h
45 from kallithea.lib import helpers as h
46 from kallithea.lib import diffs
46 from kallithea.lib import diffs
47 from kallithea.lib.utils import action_logger, jsonify
47 from kallithea.lib.utils import action_logger, jsonify
48 from kallithea.lib.vcs.utils import safe_str
48 from kallithea.lib.vcs.utils import safe_str
49 from kallithea.lib.vcs.exceptions import EmptyRepositoryError
49 from kallithea.lib.vcs.exceptions import EmptyRepositoryError
50 from kallithea.lib.diffs import LimitedDiffContainer
50 from kallithea.lib.diffs import LimitedDiffContainer
51 from kallithea.model.db import PullRequest, ChangesetStatus, ChangesetComment,\
51 from kallithea.model.db import PullRequest, ChangesetStatus, ChangesetComment,\
52 PullRequestReviewers
52 PullRequestReviewers
53 from kallithea.model.pull_request import PullRequestModel
53 from kallithea.model.pull_request import PullRequestModel
54 from kallithea.model.meta import Session
54 from kallithea.model.meta import Session
55 from kallithea.model.repo import RepoModel
55 from kallithea.model.repo import RepoModel
56 from kallithea.model.comment import ChangesetCommentsModel
56 from kallithea.model.comment import ChangesetCommentsModel
57 from kallithea.model.changeset_status import ChangesetStatusModel
57 from kallithea.model.changeset_status import ChangesetStatusModel
58 from kallithea.model.forms import PullRequestForm, PullRequestPostForm
58 from kallithea.model.forms import PullRequestForm, PullRequestPostForm
59 from kallithea.lib.utils2 import safe_int
59 from kallithea.lib.utils2 import safe_int
60 from kallithea.controllers.changeset import _ignorews_url,\
60 from kallithea.controllers.changeset import _ignorews_url,\
61 _context_url, get_line_ctx, get_ignore_ws
61 _context_url, get_line_ctx, get_ignore_ws
62 from kallithea.controllers.compare import CompareController
62 from kallithea.controllers.compare import CompareController
63 from kallithea.lib.graphmod import graph_data
63 from kallithea.lib.graphmod import graph_data
64
64
65 log = logging.getLogger(__name__)
65 log = logging.getLogger(__name__)
66
66
67
67
68 class PullrequestsController(BaseRepoController):
68 class PullrequestsController(BaseRepoController):
69
69
70 def __before__(self):
70 def __before__(self):
71 super(PullrequestsController, self).__before__()
71 super(PullrequestsController, self).__before__()
72 repo_model = RepoModel()
72 repo_model = RepoModel()
73 c.users_array = repo_model.get_users_js()
73 c.users_array = repo_model.get_users_js()
74 c.user_groups_array = repo_model.get_user_groups_js()
74 c.user_groups_array = repo_model.get_user_groups_js()
75
75
76 def _get_repo_refs(self, repo, rev=None, branch=None, branch_rev=None):
76 def _get_repo_refs(self, repo, rev=None, branch=None, branch_rev=None):
77 """return a structure with repo's interesting changesets, suitable for
77 """return a structure with repo's interesting changesets, suitable for
78 the selectors in pullrequest.html
78 the selectors in pullrequest.html
79
79
80 rev: a revision that must be in the list somehow and selected by default
80 rev: a revision that must be in the list somehow and selected by default
81 branch: a branch that must be in the list and selected by default - even if closed
81 branch: a branch that must be in the list and selected by default - even if closed
82 branch_rev: a revision of which peers should be preferred and available."""
82 branch_rev: a revision of which peers should be preferred and available."""
83 # list named branches that has been merged to this named branch - it should probably merge back
83 # list named branches that has been merged to this named branch - it should probably merge back
84 peers = []
84 peers = []
85
85
86 if rev:
86 if rev:
87 rev = safe_str(rev)
87 rev = safe_str(rev)
88
88
89 if branch:
89 if branch:
90 branch = safe_str(branch)
90 branch = safe_str(branch)
91
91
92 if branch_rev:
92 if branch_rev:
93 branch_rev = safe_str(branch_rev)
93 branch_rev = safe_str(branch_rev)
94 # a revset not restricting to merge() would be better
94 # a revset not restricting to merge() would be better
95 # (especially because it would get the branch point)
95 # (especially because it would get the branch point)
96 # ... but is currently too expensive
96 # ... but is currently too expensive
97 # including branches of children could be nice too
97 # including branches of children could be nice too
98 peerbranches = set()
98 peerbranches = set()
99 for i in repo._repo.revs(
99 for i in repo._repo.revs(
100 "sort(parents(branch(id(%s)) and merge()) - branch(id(%s)), -rev)",
100 "sort(parents(branch(id(%s)) and merge()) - branch(id(%s)), -rev)",
101 branch_rev, branch_rev):
101 branch_rev, branch_rev):
102 abranch = repo.get_changeset(i).branch
102 abranch = repo.get_changeset(i).branch
103 if abranch not in peerbranches:
103 if abranch not in peerbranches:
104 n = 'branch:%s:%s' % (abranch, repo.get_changeset(abranch).raw_id)
104 n = 'branch:%s:%s' % (abranch, repo.get_changeset(abranch).raw_id)
105 peers.append((n, abranch))
105 peers.append((n, abranch))
106 peerbranches.add(abranch)
106 peerbranches.add(abranch)
107
107
108 selected = None
108 selected = None
109 tiprev = repo.tags.get('tip')
109 tiprev = repo.tags.get('tip')
110 tipbranch = None
110 tipbranch = None
111
111
112 branches = []
112 branches = []
113 for abranch, branchrev in repo.branches.iteritems():
113 for abranch, branchrev in repo.branches.iteritems():
114 n = 'branch:%s:%s' % (abranch, branchrev)
114 n = 'branch:%s:%s' % (abranch, branchrev)
115 desc = abranch
115 desc = abranch
116 if branchrev == tiprev:
116 if branchrev == tiprev:
117 tipbranch = abranch
117 tipbranch = abranch
118 desc = '%s (current tip)' % desc
118 desc = '%s (current tip)' % desc
119 branches.append((n, desc))
119 branches.append((n, desc))
120 if rev == branchrev:
120 if rev == branchrev:
121 selected = n
121 selected = n
122 if branch == abranch:
122 if branch == abranch:
123 if not rev:
123 if not rev:
124 selected = n
124 selected = n
125 branch = None
125 branch = None
126 if branch: # branch not in list - it is probably closed
126 if branch: # branch not in list - it is probably closed
127 branchrev = repo.closed_branches.get(branch)
127 branchrev = repo.closed_branches.get(branch)
128 if branchrev:
128 if branchrev:
129 n = 'branch:%s:%s' % (branch, branchrev)
129 n = 'branch:%s:%s' % (branch, branchrev)
130 branches.append((n, _('%s (closed)') % branch))
130 branches.append((n, _('%s (closed)') % branch))
131 selected = n
131 selected = n
132 branch = None
132 branch = None
133 if branch:
133 if branch:
134 log.debug('branch %r not found in %s', branch, repo)
134 log.debug('branch %r not found in %s', branch, repo)
135
135
136 bookmarks = []
136 bookmarks = []
137 for bookmark, bookmarkrev in repo.bookmarks.iteritems():
137 for bookmark, bookmarkrev in repo.bookmarks.iteritems():
138 n = 'book:%s:%s' % (bookmark, bookmarkrev)
138 n = 'book:%s:%s' % (bookmark, bookmarkrev)
139 bookmarks.append((n, bookmark))
139 bookmarks.append((n, bookmark))
140 if rev == bookmarkrev:
140 if rev == bookmarkrev:
141 selected = n
141 selected = n
142
142
143 tags = []
143 tags = []
144 for tag, tagrev in repo.tags.iteritems():
144 for tag, tagrev in repo.tags.iteritems():
145 if tag == 'tip':
145 if tag == 'tip':
146 continue
146 continue
147 n = 'tag:%s:%s' % (tag, tagrev)
147 n = 'tag:%s:%s' % (tag, tagrev)
148 tags.append((n, tag))
148 tags.append((n, tag))
149 if rev == tagrev:
149 if rev == tagrev:
150 selected = n
150 selected = n
151
151
152 # prio 1: rev was selected as existing entry above
152 # prio 1: rev was selected as existing entry above
153
153
154 # prio 2: create special entry for rev; rev _must_ be used
154 # prio 2: create special entry for rev; rev _must_ be used
155 specials = []
155 specials = []
156 if rev and selected is None:
156 if rev and selected is None:
157 selected = 'rev:%s:%s' % (rev, rev)
157 selected = 'rev:%s:%s' % (rev, rev)
158 specials = [(selected, '%s: %s' % (_("Changeset"), rev[:12]))]
158 specials = [(selected, '%s: %s' % (_("Changeset"), rev[:12]))]
159
159
160 # prio 3: most recent peer branch
160 # prio 3: most recent peer branch
161 if peers and not selected:
161 if peers and not selected:
162 selected = peers[0][0]
162 selected = peers[0][0]
163
163
164 # prio 4: tip revision
164 # prio 4: tip revision
165 if not selected:
165 if not selected:
166 if h.is_hg(repo):
166 if h.is_hg(repo):
167 if tipbranch:
167 if tipbranch:
168 selected = 'branch:%s:%s' % (tipbranch, tiprev)
168 selected = 'branch:%s:%s' % (tipbranch, tiprev)
169 else:
169 else:
170 selected = 'tag:null:' + repo.EMPTY_CHANGESET
170 selected = 'tag:null:' + repo.EMPTY_CHANGESET
171 tags.append((selected, 'null'))
171 tags.append((selected, 'null'))
172 else:
172 else:
173 if 'master' in repo.branches:
173 if 'master' in repo.branches:
174 selected = 'branch:master:%s' % repo.branches['master']
174 selected = 'branch:master:%s' % repo.branches['master']
175 else:
175 else:
176 k, v = repo.branches.items()[0]
176 k, v = repo.branches.items()[0]
177 selected = 'branch:%s:%s' % (k, v)
177 selected = 'branch:%s:%s' % (k, v)
178
178
179 groups = [(specials, _("Special")),
179 groups = [(specials, _("Special")),
180 (peers, _("Peer branches")),
180 (peers, _("Peer branches")),
181 (bookmarks, _("Bookmarks")),
181 (bookmarks, _("Bookmarks")),
182 (branches, _("Branches")),
182 (branches, _("Branches")),
183 (tags, _("Tags")),
183 (tags, _("Tags")),
184 ]
184 ]
185 return [g for g in groups if g[0]], selected
185 return [g for g in groups if g[0]], selected
186
186
187 def _get_is_allowed_change_status(self, pull_request):
187 def _get_is_allowed_change_status(self, pull_request):
188 if pull_request.is_closed():
188 if pull_request.is_closed():
189 return False
189 return False
190
190
191 owner = self.authuser.user_id == pull_request.user_id
191 owner = self.authuser.user_id == pull_request.user_id
192 reviewer = self.authuser.user_id in [x.user_id for x in
192 reviewer = self.authuser.user_id in [x.user_id for x in
193 pull_request.reviewers]
193 pull_request.reviewers]
194 return self.authuser.admin or owner or reviewer
194 return self.authuser.admin or owner or reviewer
195
195
196 @LoginRequired()
196 @LoginRequired()
197 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
197 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
198 'repository.admin')
198 'repository.admin')
199 def show_all(self, repo_name):
199 def show_all(self, repo_name):
200 c.from_ = request.GET.get('from_') or ''
200 c.from_ = request.GET.get('from_') or ''
201 c.closed = request.GET.get('closed') or ''
201 c.closed = request.GET.get('closed') or ''
202 c.pull_requests = PullRequestModel().get_all(repo_name, from_=c.from_, closed=c.closed)
202 c.pull_requests = PullRequestModel().get_all(repo_name, from_=c.from_, closed=c.closed)
203 c.repo_name = repo_name
203 c.repo_name = repo_name
204 p = safe_int(request.GET.get('page', 1), 1)
204 p = safe_int(request.GET.get('page', 1), 1)
205
205
206 c.pullrequests_pager = Page(c.pull_requests, page=p, items_per_page=10)
206 c.pullrequests_pager = Page(c.pull_requests, page=p, items_per_page=10)
207
207
208 if request.environ.get('HTTP_X_PARTIAL_XHR'):
208 if request.environ.get('HTTP_X_PARTIAL_XHR'):
209 return render('/pullrequests/pullrequest_data.html')
209 return render('/pullrequests/pullrequest_data.html')
210
210
211 return render('/pullrequests/pullrequest_show_all.html')
211 return render('/pullrequests/pullrequest_show_all.html')
212
212
213 @LoginRequired()
213 @LoginRequired()
214 @NotAnonymous()
214 @NotAnonymous()
215 def show_my(self):
215 def show_my(self):
216 c.closed = request.GET.get('closed') or ''
216 c.closed = request.GET.get('closed') or ''
217
217
218 def _filter(pr):
218 def _filter(pr):
219 s = sorted(pr, key=lambda o: o.created_on, reverse=True)
219 s = sorted(pr, key=lambda o: o.created_on, reverse=True)
220 if not c.closed:
220 if not c.closed:
221 s = filter(lambda p: p.status != PullRequest.STATUS_CLOSED, s)
221 s = filter(lambda p: p.status != PullRequest.STATUS_CLOSED, s)
222 return s
222 return s
223
223
224 c.my_pull_requests = _filter(PullRequest.query()\
224 c.my_pull_requests = _filter(PullRequest.query()\
225 .filter(PullRequest.user_id ==
225 .filter(PullRequest.user_id ==
226 self.authuser.user_id)\
226 self.authuser.user_id)\
227 .all())
227 .all())
228
228
229 c.participate_in_pull_requests = _filter(PullRequest.query()\
229 c.participate_in_pull_requests = _filter(PullRequest.query()\
230 .join(PullRequestReviewers)\
230 .join(PullRequestReviewers)\
231 .filter(PullRequestReviewers.user_id ==
231 .filter(PullRequestReviewers.user_id ==
232 self.authuser.user_id)\
232 self.authuser.user_id)\
233 )
233 )
234
234
235 return render('/pullrequests/pullrequest_show_my.html')
235 return render('/pullrequests/pullrequest_show_my.html')
236
236
237 @LoginRequired()
237 @LoginRequired()
238 @NotAnonymous()
238 @NotAnonymous()
239 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
239 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
240 'repository.admin')
240 'repository.admin')
241 def index(self):
241 def index(self):
242 org_repo = c.db_repo
242 org_repo = c.db_repo
243 org_scm_instance = org_repo.scm_instance
243 org_scm_instance = org_repo.scm_instance
244 try:
244 try:
245 org_scm_instance.get_changeset()
245 org_scm_instance.get_changeset()
246 except EmptyRepositoryError, e:
246 except EmptyRepositoryError, e:
247 h.flash(h.literal(_('There are no changesets yet')),
247 h.flash(h.literal(_('There are no changesets yet')),
248 category='warning')
248 category='warning')
249 redirect(url('summary_home', repo_name=org_repo.repo_name))
249 redirect(url('summary_home', repo_name=org_repo.repo_name))
250
250
251 org_rev = request.GET.get('rev_end')
251 org_rev = request.GET.get('rev_end')
252 # rev_start is not directly useful - its parent could however be used
252 # rev_start is not directly useful - its parent could however be used
253 # as default for other and thus give a simple compare view
253 # as default for other and thus give a simple compare view
254 #other_rev = request.POST.get('rev_start')
254 #other_rev = request.POST.get('rev_start')
255 branch = request.GET.get('branch')
255 branch = request.GET.get('branch')
256
256
257 c.cs_repos = [(org_repo.repo_name, org_repo.repo_name)]
257 c.cs_repos = [(org_repo.repo_name, org_repo.repo_name)]
258 c.default_cs_repo = org_repo.repo_name
258 c.default_cs_repo = org_repo.repo_name
259 c.cs_refs, c.default_cs_ref = self._get_repo_refs(org_scm_instance, rev=org_rev, branch=branch)
259 c.cs_refs, c.default_cs_ref = self._get_repo_refs(org_scm_instance, rev=org_rev, branch=branch)
260
260
261 default_cs_ref_type, default_cs_branch, default_cs_rev = c.default_cs_ref.split(':')
261 default_cs_ref_type, default_cs_branch, default_cs_rev = c.default_cs_ref.split(':')
262 if default_cs_ref_type != 'branch':
262 if default_cs_ref_type != 'branch':
263 default_cs_branch = org_repo.get_changeset(default_cs_rev).branch
263 default_cs_branch = org_repo.get_changeset(default_cs_rev).branch
264
264
265 # add org repo to other so we can open pull request against peer branches on itself
265 # add org repo to other so we can open pull request against peer branches on itself
266 c.a_repos = [(org_repo.repo_name, '%s (self)' % org_repo.repo_name)]
266 c.a_repos = [(org_repo.repo_name, '%s (self)' % org_repo.repo_name)]
267
267
268 if org_repo.parent:
268 if org_repo.parent:
269 # add parent of this fork also and select it.
269 # add parent of this fork also and select it.
270 # use the same branch on destination as on source, if available.
270 # use the same branch on destination as on source, if available.
271 c.a_repos.append((org_repo.parent.repo_name, '%s (parent)' % org_repo.parent.repo_name))
271 c.a_repos.append((org_repo.parent.repo_name, '%s (parent)' % org_repo.parent.repo_name))
272 c.a_repo = org_repo.parent
272 c.a_repo = org_repo.parent
273 c.a_refs, c.default_a_ref = self._get_repo_refs(
273 c.a_refs, c.default_a_ref = self._get_repo_refs(
274 org_repo.parent.scm_instance, branch=default_cs_branch)
274 org_repo.parent.scm_instance, branch=default_cs_branch)
275
275
276 else:
276 else:
277 c.a_repo = org_repo
277 c.a_repo = org_repo
278 c.a_refs, c.default_a_ref = self._get_repo_refs(org_scm_instance) # without rev and branch
278 c.a_refs, c.default_a_ref = self._get_repo_refs(org_scm_instance) # without rev and branch
279
279
280 # gather forks and add to this list ... even though it is rare to
280 # gather forks and add to this list ... even though it is rare to
281 # request forks to pull from their parent
281 # request forks to pull from their parent
282 for fork in org_repo.forks:
282 for fork in org_repo.forks:
283 c.a_repos.append((fork.repo_name, fork.repo_name))
283 c.a_repos.append((fork.repo_name, fork.repo_name))
284
284
285 return render('/pullrequests/pullrequest.html')
285 return render('/pullrequests/pullrequest.html')
286
286
287 @LoginRequired()
287 @LoginRequired()
288 @NotAnonymous()
288 @NotAnonymous()
289 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
289 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
290 'repository.admin')
290 'repository.admin')
291 @jsonify
291 @jsonify
292 def repo_info(self, repo_name):
292 def repo_info(self, repo_name):
293 repo = RepoModel()._get_repo(repo_name)
293 repo = RepoModel()._get_repo(repo_name)
294 refs, selected_ref = self._get_repo_refs(repo.scm_instance)
294 refs, selected_ref = self._get_repo_refs(repo.scm_instance)
295 return {
295 return {
296 'description': repo.description.split('\n', 1)[0],
296 'description': repo.description.split('\n', 1)[0],
297 'selected_ref': selected_ref,
297 'selected_ref': selected_ref,
298 'refs': refs,
298 'refs': refs,
299 }
299 }
300
300
301 @LoginRequired()
301 @LoginRequired()
302 @NotAnonymous()
302 @NotAnonymous()
303 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
303 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
304 'repository.admin')
304 'repository.admin')
305 def create(self, repo_name):
305 def create(self, repo_name):
306 repo = RepoModel()._get_repo(repo_name)
306 repo = RepoModel()._get_repo(repo_name)
307 try:
307 try:
308 _form = PullRequestForm(repo.repo_id)().to_python(request.POST)
308 _form = PullRequestForm(repo.repo_id)().to_python(request.POST)
309 except formencode.Invalid, errors:
309 except formencode.Invalid, errors:
310 log.error(traceback.format_exc())
310 log.error(traceback.format_exc())
311 log.error(str(errors))
311 log.error(str(errors))
312 msg = _('Error creating pull request: %s') % errors.msg
312 msg = _('Error creating pull request: %s') % errors.msg
313 h.flash(msg, 'error')
313 h.flash(msg, 'error')
314 raise HTTPBadRequest
314 raise HTTPBadRequest
315
315
316 # heads up: org and other might seem backward here ...
316 # heads up: org and other might seem backward here ...
317 org_repo_name = _form['org_repo']
317 org_repo_name = _form['org_repo']
318 org_ref = _form['org_ref'] # will have merge_rev as rev but symbolic name
318 org_ref = _form['org_ref'] # will have merge_rev as rev but symbolic name
319 org_repo = RepoModel()._get_repo(org_repo_name)
319 org_repo = RepoModel()._get_repo(org_repo_name)
320 (org_ref_type,
320 (org_ref_type,
321 org_ref_name,
321 org_ref_name,
322 org_rev) = org_ref.split(':')
322 org_rev) = org_ref.split(':')
323 if org_ref_type == 'rev':
323 if org_ref_type == 'rev':
324 org_ref_type = 'branch'
324 org_ref_type = 'branch'
325 cs = org_repo.scm_instance.get_changeset(org_rev)
325 cs = org_repo.scm_instance.get_changeset(org_rev)
326 org_ref = '%s:%s:%s' % (org_ref_type, cs.branch, cs.raw_id)
326 org_ref = '%s:%s:%s' % (org_ref_type, cs.branch, cs.raw_id)
327
327
328 other_repo_name = _form['other_repo']
328 other_repo_name = _form['other_repo']
329 other_ref = _form['other_ref'] # will have symbolic name and head revision
329 other_ref = _form['other_ref'] # will have symbolic name and head revision
330 other_repo = RepoModel()._get_repo(other_repo_name)
330 other_repo = RepoModel()._get_repo(other_repo_name)
331 (other_ref_type,
331 (other_ref_type,
332 other_ref_name,
332 other_ref_name,
333 other_rev) = other_ref.split(':')
333 other_rev) = other_ref.split(':')
334
334
335 cs_ranges, _cs_ranges_not, ancestor_rev = \
335 cs_ranges, _cs_ranges_not, ancestor_rev = \
336 CompareController._get_changesets(org_repo.scm_instance.alias,
336 CompareController._get_changesets(org_repo.scm_instance.alias,
337 other_repo.scm_instance, other_rev, # org and other "swapped"
337 other_repo.scm_instance, other_rev, # org and other "swapped"
338 org_repo.scm_instance, org_rev,
338 org_repo.scm_instance, org_rev,
339 )
339 )
340 revisions = [cs.raw_id for cs in cs_ranges]
340 revisions = [cs.raw_id for cs in cs_ranges]
341
341
342 # hack: ancestor_rev is not an other_rev but we want to show the
342 # hack: ancestor_rev is not an other_rev but we want to show the
343 # requested destination and have the exact ancestor
343 # requested destination and have the exact ancestor
344 other_ref = '%s:%s:%s' % (other_ref_type, other_ref_name, ancestor_rev)
344 other_ref = '%s:%s:%s' % (other_ref_type, other_ref_name, ancestor_rev)
345
345
346 reviewers = _form['review_members']
346 reviewers = _form['review_members']
347
347
348 title = _form['pullrequest_title']
348 title = _form['pullrequest_title']
349 if not title:
349 if not title:
350 if org_repo_name == other_repo_name:
350 if org_repo_name == other_repo_name:
351 title = '%s to %s' % (h.short_ref(org_ref_type, org_ref_name),
351 title = '%s to %s' % (h.short_ref(org_ref_type, org_ref_name),
352 h.short_ref(other_ref_type, other_ref_name))
352 h.short_ref(other_ref_type, other_ref_name))
353 else:
353 else:
354 title = '%s#%s to %s#%s' % (org_repo_name, h.short_ref(org_ref_type, org_ref_name),
354 title = '%s#%s to %s#%s' % (org_repo_name, h.short_ref(org_ref_type, org_ref_name),
355 other_repo_name, h.short_ref(other_ref_type, other_ref_name))
355 other_repo_name, h.short_ref(other_ref_type, other_ref_name))
356 description = _form['pullrequest_desc'].strip() or _('No description')
356 description = _form['pullrequest_desc'].strip() or _('No description')
357 try:
357 try:
358 pull_request = PullRequestModel().create(
358 pull_request = PullRequestModel().create(
359 self.authuser.user_id, org_repo_name, org_ref, other_repo_name,
359 self.authuser.user_id, org_repo_name, org_ref, other_repo_name,
360 other_ref, revisions, reviewers, title, description
360 other_ref, revisions, reviewers, title, description
361 )
361 )
362 Session().commit()
362 Session().commit()
363 h.flash(_('Successfully opened new pull request'),
363 h.flash(_('Successfully opened new pull request'),
364 category='success')
364 category='success')
365 except Exception:
365 except Exception:
366 h.flash(_('Error occurred while creating pull request'),
366 h.flash(_('Error occurred while creating pull request'),
367 category='error')
367 category='error')
368 log.error(traceback.format_exc())
368 log.error(traceback.format_exc())
369 return redirect(url('pullrequest_home', repo_name=repo_name))
369 return redirect(url('pullrequest_home', repo_name=repo_name))
370
370
371 return redirect(pull_request.url())
371 return redirect(pull_request.url())
372
372
373 def create_update(self, old_pull_request, updaterev, title, description, reviewers_ids):
373 def create_update(self, old_pull_request, updaterev, title, description, reviewers_ids):
374 org_repo = RepoModel()._get_repo(old_pull_request.org_repo.repo_name)
374 org_repo = RepoModel()._get_repo(old_pull_request.org_repo.repo_name)
375 org_ref_type, org_ref_name, org_rev = old_pull_request.org_ref.split(':')
375 org_ref_type, org_ref_name, org_rev = old_pull_request.org_ref.split(':')
376 new_org_rev = self._get_ref_rev(org_repo, 'rev', updaterev)
376 new_org_rev = self._get_ref_rev(org_repo, 'rev', updaterev)
377
377
378 other_repo = RepoModel()._get_repo(old_pull_request.other_repo.repo_name)
378 other_repo = RepoModel()._get_repo(old_pull_request.other_repo.repo_name)
379 other_ref_type, other_ref_name, other_rev = old_pull_request.other_ref.split(':') # other_rev is ancestor
379 other_ref_type, other_ref_name, other_rev = old_pull_request.other_ref.split(':') # other_rev is ancestor
380 #assert other_ref_type == 'branch', other_ref_type # TODO: what if not?
380 #assert other_ref_type == 'branch', other_ref_type # TODO: what if not?
381 new_other_rev = self._get_ref_rev(other_repo, other_ref_type, other_ref_name)
381 new_other_rev = self._get_ref_rev(other_repo, other_ref_type, other_ref_name)
382
382
383 cs_ranges, _cs_ranges_not, ancestor_rev = CompareController._get_changesets(org_repo.scm_instance.alias,
383 cs_ranges, _cs_ranges_not, ancestor_rev = CompareController._get_changesets(org_repo.scm_instance.alias,
384 other_repo.scm_instance, new_other_rev, # org and other "swapped"
384 other_repo.scm_instance, new_other_rev, # org and other "swapped"
385 org_repo.scm_instance, new_org_rev)
385 org_repo.scm_instance, new_org_rev)
386
386
387 old_revisions = set(old_pull_request.revisions)
387 old_revisions = set(old_pull_request.revisions)
388 revisions = [cs.raw_id for cs in cs_ranges]
388 revisions = [cs.raw_id for cs in cs_ranges]
389 new_revisions = [r for r in revisions if r not in old_revisions]
389 new_revisions = [r for r in revisions if r not in old_revisions]
390 lost = old_revisions.difference(revisions)
390 lost = old_revisions.difference(revisions)
391
391
392 infos = ['This is an update of %s "%s".' %
392 infos = ['This is an update of %s "%s".' %
393 (h.canonical_url('pullrequest_show', repo_name=old_pull_request.other_repo.repo_name,
393 (h.canonical_url('pullrequest_show', repo_name=old_pull_request.other_repo.repo_name,
394 pull_request_id=old_pull_request.pull_request_id),
394 pull_request_id=old_pull_request.pull_request_id),
395 old_pull_request.title)]
395 old_pull_request.title)]
396
396
397 if lost:
397 if lost:
398 infos.append(_('Missing changesets since the previous pull request:'))
398 infos.append(_('Missing changesets since the previous pull request:'))
399 for r in old_pull_request.revisions:
399 for r in old_pull_request.revisions:
400 if r in lost:
400 if r in lost:
401 rev_desc = org_repo.get_changeset(r).message.split('\n')[0]
401 rev_desc = org_repo.get_changeset(r).message.split('\n')[0]
402 infos.append(' %s "%s"' % (h.short_id(r), rev_desc))
402 infos.append(' %s "%s"' % (h.short_id(r), rev_desc))
403
403
404 if new_revisions:
404 if new_revisions:
405 infos.append(_('New changesets on %s %s since the previous pull request:') % (org_ref_type, org_ref_name))
405 infos.append(_('New changesets on %s %s since the previous pull request:') % (org_ref_type, org_ref_name))
406 for r in reversed(revisions):
406 for r in reversed(revisions):
407 if r in new_revisions:
407 if r in new_revisions:
408 rev_desc = org_repo.get_changeset(r).message.split('\n')[0]
408 rev_desc = org_repo.get_changeset(r).message.split('\n')[0]
409 infos.append(' %s %s' % (h.short_id(r), h.shorter(rev_desc, 80)))
409 infos.append(' %s %s' % (h.short_id(r), h.shorter(rev_desc, 80)))
410
410
411 if ancestor_rev == other_rev:
411 if ancestor_rev == other_rev:
412 infos.append(_("Ancestor didn't change - show diff since previous version:"))
412 infos.append(_("Ancestor didn't change - show diff since previous version:"))
413 infos.append(h.canonical_url('compare_url',
413 infos.append(h.canonical_url('compare_url',
414 repo_name=org_repo.repo_name, # other_repo is always same as repo_name
414 repo_name=org_repo.repo_name, # other_repo is always same as repo_name
415 org_ref_type='rev', org_ref_name=h.short_id(org_rev), # use old org_rev as base
415 org_ref_type='rev', org_ref_name=h.short_id(org_rev), # use old org_rev as base
416 other_ref_type='rev', other_ref_name=h.short_id(new_org_rev),
416 other_ref_type='rev', other_ref_name=h.short_id(new_org_rev),
417 )) # note: linear diff, merge or not doesn't matter
417 )) # note: linear diff, merge or not doesn't matter
418 else:
418 else:
419 infos.append(_('This pull request is based on another %s revision and there is no simple diff.') % other_ref_name)
419 infos.append(_('This pull request is based on another %s revision and there is no simple diff.') % other_ref_name)
420 else:
420 else:
421 infos.append(_('No changes found on %s %s since previous version.') % (org_ref_type, org_ref_name))
421 infos.append(_('No changes found on %s %s since previous version.') % (org_ref_type, org_ref_name))
422 # TODO: fail?
422 # TODO: fail?
423
423
424 # hack: ancestor_rev is not an other_ref but we want to show the
424 # hack: ancestor_rev is not an other_ref but we want to show the
425 # requested destination and have the exact ancestor
425 # requested destination and have the exact ancestor
426 new_other_ref = '%s:%s:%s' % (other_ref_type, other_ref_name, ancestor_rev)
426 new_other_ref = '%s:%s:%s' % (other_ref_type, other_ref_name, ancestor_rev)
427 new_org_ref = '%s:%s:%s' % (org_ref_type, org_ref_name, new_org_rev)
427 new_org_ref = '%s:%s:%s' % (org_ref_type, org_ref_name, new_org_rev)
428
428
429 try:
429 try:
430 title, old_v = re.match(r'(.*)\(v(\d+)\)\s*$', title).groups()
430 title, old_v = re.match(r'(.*)\(v(\d+)\)\s*$', title).groups()
431 v = int(old_v) + 1
431 v = int(old_v) + 1
432 except (AttributeError, ValueError):
432 except (AttributeError, ValueError):
433 v = 2
433 v = 2
434 title = '%s (v%s)' % (title.strip(), v)
434 title = '%s (v%s)' % (title.strip(), v)
435
435
436 # using a mail-like separator, insert new update info at the top of the list
436 # using a mail-like separator, insert new update info at the top of the list
437 descriptions = description.replace('\r\n', '\n').split('\n-- \n', 1)
437 descriptions = description.replace('\r\n', '\n').split('\n-- \n', 1)
438 description = descriptions[0].strip() + '\n\n-- \n' + '\n'.join(infos)
438 description = descriptions[0].strip() + '\n\n-- \n' + '\n'.join(infos)
439 if len(descriptions) > 1:
439 if len(descriptions) > 1:
440 description += '\n\n' + descriptions[1].strip()
440 description += '\n\n' + descriptions[1].strip()
441
441
442 try:
442 try:
443 pull_request = PullRequestModel().create(
443 pull_request = PullRequestModel().create(
444 self.authuser.user_id,
444 self.authuser.user_id,
445 old_pull_request.org_repo.repo_name, new_org_ref,
445 old_pull_request.org_repo.repo_name, new_org_ref,
446 old_pull_request.other_repo.repo_name, new_other_ref,
446 old_pull_request.other_repo.repo_name, new_other_ref,
447 revisions, reviewers_ids, title, description
447 revisions, reviewers_ids, title, description
448 )
448 )
449 except Exception:
449 except Exception:
450 h.flash(_('Error occurred while creating pull request'),
450 h.flash(_('Error occurred while creating pull request'),
451 category='error')
451 category='error')
452 log.error(traceback.format_exc())
452 log.error(traceback.format_exc())
453 return redirect(old_pull_request.url())
453 return redirect(old_pull_request.url())
454
454
455 ChangesetCommentsModel().create(
455 ChangesetCommentsModel().create(
456 text=_('Closed, replaced by %s .') % pull_request.url(canonical=True),
456 text=_('Closed, replaced by %s .') % pull_request.url(canonical=True),
457 repo=old_pull_request.other_repo.repo_id,
457 repo=old_pull_request.other_repo.repo_id,
458 user=c.authuser.user_id,
458 user=c.authuser.user_id,
459 pull_request=old_pull_request.pull_request_id,
459 pull_request=old_pull_request.pull_request_id,
460 closing_pr=True)
460 closing_pr=True)
461 PullRequestModel().close_pull_request(old_pull_request.pull_request_id)
461 PullRequestModel().close_pull_request(old_pull_request.pull_request_id)
462
462
463 Session().commit()
463 Session().commit()
464 h.flash(_('Pull request update created'),
464 h.flash(_('Pull request update created'),
465 category='success')
465 category='success')
466
466
467 return redirect(pull_request.url())
467 return redirect(pull_request.url())
468
468
469 # pullrequest_post for PR editing
469 # pullrequest_post for PR editing
470 @LoginRequired()
470 @LoginRequired()
471 @NotAnonymous()
471 @NotAnonymous()
472 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
472 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
473 'repository.admin')
473 'repository.admin')
474 def post(self, repo_name, pull_request_id):
474 def post(self, repo_name, pull_request_id):
475 pull_request = PullRequest.get_or_404(pull_request_id)
475 pull_request = PullRequest.get_or_404(pull_request_id)
476 if pull_request.is_closed():
476 if pull_request.is_closed():
477 raise HTTPForbidden()
477 raise HTTPForbidden()
478 assert pull_request.other_repo.repo_name == repo_name
478 assert pull_request.other_repo.repo_name == repo_name
479 #only owner or admin can update it
479 #only owner or admin can update it
480 owner = pull_request.author.user_id == c.authuser.user_id
480 owner = pull_request.author.user_id == c.authuser.user_id
481 repo_admin = h.HasRepoPermissionAny('repository.admin')(c.repo_name)
481 repo_admin = h.HasRepoPermissionAny('repository.admin')(c.repo_name)
482 if not (h.HasPermissionAny('hg.admin') or repo_admin or owner):
482 if not (h.HasPermissionAny('hg.admin') or repo_admin or owner):
483 raise HTTPForbidden()
483 raise HTTPForbidden()
484
484
485 _form = PullRequestPostForm()().to_python(request.POST)
485 _form = PullRequestPostForm()().to_python(request.POST)
486 reviewers_ids = [int(s) for s in _form['review_members']]
486 reviewers_ids = [int(s) for s in _form['review_members']]
487
487
488 if _form['updaterev']:
488 if _form['updaterev']:
489 return self.create_update(pull_request,
489 return self.create_update(pull_request,
490 _form['updaterev'],
490 _form['updaterev'],
491 _form['pullrequest_title'],
491 _form['pullrequest_title'],
492 _form['pullrequest_desc'],
492 _form['pullrequest_desc'],
493 reviewers_ids)
493 reviewers_ids)
494
494
495 old_description = pull_request.description
495 old_description = pull_request.description
496 pull_request.title = _form['pullrequest_title']
496 pull_request.title = _form['pullrequest_title']
497 pull_request.description = _form['pullrequest_desc'].strip() or _('No description')
497 pull_request.description = _form['pullrequest_desc'].strip() or _('No description')
498 PullRequestModel().mention_from_description(pull_request, old_description)
498 PullRequestModel().mention_from_description(pull_request, old_description)
499
499
500 PullRequestModel().update_reviewers(pull_request_id, reviewers_ids)
500 PullRequestModel().update_reviewers(pull_request_id, reviewers_ids)
501
501
502 Session().commit()
502 Session().commit()
503 h.flash(_('Pull request updated'), category='success')
503 h.flash(_('Pull request updated'), category='success')
504
504
505 return redirect(pull_request.url())
505 return redirect(pull_request.url())
506
506
507 @LoginRequired()
507 @LoginRequired()
508 @NotAnonymous()
508 @NotAnonymous()
509 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
509 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
510 'repository.admin')
510 'repository.admin')
511 @jsonify
511 @jsonify
512 def delete(self, repo_name, pull_request_id):
512 def delete(self, repo_name, pull_request_id):
513 pull_request = PullRequest.get_or_404(pull_request_id)
513 pull_request = PullRequest.get_or_404(pull_request_id)
514 #only owner can delete it !
514 #only owner can delete it !
515 if pull_request.author.user_id == c.authuser.user_id:
515 if pull_request.author.user_id == c.authuser.user_id:
516 PullRequestModel().delete(pull_request)
516 PullRequestModel().delete(pull_request)
517 Session().commit()
517 Session().commit()
518 h.flash(_('Successfully deleted pull request'),
518 h.flash(_('Successfully deleted pull request'),
519 category='success')
519 category='success')
520 return redirect(url('my_pullrequests'))
520 return redirect(url('my_pullrequests'))
521 raise HTTPForbidden()
521 raise HTTPForbidden()
522
522
523 @LoginRequired()
523 @LoginRequired()
524 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
524 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
525 'repository.admin')
525 'repository.admin')
526 def show(self, repo_name, pull_request_id, extra=None):
526 def show(self, repo_name, pull_request_id, extra=None):
527 repo_model = RepoModel()
527 repo_model = RepoModel()
528 c.users_array = repo_model.get_users_js()
528 c.users_array = repo_model.get_users_js()
529 c.user_groups_array = repo_model.get_user_groups_js()
529 c.user_groups_array = repo_model.get_user_groups_js()
530 c.pull_request = PullRequest.get_or_404(pull_request_id)
530 c.pull_request = PullRequest.get_or_404(pull_request_id)
531 c.allowed_to_change_status = self._get_is_allowed_change_status(c.pull_request)
531 c.allowed_to_change_status = self._get_is_allowed_change_status(c.pull_request)
532 cc_model = ChangesetCommentsModel()
532 cc_model = ChangesetCommentsModel()
533 cs_model = ChangesetStatusModel()
533 cs_model = ChangesetStatusModel()
534
534
535 # pull_requests repo_name we opened it against
535 # pull_requests repo_name we opened it against
536 # ie. other_repo must match
536 # ie. other_repo must match
537 if repo_name != c.pull_request.other_repo.repo_name:
537 if repo_name != c.pull_request.other_repo.repo_name:
538 raise HTTPNotFound
538 raise HTTPNotFound
539
539
540 # load compare data into template context
540 # load compare data into template context
541 c.cs_repo = c.pull_request.org_repo
541 c.cs_repo = c.pull_request.org_repo
542 (c.cs_ref_type,
542 (c.cs_ref_type,
543 c.cs_ref_name,
543 c.cs_ref_name,
544 c.cs_rev) = c.pull_request.org_ref.split(':')
544 c.cs_rev) = c.pull_request.org_ref.split(':')
545
545
546 c.a_repo = c.pull_request.other_repo
546 c.a_repo = c.pull_request.other_repo
547 (c.a_ref_type,
547 (c.a_ref_type,
548 c.a_ref_name,
548 c.a_ref_name,
549 c.a_rev) = c.pull_request.other_ref.split(':') # other_rev is ancestor
549 c.a_rev) = c.pull_request.other_ref.split(':') # other_rev is ancestor
550
550
551 org_scm_instance = c.cs_repo.scm_instance # property with expensive cache invalidation check!!!
551 org_scm_instance = c.cs_repo.scm_instance # property with expensive cache invalidation check!!!
552 c.cs_repo = c.cs_repo
552 c.cs_repo = c.cs_repo
553 c.cs_ranges = [org_scm_instance.get_changeset(x) for x in c.pull_request.revisions]
553 c.cs_ranges = [org_scm_instance.get_changeset(x) for x in c.pull_request.revisions]
554 c.cs_ranges_org = None # not stored and not important and moving target - could be calculated ...
554 c.cs_ranges_org = None # not stored and not important and moving target - could be calculated ...
555 revs = [ctx.revision for ctx in reversed(c.cs_ranges)]
555 revs = [ctx.revision for ctx in reversed(c.cs_ranges)]
556 c.jsdata = json.dumps(graph_data(org_scm_instance, revs))
556 c.jsdata = json.dumps(graph_data(org_scm_instance, revs))
557
557
558 avail_revs = set()
558 avail_revs = set()
559 avail_show = []
559 avail_show = []
560 c.cs_branch_name = c.cs_ref_name
560 c.cs_branch_name = c.cs_ref_name
561 other_scm_instance = c.a_repo.scm_instance
561 other_scm_instance = c.a_repo.scm_instance
562 c.update_msg = ""
562 c.update_msg = ""
563 c.update_msg_other = ""
563 c.update_msg_other = ""
564 if org_scm_instance.alias == 'hg' and c.a_ref_name != 'ancestor':
564 if org_scm_instance.alias == 'hg' and c.a_ref_name != 'ancestor':
565 if c.cs_ref_type != 'branch':
565 if c.cs_ref_type != 'branch':
566 c.cs_branch_name = org_scm_instance.get_changeset(c.cs_ref_name).branch # use ref_type ?
566 c.cs_branch_name = org_scm_instance.get_changeset(c.cs_ref_name).branch # use ref_type ?
567 c.a_branch_name = c.a_ref_name
567 c.a_branch_name = c.a_ref_name
568 if c.a_ref_type != 'branch':
568 if c.a_ref_type != 'branch':
569 try:
569 try:
570 c.a_branch_name = other_scm_instance.get_changeset(c.a_ref_name).branch # use ref_type ?
570 c.a_branch_name = other_scm_instance.get_changeset(c.a_ref_name).branch # use ref_type ?
571 except EmptyRepositoryError:
571 except EmptyRepositoryError:
572 c.a_branch_name = 'null' # not a branch name ... but close enough
572 c.a_branch_name = 'null' # not a branch name ... but close enough
573 # candidates: descendants of old head that are on the right branch
573 # candidates: descendants of old head that are on the right branch
574 # and not are the old head itself ...
574 # and not are the old head itself ...
575 # and nothing at all if old head is a descendant of target ref name
575 # and nothing at all if old head is a descendant of target ref name
576 if other_scm_instance._repo.revs('present(%s)::&%s', c.cs_ranges[-1].raw_id, c.a_branch_name):
576 if other_scm_instance._repo.revs('present(%s)::&%s', c.cs_ranges[-1].raw_id, c.a_branch_name):
577 c.update_msg = _('This pull request has already been merged to %s.') % c.a_branch_name
577 c.update_msg = _('This pull request has already been merged to %s.') % c.a_branch_name
578 elif c.pull_request.is_closed():
578 elif c.pull_request.is_closed():
579 c.update_msg = _('This pull request has been closed and can not be updated.')
579 c.update_msg = _('This pull request has been closed and can not be updated.')
580 else: # look for descendants of PR head on source branch in org repo
580 else: # look for descendants of PR head on source branch in org repo
581 avail_revs = org_scm_instance._repo.revs('%s:: & branch(%s)',
581 avail_revs = org_scm_instance._repo.revs('%s:: & branch(%s)',
582 revs[0], c.cs_branch_name)
582 revs[0], c.cs_branch_name)
583 if len(avail_revs) > 1: # more than just revs[0]
583 if len(avail_revs) > 1: # more than just revs[0]
584 # also show changesets that not are descendants but would be merged in
584 # also show changesets that not are descendants but would be merged in
585 targethead = other_scm_instance.get_changeset(c.a_branch_name).raw_id
585 targethead = other_scm_instance.get_changeset(c.a_branch_name).raw_id
586 if org_scm_instance.path != other_scm_instance.path:
586 if org_scm_instance.path != other_scm_instance.path:
587 # Note: org_scm_instance.path must come first so all
587 # Note: org_scm_instance.path must come first so all
588 # valid revision numbers are 100% org_scm compatible
588 # valid revision numbers are 100% org_scm compatible
589 # - both for avail_revs and for revset results
589 # - both for avail_revs and for revset results
590 hgrepo = unionrepo.unionrepository(org_scm_instance.baseui,
590 hgrepo = unionrepo.unionrepository(org_scm_instance.baseui,
591 org_scm_instance.path,
591 org_scm_instance.path,
592 other_scm_instance.path)
592 other_scm_instance.path)
593 else:
593 else:
594 hgrepo = org_scm_instance._repo
594 hgrepo = org_scm_instance._repo
595 show = set(hgrepo.revs('::%ld & !::%s & !::%s',
595 show = set(hgrepo.revs('::%ld & !::%s & !::%s',
596 avail_revs, revs[0], targethead))
596 avail_revs, revs[0], targethead))
597 c.update_msg = _('This pull request can be updated with changes on %s:') % c.cs_branch_name
597 c.update_msg = _('This pull request can be updated with changes on %s:') % c.cs_branch_name
598 else:
598 else:
599 show = set()
599 show = set()
600 c.update_msg = _('No changesets found for updating this pull request.')
600 c.update_msg = _('No changesets found for updating this pull request.')
601
601
602 # TODO: handle branch heads that not are tip-most
602 # TODO: handle branch heads that not are tip-most
603 brevs = org_scm_instance._repo.revs('%s - %ld', c.cs_branch_name, avail_revs)
603 brevs = org_scm_instance._repo.revs('%s - %ld', c.cs_branch_name, avail_revs)
604 if brevs:
604 if brevs:
605 # also show changesets that are on branch but neither ancestors nor descendants
605 # also show changesets that are on branch but neither ancestors nor descendants
606 show.update(org_scm_instance._repo.revs('::%ld - ::%ld - ::%s', brevs, avail_revs, c.a_branch_name))
606 show.update(org_scm_instance._repo.revs('::%ld - ::%ld - ::%s', brevs, avail_revs, c.a_branch_name))
607 show.add(revs[0]) # make sure graph shows this so we can see how they relate
607 show.add(revs[0]) # make sure graph shows this so we can see how they relate
608 c.update_msg_other = _('Note: Branch %s has another head: %s.') % (c.cs_branch_name,
608 c.update_msg_other = _('Note: Branch %s has another head: %s.') % (c.cs_branch_name,
609 h.short_id(org_scm_instance.get_changeset((max(brevs))).raw_id))
609 h.short_id(org_scm_instance.get_changeset((max(brevs))).raw_id))
610
610
611 avail_show = sorted(show, reverse=True)
611 avail_show = sorted(show, reverse=True)
612
612
613 elif org_scm_instance.alias == 'git':
613 elif org_scm_instance.alias == 'git':
614 c.update_msg = _("Git pull requests don't support updates yet.")
614 c.update_msg = _("Git pull requests don't support updates yet.")
615
615
616 c.avail_revs = avail_revs
616 c.avail_revs = avail_revs
617 c.avail_cs = [org_scm_instance.get_changeset(r) for r in avail_show]
617 c.avail_cs = [org_scm_instance.get_changeset(r) for r in avail_show]
618 c.avail_jsdata = json.dumps(graph_data(org_scm_instance, avail_show))
618 c.avail_jsdata = json.dumps(graph_data(org_scm_instance, avail_show))
619
619
620 raw_ids = [x.raw_id for x in c.cs_ranges]
620 raw_ids = [x.raw_id for x in c.cs_ranges]
621 c.cs_comments = c.cs_repo.get_comments(raw_ids)
621 c.cs_comments = c.cs_repo.get_comments(raw_ids)
622 c.statuses = c.cs_repo.statuses(raw_ids)
622 c.statuses = c.cs_repo.statuses(raw_ids)
623
623
624 ignore_whitespace = request.GET.get('ignorews') == '1'
624 ignore_whitespace = request.GET.get('ignorews') == '1'
625 line_context = request.GET.get('context', 3)
625 line_context = request.GET.get('context', 3)
626 c.ignorews_url = _ignorews_url
626 c.ignorews_url = _ignorews_url
627 c.context_url = _context_url
627 c.context_url = _context_url
628 c.fulldiff = request.GET.get('fulldiff')
628 c.fulldiff = request.GET.get('fulldiff')
629 diff_limit = self.cut_off_limit if not c.fulldiff else None
629 diff_limit = self.cut_off_limit if not c.fulldiff else None
630
630
631 # we swap org/other ref since we run a simple diff on one repo
631 # we swap org/other ref since we run a simple diff on one repo
632 log.debug('running diff between %s and %s in %s'
632 log.debug('running diff between %s and %s in %s'
633 % (c.a_rev, c.cs_rev, org_scm_instance.path))
633 % (c.a_rev, c.cs_rev, org_scm_instance.path))
634 txtdiff = org_scm_instance.get_diff(rev1=safe_str(c.a_rev), rev2=safe_str(c.cs_rev),
634 txtdiff = org_scm_instance.get_diff(rev1=safe_str(c.a_rev), rev2=safe_str(c.cs_rev),
635 ignore_whitespace=ignore_whitespace,
635 ignore_whitespace=ignore_whitespace,
636 context=line_context)
636 context=line_context)
637
637
638 diff_processor = diffs.DiffProcessor(txtdiff or '', format='gitdiff',
638 diff_processor = diffs.DiffProcessor(txtdiff or '', format='gitdiff',
639 diff_limit=diff_limit)
639 diff_limit=diff_limit)
640 _parsed = diff_processor.prepare()
640 _parsed = diff_processor.prepare()
641
641
642 c.limited_diff = False
642 c.limited_diff = False
643 if isinstance(_parsed, LimitedDiffContainer):
643 if isinstance(_parsed, LimitedDiffContainer):
644 c.limited_diff = True
644 c.limited_diff = True
645
645
646 c.files = []
646 c.files = []
647 c.changes = {}
647 c.changes = {}
648 c.lines_added = 0
648 c.lines_added = 0
649 c.lines_deleted = 0
649 c.lines_deleted = 0
650
650
651 for f in _parsed:
651 for f in _parsed:
652 st = f['stats']
652 st = f['stats']
653 c.lines_added += st['added']
653 c.lines_added += st['added']
654 c.lines_deleted += st['deleted']
654 c.lines_deleted += st['deleted']
655 fid = h.FID('', f['filename'])
655 fid = h.FID('', f['filename'])
656 c.files.append([fid, f['operation'], f['filename'], f['stats']])
656 c.files.append([fid, f['operation'], f['filename'], f['stats']])
657 htmldiff = diff_processor.as_html(enable_comments=True,
657 htmldiff = diff_processor.as_html(enable_comments=True,
658 parsed_lines=[f])
658 parsed_lines=[f])
659 c.changes[fid] = [f['operation'], f['filename'], htmldiff]
659 c.changes[fid] = [f['operation'], f['filename'], htmldiff]
660
660
661 # inline comments
661 # inline comments
662 c.inline_cnt = 0
662 c.inline_cnt = 0
663 c.inline_comments = cc_model.get_inline_comments(
663 c.inline_comments = cc_model.get_inline_comments(
664 c.db_repo.repo_id,
664 c.db_repo.repo_id,
665 pull_request=pull_request_id)
665 pull_request=pull_request_id)
666 # count inline comments
666 # count inline comments
667 for __, lines in c.inline_comments:
667 for __, lines in c.inline_comments:
668 for comments in lines.values():
668 for comments in lines.values():
669 c.inline_cnt += len(comments)
669 c.inline_cnt += len(comments)
670 # comments
670 # comments
671 c.comments = cc_model.get_comments(c.db_repo.repo_id,
671 c.comments = cc_model.get_comments(c.db_repo.repo_id,
672 pull_request=pull_request_id)
672 pull_request=pull_request_id)
673
673
674 # (badly named) pull-request status calculation based on reviewer votes
674 # (badly named) pull-request status calculation based on reviewer votes
675 (c.pull_request_reviewers,
675 (c.pull_request_reviewers,
676 c.pull_request_pending_reviewers,
676 c.pull_request_pending_reviewers,
677 c.current_voting_result,
677 c.current_voting_result,
678 ) = cs_model.calculate_pull_request_result(c.pull_request)
678 ) = cs_model.calculate_pull_request_result(c.pull_request)
679 c.changeset_statuses = ChangesetStatus.STATUSES
679 c.changeset_statuses = ChangesetStatus.STATUSES
680
680
681 c.as_form = False
681 c.as_form = False
682 c.ancestor = None # there is one - but right here we don't know which
682 c.ancestor = None # there is one - but right here we don't know which
683 return render('/pullrequests/pullrequest_show.html')
683 return render('/pullrequests/pullrequest_show.html')
684
684
685 @LoginRequired()
685 @LoginRequired()
686 @NotAnonymous()
686 @NotAnonymous()
687 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
687 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
688 'repository.admin')
688 'repository.admin')
689 @jsonify
689 @jsonify
690 def comment(self, repo_name, pull_request_id):
690 def comment(self, repo_name, pull_request_id):
691 pull_request = PullRequest.get_or_404(pull_request_id)
691 pull_request = PullRequest.get_or_404(pull_request_id)
692
692
693 status = 0
693 status = 0
694 close_pr = False
694 close_pr = False
695 allowed_to_change_status = self._get_is_allowed_change_status(pull_request)
695 allowed_to_change_status = self._get_is_allowed_change_status(pull_request)
696 if allowed_to_change_status:
696 if allowed_to_change_status:
697 status = request.POST.get('changeset_status')
697 status = request.POST.get('changeset_status')
698 close_pr = request.POST.get('save_close')
698 close_pr = request.POST.get('save_close')
699 text = request.POST.get('text', '').strip() or _('No comments.')
699 text = request.POST.get('text', '').strip()
700 if close_pr:
700 if close_pr:
701 text = _('Closing.') + '\n' + text
701 text = _('Closing.') + '\n' + text
702
702
703 comm = ChangesetCommentsModel().create(
703 comm = ChangesetCommentsModel().create(
704 text=text,
704 text=text,
705 repo=c.db_repo.repo_id,
705 repo=c.db_repo.repo_id,
706 user=c.authuser.user_id,
706 user=c.authuser.user_id,
707 pull_request=pull_request_id,
707 pull_request=pull_request_id,
708 f_path=request.POST.get('f_path'),
708 f_path=request.POST.get('f_path'),
709 line_no=request.POST.get('line'),
709 line_no=request.POST.get('line'),
710 status_change=(ChangesetStatus.get_status_lbl(status)
710 status_change=(ChangesetStatus.get_status_lbl(status)
711 if status and allowed_to_change_status else None),
711 if status and allowed_to_change_status else None),
712 closing_pr=close_pr
712 closing_pr=close_pr
713 )
713 )
714
714
715 action_logger(self.authuser,
715 action_logger(self.authuser,
716 'user_commented_pull_request:%s' % pull_request_id,
716 'user_commented_pull_request:%s' % pull_request_id,
717 c.db_repo, self.ip_addr, self.sa)
717 c.db_repo, self.ip_addr, self.sa)
718
718
719 if allowed_to_change_status:
719 if allowed_to_change_status:
720 # get status if set !
720 # get status if set !
721 if status:
721 if status:
722 ChangesetStatusModel().set_status(
722 ChangesetStatusModel().set_status(
723 c.db_repo.repo_id,
723 c.db_repo.repo_id,
724 status,
724 status,
725 c.authuser.user_id,
725 c.authuser.user_id,
726 comm,
726 comm,
727 pull_request=pull_request_id
727 pull_request=pull_request_id
728 )
728 )
729
729
730 if close_pr:
730 if close_pr:
731 PullRequestModel().close_pull_request(pull_request_id)
731 PullRequestModel().close_pull_request(pull_request_id)
732 action_logger(self.authuser,
732 action_logger(self.authuser,
733 'user_closed_pull_request:%s' % pull_request_id,
733 'user_closed_pull_request:%s' % pull_request_id,
734 c.db_repo, self.ip_addr, self.sa)
734 c.db_repo, self.ip_addr, self.sa)
735
735
736 Session().commit()
736 Session().commit()
737
737
738 if not request.environ.get('HTTP_X_PARTIAL_XHR'):
738 if not request.environ.get('HTTP_X_PARTIAL_XHR'):
739 return redirect(pull_request.url())
739 return redirect(pull_request.url())
740
740
741 data = {
741 data = {
742 'target_id': h.safeid(h.safe_unicode(request.POST.get('f_path'))),
742 'target_id': h.safeid(h.safe_unicode(request.POST.get('f_path'))),
743 }
743 }
744 if comm:
744 if comm:
745 c.co = comm
745 c.co = comm
746 data.update(comm.get_dict())
746 data.update(comm.get_dict())
747 data.update({'rendered_text':
747 data.update({'rendered_text':
748 render('changeset/changeset_comment_block.html')})
748 render('changeset/changeset_comment_block.html')})
749
749
750 return data
750 return data
751
751
752 @LoginRequired()
752 @LoginRequired()
753 @NotAnonymous()
753 @NotAnonymous()
754 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
754 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
755 'repository.admin')
755 'repository.admin')
756 @jsonify
756 @jsonify
757 def delete_comment(self, repo_name, comment_id):
757 def delete_comment(self, repo_name, comment_id):
758 co = ChangesetComment.get(comment_id)
758 co = ChangesetComment.get(comment_id)
759 if co.pull_request.is_closed():
759 if co.pull_request.is_closed():
760 #don't allow deleting comments on closed pull request
760 #don't allow deleting comments on closed pull request
761 raise HTTPForbidden()
761 raise HTTPForbidden()
762
762
763 owner = co.author.user_id == c.authuser.user_id
763 owner = co.author.user_id == c.authuser.user_id
764 repo_admin = h.HasRepoPermissionAny('repository.admin')(c.repo_name)
764 repo_admin = h.HasRepoPermissionAny('repository.admin')(c.repo_name)
765 if h.HasPermissionAny('hg.admin') or repo_admin or owner:
765 if h.HasPermissionAny('hg.admin') or repo_admin or owner:
766 ChangesetCommentsModel().delete(comment=co)
766 ChangesetCommentsModel().delete(comment=co)
767 Session().commit()
767 Session().commit()
768 return True
768 return True
769 else:
769 else:
770 raise HTTPForbidden()
770 raise HTTPForbidden()
@@ -1,296 +1,296 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 # This program is free software: you can redistribute it and/or modify
2 # This program is free software: you can redistribute it and/or modify
3 # it under the terms of the GNU General Public License as published by
3 # it under the terms of the GNU General Public License as published by
4 # the Free Software Foundation, either version 3 of the License, or
4 # the Free Software Foundation, either version 3 of the License, or
5 # (at your option) any later version.
5 # (at your option) any later version.
6 #
6 #
7 # This program is distributed in the hope that it will be useful,
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
10 # GNU General Public License for more details.
11 #
11 #
12 # You should have received a copy of the GNU General Public License
12 # You should have received a copy of the GNU General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 """
14 """
15 kallithea.model.comment
15 kallithea.model.comment
16 ~~~~~~~~~~~~~~~~~~~~~~~
16 ~~~~~~~~~~~~~~~~~~~~~~~
17
17
18 comments model for Kallithea
18 comments model for Kallithea
19
19
20 This file was forked by the Kallithea project in July 2014.
20 This file was forked by the Kallithea project in July 2014.
21 Original author and date, and relevant copyright and licensing information is below:
21 Original author and date, and relevant copyright and licensing information is below:
22 :created_on: Nov 11, 2011
22 :created_on: Nov 11, 2011
23 :author: marcink
23 :author: marcink
24 :copyright: (c) 2013 RhodeCode GmbH, and others.
24 :copyright: (c) 2013 RhodeCode GmbH, and others.
25 :license: GPLv3, see LICENSE.md for more details.
25 :license: GPLv3, see LICENSE.md for more details.
26 """
26 """
27
27
28 import logging
28 import logging
29
29
30 from pylons.i18n.translation import _
30 from pylons.i18n.translation import _
31 from collections import defaultdict
31 from collections import defaultdict
32
32
33 from kallithea.lib.utils2 import extract_mentioned_users, safe_unicode
33 from kallithea.lib.utils2 import extract_mentioned_users, safe_unicode
34 from kallithea.lib import helpers as h
34 from kallithea.lib import helpers as h
35 from kallithea.model import BaseModel
35 from kallithea.model import BaseModel
36 from kallithea.model.db import ChangesetComment, User, \
36 from kallithea.model.db import ChangesetComment, User, \
37 Notification, PullRequest
37 Notification, PullRequest
38 from kallithea.model.notification import NotificationModel
38 from kallithea.model.notification import NotificationModel
39 from kallithea.model.meta import Session
39 from kallithea.model.meta import Session
40
40
41 log = logging.getLogger(__name__)
41 log = logging.getLogger(__name__)
42
42
43
43
44 class ChangesetCommentsModel(BaseModel):
44 class ChangesetCommentsModel(BaseModel):
45
45
46 cls = ChangesetComment
46 cls = ChangesetComment
47
47
48 def __get_changeset_comment(self, changeset_comment):
48 def __get_changeset_comment(self, changeset_comment):
49 return self._get_instance(ChangesetComment, changeset_comment)
49 return self._get_instance(ChangesetComment, changeset_comment)
50
50
51 def __get_pull_request(self, pull_request):
51 def __get_pull_request(self, pull_request):
52 return self._get_instance(PullRequest, pull_request)
52 return self._get_instance(PullRequest, pull_request)
53
53
54 def _extract_mentions(self, s):
54 def _extract_mentions(self, s):
55 user_objects = []
55 user_objects = []
56 for username in extract_mentioned_users(s):
56 for username in extract_mentioned_users(s):
57 user_obj = User.get_by_username(username, case_insensitive=True)
57 user_obj = User.get_by_username(username, case_insensitive=True)
58 if user_obj:
58 if user_obj:
59 user_objects.append(user_obj)
59 user_objects.append(user_obj)
60 return user_objects
60 return user_objects
61
61
62 def _get_notification_data(self, repo, comment, user, comment_text,
62 def _get_notification_data(self, repo, comment, user, comment_text,
63 line_no=None, revision=None, pull_request=None,
63 line_no=None, revision=None, pull_request=None,
64 status_change=None, closing_pr=False):
64 status_change=None, closing_pr=False):
65 """
65 """
66 Get notification data
66 Get notification data
67
67
68 :param comment_text:
68 :param comment_text:
69 :param line:
69 :param line:
70 :returns: tuple (subj,body,recipients,notification_type,email_kwargs)
70 :returns: tuple (subj,body,recipients,notification_type,email_kwargs)
71 """
71 """
72 # make notification
72 # make notification
73 body = comment_text # text of the comment
73 body = comment_text # text of the comment
74 line = ''
74 line = ''
75 if line_no:
75 if line_no:
76 line = _('on line %s') % line_no
76 line = _('on line %s') % line_no
77
77
78 #changeset
78 #changeset
79 if revision:
79 if revision:
80 notification_type = Notification.TYPE_CHANGESET_COMMENT
80 notification_type = Notification.TYPE_CHANGESET_COMMENT
81 cs = repo.scm_instance.get_changeset(revision)
81 cs = repo.scm_instance.get_changeset(revision)
82 desc = "%s" % (cs.short_id)
82 desc = "%s" % (cs.short_id)
83
83
84 threading = ['%s-rev-%s@%s' % (repo.repo_name, revision, h.canonical_hostname())]
84 threading = ['%s-rev-%s@%s' % (repo.repo_name, revision, h.canonical_hostname())]
85 if line_no: # TODO: url to file _and_ line number
85 if line_no: # TODO: url to file _and_ line number
86 threading.append('%s-rev-%s-line-%s@%s' % (repo.repo_name, revision, line_no,
86 threading.append('%s-rev-%s-line-%s@%s' % (repo.repo_name, revision, line_no,
87 h.canonical_hostname()))
87 h.canonical_hostname()))
88 comment_url = h.canonical_url('changeset_home',
88 comment_url = h.canonical_url('changeset_home',
89 repo_name=repo.repo_name,
89 repo_name=repo.repo_name,
90 revision=revision,
90 revision=revision,
91 anchor='comment-%s' % comment.comment_id)
91 anchor='comment-%s' % comment.comment_id)
92 subj = safe_unicode(
92 subj = safe_unicode(
93 h.link_to('Re changeset: %(desc)s %(line)s' % \
93 h.link_to('Re changeset: %(desc)s %(line)s' % \
94 {'desc': desc, 'line': line},
94 {'desc': desc, 'line': line},
95 comment_url)
95 comment_url)
96 )
96 )
97 # get the current participants of this changeset
97 # get the current participants of this changeset
98 recipients = ChangesetComment.get_users(revision=revision)
98 recipients = ChangesetComment.get_users(revision=revision)
99 # add changeset author if it's in kallithea system
99 # add changeset author if it's in kallithea system
100 cs_author = User.get_from_cs_author(cs.author)
100 cs_author = User.get_from_cs_author(cs.author)
101 if not cs_author:
101 if not cs_author:
102 #use repo owner if we cannot extract the author correctly
102 #use repo owner if we cannot extract the author correctly
103 cs_author = repo.user
103 cs_author = repo.user
104 recipients += [cs_author]
104 recipients += [cs_author]
105 email_kwargs = {
105 email_kwargs = {
106 'status_change': status_change,
106 'status_change': status_change,
107 'cs_comment_user': h.person(user, 'username_and_name'),
107 'cs_comment_user': h.person(user, 'username_and_name'),
108 'cs_target_repo': h.canonical_url('summary_home', repo_name=repo.repo_name),
108 'cs_target_repo': h.canonical_url('summary_home', repo_name=repo.repo_name),
109 'cs_comment_url': comment_url,
109 'cs_comment_url': comment_url,
110 'raw_id': revision,
110 'raw_id': revision,
111 'message': cs.message,
111 'message': cs.message,
112 'repo_name': repo.repo_name,
112 'repo_name': repo.repo_name,
113 'short_id': h.short_id(revision),
113 'short_id': h.short_id(revision),
114 'branch': cs.branch,
114 'branch': cs.branch,
115 'comment_username': user.username,
115 'comment_username': user.username,
116 'threading': threading,
116 'threading': threading,
117 }
117 }
118 #pull request
118 #pull request
119 elif pull_request:
119 elif pull_request:
120 notification_type = Notification.TYPE_PULL_REQUEST_COMMENT
120 notification_type = Notification.TYPE_PULL_REQUEST_COMMENT
121 desc = comment.pull_request.title
121 desc = comment.pull_request.title
122 _org_ref_type, org_ref_name, _org_rev = comment.pull_request.org_ref.split(':')
122 _org_ref_type, org_ref_name, _org_rev = comment.pull_request.org_ref.split(':')
123 threading = ['%s-pr-%s@%s' % (pull_request.other_repo.repo_name,
123 threading = ['%s-pr-%s@%s' % (pull_request.other_repo.repo_name,
124 pull_request.pull_request_id,
124 pull_request.pull_request_id,
125 h.canonical_hostname())]
125 h.canonical_hostname())]
126 if line_no: # TODO: url to file _and_ line number
126 if line_no: # TODO: url to file _and_ line number
127 threading.append('%s-pr-%s-line-%s@%s' % (pull_request.other_repo.repo_name,
127 threading.append('%s-pr-%s-line-%s@%s' % (pull_request.other_repo.repo_name,
128 pull_request.pull_request_id, line_no,
128 pull_request.pull_request_id, line_no,
129 h.canonical_hostname()))
129 h.canonical_hostname()))
130 comment_url = pull_request.url(canonical=True,
130 comment_url = pull_request.url(canonical=True,
131 anchor='comment-%s' % comment.comment_id)
131 anchor='comment-%s' % comment.comment_id)
132 subj = safe_unicode(
132 subj = safe_unicode(
133 h.link_to('Re pull request #%(pr_id)s: %(desc)s %(line)s' % \
133 h.link_to('Re pull request #%(pr_id)s: %(desc)s %(line)s' % \
134 {'desc': desc,
134 {'desc': desc,
135 'pr_id': comment.pull_request.pull_request_id,
135 'pr_id': comment.pull_request.pull_request_id,
136 'line': line},
136 'line': line},
137 comment_url)
137 comment_url)
138 )
138 )
139 # get the current participants of this pull request
139 # get the current participants of this pull request
140 recipients = ChangesetComment.get_users(pull_request_id=
140 recipients = ChangesetComment.get_users(pull_request_id=
141 pull_request.pull_request_id)
141 pull_request.pull_request_id)
142 # add pull request author
142 # add pull request author
143 recipients += [pull_request.author]
143 recipients += [pull_request.author]
144
144
145 # add the reviewers to notification
145 # add the reviewers to notification
146 recipients += [x.user for x in pull_request.reviewers]
146 recipients += [x.user for x in pull_request.reviewers]
147
147
148 #set some variables for email notification
148 #set some variables for email notification
149 email_kwargs = {
149 email_kwargs = {
150 'pr_title': pull_request.title,
150 'pr_title': pull_request.title,
151 'pr_id': pull_request.pull_request_id,
151 'pr_id': pull_request.pull_request_id,
152 'status_change': status_change,
152 'status_change': status_change,
153 'closing_pr': closing_pr,
153 'closing_pr': closing_pr,
154 'pr_comment_url': comment_url,
154 'pr_comment_url': comment_url,
155 'pr_comment_user': h.person(user, 'username_and_name'),
155 'pr_comment_user': h.person(user, 'username_and_name'),
156 'pr_target_repo': h.canonical_url('summary_home',
156 'pr_target_repo': h.canonical_url('summary_home',
157 repo_name=pull_request.other_repo.repo_name),
157 repo_name=pull_request.other_repo.repo_name),
158 'repo_name': pull_request.other_repo.repo_name,
158 'repo_name': pull_request.other_repo.repo_name,
159 'ref': org_ref_name,
159 'ref': org_ref_name,
160 'comment_username': user.username,
160 'comment_username': user.username,
161 'threading': threading,
161 'threading': threading,
162 }
162 }
163
163
164 return subj, body, recipients, notification_type, email_kwargs
164 return subj, body, recipients, notification_type, email_kwargs
165
165
166 def create(self, text, repo, user, revision=None, pull_request=None,
166 def create(self, text, repo, user, revision=None, pull_request=None,
167 f_path=None, line_no=None, status_change=None, closing_pr=False,
167 f_path=None, line_no=None, status_change=None, closing_pr=False,
168 send_email=True):
168 send_email=True):
169 """
169 """
170 Creates new comment for changeset or pull request.
170 Creates new comment for changeset or pull request.
171 If status_change is not None this comment is associated with a
171 If status_change is not None this comment is associated with a
172 status change of changeset or changesets associated with pull request
172 status change of changeset or changesets associated with pull request
173
173
174 :param text:
174 :param text:
175 :param repo:
175 :param repo:
176 :param user:
176 :param user:
177 :param revision:
177 :param revision:
178 :param pull_request: (for emails, not for comments)
178 :param pull_request: (for emails, not for comments)
179 :param f_path:
179 :param f_path:
180 :param line_no:
180 :param line_no:
181 :param status_change: (for emails, not for comments)
181 :param status_change: (for emails, not for comments)
182 :param closing_pr: (for emails, not for comments)
182 :param closing_pr: (for emails, not for comments)
183 :param send_email: also send email
183 :param send_email: also send email
184 """
184 """
185 if not text:
185 if not status_change and not text:
186 log.warning('Missing text for comment, skipping...')
186 log.warning('Missing text for comment, skipping...')
187 return
187 return
188
188
189 repo = self._get_repo(repo)
189 repo = self._get_repo(repo)
190 user = self._get_user(user)
190 user = self._get_user(user)
191 comment = ChangesetComment()
191 comment = ChangesetComment()
192 comment.repo = repo
192 comment.repo = repo
193 comment.author = user
193 comment.author = user
194 comment.text = text
194 comment.text = text
195 comment.f_path = f_path
195 comment.f_path = f_path
196 comment.line_no = line_no
196 comment.line_no = line_no
197
197
198 if revision:
198 if revision:
199 comment.revision = revision
199 comment.revision = revision
200 elif pull_request:
200 elif pull_request:
201 pull_request = self.__get_pull_request(pull_request)
201 pull_request = self.__get_pull_request(pull_request)
202 comment.pull_request = pull_request
202 comment.pull_request = pull_request
203 else:
203 else:
204 raise Exception('Please specify revision or pull_request_id')
204 raise Exception('Please specify revision or pull_request_id')
205
205
206 Session().add(comment)
206 Session().add(comment)
207 Session().flush()
207 Session().flush()
208
208
209 if send_email:
209 if send_email:
210 (subj, body, recipients, notification_type,
210 (subj, body, recipients, notification_type,
211 email_kwargs) = self._get_notification_data(
211 email_kwargs) = self._get_notification_data(
212 repo, comment, user,
212 repo, comment, user,
213 comment_text=text,
213 comment_text=text,
214 line_no=line_no,
214 line_no=line_no,
215 revision=revision,
215 revision=revision,
216 pull_request=pull_request,
216 pull_request=pull_request,
217 status_change=status_change,
217 status_change=status_change,
218 closing_pr=closing_pr)
218 closing_pr=closing_pr)
219 email_kwargs['is_mention'] = False
219 email_kwargs['is_mention'] = False
220 # create notification objects, and emails
220 # create notification objects, and emails
221 NotificationModel().create(
221 NotificationModel().create(
222 created_by=user, subject=subj, body=body,
222 created_by=user, subject=subj, body=body,
223 recipients=recipients, type_=notification_type,
223 recipients=recipients, type_=notification_type,
224 email_kwargs=email_kwargs,
224 email_kwargs=email_kwargs,
225 )
225 )
226
226
227 mention_recipients = set(self._extract_mentions(body))\
227 mention_recipients = set(self._extract_mentions(body))\
228 .difference(recipients)
228 .difference(recipients)
229 if mention_recipients:
229 if mention_recipients:
230 email_kwargs['is_mention'] = True
230 email_kwargs['is_mention'] = True
231 subj = _('[Mention]') + ' ' + subj
231 subj = _('[Mention]') + ' ' + subj
232 NotificationModel().create(
232 NotificationModel().create(
233 created_by=user, subject=subj, body=body,
233 created_by=user, subject=subj, body=body,
234 recipients=mention_recipients,
234 recipients=mention_recipients,
235 type_=notification_type,
235 type_=notification_type,
236 email_kwargs=email_kwargs
236 email_kwargs=email_kwargs
237 )
237 )
238
238
239 return comment
239 return comment
240
240
241 def delete(self, comment):
241 def delete(self, comment):
242 """
242 """
243 Deletes given comment
243 Deletes given comment
244
244
245 :param comment_id:
245 :param comment_id:
246 """
246 """
247 comment = self.__get_changeset_comment(comment)
247 comment = self.__get_changeset_comment(comment)
248 Session().delete(comment)
248 Session().delete(comment)
249
249
250 return comment
250 return comment
251
251
252 def get_comments(self, repo_id, revision=None, pull_request=None):
252 def get_comments(self, repo_id, revision=None, pull_request=None):
253 """
253 """
254 Gets main comments based on revision or pull_request_id
254 Gets main comments based on revision or pull_request_id
255
255
256 :param repo_id:
256 :param repo_id:
257 :param revision:
257 :param revision:
258 :param pull_request:
258 :param pull_request:
259 """
259 """
260
260
261 q = ChangesetComment.query()\
261 q = ChangesetComment.query()\
262 .filter(ChangesetComment.repo_id == repo_id)\
262 .filter(ChangesetComment.repo_id == repo_id)\
263 .filter(ChangesetComment.line_no == None)\
263 .filter(ChangesetComment.line_no == None)\
264 .filter(ChangesetComment.f_path == None)
264 .filter(ChangesetComment.f_path == None)
265 if revision:
265 if revision:
266 q = q.filter(ChangesetComment.revision == revision)
266 q = q.filter(ChangesetComment.revision == revision)
267 elif pull_request:
267 elif pull_request:
268 pull_request = self.__get_pull_request(pull_request)
268 pull_request = self.__get_pull_request(pull_request)
269 q = q.filter(ChangesetComment.pull_request == pull_request)
269 q = q.filter(ChangesetComment.pull_request == pull_request)
270 else:
270 else:
271 raise Exception('Please specify revision or pull_request')
271 raise Exception('Please specify revision or pull_request')
272 q = q.order_by(ChangesetComment.created_on)
272 q = q.order_by(ChangesetComment.created_on)
273 return q.all()
273 return q.all()
274
274
275 def get_inline_comments(self, repo_id, revision=None, pull_request=None):
275 def get_inline_comments(self, repo_id, revision=None, pull_request=None):
276 q = Session().query(ChangesetComment)\
276 q = Session().query(ChangesetComment)\
277 .filter(ChangesetComment.repo_id == repo_id)\
277 .filter(ChangesetComment.repo_id == repo_id)\
278 .filter(ChangesetComment.line_no != None)\
278 .filter(ChangesetComment.line_no != None)\
279 .filter(ChangesetComment.f_path != None)\
279 .filter(ChangesetComment.f_path != None)\
280 .order_by(ChangesetComment.comment_id.asc())\
280 .order_by(ChangesetComment.comment_id.asc())\
281
281
282 if revision:
282 if revision:
283 q = q.filter(ChangesetComment.revision == revision)
283 q = q.filter(ChangesetComment.revision == revision)
284 elif pull_request:
284 elif pull_request:
285 pull_request = self.__get_pull_request(pull_request)
285 pull_request = self.__get_pull_request(pull_request)
286 q = q.filter(ChangesetComment.pull_request == pull_request)
286 q = q.filter(ChangesetComment.pull_request == pull_request)
287 else:
287 else:
288 raise Exception('Please specify revision or pull_request_id')
288 raise Exception('Please specify revision or pull_request_id')
289
289
290 comments = q.all()
290 comments = q.all()
291
291
292 paths = defaultdict(lambda: defaultdict(list))
292 paths = defaultdict(lambda: defaultdict(list))
293
293
294 for co in comments:
294 for co in comments:
295 paths[co.f_path][co.line_no].append(co)
295 paths[co.f_path][co.line_no].append(co)
296 return paths.items()
296 return paths.items()
@@ -1,5067 +1,5071 b''
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 {
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 border: 0;
2 border: 0;
3 outline: 0;
3 outline: 0;
4 font-size: 100%;
4 font-size: 100%;
5 vertical-align: baseline;
5 vertical-align: baseline;
6 background: transparent;
6 background: transparent;
7 margin: 0;
7 margin: 0;
8 padding: 0;
8 padding: 0;
9 }
9 }
10
10
11 body {
11 body {
12 line-height: 1;
12 line-height: 1;
13 height: 100%;
13 height: 100%;
14 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
14 background: url("../images/background.png") repeat scroll 0 0 #B0B0B0;
15 font-family: Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
15 font-family: Lucida Grande, Verdana, Lucida Sans Regular, Lucida Sans Unicode, Arial, sans-serif;
16 color: #000;
16 color: #000;
17 margin: 0;
17 margin: 0;
18 padding: 0;
18 padding: 0;
19 font-size: 12px;
19 font-size: 12px;
20 }
20 }
21
21
22 ol, ul {
22 ol, ul {
23 list-style: none;
23 list-style: none;
24 }
24 }
25
25
26 blockquote, q {
26 blockquote, q {
27 quotes: none;
27 quotes: none;
28 }
28 }
29
29
30 blockquote:before, blockquote:after, q:before, q:after {
30 blockquote:before, blockquote:after, q:before, q:after {
31 content: none;
31 content: none;
32 }
32 }
33
33
34 :focus {
34 :focus {
35 outline: 0;
35 outline: 0;
36 }
36 }
37
37
38 del {
38 del {
39 text-decoration: line-through;
39 text-decoration: line-through;
40 }
40 }
41
41
42 table {
42 table {
43 border-collapse: collapse;
43 border-collapse: collapse;
44 border-spacing: 0;
44 border-spacing: 0;
45 }
45 }
46
46
47 html {
47 html {
48 height: 100%;
48 height: 100%;
49 }
49 }
50
50
51 a {
51 a {
52 color: #577632;
52 color: #577632;
53 text-decoration: none;
53 text-decoration: none;
54 cursor: pointer;
54 cursor: pointer;
55 }
55 }
56
56
57 a:hover {
57 a:hover {
58 color: #576622;
58 color: #576622;
59 text-decoration: underline;
59 text-decoration: underline;
60 }
60 }
61
61
62 h1, h2, h3, h4, h5, h6,
62 h1, h2, h3, h4, h5, h6,
63 div.h1, div.h2, div.h3, div.h4, div.h5, div.h6 {
63 div.h1, div.h2, div.h3, div.h4, div.h5, div.h6 {
64 color: #292929;
64 color: #292929;
65 font-weight: 700;
65 font-weight: 700;
66 }
66 }
67
67
68 h1, div.h1 {
68 h1, div.h1 {
69 font-size: 22px;
69 font-size: 22px;
70 }
70 }
71
71
72 h2, div.h2 {
72 h2, div.h2 {
73 font-size: 20px;
73 font-size: 20px;
74 }
74 }
75
75
76 h3, div.h3 {
76 h3, div.h3 {
77 font-size: 18px;
77 font-size: 18px;
78 }
78 }
79
79
80 h4, div.h4 {
80 h4, div.h4 {
81 font-size: 16px;
81 font-size: 16px;
82 }
82 }
83
83
84 h5, div.h5 {
84 h5, div.h5 {
85 font-size: 14px;
85 font-size: 14px;
86 }
86 }
87
87
88 h6, div.h6 {
88 h6, div.h6 {
89 font-size: 11px;
89 font-size: 11px;
90 }
90 }
91
91
92 ul.circle {
92 ul.circle {
93 list-style-type: circle;
93 list-style-type: circle;
94 }
94 }
95
95
96 ul.disc {
96 ul.disc {
97 list-style-type: disc;
97 list-style-type: disc;
98 }
98 }
99
99
100 ul.square {
100 ul.square {
101 list-style-type: square;
101 list-style-type: square;
102 }
102 }
103
103
104 ol.lower-roman {
104 ol.lower-roman {
105 list-style-type: lower-roman;
105 list-style-type: lower-roman;
106 }
106 }
107
107
108 ol.upper-roman {
108 ol.upper-roman {
109 list-style-type: upper-roman;
109 list-style-type: upper-roman;
110 }
110 }
111
111
112 ol.lower-alpha {
112 ol.lower-alpha {
113 list-style-type: lower-alpha;
113 list-style-type: lower-alpha;
114 }
114 }
115
115
116 ol.upper-alpha {
116 ol.upper-alpha {
117 list-style-type: upper-alpha;
117 list-style-type: upper-alpha;
118 }
118 }
119
119
120 ol.decimal {
120 ol.decimal {
121 list-style-type: decimal;
121 list-style-type: decimal;
122 }
122 }
123
123
124 div.color {
124 div.color {
125 clear: both;
125 clear: both;
126 overflow: hidden;
126 overflow: hidden;
127 position: absolute;
127 position: absolute;
128 background: #FFF;
128 background: #FFF;
129 margin: 7px 0 0 60px;
129 margin: 7px 0 0 60px;
130 padding: 1px 1px 1px 0;
130 padding: 1px 1px 1px 0;
131 }
131 }
132
132
133 div.color a {
133 div.color a {
134 width: 15px;
134 width: 15px;
135 height: 15px;
135 height: 15px;
136 display: block;
136 display: block;
137 float: left;
137 float: left;
138 margin: 0 0 0 1px;
138 margin: 0 0 0 1px;
139 padding: 0;
139 padding: 0;
140 }
140 }
141
141
142 div.options {
142 div.options {
143 clear: both;
143 clear: both;
144 overflow: hidden;
144 overflow: hidden;
145 position: absolute;
145 position: absolute;
146 background: #FFF;
146 background: #FFF;
147 margin: 7px 0 0 162px;
147 margin: 7px 0 0 162px;
148 padding: 0;
148 padding: 0;
149 }
149 }
150
150
151 div.options a {
151 div.options a {
152 height: 1%;
152 height: 1%;
153 display: block;
153 display: block;
154 text-decoration: none;
154 text-decoration: none;
155 margin: 0;
155 margin: 0;
156 padding: 3px 8px;
156 padding: 3px 8px;
157 }
157 }
158
158
159 code,
159 code,
160 .code pre,
160 .code pre,
161 div.readme .readme_box pre,
161 div.readme .readme_box pre,
162 div.rst-block pre,
162 div.rst-block pre,
163 .CodeMirror .CodeMirror-code pre {
163 .CodeMirror .CodeMirror-code pre {
164 font-size: 12px;
164 font-size: 12px;
165 font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
165 font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
166 }
166 }
167
167
168 .top-left-rounded-corner {
168 .top-left-rounded-corner {
169 -webkit-border-top-left-radius: 8px;
169 -webkit-border-top-left-radius: 8px;
170 -khtml-border-radius-topleft: 8px;
170 -khtml-border-radius-topleft: 8px;
171 border-top-left-radius: 8px;
171 border-top-left-radius: 8px;
172 }
172 }
173
173
174 .top-right-rounded-corner {
174 .top-right-rounded-corner {
175 -webkit-border-top-right-radius: 8px;
175 -webkit-border-top-right-radius: 8px;
176 -khtml-border-radius-topright: 8px;
176 -khtml-border-radius-topright: 8px;
177 border-top-right-radius: 8px;
177 border-top-right-radius: 8px;
178 }
178 }
179
179
180 .bottom-left-rounded-corner {
180 .bottom-left-rounded-corner {
181 -webkit-border-bottom-left-radius: 8px;
181 -webkit-border-bottom-left-radius: 8px;
182 -khtml-border-radius-bottomleft: 8px;
182 -khtml-border-radius-bottomleft: 8px;
183 border-bottom-left-radius: 8px;
183 border-bottom-left-radius: 8px;
184 }
184 }
185
185
186 .bottom-right-rounded-corner {
186 .bottom-right-rounded-corner {
187 -webkit-border-bottom-right-radius: 8px;
187 -webkit-border-bottom-right-radius: 8px;
188 -khtml-border-radius-bottomright: 8px;
188 -khtml-border-radius-bottomright: 8px;
189 border-bottom-right-radius: 8px;
189 border-bottom-right-radius: 8px;
190 }
190 }
191
191
192 .top-left-rounded-corner-mid {
192 .top-left-rounded-corner-mid {
193 -webkit-border-top-left-radius: 4px;
193 -webkit-border-top-left-radius: 4px;
194 -khtml-border-radius-topleft: 4px;
194 -khtml-border-radius-topleft: 4px;
195 border-top-left-radius: 4px;
195 border-top-left-radius: 4px;
196 }
196 }
197
197
198 .top-right-rounded-corner-mid {
198 .top-right-rounded-corner-mid {
199 -webkit-border-top-right-radius: 4px;
199 -webkit-border-top-right-radius: 4px;
200 -khtml-border-radius-topright: 4px;
200 -khtml-border-radius-topright: 4px;
201 border-top-right-radius: 4px;
201 border-top-right-radius: 4px;
202 }
202 }
203
203
204 .bottom-left-rounded-corner-mid {
204 .bottom-left-rounded-corner-mid {
205 -webkit-border-bottom-left-radius: 4px;
205 -webkit-border-bottom-left-radius: 4px;
206 -khtml-border-radius-bottomleft: 4px;
206 -khtml-border-radius-bottomleft: 4px;
207 border-bottom-left-radius: 4px;
207 border-bottom-left-radius: 4px;
208 }
208 }
209
209
210 .bottom-right-rounded-corner-mid {
210 .bottom-right-rounded-corner-mid {
211 -webkit-border-bottom-right-radius: 4px;
211 -webkit-border-bottom-right-radius: 4px;
212 -khtml-border-radius-bottomright: 4px;
212 -khtml-border-radius-bottomright: 4px;
213 border-bottom-right-radius: 4px;
213 border-bottom-right-radius: 4px;
214 }
214 }
215
215
216 .help-block {
216 .help-block {
217 color: #999999;
217 color: #999999;
218 display: block;
218 display: block;
219 margin-bottom: 0;
219 margin-bottom: 0;
220 margin-top: 5px;
220 margin-top: 5px;
221 }
221 }
222
222
223 .empty_data {
223 .empty_data {
224 color: #B9B9B9;
224 color: #B9B9B9;
225 }
225 }
226
226
227 .truncate {
227 .truncate {
228 white-space: nowrap;
228 white-space: nowrap;
229 overflow: hidden;
229 overflow: hidden;
230 text-overflow: ellipsis;
230 text-overflow: ellipsis;
231 -o-text-overflow: ellipsis;
231 -o-text-overflow: ellipsis;
232 -ms-text-overflow: ellipsis;
232 -ms-text-overflow: ellipsis;
233 }
233 }
234
234
235 .truncate.autoexpand:hover {
235 .truncate.autoexpand:hover {
236 text-overflow: none;
236 text-overflow: none;
237 overflow: visible;
237 overflow: visible;
238 }
238 }
239
239
240 a.permalink {
240 a.permalink {
241 visibility: hidden;
241 visibility: hidden;
242 position: absolute;
242 position: absolute;
243 margin: 3px 4px;
243 margin: 3px 4px;
244 }
244 }
245
245
246 a.permalink:hover {
246 a.permalink:hover {
247 text-decoration: none;
247 text-decoration: none;
248 }
248 }
249
249
250 h1:hover > a.permalink,
250 h1:hover > a.permalink,
251 h2:hover > a.permalink,
251 h2:hover > a.permalink,
252 h3:hover > a.permalink,
252 h3:hover > a.permalink,
253 h4:hover > a.permalink,
253 h4:hover > a.permalink,
254 h5:hover > a.permalink,
254 h5:hover > a.permalink,
255 h6:hover > a.permalink,
255 h6:hover > a.permalink,
256 div:hover > a.permalink {
256 div:hover > a.permalink {
257 visibility: visible;
257 visibility: visible;
258 }
258 }
259
259
260 #header #logo {
260 #header #logo {
261 padding-left: 10px;
261 padding-left: 10px;
262 }
262 }
263
263
264 div.header img {
264 div.header img {
265 padding-top: 5px;
265 padding-top: 5px;
266 }
266 }
267
267
268 #header #logo div.header,
268 #header #logo div.header,
269 #header #logo div.branding {
269 #header #logo div.branding {
270 font-size: 20px;
270 font-size: 20px;
271 color: white;
271 color: white;
272 float: left;
272 float: left;
273 height: 44px;
273 height: 44px;
274 line-height: 44px;
274 line-height: 44px;
275 margin-right: 5px;
275 margin-right: 5px;
276 }
276 }
277
277
278 #header ul#logged-user {
278 #header ul#logged-user {
279 margin-bottom: 5px !important;
279 margin-bottom: 5px !important;
280 -webkit-border-radius: 0px 0px 8px 8px;
280 -webkit-border-radius: 0px 0px 8px 8px;
281 -khtml-border-radius: 0px 0px 8px 8px;
281 -khtml-border-radius: 0px 0px 8px 8px;
282 border-radius: 0px 0px 8px 8px;
282 border-radius: 0px 0px 8px 8px;
283 height: 37px;
283 height: 37px;
284 background-color: #577632;
284 background-color: #577632;
285 background-repeat: repeat-x;
285 background-repeat: repeat-x;
286 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
286 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
287 background-image: -moz-linear-gradient(top, #577632, #577632);
287 background-image: -moz-linear-gradient(top, #577632, #577632);
288 background-image: -ms-linear-gradient(top, #577632, #577632);
288 background-image: -ms-linear-gradient(top, #577632, #577632);
289 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
289 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
290 background-image: -webkit-linear-gradient(top, #577632, #577632);
290 background-image: -webkit-linear-gradient(top, #577632, #577632);
291 background-image: -o-linear-gradient(top, #577632, #577632);
291 background-image: -o-linear-gradient(top, #577632, #577632);
292 background-image: linear-gradient(to bottom, #577632, #577632);
292 background-image: linear-gradient(to bottom, #577632, #577632);
293 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
293 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
294 }
294 }
295
295
296 #header ul#logged-user li {
296 #header ul#logged-user li {
297 list-style: none;
297 list-style: none;
298 float: left;
298 float: left;
299 margin: 8px 0 0;
299 margin: 8px 0 0;
300 padding: 4px 12px;
300 padding: 4px 12px;
301 border-left: 1px solid #576622;
301 border-left: 1px solid #576622;
302 }
302 }
303
303
304 #header ul#logged-user li.first {
304 #header ul#logged-user li.first {
305 border-left: none;
305 border-left: none;
306 margin: 4px;
306 margin: 4px;
307 }
307 }
308
308
309 #header ul#logged-user li.first div.gravatar {
309 #header ul#logged-user li.first div.gravatar {
310 margin-top: -2px;
310 margin-top: -2px;
311 }
311 }
312
312
313 #header ul#logged-user li.first div.account {
313 #header ul#logged-user li.first div.account {
314 padding-top: 4px;
314 padding-top: 4px;
315 float: left;
315 float: left;
316 }
316 }
317
317
318 #header ul#logged-user li.last {
318 #header ul#logged-user li.last {
319 border-right: none;
319 border-right: none;
320 }
320 }
321
321
322 #header ul#logged-user li a {
322 #header ul#logged-user li a {
323 color: #fff;
323 color: #fff;
324 font-weight: 700;
324 font-weight: 700;
325 text-decoration: none;
325 text-decoration: none;
326 }
326 }
327
327
328 #header ul#logged-user li a:hover {
328 #header ul#logged-user li a:hover {
329 text-decoration: underline;
329 text-decoration: underline;
330 }
330 }
331
331
332 #header ul#logged-user li.highlight a {
332 #header ul#logged-user li.highlight a {
333 color: #fff;
333 color: #fff;
334 }
334 }
335
335
336 #header ul#logged-user li.highlight a:hover {
336 #header ul#logged-user li.highlight a:hover {
337 color: #FFF;
337 color: #FFF;
338 }
338 }
339 #header-dd {
339 #header-dd {
340 clear: both;
340 clear: both;
341 position: fixed !important;
341 position: fixed !important;
342 background-color: #577632;
342 background-color: #577632;
343 opacity: 0.01;
343 opacity: 0.01;
344 cursor: pointer;
344 cursor: pointer;
345 min-height: 10px;
345 min-height: 10px;
346 width: 100% !important;
346 width: 100% !important;
347 -webkit-border-radius: 0px 0px 4px 4px;
347 -webkit-border-radius: 0px 0px 4px 4px;
348 -khtml-border-radius: 0px 0px 4px 4px;
348 -khtml-border-radius: 0px 0px 4px 4px;
349 border-radius: 0px 0px 4px 4px;
349 border-radius: 0px 0px 4px 4px;
350 }
350 }
351
351
352 #header-dd:hover {
352 #header-dd:hover {
353 opacity: 0.2;
353 opacity: 0.2;
354 -webkit-transition: opacity 0.5s ease-in-out;
354 -webkit-transition: opacity 0.5s ease-in-out;
355 -moz-transition: opacity 0.5s ease-in-out;
355 -moz-transition: opacity 0.5s ease-in-out;
356 transition: opacity 0.5s ease-in-out;
356 transition: opacity 0.5s ease-in-out;
357 }
357 }
358
358
359 #header #header-inner {
359 #header #header-inner {
360 min-height: 44px;
360 min-height: 44px;
361 clear: both;
361 clear: both;
362 position: relative;
362 position: relative;
363 background-color: #577632;
363 background-color: #577632;
364 background-repeat: repeat-x;
364 background-repeat: repeat-x;
365 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
365 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
366 background-image: -moz-linear-gradient(top, #577632, #577632);
366 background-image: -moz-linear-gradient(top, #577632, #577632);
367 background-image: -ms-linear-gradient(top, #577632, #577632);
367 background-image: -ms-linear-gradient(top, #577632, #577632);
368 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632),color-stop(100%, #577632) );
368 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632),color-stop(100%, #577632) );
369 background-image: -webkit-linear-gradient(top, #577632, #577632);
369 background-image: -webkit-linear-gradient(top, #577632, #577632);
370 background-image: -o-linear-gradient(top, #577632, #577632);
370 background-image: -o-linear-gradient(top, #577632, #577632);
371 background-image: linear-gradient(to bottom, #577632, #577632);
371 background-image: linear-gradient(to bottom, #577632, #577632);
372 margin: 0;
372 margin: 0;
373 padding: 0;
373 padding: 0;
374 display: block;
374 display: block;
375 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
375 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
376 -webkit-border-radius: 0px 0px 4px 4px;
376 -webkit-border-radius: 0px 0px 4px 4px;
377 -khtml-border-radius: 0px 0px 4px 4px;
377 -khtml-border-radius: 0px 0px 4px 4px;
378 border-radius: 0px 0px 4px 4px;
378 border-radius: 0px 0px 4px 4px;
379 }
379 }
380 #header #header-inner.hover {
380 #header #header-inner.hover {
381 width: 100% !important;
381 width: 100% !important;
382 -webkit-border-radius: 0px 0px 0px 0px;
382 -webkit-border-radius: 0px 0px 0px 0px;
383 -khtml-border-radius: 0px 0px 0px 0px;
383 -khtml-border-radius: 0px 0px 0px 0px;
384 border-radius: 0px 0px 0px 0px;
384 border-radius: 0px 0px 0px 0px;
385 position: fixed !important;
385 position: fixed !important;
386 z-index: 10000;
386 z-index: 10000;
387 }
387 }
388
388
389 .ie7 #header #header-inner.hover,
389 .ie7 #header #header-inner.hover,
390 .ie8 #header #header-inner.hover,
390 .ie8 #header #header-inner.hover,
391 .ie9 #header #header-inner.hover
391 .ie9 #header #header-inner.hover
392 {
392 {
393 z-index: auto !important;
393 z-index: auto !important;
394 }
394 }
395
395
396 .header-pos-fix, .anchor {
396 .header-pos-fix, .anchor {
397 margin-top: -46px;
397 margin-top: -46px;
398 padding-top: 46px;
398 padding-top: 46px;
399 }
399 }
400
400
401 #header #header-inner #home a {
401 #header #header-inner #home a {
402 height: 40px;
402 height: 40px;
403 width: 46px;
403 width: 46px;
404 display: block;
404 display: block;
405 background-position: 0 0;
405 background-position: 0 0;
406 margin: 0;
406 margin: 0;
407 padding: 0;
407 padding: 0;
408 }
408 }
409
409
410 #header #header-inner #home a:hover {
410 #header #header-inner #home a:hover {
411 background-position: 0 -40px;
411 background-position: 0 -40px;
412 }
412 }
413
413
414 #header #header-inner #logo {
414 #header #header-inner #logo {
415 float: left;
415 float: left;
416 position: absolute;
416 position: absolute;
417 }
417 }
418
418
419 #header #header-inner #logo h1 {
419 #header #header-inner #logo h1 {
420 color: #FFF;
420 color: #FFF;
421 font-size: 20px;
421 font-size: 20px;
422 margin: 12px 0 0 13px;
422 margin: 12px 0 0 13px;
423 padding: 0;
423 padding: 0;
424 }
424 }
425
425
426 #header #header-inner #logo a {
426 #header #header-inner #logo a {
427 color: #fff;
427 color: #fff;
428 text-decoration: none;
428 text-decoration: none;
429 }
429 }
430
430
431 #header #header-inner #logo a:hover {
431 #header #header-inner #logo a:hover {
432 color: #bfe3ff;
432 color: #bfe3ff;
433 }
433 }
434
434
435 #header #header-inner #quick {
435 #header #header-inner #quick {
436 position: relative;
436 position: relative;
437 float: right;
437 float: right;
438 list-style-type: none;
438 list-style-type: none;
439 list-style-position: outside;
439 list-style-position: outside;
440 margin: 4px 8px 0 0;
440 margin: 4px 8px 0 0;
441 padding: 0;
441 padding: 0;
442 border-radius: 4px;
442 border-radius: 4px;
443 }
443 }
444
444
445 #header #header-inner #quick li span.short {
445 #header #header-inner #quick li span.short {
446 padding: 9px 6px 8px 6px;
446 padding: 9px 6px 8px 6px;
447 }
447 }
448
448
449 #header #header-inner #quick li span {
449 #header #header-inner #quick li span {
450 display: inline;
450 display: inline;
451 margin: 0;
451 margin: 0;
452 }
452 }
453
453
454 #header #header-inner #quick li span.normal {
454 #header #header-inner #quick li span.normal {
455 border: none;
455 border: none;
456 padding: 10px 12px 8px;
456 padding: 10px 12px 8px;
457 }
457 }
458
458
459 #header #header-inner #quick li span.icon {
459 #header #header-inner #quick li span.icon {
460 border-left: none;
460 border-left: none;
461 padding-left: 10px;
461 padding-left: 10px;
462 }
462 }
463
463
464 #header #header-inner #quick li span.icon_short {
464 #header #header-inner #quick li span.icon_short {
465 top: 0;
465 top: 0;
466 left: 0;
466 left: 0;
467 border-left: none;
467 border-left: none;
468 border-right: 1px solid #2e5c89;
468 border-right: 1px solid #2e5c89;
469 padding: 8px 6px 4px;
469 padding: 8px 6px 4px;
470 }
470 }
471
471
472 #header #header-inner #quick li span.icon img,
472 #header #header-inner #quick li span.icon img,
473 #header #header-inner #quick li span.icon_short img {
473 #header #header-inner #quick li span.icon_short img {
474 vertical-align: middle;
474 vertical-align: middle;
475 margin-bottom: 2px;
475 margin-bottom: 2px;
476 }
476 }
477
477
478 #header #header-inner #quick ul.repo_switcher {
478 #header #header-inner #quick ul.repo_switcher {
479 max-height: 275px;
479 max-height: 275px;
480 overflow-x: hidden;
480 overflow-x: hidden;
481 overflow-y: auto;
481 overflow-y: auto;
482 }
482 }
483
483
484 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
484 #header #header-inner #quick ul.repo_switcher li.qfilter_rs {
485 padding: 2px 3px;
485 padding: 2px 3px;
486 padding-right: 17px;
486 padding-right: 17px;
487 }
487 }
488
488
489 #header #header-inner #quick ul.repo_switcher li.qfilter_rs input {
489 #header #header-inner #quick ul.repo_switcher li.qfilter_rs input {
490 width: 100%;
490 width: 100%;
491 border-radius: 10px;
491 border-radius: 10px;
492 padding: 2px 7px;
492 padding: 2px 7px;
493 }
493 }
494
494
495 #header #header-inner #quick .repo_switcher_type {
495 #header #header-inner #quick .repo_switcher_type {
496 position: absolute;
496 position: absolute;
497 left: 0;
497 left: 0;
498 top: 9px;
498 top: 9px;
499 margin: 0px 2px 0px 2px;
499 margin: 0px 2px 0px 2px;
500 }
500 }
501
501
502 .groups_breadcrumbs a {
502 .groups_breadcrumbs a {
503 color: #fff;
503 color: #fff;
504 }
504 }
505
505
506 .groups_breadcrumbs a:hover {
506 .groups_breadcrumbs a:hover {
507 color: #bfe3ff;
507 color: #bfe3ff;
508 text-decoration: none;
508 text-decoration: none;
509 }
509 }
510
510
511 td.quick_repo_menu:before {
511 td.quick_repo_menu:before {
512 font-family: "kallithea";
512 font-family: "kallithea";
513 content: "\23f5"; /* triangle-right */
513 content: "\23f5"; /* triangle-right */
514 margin-left: 3px;
514 margin-left: 3px;
515 padding-right: 3px;
515 padding-right: 3px;
516 }
516 }
517
517
518 td.quick_repo_menu {
518 td.quick_repo_menu {
519 cursor: pointer;
519 cursor: pointer;
520 width: 8px;
520 width: 8px;
521 border: 1px solid transparent;
521 border: 1px solid transparent;
522 }
522 }
523
523
524 td.quick_repo_menu.active:before {
524 td.quick_repo_menu.active:before {
525 font-family: "kallithea";
525 font-family: "kallithea";
526 content: "\23f7"; /* triangle-down */
526 content: "\23f7"; /* triangle-down */
527 margin-left: 1px;
527 margin-left: 1px;
528 padding-right: 1px;
528 padding-right: 1px;
529 }
529 }
530
530
531 td.quick_repo_menu.active {
531 td.quick_repo_menu.active {
532 border: 1px solid #577632;
532 border: 1px solid #577632;
533 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
533 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
534 cursor: pointer;
534 cursor: pointer;
535 }
535 }
536
536
537 td.quick_repo_menu .menu_items {
537 td.quick_repo_menu .menu_items {
538 margin-top: 5px;
538 margin-top: 5px;
539 margin-left: -6px;
539 margin-left: -6px;
540 width: 150px;
540 width: 150px;
541 position: absolute;
541 position: absolute;
542 background-color: #FFF;
542 background-color: #FFF;
543 background: none repeat scroll 0 0 #FFFFFF;
543 background: none repeat scroll 0 0 #FFFFFF;
544 border-color: #577632 #666666 #666666;
544 border-color: #577632 #666666 #666666;
545 border-right: 1px solid #666666;
545 border-right: 1px solid #666666;
546 border-style: solid;
546 border-style: solid;
547 border-width: 1px;
547 border-width: 1px;
548 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
548 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
549 border-top-style: none;
549 border-top-style: none;
550 }
550 }
551
551
552 td.quick_repo_menu .menu_items li {
552 td.quick_repo_menu .menu_items li {
553 padding: 0 !important;
553 padding: 0 !important;
554 }
554 }
555
555
556 td.quick_repo_menu .menu_items a {
556 td.quick_repo_menu .menu_items a {
557 display: block;
557 display: block;
558 padding: 4px 12px 4px 8px;
558 padding: 4px 12px 4px 8px;
559 }
559 }
560
560
561 td.quick_repo_menu .menu_items a:hover {
561 td.quick_repo_menu .menu_items a:hover {
562 background-color: #EEE;
562 background-color: #EEE;
563 text-decoration: none;
563 text-decoration: none;
564 }
564 }
565
565
566 td.quick_repo_menu .menu_items .icon img {
566 td.quick_repo_menu .menu_items .icon img {
567 margin-bottom: -2px;
567 margin-bottom: -2px;
568 }
568 }
569
569
570 td.quick_repo_menu .menu_items.hidden {
570 td.quick_repo_menu .menu_items.hidden {
571 display: none;
571 display: none;
572 }
572 }
573
573
574 .dt_repo {
574 .dt_repo {
575 white-space: nowrap;
575 white-space: nowrap;
576 color: #577632;
576 color: #577632;
577 }
577 }
578
578
579 .dt_repo_pending {
579 .dt_repo_pending {
580 opacity: 0.5;
580 opacity: 0.5;
581 }
581 }
582
582
583 .dt_repo i.icon-keyhole-circled,
583 .dt_repo i.icon-keyhole-circled,
584 .dt_repo i.icon-globe
584 .dt_repo i.icon-globe
585 {
585 {
586 font-size: 16px;
586 font-size: 16px;
587 vertical-align: -2px;
587 vertical-align: -2px;
588 margin: 0px 1px 0px 3px;
588 margin: 0px 1px 0px 3px;
589 }
589 }
590
590
591 .dt_repo a {
591 .dt_repo a {
592 text-decoration: none;
592 text-decoration: none;
593 }
593 }
594
594
595 .dt_repo .dt_repo_name:hover {
595 .dt_repo .dt_repo_name:hover {
596 text-decoration: underline;
596 text-decoration: underline;
597 }
597 }
598
598
599 .yui-dt-first th {
599 .yui-dt-first th {
600 text-align: left;
600 text-align: left;
601 }
601 }
602
602
603 /*
603 /*
604 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
604 Copyright (c) 2011, Yahoo! Inc. All rights reserved.
605 Code licensed under the BSD License:
605 Code licensed under the BSD License:
606 http://developer.yahoo.com/yui/license.html
606 http://developer.yahoo.com/yui/license.html
607 version: 2.9.0
607 version: 2.9.0
608 */
608 */
609 .yui-skin-sam .yui-dt-mask {
609 .yui-skin-sam .yui-dt-mask {
610 position: absolute;
610 position: absolute;
611 z-index: 9500;
611 z-index: 9500;
612 }
612 }
613 .yui-dt-tmp {
613 .yui-dt-tmp {
614 position: absolute;
614 position: absolute;
615 left: -9000px;
615 left: -9000px;
616 }
616 }
617 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
617 .yui-dt-scrollable .yui-dt-bd { overflow: auto }
618 .yui-dt-scrollable .yui-dt-hd {
618 .yui-dt-scrollable .yui-dt-hd {
619 overflow: hidden;
619 overflow: hidden;
620 position: relative;
620 position: relative;
621 }
621 }
622 .yui-dt-scrollable .yui-dt-bd thead tr,
622 .yui-dt-scrollable .yui-dt-bd thead tr,
623 .yui-dt-scrollable .yui-dt-bd thead th {
623 .yui-dt-scrollable .yui-dt-bd thead th {
624 position: absolute;
624 position: absolute;
625 left: -1500px;
625 left: -1500px;
626 }
626 }
627 .yui-dt-scrollable tbody { -moz-outline: 0 }
627 .yui-dt-scrollable tbody { -moz-outline: 0 }
628 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
628 .yui-skin-sam thead .yui-dt-sortable { cursor: pointer }
629 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
629 .yui-skin-sam thead .yui-dt-draggable { cursor: move }
630 .yui-dt-coltarget {
630 .yui-dt-coltarget {
631 position: absolute;
631 position: absolute;
632 z-index: 999;
632 z-index: 999;
633 }
633 }
634 .yui-dt-hd { zoom: 1 }
634 .yui-dt-hd { zoom: 1 }
635 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
635 th.yui-dt-resizeable .yui-dt-resizerliner { position: relative }
636 .yui-dt-resizer {
636 .yui-dt-resizer {
637 position: absolute;
637 position: absolute;
638 right: 0;
638 right: 0;
639 bottom: 0;
639 bottom: 0;
640 height: 100%;
640 height: 100%;
641 cursor: e-resize;
641 cursor: e-resize;
642 cursor: col-resize;
642 cursor: col-resize;
643 background-color: #CCC;
643 background-color: #CCC;
644 opacity: 0;
644 opacity: 0;
645 filter: alpha(opacity=0);
645 filter: alpha(opacity=0);
646 }
646 }
647 .yui-dt-resizerproxy {
647 .yui-dt-resizerproxy {
648 visibility: hidden;
648 visibility: hidden;
649 position: absolute;
649 position: absolute;
650 z-index: 9000;
650 z-index: 9000;
651 background-color: #CCC;
651 background-color: #CCC;
652 opacity: 0;
652 opacity: 0;
653 filter: alpha(opacity=0);
653 filter: alpha(opacity=0);
654 }
654 }
655 th.yui-dt-hidden .yui-dt-liner,
655 th.yui-dt-hidden .yui-dt-liner,
656 td.yui-dt-hidden .yui-dt-liner,
656 td.yui-dt-hidden .yui-dt-liner,
657 th.yui-dt-hidden .yui-dt-resizer { display: none }
657 th.yui-dt-hidden .yui-dt-resizer { display: none }
658 .yui-dt-editor,
658 .yui-dt-editor,
659 .yui-dt-editor-shim {
659 .yui-dt-editor-shim {
660 position: absolute;
660 position: absolute;
661 z-index: 9000;
661 z-index: 9000;
662 }
662 }
663 .yui-skin-sam .yui-dt table {
663 .yui-skin-sam .yui-dt table {
664 margin: 0;
664 margin: 0;
665 padding: 0;
665 padding: 0;
666 font-family: arial;
666 font-family: arial;
667 font-size: inherit;
667 font-size: inherit;
668 border-collapse: separate;
668 border-collapse: separate;
669 border-spacing: 0;
669 border-spacing: 0;
670 border: 1px solid #7f7f7f;
670 border: 1px solid #7f7f7f;
671 }
671 }
672 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
672 .yui-skin-sam .yui-dt thead { border-spacing: 0 }
673 .yui-skin-sam .yui-dt caption {
673 .yui-skin-sam .yui-dt caption {
674 color: #000;
674 color: #000;
675 font-size: 85%;
675 font-size: 85%;
676 font-weight: normal;
676 font-weight: normal;
677 font-style: italic;
677 font-style: italic;
678 line-height: 1;
678 line-height: 1;
679 padding: 1em 0;
679 padding: 1em 0;
680 text-align: center;
680 text-align: center;
681 }
681 }
682 .yui-skin-sam .yui-dt th,
682 .yui-skin-sam .yui-dt th,
683 .yui-skin-sam .yui-dt th a {
683 .yui-skin-sam .yui-dt th a {
684 font-weight: normal;
684 font-weight: normal;
685 text-decoration: none;
685 text-decoration: none;
686 color: #000;
686 color: #000;
687 vertical-align: bottom;
687 vertical-align: bottom;
688 }
688 }
689 .yui-skin-sam .yui-dt th {
689 .yui-skin-sam .yui-dt th {
690 margin: 0;
690 margin: 0;
691 padding: 0;
691 padding: 0;
692 border: 0;
692 border: 0;
693 border-right: 1px solid #cbcbcb;
693 border-right: 1px solid #cbcbcb;
694 }
694 }
695 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
695 .yui-skin-sam .yui-dt tr.yui-dt-first td { border-top: 1px solid #7f7f7f }
696 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
696 .yui-skin-sam .yui-dt th .yui-dt-liner { white-space: nowrap }
697 .yui-skin-sam .yui-dt-liner {
697 .yui-skin-sam .yui-dt-liner {
698 margin: 0;
698 margin: 0;
699 padding: 0;
699 padding: 0;
700 }
700 }
701 .yui-skin-sam .yui-dt-coltarget {
701 .yui-skin-sam .yui-dt-coltarget {
702 width: 5px;
702 width: 5px;
703 background-color: red;
703 background-color: red;
704 }
704 }
705 .yui-skin-sam .yui-dt td {
705 .yui-skin-sam .yui-dt td {
706 margin: 0;
706 margin: 0;
707 padding: 0;
707 padding: 0;
708 border: 0;
708 border: 0;
709 border-right: 1px solid #cbcbcb;
709 border-right: 1px solid #cbcbcb;
710 text-align: left;
710 text-align: left;
711 }
711 }
712 .yui-skin-sam .yui-dt-list td { border-right: 0 }
712 .yui-skin-sam .yui-dt-list td { border-right: 0 }
713 .yui-skin-sam .yui-dt-resizer { width: 6px }
713 .yui-skin-sam .yui-dt-resizer { width: 6px }
714 .yui-skin-sam .yui-dt-mask {
714 .yui-skin-sam .yui-dt-mask {
715 background-color: #000;
715 background-color: #000;
716 opacity: .25;
716 opacity: .25;
717 filter: alpha(opacity=25);
717 filter: alpha(opacity=25);
718 }
718 }
719 .yui-skin-sam .yui-dt-message { background-color: #FFF }
719 .yui-skin-sam .yui-dt-message { background-color: #FFF }
720 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
720 .yui-skin-sam .yui-dt-scrollable table { border: 0 }
721 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
721 .yui-skin-sam .yui-dt-scrollable .yui-dt-hd {
722 border-left: 1px solid #7f7f7f;
722 border-left: 1px solid #7f7f7f;
723 border-top: 1px solid #7f7f7f;
723 border-top: 1px solid #7f7f7f;
724 border-right: 1px solid #7f7f7f;
724 border-right: 1px solid #7f7f7f;
725 }
725 }
726 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
726 .yui-skin-sam .yui-dt-scrollable .yui-dt-bd {
727 border-left: 1px solid #7f7f7f;
727 border-left: 1px solid #7f7f7f;
728 border-bottom: 1px solid #7f7f7f;
728 border-bottom: 1px solid #7f7f7f;
729 border-right: 1px solid #7f7f7f;
729 border-right: 1px solid #7f7f7f;
730 background-color: #FFF;
730 background-color: #FFF;
731 }
731 }
732 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
732 .yui-skin-sam .yui-dt-scrollable .yui-dt-data tr.yui-dt-last td { border-bottom: 1px solid #7f7f7f }
733 .yui-skin-sam th.yui-dt-asc,
733 .yui-skin-sam th.yui-dt-asc,
734 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
734 .yui-skin-sam th.yui-dt-sortable .yui-dt-label { margin-right: 10px }
735
735
736 .yui-skin-sam th.yui-dt-asc .yui-dt-liner:after {
736 .yui-skin-sam th.yui-dt-asc .yui-dt-liner:after {
737 font-family: "kallithea";
737 font-family: "kallithea";
738 content: "\23f6"; /* triangle-up */
738 content: "\23f6"; /* triangle-up */
739 }
739 }
740
740
741 .yui-skin-sam th.yui-dt-desc .yui-dt-liner:after {
741 .yui-skin-sam th.yui-dt-desc .yui-dt-liner:after {
742 font-family: "kallithea";
742 font-family: "kallithea";
743 content: "\23f7"; /* triangle-down */
743 content: "\23f7"; /* triangle-down */
744 }
744 }
745
745
746 tbody .yui-dt-editable { cursor: pointer }
746 tbody .yui-dt-editable { cursor: pointer }
747 .yui-dt-editor {
747 .yui-dt-editor {
748 text-align: left;
748 text-align: left;
749 background-color: #f2f2f2;
749 background-color: #f2f2f2;
750 border: 1px solid #808080;
750 border: 1px solid #808080;
751 padding: 6px;
751 padding: 6px;
752 }
752 }
753 .yui-dt-editor label {
753 .yui-dt-editor label {
754 padding-left: 4px;
754 padding-left: 4px;
755 padding-right: 6px;
755 padding-right: 6px;
756 }
756 }
757 .yui-dt-editor .yui-dt-button {
757 .yui-dt-editor .yui-dt-button {
758 padding-top: 6px;
758 padding-top: 6px;
759 text-align: right;
759 text-align: right;
760 }
760 }
761 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
761 .yui-skin-sam tr.yui-dt-even { background-color: #FFF }
762 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
762 .yui-skin-sam tr.yui-dt-odd { background-color: #edf5ff }
763 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
763 .yui-skin-sam tr.yui-dt-even td.yui-dt-asc,
764 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
764 .yui-skin-sam tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
765 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
765 .yui-skin-sam tr.yui-dt-odd td.yui-dt-asc,
766 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
766 .yui-skin-sam tr.yui-dt-odd td.yui-dt-desc { background-color: #dbeaff }
767 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
767 .yui-skin-sam .yui-dt-list tr.yui-dt-even { background-color: #FFF }
768 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
768 .yui-skin-sam .yui-dt-list tr.yui-dt-odd { background-color: #FFF }
769 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
769 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-asc,
770 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
770 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-desc { background-color: #edf5ff }
771 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
771 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-asc,
772 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
772 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-desc { background-color: #edf5ff }
773 .yui-skin-sam th.yui-dt-highlighted,
773 .yui-skin-sam th.yui-dt-highlighted,
774 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
774 .yui-skin-sam th.yui-dt-highlighted a { background-color: #b2d2ff }
775 .yui-skin-sam tr.yui-dt-highlighted,
775 .yui-skin-sam tr.yui-dt-highlighted,
776 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
776 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-asc,
777 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
777 .yui-skin-sam tr.yui-dt-highlighted td.yui-dt-desc,
778 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
778 .yui-skin-sam tr.yui-dt-even td.yui-dt-highlighted,
779 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
779 .yui-skin-sam tr.yui-dt-odd td.yui-dt-highlighted {
780 cursor: pointer;
780 cursor: pointer;
781 background-color: #b2d2ff;
781 background-color: #b2d2ff;
782 }
782 }
783 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
783 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted,
784 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
784 .yui-skin-sam .yui-dt-list th.yui-dt-highlighted a { background-color: #b2d2ff }
785 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
785 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted,
786 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
786 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-asc,
787 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
787 .yui-skin-sam .yui-dt-list tr.yui-dt-highlighted td.yui-dt-desc,
788 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
788 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-highlighted,
789 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
789 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-highlighted {
790 cursor: pointer;
790 cursor: pointer;
791 background-color: #b2d2ff;
791 background-color: #b2d2ff;
792 }
792 }
793 .yui-skin-sam th.yui-dt-selected,
793 .yui-skin-sam th.yui-dt-selected,
794 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
794 .yui-skin-sam th.yui-dt-selected a { background-color: #446cd7 }
795 .yui-skin-sam tr.yui-dt-selected td,
795 .yui-skin-sam tr.yui-dt-selected td,
796 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
796 .yui-skin-sam tr.yui-dt-selected td.yui-dt-asc,
797 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
797 .yui-skin-sam tr.yui-dt-selected td.yui-dt-desc {
798 background-color: #426fd9;
798 background-color: #426fd9;
799 color: #FFF;
799 color: #FFF;
800 }
800 }
801 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
801 .yui-skin-sam tr.yui-dt-even td.yui-dt-selected,
802 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
802 .yui-skin-sam tr.yui-dt-odd td.yui-dt-selected {
803 background-color: #446cd7;
803 background-color: #446cd7;
804 color: #FFF;
804 color: #FFF;
805 }
805 }
806 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
806 .yui-skin-sam .yui-dt-list th.yui-dt-selected,
807 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
807 .yui-skin-sam .yui-dt-list th.yui-dt-selected a { background-color: #446cd7 }
808 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
808 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td,
809 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
809 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-asc,
810 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
810 .yui-skin-sam .yui-dt-list tr.yui-dt-selected td.yui-dt-desc {
811 background-color: #426fd9;
811 background-color: #426fd9;
812 color: #FFF;
812 color: #FFF;
813 }
813 }
814 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
814 .yui-skin-sam .yui-dt-list tr.yui-dt-even td.yui-dt-selected,
815 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
815 .yui-skin-sam .yui-dt-list tr.yui-dt-odd td.yui-dt-selected {
816 background-color: #446cd7;
816 background-color: #446cd7;
817 color: #FFF;
817 color: #FFF;
818 }
818 }
819 .yui-skin-sam .yui-dt-paginator {
819 .yui-skin-sam .yui-dt-paginator {
820 display: block;
820 display: block;
821 margin: 6px 0;
821 margin: 6px 0;
822 white-space: nowrap;
822 white-space: nowrap;
823 }
823 }
824 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
824 .yui-skin-sam .yui-dt-paginator .yui-dt-first,
825 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
825 .yui-skin-sam .yui-dt-paginator .yui-dt-last,
826 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
826 .yui-skin-sam .yui-dt-paginator .yui-dt-selected { padding: 2px 6px }
827 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
827 .yui-skin-sam .yui-dt-paginator a.yui-dt-first,
828 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
828 .yui-skin-sam .yui-dt-paginator a.yui-dt-last { text-decoration: none }
829 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
829 .yui-skin-sam .yui-dt-paginator .yui-dt-previous,
830 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
830 .yui-skin-sam .yui-dt-paginator .yui-dt-next { display: none }
831 .yui-skin-sam a.yui-dt-page {
831 .yui-skin-sam a.yui-dt-page {
832 border: 1px solid #cbcbcb;
832 border: 1px solid #cbcbcb;
833 padding: 2px 6px;
833 padding: 2px 6px;
834 text-decoration: none;
834 text-decoration: none;
835 background-color: #fff;
835 background-color: #fff;
836 }
836 }
837 .yui-skin-sam .yui-dt-selected {
837 .yui-skin-sam .yui-dt-selected {
838 border: 1px solid #fff;
838 border: 1px solid #fff;
839 background-color: #fff;
839 background-color: #fff;
840 }
840 }
841
841
842 #content #left {
842 #content #left {
843 left: 0;
843 left: 0;
844 width: 280px;
844 width: 280px;
845 position: absolute;
845 position: absolute;
846 }
846 }
847
847
848 #content #right {
848 #content #right {
849 margin: 0 60px 10px 290px;
849 margin: 0 60px 10px 290px;
850 }
850 }
851
851
852 #content div.box {
852 #content div.box {
853 clear: both;
853 clear: both;
854 background: #fff;
854 background: #fff;
855 margin: 0 0 10px;
855 margin: 0 0 10px;
856 padding: 0 0 10px;
856 padding: 0 0 10px;
857 -webkit-border-radius: 4px 4px 4px 4px;
857 -webkit-border-radius: 4px 4px 4px 4px;
858 -khtml-border-radius: 4px 4px 4px 4px;
858 -khtml-border-radius: 4px 4px 4px 4px;
859 border-radius: 4px 4px 4px 4px;
859 border-radius: 4px 4px 4px 4px;
860 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
860 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
861 }
861 }
862
862
863 #content div.box-left {
863 #content div.box-left {
864 width: 49%;
864 width: 49%;
865 clear: none;
865 clear: none;
866 float: left;
866 float: left;
867 margin: 0 0 10px;
867 margin: 0 0 10px;
868 }
868 }
869
869
870 #content div.box-right {
870 #content div.box-right {
871 width: 49%;
871 width: 49%;
872 clear: none;
872 clear: none;
873 float: right;
873 float: right;
874 margin: 0 0 10px;
874 margin: 0 0 10px;
875 }
875 }
876
876
877 #content div.box div.title {
877 #content div.box div.title {
878 clear: both;
878 clear: both;
879 overflow: hidden;
879 overflow: hidden;
880 background-color: #577632;
880 background-color: #577632;
881 background-repeat: repeat-x;
881 background-repeat: repeat-x;
882 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
882 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
883 background-image: -moz-linear-gradient(top, #577632, #577632);
883 background-image: -moz-linear-gradient(top, #577632, #577632);
884 background-image: -ms-linear-gradient(top, #577632, #577632);
884 background-image: -ms-linear-gradient(top, #577632, #577632);
885 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
885 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
886 background-image: -webkit-linear-gradient(top, #577632, #577632);
886 background-image: -webkit-linear-gradient(top, #577632, #577632);
887 background-image: -o-linear-gradient(top, #577632, #577632);
887 background-image: -o-linear-gradient(top, #577632, #577632);
888 background-image: linear-gradient(to bottom, #577632, #577632);
888 background-image: linear-gradient(to bottom, #577632, #577632);
889 margin: 0 0 20px;
889 margin: 0 0 20px;
890 padding: 0;
890 padding: 0;
891 border-radius: 4px 4px 0 0;
891 border-radius: 4px 4px 0 0;
892 }
892 }
893
893
894 #content div.box div.title h5 {
894 #content div.box div.title h5 {
895 float: left;
895 float: left;
896 border: none;
896 border: none;
897 color: #fff;
897 color: #fff;
898 margin: 0;
898 margin: 0;
899 padding: 11px 0 11px 10px;
899 padding: 11px 0 11px 10px;
900 }
900 }
901
901
902 #content div.box div.title .link-white {
902 #content div.box div.title .link-white {
903 color: #FFFFFF;
903 color: #FFFFFF;
904 }
904 }
905
905
906 #content div.box div.title .link-white.current {
906 #content div.box div.title .link-white.current {
907 color: #BFE3FF;
907 color: #BFE3FF;
908 }
908 }
909
909
910 #content div.box div.title ul.links li {
910 #content div.box div.title ul.links li {
911 list-style: none;
911 list-style: none;
912 float: left;
912 float: left;
913 margin: 0;
913 margin: 0;
914 padding: 0;
914 padding: 0;
915 }
915 }
916
916
917 #content div.box div.title ul.links li a {
917 #content div.box div.title ul.links li a {
918 font-size: 13px;
918 font-size: 13px;
919 font-weight: 700;
919 font-weight: 700;
920 height: 1%;
920 height: 1%;
921 margin: 4px;
921 margin: 4px;
922 text-decoration: none;
922 text-decoration: none;
923 }
923 }
924
924
925 #content div.box div.title ul.links.nav-tabs li a {
925 #content div.box div.title ul.links.nav-tabs li a {
926 float: left;
926 float: left;
927 color: #fff;
927 color: #fff;
928 margin: 0;
928 margin: 0;
929 padding: 11px 10px 11px 10px;
929 padding: 11px 10px 11px 10px;
930 }
930 }
931
931
932 #content div.box div.title ul.links.icon-only-links li a {
932 #content div.box div.title ul.links.icon-only-links li a {
933 float: left;
933 float: left;
934 color: #fff;
934 color: #fff;
935 margin: 0;
935 margin: 0;
936 padding: 11px 10px 11px 10px;
936 padding: 11px 10px 11px 10px;
937 }
937 }
938
938
939 #content div.box h1,
939 #content div.box h1,
940 #content div.box h2,
940 #content div.box h2,
941 #content div.box h3,
941 #content div.box h3,
942 #content div.box h4,
942 #content div.box h4,
943 #content div.box h5,
943 #content div.box h5,
944 #content div.box h6,
944 #content div.box h6,
945 #content div.box div.h1,
945 #content div.box div.h1,
946 #content div.box div.h2,
946 #content div.box div.h2,
947 #content div.box div.h3,
947 #content div.box div.h3,
948 #content div.box div.h4,
948 #content div.box div.h4,
949 #content div.box div.h5,
949 #content div.box div.h5,
950 #content div.box div.h6 {
950 #content div.box div.h6 {
951 clear: both;
951 clear: both;
952 overflow: hidden;
952 overflow: hidden;
953 margin: 8px 20px 3px;
953 margin: 8px 20px 3px;
954 padding-bottom: 2px;
954 padding-bottom: 2px;
955 }
955 }
956
956
957 #content div.box div.normal-indent {
957 #content div.box div.normal-indent {
958 margin: 0 20px 10px 20px;
958 margin: 0 20px 10px 20px;
959 }
959 }
960
960
961 #content div.box p {
961 #content div.box p {
962 color: #5f5f5f;
962 color: #5f5f5f;
963 font-size: 12px;
963 font-size: 12px;
964 line-height: 150%;
964 line-height: 150%;
965 margin: 0 24px 10px;
965 margin: 0 24px 10px;
966 padding: 0;
966 padding: 0;
967 }
967 }
968
968
969 #content div.box blockquote {
969 #content div.box blockquote {
970 border-left: 4px solid #DDD;
970 border-left: 4px solid #DDD;
971 color: #5f5f5f;
971 color: #5f5f5f;
972 font-size: 11px;
972 font-size: 11px;
973 line-height: 150%;
973 line-height: 150%;
974 margin: 0 34px;
974 margin: 0 34px;
975 padding: 0 0 0 14px;
975 padding: 0 0 0 14px;
976 }
976 }
977
977
978 #content div.box blockquote p {
978 #content div.box blockquote p {
979 margin: 10px 0;
979 margin: 10px 0;
980 padding: 0;
980 padding: 0;
981 }
981 }
982
982
983 #content div.box dl {
983 #content div.box dl {
984 margin: 10px 0px;
984 margin: 10px 0px;
985 }
985 }
986
986
987 #content div.box dt {
987 #content div.box dt {
988 font-size: 12px;
988 font-size: 12px;
989 margin: 0;
989 margin: 0;
990 }
990 }
991
991
992 #content div.box dd {
992 #content div.box dd {
993 font-size: 12px;
993 font-size: 12px;
994 margin: 0;
994 margin: 0;
995 padding: 8px 0 8px 15px;
995 padding: 8px 0 8px 15px;
996 }
996 }
997
997
998 #content div.box li {
998 #content div.box li {
999 font-size: 12px;
999 font-size: 12px;
1000 padding: 4px 0;
1000 padding: 4px 0;
1001 }
1001 }
1002
1002
1003 #content div.box ul.disc,
1003 #content div.box ul.disc,
1004 #content div.box ul.circle {
1004 #content div.box ul.circle {
1005 margin: 10px 24px 10px 38px;
1005 margin: 10px 24px 10px 38px;
1006 }
1006 }
1007
1007
1008 #content div.box ul.square {
1008 #content div.box ul.square {
1009 margin: 10px 24px 10px 40px;
1009 margin: 10px 24px 10px 40px;
1010 }
1010 }
1011
1011
1012 #content div.box img.left {
1012 #content div.box img.left {
1013 border: none;
1013 border: none;
1014 float: left;
1014 float: left;
1015 margin: 10px 10px 10px 0;
1015 margin: 10px 10px 10px 0;
1016 }
1016 }
1017
1017
1018 #content div.box img.right {
1018 #content div.box img.right {
1019 border: none;
1019 border: none;
1020 float: right;
1020 float: right;
1021 margin: 10px 0 10px 10px;
1021 margin: 10px 0 10px 10px;
1022 }
1022 }
1023
1023
1024 #content div.box div.messages {
1024 #content div.box div.messages {
1025 clear: both;
1025 clear: both;
1026 overflow: hidden;
1026 overflow: hidden;
1027 margin: 0 20px;
1027 margin: 0 20px;
1028 padding: 0;
1028 padding: 0;
1029 }
1029 }
1030
1030
1031 #content div.box div.message {
1031 #content div.box div.message {
1032 clear: both;
1032 clear: both;
1033 overflow: hidden;
1033 overflow: hidden;
1034 margin: 0;
1034 margin: 0;
1035 padding: 5px 0;
1035 padding: 5px 0;
1036 white-space: pre-wrap;
1036 white-space: pre-wrap;
1037 }
1037 }
1038 #content div.box div.expand {
1038 #content div.box div.expand {
1039 width: 110%;
1039 width: 110%;
1040 height: 14px;
1040 height: 14px;
1041 font-size: 10px;
1041 font-size: 10px;
1042 text-align: center;
1042 text-align: center;
1043 cursor: pointer;
1043 cursor: pointer;
1044 color: #666;
1044 color: #666;
1045
1045
1046 background: -webkit-gradient(linear,0% 50%,100% 50%,color-stop(0%,rgba(255,255,255,0)),color-stop(100%,rgba(64,96,128,0.1)));
1046 background: -webkit-gradient(linear,0% 50%,100% 50%,color-stop(0%,rgba(255,255,255,0)),color-stop(100%,rgba(64,96,128,0.1)));
1047 background: -webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1047 background: -webkit-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1048 background: -moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1048 background: -moz-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1049 background: -o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1049 background: -o-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1050 background: -ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1050 background: -ms-linear-gradient(top,rgba(255,255,255,0),rgba(64,96,128,0.1));
1051 background: linear-gradient(to bottom,rgba(255,255,255,0),rgba(64,96,128,0.1));
1051 background: linear-gradient(to bottom,rgba(255,255,255,0),rgba(64,96,128,0.1));
1052
1052
1053 display: none;
1053 display: none;
1054 overflow: hidden;
1054 overflow: hidden;
1055 }
1055 }
1056 #content div.box div.expand .expandtext {
1056 #content div.box div.expand .expandtext {
1057 background-color: #ffffff;
1057 background-color: #ffffff;
1058 padding: 2px;
1058 padding: 2px;
1059 border-radius: 2px;
1059 border-radius: 2px;
1060 }
1060 }
1061
1061
1062 #content div.box div.message a {
1062 #content div.box div.message a {
1063 font-weight: 400 !important;
1063 font-weight: 400 !important;
1064 }
1064 }
1065
1065
1066 #content div.box div.message div.image {
1066 #content div.box div.message div.image {
1067 float: left;
1067 float: left;
1068 margin: 9px 0 0 5px;
1068 margin: 9px 0 0 5px;
1069 padding: 6px;
1069 padding: 6px;
1070 }
1070 }
1071
1071
1072 #content div.box div.message div.image img {
1072 #content div.box div.message div.image img {
1073 vertical-align: middle;
1073 vertical-align: middle;
1074 margin: 0;
1074 margin: 0;
1075 }
1075 }
1076
1076
1077 #content div.box div.message div.text {
1077 #content div.box div.message div.text {
1078 float: left;
1078 float: left;
1079 margin: 0;
1079 margin: 0;
1080 padding: 9px 6px;
1080 padding: 9px 6px;
1081 }
1081 }
1082
1082
1083 #content div.box div.message div.text h1,
1083 #content div.box div.message div.text h1,
1084 #content div.box div.message div.text h2,
1084 #content div.box div.message div.text h2,
1085 #content div.box div.message div.text h3,
1085 #content div.box div.message div.text h3,
1086 #content div.box div.message div.text h4,
1086 #content div.box div.message div.text h4,
1087 #content div.box div.message div.text h5,
1087 #content div.box div.message div.text h5,
1088 #content div.box div.message div.text h6 {
1088 #content div.box div.message div.text h6 {
1089 border: none;
1089 border: none;
1090 margin: 0;
1090 margin: 0;
1091 padding: 0;
1091 padding: 0;
1092 }
1092 }
1093
1093
1094 #content div.box div.message div.text span {
1094 #content div.box div.message div.text span {
1095 height: 1%;
1095 height: 1%;
1096 display: block;
1096 display: block;
1097 margin: 0;
1097 margin: 0;
1098 padding: 5px 0 0;
1098 padding: 5px 0 0;
1099 }
1099 }
1100
1100
1101 #content div.box div.message-error {
1101 #content div.box div.message-error {
1102 height: 1%;
1102 height: 1%;
1103 clear: both;
1103 clear: both;
1104 overflow: hidden;
1104 overflow: hidden;
1105 background: #FBE3E4;
1105 background: #FBE3E4;
1106 border: 1px solid #FBC2C4;
1106 border: 1px solid #FBC2C4;
1107 color: #860006;
1107 color: #860006;
1108 }
1108 }
1109
1109
1110 #content div.box div.message-error h6 {
1110 #content div.box div.message-error h6 {
1111 color: #860006;
1111 color: #860006;
1112 }
1112 }
1113
1113
1114 #content div.box div.message-warning {
1114 #content div.box div.message-warning {
1115 height: 1%;
1115 height: 1%;
1116 clear: both;
1116 clear: both;
1117 overflow: hidden;
1117 overflow: hidden;
1118 background: #FFF6BF;
1118 background: #FFF6BF;
1119 border: 1px solid #FFD324;
1119 border: 1px solid #FFD324;
1120 color: #5f5200;
1120 color: #5f5200;
1121 }
1121 }
1122
1122
1123 #content div.box div.message-warning h6 {
1123 #content div.box div.message-warning h6 {
1124 color: #5f5200;
1124 color: #5f5200;
1125 }
1125 }
1126
1126
1127 #content div.box div.message-notice {
1127 #content div.box div.message-notice {
1128 height: 1%;
1128 height: 1%;
1129 clear: both;
1129 clear: both;
1130 overflow: hidden;
1130 overflow: hidden;
1131 background: #8FBDE0;
1131 background: #8FBDE0;
1132 border: 1px solid #6BACDE;
1132 border: 1px solid #6BACDE;
1133 color: #003863;
1133 color: #003863;
1134 }
1134 }
1135
1135
1136 #content div.box div.message-notice h6 {
1136 #content div.box div.message-notice h6 {
1137 color: #003863;
1137 color: #003863;
1138 }
1138 }
1139
1139
1140 #content div.box div.message-success {
1140 #content div.box div.message-success {
1141 height: 1%;
1141 height: 1%;
1142 clear: both;
1142 clear: both;
1143 overflow: hidden;
1143 overflow: hidden;
1144 background: #E6EFC2;
1144 background: #E6EFC2;
1145 border: 1px solid #C6D880;
1145 border: 1px solid #C6D880;
1146 color: #4e6100;
1146 color: #4e6100;
1147 }
1147 }
1148
1148
1149 #content div.box div.message-success h6 {
1149 #content div.box div.message-success h6 {
1150 color: #4e6100;
1150 color: #4e6100;
1151 }
1151 }
1152
1152
1153 #content div.box div.form div.fields div.field {
1153 #content div.box div.form div.fields div.field {
1154 height: 1%;
1154 height: 1%;
1155 min-height: 12px;
1155 min-height: 12px;
1156 border-bottom: 1px solid #DDD;
1156 border-bottom: 1px solid #DDD;
1157 clear: both;
1157 clear: both;
1158 margin: 0;
1158 margin: 0;
1159 padding: 10px 0;
1159 padding: 10px 0;
1160 }
1160 }
1161
1161
1162 #content div.box div.form div.fields div.field-first {
1162 #content div.box div.form div.fields div.field-first {
1163 padding: 0 0 10px;
1163 padding: 0 0 10px;
1164 }
1164 }
1165
1165
1166 #content div.box div.form div.fields div.field-noborder {
1166 #content div.box div.form div.fields div.field-noborder {
1167 border-bottom: 0 !important;
1167 border-bottom: 0 !important;
1168 }
1168 }
1169
1169
1170 #content div.box div.form div.fields div.field span.error-message {
1170 #content div.box div.form div.fields div.field span.error-message {
1171 height: 1%;
1171 height: 1%;
1172 display: inline-block;
1172 display: inline-block;
1173 color: red;
1173 color: red;
1174 margin: 8px 0 0 4px;
1174 margin: 8px 0 0 4px;
1175 padding: 0;
1175 padding: 0;
1176 }
1176 }
1177
1177
1178 #content div.box div.form div.fields div.field span.success {
1178 #content div.box div.form div.fields div.field span.success {
1179 height: 1%;
1179 height: 1%;
1180 display: block;
1180 display: block;
1181 color: #316309;
1181 color: #316309;
1182 margin: 8px 0 0;
1182 margin: 8px 0 0;
1183 padding: 0;
1183 padding: 0;
1184 }
1184 }
1185
1185
1186 #content div.box div.form div.fields div.field div.label {
1186 #content div.box div.form div.fields div.field div.label {
1187 left: 70px;
1187 left: 70px;
1188 width: 155px;
1188 width: 155px;
1189 position: absolute;
1189 position: absolute;
1190 margin: 0;
1190 margin: 0;
1191 padding: 5px 0 0 0px;
1191 padding: 5px 0 0 0px;
1192 }
1192 }
1193
1193
1194 #content div.box div.form div.fields div.field div.label-summary {
1194 #content div.box div.form div.fields div.field div.label-summary {
1195 left: 30px;
1195 left: 30px;
1196 width: 155px;
1196 width: 155px;
1197 position: absolute;
1197 position: absolute;
1198 margin: 0;
1198 margin: 0;
1199 padding: 0px 0 0 0px;
1199 padding: 0px 0 0 0px;
1200 }
1200 }
1201
1201
1202 #content div.box-left div.form div.fields div.field div.label,
1202 #content div.box-left div.form div.fields div.field div.label,
1203 #content div.box-right div.form div.fields div.field div.label,
1203 #content div.box-right div.form div.fields div.field div.label,
1204 #content div.box-left div.form div.fields div.field div.label,
1204 #content div.box-left div.form div.fields div.field div.label,
1205 #content div.box-left div.form div.fields div.field div.label-summary,
1205 #content div.box-left div.form div.fields div.field div.label-summary,
1206 #content div.box-right div.form div.fields div.field div.label-summary,
1206 #content div.box-right div.form div.fields div.field div.label-summary,
1207 #content div.box-left div.form div.fields div.field div.label-summary {
1207 #content div.box-left div.form div.fields div.field div.label-summary {
1208 clear: both;
1208 clear: both;
1209 overflow: hidden;
1209 overflow: hidden;
1210 left: 0;
1210 left: 0;
1211 width: auto;
1211 width: auto;
1212 position: relative;
1212 position: relative;
1213 margin: 0;
1213 margin: 0;
1214 padding: 0 0 8px;
1214 padding: 0 0 8px;
1215 }
1215 }
1216
1216
1217 #content div.box div.form div.fields div.field div.label-select {
1217 #content div.box div.form div.fields div.field div.label-select {
1218 padding: 5px 0 0 5px;
1218 padding: 5px 0 0 5px;
1219 }
1219 }
1220
1220
1221 #content div.box-left div.form div.fields div.field div.label-select,
1221 #content div.box-left div.form div.fields div.field div.label-select,
1222 #content div.box-right div.form div.fields div.field div.label-select {
1222 #content div.box-right div.form div.fields div.field div.label-select {
1223 padding: 0 0 8px;
1223 padding: 0 0 8px;
1224 }
1224 }
1225
1225
1226 #content div.box-left div.form div.fields div.field div.label-textarea,
1226 #content div.box-left div.form div.fields div.field div.label-textarea,
1227 #content div.box-right div.form div.fields div.field div.label-textarea {
1227 #content div.box-right div.form div.fields div.field div.label-textarea {
1228 padding: 0 0 8px !important;
1228 padding: 0 0 8px !important;
1229 }
1229 }
1230
1230
1231 #content div.box div.form div.fields div.field div.label label,
1231 #content div.box div.form div.fields div.field div.label label,
1232 div.label label {
1232 div.label label {
1233 color: #393939;
1233 color: #393939;
1234 font-weight: 700;
1234 font-weight: 700;
1235 }
1235 }
1236 #content div.box div.form div.fields div.field div.label label,
1236 #content div.box div.form div.fields div.field div.label label,
1237 div.label-summary label {
1237 div.label-summary label {
1238 color: #393939;
1238 color: #393939;
1239 font-weight: 700;
1239 font-weight: 700;
1240 }
1240 }
1241 #content div.box div.form div.fields div.field div.input {
1241 #content div.box div.form div.fields div.field div.input {
1242 margin: 0 0 0 200px;
1242 margin: 0 0 0 200px;
1243 }
1243 }
1244
1244
1245 #content div.box div.form div.fields div.field div.input.summary {
1245 #content div.box div.form div.fields div.field div.input.summary {
1246 margin: 0 0 0 110px;
1246 margin: 0 0 0 110px;
1247 }
1247 }
1248 #content div.box div.form div.fields div.field div.input.summary-short {
1248 #content div.box div.form div.fields div.field div.input.summary-short {
1249 margin: 0 0 0 110px;
1249 margin: 0 0 0 110px;
1250 }
1250 }
1251 #content div.box div.form div.fields div.field div.file {
1251 #content div.box div.form div.fields div.field div.file {
1252 margin: 0 0 0 200px;
1252 margin: 0 0 0 200px;
1253 }
1253 }
1254 #content div.box div.form div.fields div.field div.editor {
1254 #content div.box div.form div.fields div.field div.editor {
1255 margin: 0 0 0 200px;
1255 margin: 0 0 0 200px;
1256 }
1256 }
1257
1257
1258 #content div.box-left div.form div.fields div.field div.input,
1258 #content div.box-left div.form div.fields div.field div.input,
1259 #content div.box-right div.form div.fields div.field div.input {
1259 #content div.box-right div.form div.fields div.field div.input {
1260 margin: 0 0 0 0px;
1260 margin: 0 0 0 0px;
1261 }
1261 }
1262
1262
1263 #content div.box div.form div.fields div.field div.input input,
1263 #content div.box div.form div.fields div.field div.input input,
1264 .reviewer_ac input {
1264 .reviewer_ac input {
1265 background: #FFF;
1265 background: #FFF;
1266 border-top: 1px solid #b3b3b3;
1266 border-top: 1px solid #b3b3b3;
1267 border-left: 1px solid #b3b3b3;
1267 border-left: 1px solid #b3b3b3;
1268 border-right: 1px solid #eaeaea;
1268 border-right: 1px solid #eaeaea;
1269 border-bottom: 1px solid #eaeaea;
1269 border-bottom: 1px solid #eaeaea;
1270 color: #000;
1270 color: #000;
1271 font-size: 12px;
1271 font-size: 12px;
1272 margin: 0;
1272 margin: 0;
1273 padding: 7px 7px 6px;
1273 padding: 7px 7px 6px;
1274 }
1274 }
1275
1275
1276 #content div.box div.form div.fields div.field div.input input#clone_url,
1276 #content div.box div.form div.fields div.field div.input input#clone_url,
1277 #content div.box div.form div.fields div.field div.input input#clone_url_id
1277 #content div.box div.form div.fields div.field div.input input#clone_url_id
1278 {
1278 {
1279 font-size: 14px;
1279 font-size: 14px;
1280 padding: 0 2px;
1280 padding: 0 2px;
1281 }
1281 }
1282
1282
1283 #content div.box div.form div.fields div.field div.file input {
1283 #content div.box div.form div.fields div.field div.file input {
1284 background: none repeat scroll 0 0 #FFFFFF;
1284 background: none repeat scroll 0 0 #FFFFFF;
1285 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1285 border-color: #B3B3B3 #EAEAEA #EAEAEA #B3B3B3;
1286 border-style: solid;
1286 border-style: solid;
1287 border-width: 1px;
1287 border-width: 1px;
1288 color: #000000;
1288 color: #000000;
1289 font-size: 12px;
1289 font-size: 12px;
1290 margin: 0;
1290 margin: 0;
1291 padding: 7px 7px 6px;
1291 padding: 7px 7px 6px;
1292 }
1292 }
1293
1293
1294 input.disabled {
1294 input.disabled {
1295 background-color: #F5F5F5 !important;
1295 background-color: #F5F5F5 !important;
1296 }
1296 }
1297 #content div.box div.form div.fields div.field div.input input.small {
1297 #content div.box div.form div.fields div.field div.input input.small {
1298 width: 30%;
1298 width: 30%;
1299 }
1299 }
1300
1300
1301 #content div.box div.form div.fields div.field div.input input.medium {
1301 #content div.box div.form div.fields div.field div.input input.medium {
1302 width: 55%;
1302 width: 55%;
1303 }
1303 }
1304
1304
1305 #content div.box div.form div.fields div.field div.input input.large {
1305 #content div.box div.form div.fields div.field div.input input.large {
1306 width: 85%;
1306 width: 85%;
1307 }
1307 }
1308
1308
1309 #content div.box div.form div.fields div.field div.input input.date {
1309 #content div.box div.form div.fields div.field div.input input.date {
1310 width: 177px;
1310 width: 177px;
1311 }
1311 }
1312
1312
1313 #content div.box div.form div.fields div.field div.input input.button {
1313 #content div.box div.form div.fields div.field div.input input.button {
1314 background: #D4D0C8;
1314 background: #D4D0C8;
1315 border-top: 1px solid #FFF;
1315 border-top: 1px solid #FFF;
1316 border-left: 1px solid #FFF;
1316 border-left: 1px solid #FFF;
1317 border-right: 1px solid #404040;
1317 border-right: 1px solid #404040;
1318 border-bottom: 1px solid #404040;
1318 border-bottom: 1px solid #404040;
1319 color: #000;
1319 color: #000;
1320 margin: 0;
1320 margin: 0;
1321 padding: 4px 8px;
1321 padding: 4px 8px;
1322 }
1322 }
1323
1323
1324 #content div.box div.form div.fields div.field div.textarea {
1324 #content div.box div.form div.fields div.field div.textarea {
1325 border-top: 1px solid #b3b3b3;
1325 border-top: 1px solid #b3b3b3;
1326 border-left: 1px solid #b3b3b3;
1326 border-left: 1px solid #b3b3b3;
1327 border-right: 1px solid #eaeaea;
1327 border-right: 1px solid #eaeaea;
1328 border-bottom: 1px solid #eaeaea;
1328 border-bottom: 1px solid #eaeaea;
1329 margin: 0 0 0 200px;
1329 margin: 0 0 0 200px;
1330 padding: 7px 7px 6px;
1330 padding: 7px 7px 6px;
1331 }
1331 }
1332
1332
1333 #content div.box div.form div.fields div.field div.textarea-editor {
1333 #content div.box div.form div.fields div.field div.textarea-editor {
1334 border: 1px solid #ddd;
1334 border: 1px solid #ddd;
1335 padding: 0;
1335 padding: 0;
1336 }
1336 }
1337
1337
1338 #content div.box div.form div.fields div.field div.textarea textarea {
1338 #content div.box div.form div.fields div.field div.textarea textarea {
1339 width: 100%;
1339 width: 100%;
1340 height: 220px;
1340 height: 220px;
1341 overflow-y: auto;
1341 overflow-y: auto;
1342 background: #FFF;
1342 background: #FFF;
1343 color: #000;
1343 color: #000;
1344 font-size: 12px;
1344 font-size: 12px;
1345 outline: none;
1345 outline: none;
1346 border-width: 0;
1346 border-width: 0;
1347 margin: 0;
1347 margin: 0;
1348 padding: 0;
1348 padding: 0;
1349 }
1349 }
1350
1350
1351 #content div.box-left div.form div.fields div.field div.textarea textarea,
1351 #content div.box-left div.form div.fields div.field div.textarea textarea,
1352 #content div.box-right div.form div.fields div.field div.textarea textarea {
1352 #content div.box-right div.form div.fields div.field div.textarea textarea {
1353 width: 100%;
1353 width: 100%;
1354 height: 100px;
1354 height: 100px;
1355 }
1355 }
1356
1356
1357 #content div.box div.form div.fields div.field div.textarea table {
1357 #content div.box div.form div.fields div.field div.textarea table {
1358 width: 100%;
1358 width: 100%;
1359 border: none;
1359 border: none;
1360 margin: 0;
1360 margin: 0;
1361 padding: 0;
1361 padding: 0;
1362 }
1362 }
1363
1363
1364 #content div.box div.form div.fields div.field div.textarea table td {
1364 #content div.box div.form div.fields div.field div.textarea table td {
1365 background: #DDD;
1365 background: #DDD;
1366 border: none;
1366 border: none;
1367 padding: 0;
1367 padding: 0;
1368 }
1368 }
1369
1369
1370 #content div.box div.form div.fields div.field div.textarea table td table {
1370 #content div.box div.form div.fields div.field div.textarea table td table {
1371 width: auto;
1371 width: auto;
1372 border: none;
1372 border: none;
1373 margin: 0;
1373 margin: 0;
1374 padding: 0;
1374 padding: 0;
1375 }
1375 }
1376
1376
1377 #content div.box div.form div.fields div.field div.textarea table td table td {
1377 #content div.box div.form div.fields div.field div.textarea table td table td {
1378 font-size: 11px;
1378 font-size: 11px;
1379 padding: 5px 5px 5px 0;
1379 padding: 5px 5px 5px 0;
1380 }
1380 }
1381
1381
1382 #content div.box div.form div.fields div.field input[type=text]:focus,
1382 #content div.box div.form div.fields div.field input[type=text]:focus,
1383 #content div.box div.form div.fields div.field input[type=password]:focus,
1383 #content div.box div.form div.fields div.field input[type=password]:focus,
1384 #content div.box div.form div.fields div.field input[type=file]:focus,
1384 #content div.box div.form div.fields div.field input[type=file]:focus,
1385 #content div.box div.form div.fields div.field textarea:focus,
1385 #content div.box div.form div.fields div.field textarea:focus,
1386 #content div.box div.form div.fields div.field select:focus,
1386 #content div.box div.form div.fields div.field select:focus,
1387 .reviewer_ac input:focus {
1387 .reviewer_ac input:focus {
1388 background: #f6f6f6;
1388 background: #f6f6f6;
1389 border-color: #666;
1389 border-color: #666;
1390 }
1390 }
1391
1391
1392 .reviewer_ac {
1392 .reviewer_ac {
1393 padding: 10px
1393 padding: 10px
1394 }
1394 }
1395
1395
1396 div.form div.fields div.field div.button {
1396 div.form div.fields div.field div.button {
1397 margin: 0;
1397 margin: 0;
1398 padding: 0 0 0 8px;
1398 padding: 0 0 0 8px;
1399 }
1399 }
1400 #content div.box table.noborder {
1400 #content div.box table.noborder {
1401 border: 1px solid transparent;
1401 border: 1px solid transparent;
1402 }
1402 }
1403
1403
1404 #content div.box table {
1404 #content div.box table {
1405 width: 100%;
1405 width: 100%;
1406 border-collapse: separate;
1406 border-collapse: separate;
1407 margin: 0;
1407 margin: 0;
1408 padding: 0;
1408 padding: 0;
1409 border: 1px solid #eee;
1409 border: 1px solid #eee;
1410 -webkit-border-radius: 4px;
1410 -webkit-border-radius: 4px;
1411 border-radius: 4px;
1411 border-radius: 4px;
1412 }
1412 }
1413
1413
1414 #content div.box table th {
1414 #content div.box table th {
1415 background: #eee;
1415 background: #eee;
1416 border-bottom: 1px solid #ddd;
1416 border-bottom: 1px solid #ddd;
1417 padding: 5px 0px 5px 5px;
1417 padding: 5px 0px 5px 5px;
1418 text-align: left;
1418 text-align: left;
1419 }
1419 }
1420
1420
1421 #content div.box table th.left {
1421 #content div.box table th.left {
1422 text-align: left;
1422 text-align: left;
1423 }
1423 }
1424
1424
1425 #content div.box table th.right {
1425 #content div.box table th.right {
1426 text-align: right;
1426 text-align: right;
1427 }
1427 }
1428
1428
1429 #content div.box table th.center {
1429 #content div.box table th.center {
1430 text-align: center;
1430 text-align: center;
1431 }
1431 }
1432
1432
1433 #content div.box table th.selected {
1433 #content div.box table th.selected {
1434 vertical-align: middle;
1434 vertical-align: middle;
1435 padding: 0;
1435 padding: 0;
1436 }
1436 }
1437
1437
1438 #content div.box table td {
1438 #content div.box table td {
1439 background: #fff;
1439 background: #fff;
1440 border-bottom: 1px solid #cdcdcd;
1440 border-bottom: 1px solid #cdcdcd;
1441 vertical-align: middle;
1441 vertical-align: middle;
1442 padding: 5px;
1442 padding: 5px;
1443 }
1443 }
1444
1444
1445 #content div.box table td.compact {
1445 #content div.box table td.compact {
1446 padding: 0;
1446 padding: 0;
1447 }
1447 }
1448
1448
1449 #content div.box table tr.selected td {
1449 #content div.box table tr.selected td {
1450 background: #FFC;
1450 background: #FFC;
1451 }
1451 }
1452
1452
1453 #content div.box table td.selected {
1453 #content div.box table td.selected {
1454 width: 3%;
1454 width: 3%;
1455 text-align: center;
1455 text-align: center;
1456 vertical-align: middle;
1456 vertical-align: middle;
1457 padding: 0;
1457 padding: 0;
1458 }
1458 }
1459
1459
1460 #content div.box table td.action {
1460 #content div.box table td.action {
1461 width: 45%;
1461 width: 45%;
1462 text-align: left;
1462 text-align: left;
1463 }
1463 }
1464
1464
1465 #content div.box table td.date {
1465 #content div.box table td.date {
1466 width: 33%;
1466 width: 33%;
1467 text-align: center;
1467 text-align: center;
1468 }
1468 }
1469
1469
1470 #content div.box div.action {
1470 #content div.box div.action {
1471 float: right;
1471 float: right;
1472 background: #FFF;
1472 background: #FFF;
1473 text-align: right;
1473 text-align: right;
1474 margin: 10px 0 0;
1474 margin: 10px 0 0;
1475 padding: 0;
1475 padding: 0;
1476 }
1476 }
1477
1477
1478 #content div.box div.action select {
1478 #content div.box div.action select {
1479 font-size: 11px;
1479 font-size: 11px;
1480 margin: 0;
1480 margin: 0;
1481 }
1481 }
1482
1482
1483 #content div.box div.action .ui-selectmenu {
1483 #content div.box div.action .ui-selectmenu {
1484 margin: 0;
1484 margin: 0;
1485 padding: 0;
1485 padding: 0;
1486 }
1486 }
1487
1487
1488 #content div.box div.pagination {
1488 #content div.box div.pagination {
1489 height: 1%;
1489 height: 1%;
1490 clear: both;
1490 clear: both;
1491 overflow: hidden;
1491 overflow: hidden;
1492 margin: 10px 0 0;
1492 margin: 10px 0 0;
1493 padding: 0;
1493 padding: 0;
1494 }
1494 }
1495
1495
1496 #content div.box div.pagination ul.pager {
1496 #content div.box div.pagination ul.pager {
1497 float: right;
1497 float: right;
1498 text-align: right;
1498 text-align: right;
1499 margin: 0;
1499 margin: 0;
1500 padding: 0;
1500 padding: 0;
1501 }
1501 }
1502
1502
1503 #content div.box div.pagination ul.pager li {
1503 #content div.box div.pagination ul.pager li {
1504 height: 1%;
1504 height: 1%;
1505 float: left;
1505 float: left;
1506 list-style: none;
1506 list-style: none;
1507 background: #ebebeb url("../images/pager.png") repeat-x;
1507 background: #ebebeb url("../images/pager.png") repeat-x;
1508 border-top: 1px solid #dedede;
1508 border-top: 1px solid #dedede;
1509 border-left: 1px solid #cfcfcf;
1509 border-left: 1px solid #cfcfcf;
1510 border-right: 1px solid #c4c4c4;
1510 border-right: 1px solid #c4c4c4;
1511 border-bottom: 1px solid #c4c4c4;
1511 border-bottom: 1px solid #c4c4c4;
1512 color: #4A4A4A;
1512 color: #4A4A4A;
1513 font-weight: 700;
1513 font-weight: 700;
1514 margin: 0 0 0 4px;
1514 margin: 0 0 0 4px;
1515 padding: 0;
1515 padding: 0;
1516 }
1516 }
1517
1517
1518 #content div.box div.pagination ul.pager li.separator {
1518 #content div.box div.pagination ul.pager li.separator {
1519 padding: 6px;
1519 padding: 6px;
1520 }
1520 }
1521
1521
1522 #content div.box div.pagination ul.pager li.current {
1522 #content div.box div.pagination ul.pager li.current {
1523 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1523 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1524 border-top: 1px solid #ccc;
1524 border-top: 1px solid #ccc;
1525 border-left: 1px solid #bebebe;
1525 border-left: 1px solid #bebebe;
1526 border-right: 1px solid #b1b1b1;
1526 border-right: 1px solid #b1b1b1;
1527 border-bottom: 1px solid #afafaf;
1527 border-bottom: 1px solid #afafaf;
1528 color: #515151;
1528 color: #515151;
1529 padding: 6px;
1529 padding: 6px;
1530 }
1530 }
1531
1531
1532 #content div.box div.pagination ul.pager li a {
1532 #content div.box div.pagination ul.pager li a {
1533 height: 1%;
1533 height: 1%;
1534 display: block;
1534 display: block;
1535 float: left;
1535 float: left;
1536 color: #515151;
1536 color: #515151;
1537 text-decoration: none;
1537 text-decoration: none;
1538 margin: 0;
1538 margin: 0;
1539 padding: 6px;
1539 padding: 6px;
1540 }
1540 }
1541
1541
1542 #content div.box div.pagination ul.pager li a:hover,
1542 #content div.box div.pagination ul.pager li a:hover,
1543 #content div.box div.pagination ul.pager li a:active {
1543 #content div.box div.pagination ul.pager li a:active {
1544 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1544 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1545 border-top: 1px solid #ccc;
1545 border-top: 1px solid #ccc;
1546 border-left: 1px solid #bebebe;
1546 border-left: 1px solid #bebebe;
1547 border-right: 1px solid #b1b1b1;
1547 border-right: 1px solid #b1b1b1;
1548 border-bottom: 1px solid #afafaf;
1548 border-bottom: 1px solid #afafaf;
1549 margin: -1px;
1549 margin: -1px;
1550 }
1550 }
1551
1551
1552 #content div.box div.pagination-right {
1552 #content div.box div.pagination-right {
1553 float: right;
1553 float: right;
1554 }
1554 }
1555
1555
1556 #content div.box div.pagination-wh {
1556 #content div.box div.pagination-wh {
1557 height: 1%;
1557 height: 1%;
1558 overflow: hidden;
1558 overflow: hidden;
1559 text-align: right;
1559 text-align: right;
1560 margin: 10px 0 0;
1560 margin: 10px 0 0;
1561 padding: 0;
1561 padding: 0;
1562 }
1562 }
1563
1563
1564 #content div.box div.pagination-wh > :first-child {
1564 #content div.box div.pagination-wh > :first-child {
1565 border-radius: 4px 0px 0px 4px;
1565 border-radius: 4px 0px 0px 4px;
1566 }
1566 }
1567
1567
1568 #content div.box div.pagination-wh > :last-child {
1568 #content div.box div.pagination-wh > :last-child {
1569 border-radius: 0px 4px 4px 0px;
1569 border-radius: 0px 4px 4px 0px;
1570 border-right: 1px solid #cfcfcf;
1570 border-right: 1px solid #cfcfcf;
1571 }
1571 }
1572
1572
1573 #content div.box div.pagination-wh a,
1573 #content div.box div.pagination-wh a,
1574 #content div.box div.pagination-wh span.pager_dotdot,
1574 #content div.box div.pagination-wh span.pager_dotdot,
1575 #content div.box div.pagination-wh span.yui-pg-previous,
1575 #content div.box div.pagination-wh span.yui-pg-previous,
1576 #content div.box div.pagination-wh span.yui-pg-last,
1576 #content div.box div.pagination-wh span.yui-pg-last,
1577 #content div.box div.pagination-wh span.yui-pg-next,
1577 #content div.box div.pagination-wh span.yui-pg-next,
1578 #content div.box div.pagination-wh span.yui-pg-first {
1578 #content div.box div.pagination-wh span.yui-pg-first {
1579 height: 1%;
1579 height: 1%;
1580 float: left;
1580 float: left;
1581 background: #ebebeb url("../images/pager.png") repeat-x;
1581 background: #ebebeb url("../images/pager.png") repeat-x;
1582 border-top: 1px solid #dedede;
1582 border-top: 1px solid #dedede;
1583 border-left: 1px solid #cfcfcf;
1583 border-left: 1px solid #cfcfcf;
1584 border-bottom: 1px solid #c4c4c4;
1584 border-bottom: 1px solid #c4c4c4;
1585 color: #4A4A4A;
1585 color: #4A4A4A;
1586 font-weight: 700;
1586 font-weight: 700;
1587 padding: 6px;
1587 padding: 6px;
1588 }
1588 }
1589
1589
1590 #content div.box div.pagination-wh span.pager_curpage {
1590 #content div.box div.pagination-wh span.pager_curpage {
1591 height: 1%;
1591 height: 1%;
1592 float: left;
1592 float: left;
1593 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1593 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1594 border-top: 1px solid #ccc;
1594 border-top: 1px solid #ccc;
1595 border-left: 1px solid #bebebe;
1595 border-left: 1px solid #bebebe;
1596 border-bottom: 1px solid #afafaf;
1596 border-bottom: 1px solid #afafaf;
1597 color: #515151;
1597 color: #515151;
1598 font-weight: 700;
1598 font-weight: 700;
1599 padding: 6px;
1599 padding: 6px;
1600 }
1600 }
1601
1601
1602 #content div.box div.pagination-wh a:hover,
1602 #content div.box div.pagination-wh a:hover,
1603 #content div.box div.pagination-wh a:active {
1603 #content div.box div.pagination-wh a:active {
1604 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1604 background: #b4b4b4 url("../images/pager_selected.png") repeat-x;
1605 border-top: 1px solid #ccc;
1605 border-top: 1px solid #ccc;
1606 border-left: 1px solid #bebebe;
1606 border-left: 1px solid #bebebe;
1607 border-bottom: 1px solid #afafaf;
1607 border-bottom: 1px solid #afafaf;
1608 text-decoration: none;
1608 text-decoration: none;
1609 }
1609 }
1610
1610
1611 #content div.box div.traffic div.legend {
1611 #content div.box div.traffic div.legend {
1612 clear: both;
1612 clear: both;
1613 overflow: hidden;
1613 overflow: hidden;
1614 border-bottom: 1px solid #ddd;
1614 border-bottom: 1px solid #ddd;
1615 margin: 0 0 10px;
1615 margin: 0 0 10px;
1616 padding: 0 0 10px;
1616 padding: 0 0 10px;
1617 }
1617 }
1618
1618
1619 #content div.box div.traffic div.legend h6 {
1619 #content div.box div.traffic div.legend h6 {
1620 float: left;
1620 float: left;
1621 border: none;
1621 border: none;
1622 margin: 0;
1622 margin: 0;
1623 padding: 0;
1623 padding: 0;
1624 }
1624 }
1625
1625
1626 #content div.box div.traffic div.legend li {
1626 #content div.box div.traffic div.legend li {
1627 list-style: none;
1627 list-style: none;
1628 float: left;
1628 float: left;
1629 font-size: 11px;
1629 font-size: 11px;
1630 margin: 0;
1630 margin: 0;
1631 padding: 0 8px 0 4px;
1631 padding: 0 8px 0 4px;
1632 }
1632 }
1633
1633
1634 #content div.box div.traffic div.legend li.visits {
1634 #content div.box div.traffic div.legend li.visits {
1635 border-left: 12px solid #edc240;
1635 border-left: 12px solid #edc240;
1636 }
1636 }
1637
1637
1638 #content div.box div.traffic div.legend li.pageviews {
1638 #content div.box div.traffic div.legend li.pageviews {
1639 border-left: 12px solid #afd8f8;
1639 border-left: 12px solid #afd8f8;
1640 }
1640 }
1641
1641
1642 #content div.box div.traffic table {
1642 #content div.box div.traffic table {
1643 width: auto;
1643 width: auto;
1644 }
1644 }
1645
1645
1646 #content div.box div.traffic table td {
1646 #content div.box div.traffic table td {
1647 background: transparent;
1647 background: transparent;
1648 border: none;
1648 border: none;
1649 padding: 2px 3px 3px;
1649 padding: 2px 3px 3px;
1650 }
1650 }
1651
1651
1652 #content div.box div.traffic table td.legendLabel {
1652 #content div.box div.traffic table td.legendLabel {
1653 padding: 0 3px 2px;
1653 padding: 0 3px 2px;
1654 }
1654 }
1655
1655
1656 #content div.box #summary {
1656 #content div.box #summary {
1657 margin-right: 200px;
1657 margin-right: 200px;
1658 min-height: 240px;
1658 min-height: 240px;
1659 }
1659 }
1660
1660
1661 #summary-menu-stats {
1661 #summary-menu-stats {
1662 float: left;
1662 float: left;
1663 width: 180px;
1663 width: 180px;
1664 position: absolute;
1664 position: absolute;
1665 top: 0;
1665 top: 0;
1666 right: 0;
1666 right: 0;
1667 }
1667 }
1668
1668
1669 #summary-menu-stats ul {
1669 #summary-menu-stats ul {
1670 margin: 0 10px;
1670 margin: 0 10px;
1671 display: block;
1671 display: block;
1672 background-color: #f9f9f9;
1672 background-color: #f9f9f9;
1673 border: 1px solid #d1d1d1;
1673 border: 1px solid #d1d1d1;
1674 border-radius: 4px;
1674 border-radius: 4px;
1675 }
1675 }
1676
1676
1677 #content #summary-menu-stats li {
1677 #content #summary-menu-stats li {
1678 border-top: 1px solid #d1d1d1;
1678 border-top: 1px solid #d1d1d1;
1679 padding: 0;
1679 padding: 0;
1680 }
1680 }
1681
1681
1682 #content #summary-menu-stats li:hover {
1682 #content #summary-menu-stats li:hover {
1683 background: #f0f0f0;
1683 background: #f0f0f0;
1684 }
1684 }
1685
1685
1686 #content #summary-menu-stats li:first-child {
1686 #content #summary-menu-stats li:first-child {
1687 border-top: none;
1687 border-top: none;
1688 }
1688 }
1689
1689
1690 #summary-menu-stats a {
1690 #summary-menu-stats a {
1691 display: block;
1691 display: block;
1692 padding: 12px 10px;
1692 padding: 12px 10px;
1693 background-repeat: no-repeat;
1693 background-repeat: no-repeat;
1694 background-position: 10px 50%;
1694 background-position: 10px 50%;
1695 padding-right: 10px;
1695 padding-right: 10px;
1696 }
1696 }
1697
1697
1698 #repo_size_2.loaded {
1698 #repo_size_2.loaded {
1699 margin-left: 30px;
1699 margin-left: 30px;
1700 display: block;
1700 display: block;
1701 padding-right: 10px;
1701 padding-right: 10px;
1702 padding-bottom: 7px;
1702 padding-bottom: 7px;
1703 }
1703 }
1704
1704
1705 #summary-menu-stats a:hover {
1705 #summary-menu-stats a:hover {
1706 text-decoration: none;
1706 text-decoration: none;
1707 }
1707 }
1708
1708
1709 #summary-menu-stats a span {
1709 #summary-menu-stats a span {
1710 background-color: #DEDEDE;
1710 background-color: #DEDEDE;
1711 color: #888 !important;
1711 color: #888 !important;
1712 border-radius: 4px;
1712 border-radius: 4px;
1713 padding: 2px 4px;
1713 padding: 2px 4px;
1714 font-size: 10px;
1714 font-size: 10px;
1715 }
1715 }
1716
1716
1717 #summary .metatag {
1717 #summary .metatag {
1718 display: inline-block;
1718 display: inline-block;
1719 padding: 3px 5px;
1719 padding: 3px 5px;
1720 margin-bottom: 3px;
1720 margin-bottom: 3px;
1721 margin-right: 1px;
1721 margin-right: 1px;
1722 border-radius: 5px;
1722 border-radius: 5px;
1723 }
1723 }
1724
1724
1725 #content div.box #summary p {
1725 #content div.box #summary p {
1726 margin-bottom: -5px;
1726 margin-bottom: -5px;
1727 width: 600px;
1727 width: 600px;
1728 white-space: pre-wrap;
1728 white-space: pre-wrap;
1729 }
1729 }
1730
1730
1731 #content div.box #summary p:last-child {
1731 #content div.box #summary p:last-child {
1732 margin-bottom: 9px;
1732 margin-bottom: 9px;
1733 }
1733 }
1734
1734
1735 #content div.box #summary p:first-of-type {
1735 #content div.box #summary p:first-of-type {
1736 margin-top: 9px;
1736 margin-top: 9px;
1737 }
1737 }
1738
1738
1739 .metatag {
1739 .metatag {
1740 display: inline-block;
1740 display: inline-block;
1741 margin-right: 1px;
1741 margin-right: 1px;
1742 -webkit-border-radius: 4px 4px 4px 4px;
1742 -webkit-border-radius: 4px 4px 4px 4px;
1743 -khtml-border-radius: 4px 4px 4px 4px;
1743 -khtml-border-radius: 4px 4px 4px 4px;
1744 border-radius: 4px 4px 4px 4px;
1744 border-radius: 4px 4px 4px 4px;
1745
1745
1746 border: solid 1px #9CF;
1746 border: solid 1px #9CF;
1747 padding: 2px 3px 2px 3px !important;
1747 padding: 2px 3px 2px 3px !important;
1748 background-color: #DEF;
1748 background-color: #DEF;
1749 }
1749 }
1750
1750
1751 .metatag[tag="dead"] {
1751 .metatag[tag="dead"] {
1752 background-color: #E44;
1752 background-color: #E44;
1753 }
1753 }
1754
1754
1755 .metatag[tag="stale"] {
1755 .metatag[tag="stale"] {
1756 background-color: #EA4;
1756 background-color: #EA4;
1757 }
1757 }
1758
1758
1759 .metatag[tag="featured"] {
1759 .metatag[tag="featured"] {
1760 background-color: #AEA;
1760 background-color: #AEA;
1761 }
1761 }
1762
1762
1763 .metatag[tag="requires"] {
1763 .metatag[tag="requires"] {
1764 background-color: #9CF;
1764 background-color: #9CF;
1765 }
1765 }
1766
1766
1767 .metatag[tag="recommends"] {
1767 .metatag[tag="recommends"] {
1768 background-color: #BDF;
1768 background-color: #BDF;
1769 }
1769 }
1770
1770
1771 .metatag[tag="lang"] {
1771 .metatag[tag="lang"] {
1772 background-color: #FAF474;
1772 background-color: #FAF474;
1773 }
1773 }
1774
1774
1775 .metatag[tag="license"] {
1775 .metatag[tag="license"] {
1776 border: solid 1px #9CF;
1776 border: solid 1px #9CF;
1777 background-color: #DEF;
1777 background-color: #DEF;
1778 target-new: tab !important;
1778 target-new: tab !important;
1779 }
1779 }
1780 .metatag[tag="see"] {
1780 .metatag[tag="see"] {
1781 border: solid 1px #CBD;
1781 border: solid 1px #CBD;
1782 background-color: #EDF;
1782 background-color: #EDF;
1783 }
1783 }
1784
1784
1785 a.metatag[tag="license"]:hover {
1785 a.metatag[tag="license"]:hover {
1786 background-color: #577632;
1786 background-color: #577632;
1787 color: #FFF;
1787 color: #FFF;
1788 text-decoration: none;
1788 text-decoration: none;
1789 }
1789 }
1790
1790
1791 #summary .desc {
1791 #summary .desc {
1792 white-space: pre;
1792 white-space: pre;
1793 width: 100%;
1793 width: 100%;
1794 }
1794 }
1795
1795
1796 #summary .repo_name {
1796 #summary .repo_name {
1797 font-size: 1.6em;
1797 font-size: 1.6em;
1798 font-weight: bold;
1798 font-weight: bold;
1799 vertical-align: baseline;
1799 vertical-align: baseline;
1800 clear: right
1800 clear: right
1801 }
1801 }
1802
1802
1803 #footer {
1803 #footer {
1804 clear: both;
1804 clear: both;
1805 overflow: hidden;
1805 overflow: hidden;
1806 text-align: right;
1806 text-align: right;
1807 margin: 0;
1807 margin: 0;
1808 padding: 0 10px 4px;
1808 padding: 0 10px 4px;
1809 margin: -10px 0 0;
1809 margin: -10px 0 0;
1810 }
1810 }
1811
1811
1812 #footer div#footer-inner {
1812 #footer div#footer-inner {
1813 background-color: #577632;
1813 background-color: #577632;
1814 background-repeat: repeat-x;
1814 background-repeat: repeat-x;
1815 background-image: -khtml-gradient( linear, left top, left bottom, from(#577632), to(#577632));
1815 background-image: -khtml-gradient( linear, left top, left bottom, from(#577632), to(#577632));
1816 background-image: -moz-linear-gradient(top, #577632, #577632);
1816 background-image: -moz-linear-gradient(top, #577632, #577632);
1817 background-image: -ms-linear-gradient( top, #577632, #577632);
1817 background-image: -ms-linear-gradient( top, #577632, #577632);
1818 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #577632), color-stop( 100%, #577632));
1818 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #577632), color-stop( 100%, #577632));
1819 background-image: -webkit-linear-gradient( top, #577632, #577632);
1819 background-image: -webkit-linear-gradient( top, #577632, #577632);
1820 background-image: -o-linear-gradient( top, #577632, #577632);
1820 background-image: -o-linear-gradient( top, #577632, #577632);
1821 background-image: linear-gradient(to bottom, #577632, #577632);
1821 background-image: linear-gradient(to bottom, #577632, #577632);
1822 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1822 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1823 -webkit-border-radius: 4px 4px 4px 4px;
1823 -webkit-border-radius: 4px 4px 4px 4px;
1824 -khtml-border-radius: 4px 4px 4px 4px;
1824 -khtml-border-radius: 4px 4px 4px 4px;
1825 border-radius: 4px 4px 4px 4px;
1825 border-radius: 4px 4px 4px 4px;
1826 }
1826 }
1827
1827
1828 #footer div#footer-inner p {
1828 #footer div#footer-inner p {
1829 padding: 15px 25px 15px 0;
1829 padding: 15px 25px 15px 0;
1830 color: #FFF;
1830 color: #FFF;
1831 font-weight: 700;
1831 font-weight: 700;
1832 }
1832 }
1833
1833
1834 #footer div#footer-inner .footer-link {
1834 #footer div#footer-inner .footer-link {
1835 float: left;
1835 float: left;
1836 padding-left: 10px;
1836 padding-left: 10px;
1837 }
1837 }
1838
1838
1839 #footer div#footer-inner .footer-link a,
1839 #footer div#footer-inner .footer-link a,
1840 #footer div#footer-inner .footer-link-right a {
1840 #footer div#footer-inner .footer-link-right a {
1841 color: #FFF;
1841 color: #FFF;
1842 }
1842 }
1843
1843
1844 #login div.title {
1844 #login div.title {
1845 clear: both;
1845 clear: both;
1846 overflow: hidden;
1846 overflow: hidden;
1847 position: relative;
1847 position: relative;
1848 background-color: #577632;
1848 background-color: #577632;
1849 background-repeat: repeat-x;
1849 background-repeat: repeat-x;
1850 background-image: -khtml-gradient( linear, left top, left bottom, from(#577632), to(#577632));
1850 background-image: -khtml-gradient( linear, left top, left bottom, from(#577632), to(#577632));
1851 background-image: -moz-linear-gradient( top, #577632, #577632);
1851 background-image: -moz-linear-gradient( top, #577632, #577632);
1852 background-image: -ms-linear-gradient( top, #577632, #577632);
1852 background-image: -ms-linear-gradient( top, #577632, #577632);
1853 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #577632), color-stop( 100%, #577632));
1853 background-image: -webkit-gradient( linear, left top, left bottom, color-stop( 0%, #577632), color-stop( 100%, #577632));
1854 background-image: -webkit-linear-gradient( top, #577632, #577632);
1854 background-image: -webkit-linear-gradient( top, #577632, #577632);
1855 background-image: -o-linear-gradient( top, #577632, #577632);
1855 background-image: -o-linear-gradient( top, #577632, #577632);
1856 background-image: linear-gradient(to bottom, #577632, #577632);
1856 background-image: linear-gradient(to bottom, #577632, #577632);
1857 margin: 0 auto;
1857 margin: 0 auto;
1858 padding: 0;
1858 padding: 0;
1859 }
1859 }
1860
1860
1861 #login div.inner .icon-lock {
1861 #login div.inner .icon-lock {
1862 font-size: 80pt;
1862 font-size: 80pt;
1863 color: #DDD;
1863 color: #DDD;
1864 }
1864 }
1865
1865
1866 #login div.inner {
1866 #login div.inner {
1867 background: #FFF;
1867 background: #FFF;
1868 border-top: none;
1868 border-top: none;
1869 border-bottom: none;
1869 border-bottom: none;
1870 margin: 0 auto;
1870 margin: 0 auto;
1871 padding: 20px;
1871 padding: 20px;
1872 }
1872 }
1873
1873
1874 #login div.form div.fields div.field div.label {
1874 #login div.form div.fields div.field div.label {
1875 width: 173px;
1875 width: 173px;
1876 float: left;
1876 float: left;
1877 text-align: right;
1877 text-align: right;
1878 margin: 2px 10px 0 0;
1878 margin: 2px 10px 0 0;
1879 padding: 5px 0 0 5px;
1879 padding: 5px 0 0 5px;
1880 }
1880 }
1881
1881
1882 #login div.form div.fields div.field div.input input {
1882 #login div.form div.fields div.field div.input input {
1883 background: #FFF;
1883 background: #FFF;
1884 border-top: 1px solid #b3b3b3;
1884 border-top: 1px solid #b3b3b3;
1885 border-left: 1px solid #b3b3b3;
1885 border-left: 1px solid #b3b3b3;
1886 border-right: 1px solid #eaeaea;
1886 border-right: 1px solid #eaeaea;
1887 border-bottom: 1px solid #eaeaea;
1887 border-bottom: 1px solid #eaeaea;
1888 color: #000;
1888 color: #000;
1889 font-size: 11px;
1889 font-size: 11px;
1890 margin: 0;
1890 margin: 0;
1891 padding: 7px 7px 6px;
1891 padding: 7px 7px 6px;
1892 }
1892 }
1893
1893
1894 #login div.form div.fields div.buttons {
1894 #login div.form div.fields div.buttons {
1895 clear: both;
1895 clear: both;
1896 overflow: hidden;
1896 overflow: hidden;
1897 border-top: 1px solid #DDD;
1897 border-top: 1px solid #DDD;
1898 text-align: right;
1898 text-align: right;
1899 margin: 0;
1899 margin: 0;
1900 padding: 10px 0 0;
1900 padding: 10px 0 0;
1901 }
1901 }
1902
1902
1903 #login div.form div.links {
1903 #login div.form div.links {
1904 clear: both;
1904 clear: both;
1905 overflow: hidden;
1905 overflow: hidden;
1906 margin: 10px 0 0;
1906 margin: 10px 0 0;
1907 padding: 0 0 2px;
1907 padding: 0 0 2px;
1908 }
1908 }
1909
1909
1910 .user-menu {
1910 .user-menu {
1911 margin: 0px !important;
1911 margin: 0px !important;
1912 float: left;
1912 float: left;
1913 }
1913 }
1914
1914
1915 .user-menu .container {
1915 .user-menu .container {
1916 padding: 0px 4px 0px 4px;
1916 padding: 0px 4px 0px 4px;
1917 margin: 0px 0px 0px 0px;
1917 margin: 0px 0px 0px 0px;
1918 }
1918 }
1919
1919
1920 .user-menu .gravatar {
1920 .user-menu .gravatar {
1921 margin: 0px 0px 0px 0px;
1921 margin: 0px 0px 0px 0px;
1922 cursor: pointer;
1922 cursor: pointer;
1923 }
1923 }
1924 .user-menu .gravatar.enabled {
1924 .user-menu .gravatar.enabled {
1925 background-color: #FDF784 !important;
1925 background-color: #FDF784 !important;
1926 }
1926 }
1927 .user-menu .gravatar:hover {
1927 .user-menu .gravatar:hover {
1928 background-color: #FDF784 !important;
1928 background-color: #FDF784 !important;
1929 }
1929 }
1930 #quick_login {
1930 #quick_login {
1931 min-height: 110px;
1931 min-height: 110px;
1932 padding: 4px;
1932 padding: 4px;
1933 position: absolute;
1933 position: absolute;
1934 right: 0;
1934 right: 0;
1935 background-color: #577632;
1935 background-color: #577632;
1936 background-repeat: repeat-x;
1936 background-repeat: repeat-x;
1937 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
1937 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
1938 background-image: -moz-linear-gradient(top, #577632, #577632);
1938 background-image: -moz-linear-gradient(top, #577632, #577632);
1939 background-image: -ms-linear-gradient(top, #577632, #577632);
1939 background-image: -ms-linear-gradient(top, #577632, #577632);
1940 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
1940 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
1941 background-image: -webkit-linear-gradient(top, #577632, #577632);
1941 background-image: -webkit-linear-gradient(top, #577632, #577632);
1942 background-image: -o-linear-gradient(top, #577632, #577632);
1942 background-image: -o-linear-gradient(top, #577632, #577632);
1943 background-image: linear-gradient(to bottom, #577632, #577632);
1943 background-image: linear-gradient(to bottom, #577632, #577632);
1944
1944
1945 z-index: 999;
1945 z-index: 999;
1946 -webkit-border-radius: 0px 0px 4px 4px;
1946 -webkit-border-radius: 0px 0px 4px 4px;
1947 -khtml-border-radius: 0px 0px 4px 4px;
1947 -khtml-border-radius: 0px 0px 4px 4px;
1948 border-radius: 0px 0px 4px 4px;
1948 border-radius: 0px 0px 4px 4px;
1949 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1949 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
1950
1950
1951 overflow: hidden;
1951 overflow: hidden;
1952 }
1952 }
1953 #quick_login h4 {
1953 #quick_login h4 {
1954 color: #fff;
1954 color: #fff;
1955 padding: 5px 0px 5px 14px;
1955 padding: 5px 0px 5px 14px;
1956 }
1956 }
1957
1957
1958 #quick_login .password_forgoten {
1958 #quick_login .password_forgoten {
1959 padding-right: 0px;
1959 padding-right: 0px;
1960 padding-top: 0px;
1960 padding-top: 0px;
1961 text-align: left;
1961 text-align: left;
1962 }
1962 }
1963
1963
1964 #quick_login .password_forgoten a {
1964 #quick_login .password_forgoten a {
1965 font-size: 10px;
1965 font-size: 10px;
1966 color: #fff;
1966 color: #fff;
1967 padding: 0px !important;
1967 padding: 0px !important;
1968 line-height: 20px !important;
1968 line-height: 20px !important;
1969 }
1969 }
1970
1970
1971 #quick_login .register {
1971 #quick_login .register {
1972 padding-right: 10px;
1972 padding-right: 10px;
1973 padding-top: 5px;
1973 padding-top: 5px;
1974 text-align: left;
1974 text-align: left;
1975 }
1975 }
1976
1976
1977 #quick_login .register a {
1977 #quick_login .register a {
1978 font-size: 10px;
1978 font-size: 10px;
1979 color: #fff;
1979 color: #fff;
1980 padding: 0px !important;
1980 padding: 0px !important;
1981 line-height: 20px !important;
1981 line-height: 20px !important;
1982 }
1982 }
1983
1983
1984 #quick_login .submit {
1984 #quick_login .submit {
1985 margin: -20px 0 0 0px;
1985 margin: -20px 0 0 0px;
1986 position: absolute;
1986 position: absolute;
1987 right: 15px;
1987 right: 15px;
1988 }
1988 }
1989
1989
1990 #quick_login .links_left {
1990 #quick_login .links_left {
1991 float: left;
1991 float: left;
1992 margin-right: 130px;
1992 margin-right: 130px;
1993 width: 170px;
1993 width: 170px;
1994 }
1994 }
1995 #quick_login .links_right {
1995 #quick_login .links_right {
1996
1996
1997 position: absolute;
1997 position: absolute;
1998 right: 0;
1998 right: 0;
1999 }
1999 }
2000 #quick_login .full_name {
2000 #quick_login .full_name {
2001 color: #FFFFFF;
2001 color: #FFFFFF;
2002 font-weight: bold;
2002 font-weight: bold;
2003 padding: 3px 3px 3px 6px;
2003 padding: 3px 3px 3px 6px;
2004 }
2004 }
2005 #quick_login .big_gravatar {
2005 #quick_login .big_gravatar {
2006 padding: 4px 0px 0px 6px;
2006 padding: 4px 0px 0px 6px;
2007 }
2007 }
2008 #quick_login .notifications {
2008 #quick_login .notifications {
2009 padding: 2px 0px 0px 6px;
2009 padding: 2px 0px 0px 6px;
2010 color: #FFFFFF;
2010 color: #FFFFFF;
2011 font-weight: bold;
2011 font-weight: bold;
2012 line-height: 10px !important;
2012 line-height: 10px !important;
2013 }
2013 }
2014 #quick_login .notifications a,
2014 #quick_login .notifications a,
2015 #quick_login .unread a {
2015 #quick_login .unread a {
2016 color: #FFFFFF;
2016 color: #FFFFFF;
2017 display: block;
2017 display: block;
2018 padding: 0px !important;
2018 padding: 0px !important;
2019 }
2019 }
2020 #quick_login .notifications a:hover,
2020 #quick_login .notifications a:hover,
2021 #quick_login .unread a:hover {
2021 #quick_login .unread a:hover {
2022 background-color: inherit !important;
2022 background-color: inherit !important;
2023 }
2023 }
2024 #quick_login .email,
2024 #quick_login .email,
2025 #quick_login .unread {
2025 #quick_login .unread {
2026 color: #FFFFFF;
2026 color: #FFFFFF;
2027 padding: 3px 3px 3px 6px;
2027 padding: 3px 3px 3px 6px;
2028 }
2028 }
2029 #quick_login .links .logout {
2029 #quick_login .links .logout {
2030 }
2030 }
2031
2031
2032 #quick_login div.form div.fields {
2032 #quick_login div.form div.fields {
2033 padding-top: 2px;
2033 padding-top: 2px;
2034 padding-left: 10px;
2034 padding-left: 10px;
2035 }
2035 }
2036
2036
2037 #quick_login div.form div.fields div.field {
2037 #quick_login div.form div.fields div.field {
2038 padding: 5px;
2038 padding: 5px;
2039 }
2039 }
2040
2040
2041 #quick_login div.form div.fields div.field div.label label {
2041 #quick_login div.form div.fields div.field div.label label {
2042 color: #fff;
2042 color: #fff;
2043 padding-bottom: 3px;
2043 padding-bottom: 3px;
2044 }
2044 }
2045
2045
2046 #quick_login div.form div.fields div.field div.input input {
2046 #quick_login div.form div.fields div.field div.input input {
2047 width: 236px;
2047 width: 236px;
2048 background: #FFF;
2048 background: #FFF;
2049 border-top: 1px solid #b3b3b3;
2049 border-top: 1px solid #b3b3b3;
2050 border-left: 1px solid #b3b3b3;
2050 border-left: 1px solid #b3b3b3;
2051 border-right: 1px solid #eaeaea;
2051 border-right: 1px solid #eaeaea;
2052 border-bottom: 1px solid #eaeaea;
2052 border-bottom: 1px solid #eaeaea;
2053 color: #000;
2053 color: #000;
2054 font-size: 11px;
2054 font-size: 11px;
2055 margin: 0;
2055 margin: 0;
2056 padding: 5px 7px 4px;
2056 padding: 5px 7px 4px;
2057 }
2057 }
2058
2058
2059 #quick_login div.form div.fields div.buttons {
2059 #quick_login div.form div.fields div.buttons {
2060 clear: both;
2060 clear: both;
2061 overflow: hidden;
2061 overflow: hidden;
2062 text-align: right;
2062 text-align: right;
2063 margin: 0;
2063 margin: 0;
2064 padding: 5px 14px 0px 5px;
2064 padding: 5px 14px 0px 5px;
2065 }
2065 }
2066
2066
2067 #quick_login div.form div.links {
2067 #quick_login div.form div.links {
2068 clear: both;
2068 clear: both;
2069 overflow: hidden;
2069 overflow: hidden;
2070 margin: 10px 0 0;
2070 margin: 10px 0 0;
2071 padding: 0 0 2px;
2071 padding: 0 0 2px;
2072 }
2072 }
2073
2073
2074 #quick_login ol.links {
2074 #quick_login ol.links {
2075 display: block;
2075 display: block;
2076 font-weight: bold;
2076 font-weight: bold;
2077 list-style: none outside none;
2077 list-style: none outside none;
2078 text-align: right;
2078 text-align: right;
2079 }
2079 }
2080 #quick_login ol.links li {
2080 #quick_login ol.links li {
2081 line-height: 27px;
2081 line-height: 27px;
2082 margin: 0;
2082 margin: 0;
2083 padding: 0;
2083 padding: 0;
2084 color: #fff;
2084 color: #fff;
2085 display: block;
2085 display: block;
2086 float: none !important;
2086 float: none !important;
2087 }
2087 }
2088
2088
2089 #quick_login ol.links li a {
2089 #quick_login ol.links li a {
2090 color: #fff;
2090 color: #fff;
2091 display: block;
2091 display: block;
2092 padding: 2px;
2092 padding: 2px;
2093 }
2093 }
2094 #quick_login ol.links li a:HOVER {
2094 #quick_login ol.links li a:HOVER {
2095 background-color: inherit !important;
2095 background-color: inherit !important;
2096 }
2096 }
2097
2097
2098 #register div.title {
2098 #register div.title {
2099 clear: both;
2099 clear: both;
2100 overflow: hidden;
2100 overflow: hidden;
2101 position: relative;
2101 position: relative;
2102 background-color: #577632;
2102 background-color: #577632;
2103 background-repeat: repeat-x;
2103 background-repeat: repeat-x;
2104 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
2104 background-image: -khtml-gradient(linear, left top, left bottom, from(#577632), to(#577632) );
2105 background-image: -moz-linear-gradient(top, #577632, #577632);
2105 background-image: -moz-linear-gradient(top, #577632, #577632);
2106 background-image: -ms-linear-gradient(top, #577632, #577632);
2106 background-image: -ms-linear-gradient(top, #577632, #577632);
2107 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
2107 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #577632), color-stop(100%, #577632) );
2108 background-image: -webkit-linear-gradient(top, #577632, #577632);
2108 background-image: -webkit-linear-gradient(top, #577632, #577632);
2109 background-image: -o-linear-gradient(top, #577632, #577632);
2109 background-image: -o-linear-gradient(top, #577632, #577632);
2110 background-image: linear-gradient(to bottom, #577632, #577632);
2110 background-image: linear-gradient(to bottom, #577632, #577632);
2111 margin: 0 auto;
2111 margin: 0 auto;
2112 padding: 0;
2112 padding: 0;
2113 }
2113 }
2114
2114
2115 #register div.inner {
2115 #register div.inner {
2116 background: #FFF;
2116 background: #FFF;
2117 border-top: none;
2117 border-top: none;
2118 border-bottom: none;
2118 border-bottom: none;
2119 margin: 0 auto;
2119 margin: 0 auto;
2120 padding: 20px;
2120 padding: 20px;
2121 }
2121 }
2122
2122
2123 #register div.form div.fields div.field div.label {
2123 #register div.form div.fields div.field div.label {
2124 width: 135px;
2124 width: 135px;
2125 float: left;
2125 float: left;
2126 text-align: right;
2126 text-align: right;
2127 margin: 2px 10px 0 0;
2127 margin: 2px 10px 0 0;
2128 padding: 5px 0 0 5px;
2128 padding: 5px 0 0 5px;
2129 }
2129 }
2130
2130
2131 #register div.form div.fields div.field div.input input {
2131 #register div.form div.fields div.field div.input input {
2132 width: 300px;
2132 width: 300px;
2133 background: #FFF;
2133 background: #FFF;
2134 border-top: 1px solid #b3b3b3;
2134 border-top: 1px solid #b3b3b3;
2135 border-left: 1px solid #b3b3b3;
2135 border-left: 1px solid #b3b3b3;
2136 border-right: 1px solid #eaeaea;
2136 border-right: 1px solid #eaeaea;
2137 border-bottom: 1px solid #eaeaea;
2137 border-bottom: 1px solid #eaeaea;
2138 color: #000;
2138 color: #000;
2139 font-size: 11px;
2139 font-size: 11px;
2140 margin: 0;
2140 margin: 0;
2141 padding: 7px 7px 6px;
2141 padding: 7px 7px 6px;
2142 }
2142 }
2143
2143
2144 #register div.form div.fields div.buttons {
2144 #register div.form div.fields div.buttons {
2145 clear: both;
2145 clear: both;
2146 overflow: hidden;
2146 overflow: hidden;
2147 border-top: 1px solid #DDD;
2147 border-top: 1px solid #DDD;
2148 text-align: left;
2148 text-align: left;
2149 margin: 0;
2149 margin: 0;
2150 padding: 10px 0 0 150px;
2150 padding: 10px 0 0 150px;
2151 }
2151 }
2152
2152
2153 #register div.form div.activation_msg {
2153 #register div.form div.activation_msg {
2154 padding-top: 4px;
2154 padding-top: 4px;
2155 padding-bottom: 4px;
2155 padding-bottom: 4px;
2156 }
2156 }
2157
2157
2158 #journal .journal_day {
2158 #journal .journal_day {
2159 font-size: 20px;
2159 font-size: 20px;
2160 padding: 10px 0px;
2160 padding: 10px 0px;
2161 border-bottom: 2px solid #DDD;
2161 border-bottom: 2px solid #DDD;
2162 margin-left: 10px;
2162 margin-left: 10px;
2163 margin-right: 10px;
2163 margin-right: 10px;
2164 }
2164 }
2165
2165
2166 #journal .journal_container {
2166 #journal .journal_container {
2167 padding: 5px;
2167 padding: 5px;
2168 clear: both;
2168 clear: both;
2169 margin: 0px 5px 0px 10px;
2169 margin: 0px 5px 0px 10px;
2170 }
2170 }
2171
2171
2172 #journal .journal_action_container {
2172 #journal .journal_action_container {
2173 padding-left: 38px;
2173 padding-left: 38px;
2174 }
2174 }
2175
2175
2176 #journal .journal_user {
2176 #journal .journal_user {
2177 color: #747474;
2177 color: #747474;
2178 font-size: 14px;
2178 font-size: 14px;
2179 font-weight: bold;
2179 font-weight: bold;
2180 height: 30px;
2180 height: 30px;
2181 }
2181 }
2182
2182
2183 #journal .journal_user.deleted {
2183 #journal .journal_user.deleted {
2184 color: #747474;
2184 color: #747474;
2185 font-size: 14px;
2185 font-size: 14px;
2186 font-weight: normal;
2186 font-weight: normal;
2187 height: 30px;
2187 height: 30px;
2188 font-style: italic;
2188 font-style: italic;
2189 }
2189 }
2190
2190
2191
2191
2192 #journal .journal_icon {
2192 #journal .journal_icon {
2193 clear: both;
2193 clear: both;
2194 float: left;
2194 float: left;
2195 padding-right: 4px;
2195 padding-right: 4px;
2196 padding-top: 3px;
2196 padding-top: 3px;
2197 }
2197 }
2198
2198
2199 #journal .journal_action {
2199 #journal .journal_action {
2200 padding-top: 4px;
2200 padding-top: 4px;
2201 min-height: 2px;
2201 min-height: 2px;
2202 float: left
2202 float: left
2203 }
2203 }
2204
2204
2205 #journal .journal_action_params {
2205 #journal .journal_action_params {
2206 clear: left;
2206 clear: left;
2207 padding-left: 22px;
2207 padding-left: 22px;
2208 }
2208 }
2209
2209
2210 #journal .journal_repo {
2210 #journal .journal_repo {
2211 float: left;
2211 float: left;
2212 margin-left: 6px;
2212 margin-left: 6px;
2213 padding-top: 3px;
2213 padding-top: 3px;
2214 }
2214 }
2215
2215
2216 #journal .date {
2216 #journal .date {
2217 clear: both;
2217 clear: both;
2218 color: #777777;
2218 color: #777777;
2219 font-size: 11px;
2219 font-size: 11px;
2220 padding-left: 22px;
2220 padding-left: 22px;
2221 }
2221 }
2222
2222
2223 #journal .journal_repo .journal_repo_name {
2223 #journal .journal_repo .journal_repo_name {
2224 font-weight: bold;
2224 font-weight: bold;
2225 font-size: 1.1em;
2225 font-size: 1.1em;
2226 }
2226 }
2227
2227
2228 #journal .compare_view {
2228 #journal .compare_view {
2229 padding: 5px 0px 5px 0px;
2229 padding: 5px 0px 5px 0px;
2230 width: 95px;
2230 width: 95px;
2231 }
2231 }
2232
2232
2233 .journal_highlight {
2233 .journal_highlight {
2234 font-weight: bold;
2234 font-weight: bold;
2235 padding: 0 2px;
2235 padding: 0 2px;
2236 vertical-align: bottom;
2236 vertical-align: bottom;
2237 }
2237 }
2238
2238
2239 .trending_language_tbl, .trending_language_tbl td {
2239 .trending_language_tbl, .trending_language_tbl td {
2240 border: 0 !important;
2240 border: 0 !important;
2241 margin: 0 !important;
2241 margin: 0 !important;
2242 padding: 0 !important;
2242 padding: 0 !important;
2243 }
2243 }
2244
2244
2245 .trending_language_tbl, .trending_language_tbl tr {
2245 .trending_language_tbl, .trending_language_tbl tr {
2246 border-spacing: 1px;
2246 border-spacing: 1px;
2247 }
2247 }
2248
2248
2249 .trending_language {
2249 .trending_language {
2250 background-color: #577632;
2250 background-color: #577632;
2251 color: #FFF;
2251 color: #FFF;
2252 display: block;
2252 display: block;
2253 min-width: 20px;
2253 min-width: 20px;
2254 text-decoration: none;
2254 text-decoration: none;
2255 height: 12px;
2255 height: 12px;
2256 margin-bottom: 0px;
2256 margin-bottom: 0px;
2257 margin-left: 5px;
2257 margin-left: 5px;
2258 white-space: pre;
2258 white-space: pre;
2259 padding: 3px;
2259 padding: 3px;
2260 }
2260 }
2261
2261
2262 h3.files_location {
2262 h3.files_location {
2263 font-size: 1.8em;
2263 font-size: 1.8em;
2264 font-weight: 700;
2264 font-weight: 700;
2265 border-bottom: none !important;
2265 border-bottom: none !important;
2266 margin: 10px 0 !important;
2266 margin: 10px 0 !important;
2267 }
2267 }
2268
2268
2269 #files_data dl dt {
2269 #files_data dl dt {
2270 float: left;
2270 float: left;
2271 width: 60px;
2271 width: 60px;
2272 margin: 0 !important;
2272 margin: 0 !important;
2273 padding: 5px;
2273 padding: 5px;
2274 }
2274 }
2275
2275
2276 #files_data dl dd {
2276 #files_data dl dd {
2277 margin: 0 !important;
2277 margin: 0 !important;
2278 padding: 5px !important;
2278 padding: 5px !important;
2279 }
2279 }
2280
2280
2281 #files_data .codeblock #editor_container .error-message {
2281 #files_data .codeblock #editor_container .error-message {
2282 color: red;
2282 color: red;
2283 padding: 10px 10px 10px 26px
2283 padding: 10px 10px 10px 26px
2284 }
2284 }
2285
2285
2286 .file_history {
2286 .file_history {
2287 padding-top: 10px;
2287 padding-top: 10px;
2288 font-size: 16px;
2288 font-size: 16px;
2289 }
2289 }
2290 .file_author {
2290 .file_author {
2291 float: left;
2291 float: left;
2292 }
2292 }
2293
2293
2294 .file_author .item {
2294 .file_author .item {
2295 float: left;
2295 float: left;
2296 padding: 5px;
2296 padding: 5px;
2297 color: #888;
2297 color: #888;
2298 }
2298 }
2299
2299
2300 .tablerow0 {
2300 .tablerow0 {
2301 background-color: #F8F8F8;
2301 background-color: #F8F8F8;
2302 }
2302 }
2303
2303
2304 .tablerow1 {
2304 .tablerow1 {
2305 background-color: #FFFFFF;
2305 background-color: #FFFFFF;
2306 }
2306 }
2307
2307
2308 .changeset_id {
2308 .changeset_id {
2309 color: #666666;
2309 color: #666666;
2310 margin-right: -3px;
2310 margin-right: -3px;
2311 }
2311 }
2312
2312
2313 .changeset_hash {
2313 .changeset_hash {
2314 color: #000000;
2314 color: #000000;
2315 }
2315 }
2316
2316
2317 #changeset_content {
2317 #changeset_content {
2318 border-left: 1px solid #CCC;
2318 border-left: 1px solid #CCC;
2319 border-right: 1px solid #CCC;
2319 border-right: 1px solid #CCC;
2320 border-bottom: 1px solid #CCC;
2320 border-bottom: 1px solid #CCC;
2321 padding: 5px;
2321 padding: 5px;
2322 }
2322 }
2323
2323
2324 #changeset_compare_view_content {
2324 #changeset_compare_view_content {
2325 border: 1px solid #CCC;
2325 border: 1px solid #CCC;
2326 padding: 5px;
2326 padding: 5px;
2327 }
2327 }
2328
2328
2329 #changeset_content .container {
2329 #changeset_content .container {
2330 min-height: 100px;
2330 min-height: 100px;
2331 font-size: 1.2em;
2331 font-size: 1.2em;
2332 overflow: hidden;
2332 overflow: hidden;
2333 }
2333 }
2334
2334
2335 #changeset_compare_view_content .compare_view_commits {
2335 #changeset_compare_view_content .compare_view_commits {
2336 width: auto !important;
2336 width: auto !important;
2337 }
2337 }
2338
2338
2339 #changeset_compare_view_content .compare_view_commits td {
2339 #changeset_compare_view_content .compare_view_commits td {
2340 padding: 0px 0px 0px 12px !important;
2340 padding: 0px 0px 0px 12px !important;
2341 }
2341 }
2342
2342
2343 #changeset_content .container .right {
2343 #changeset_content .container .right {
2344 float: right;
2344 float: right;
2345 width: 20%;
2345 width: 20%;
2346 text-align: right;
2346 text-align: right;
2347 }
2347 }
2348
2348
2349 #changeset_content .container .message {
2349 #changeset_content .container .message {
2350 white-space: pre-wrap;
2350 white-space: pre-wrap;
2351 }
2351 }
2352 #changeset_content .container .message a:hover {
2352 #changeset_content .container .message a:hover {
2353 text-decoration: none;
2353 text-decoration: none;
2354 }
2354 }
2355 .cs_files .cur_cs {
2355 .cs_files .cur_cs {
2356 margin: 10px 2px;
2356 margin: 10px 2px;
2357 font-weight: bold;
2357 font-weight: bold;
2358 }
2358 }
2359
2359
2360 .cs_files .node {
2360 .cs_files .node {
2361 float: left;
2361 float: left;
2362 }
2362 }
2363
2363
2364 .cs_files .changes {
2364 .cs_files .changes {
2365 float: right;
2365 float: right;
2366 color: #577632;
2366 color: #577632;
2367 }
2367 }
2368
2368
2369 .cs_files .changes .added {
2369 .cs_files .changes .added {
2370 background-color: #BBFFBB;
2370 background-color: #BBFFBB;
2371 float: left;
2371 float: left;
2372 text-align: center;
2372 text-align: center;
2373 font-size: 9px;
2373 font-size: 9px;
2374 padding: 2px 0px 2px 0px;
2374 padding: 2px 0px 2px 0px;
2375 }
2375 }
2376
2376
2377 .cs_files .changes .deleted {
2377 .cs_files .changes .deleted {
2378 background-color: #FF8888;
2378 background-color: #FF8888;
2379 float: left;
2379 float: left;
2380 text-align: center;
2380 text-align: center;
2381 font-size: 9px;
2381 font-size: 9px;
2382 padding: 2px 0px 2px 0px;
2382 padding: 2px 0px 2px 0px;
2383 }
2383 }
2384 /*new binary
2384 /*new binary
2385 NEW_FILENODE = 1
2385 NEW_FILENODE = 1
2386 DEL_FILENODE = 2
2386 DEL_FILENODE = 2
2387 MOD_FILENODE = 3
2387 MOD_FILENODE = 3
2388 RENAMED_FILENODE = 4
2388 RENAMED_FILENODE = 4
2389 CHMOD_FILENODE = 5
2389 CHMOD_FILENODE = 5
2390 BIN_FILENODE = 6
2390 BIN_FILENODE = 6
2391 */
2391 */
2392 .cs_files .changes .bin {
2392 .cs_files .changes .bin {
2393 background-color: #BBFFBB;
2393 background-color: #BBFFBB;
2394 float: left;
2394 float: left;
2395 text-align: center;
2395 text-align: center;
2396 font-size: 9px;
2396 font-size: 9px;
2397 padding: 2px 0px 2px 0px;
2397 padding: 2px 0px 2px 0px;
2398 }
2398 }
2399 .cs_files .changes .bin.bin1 {
2399 .cs_files .changes .bin.bin1 {
2400 background-color: #BBFFBB;
2400 background-color: #BBFFBB;
2401 }
2401 }
2402
2402
2403 /*deleted binary*/
2403 /*deleted binary*/
2404 .cs_files .changes .bin.bin2 {
2404 .cs_files .changes .bin.bin2 {
2405 background-color: #FF8888;
2405 background-color: #FF8888;
2406 }
2406 }
2407
2407
2408 /*mod binary*/
2408 /*mod binary*/
2409 .cs_files .changes .bin.bin3 {
2409 .cs_files .changes .bin.bin3 {
2410 background-color: #DDDDDD;
2410 background-color: #DDDDDD;
2411 }
2411 }
2412
2412
2413 /*rename file*/
2413 /*rename file*/
2414 .cs_files .changes .bin.bin4 {
2414 .cs_files .changes .bin.bin4 {
2415 background-color: #6D99FF;
2415 background-color: #6D99FF;
2416 }
2416 }
2417
2417
2418 /*rename file*/
2418 /*rename file*/
2419 .cs_files .changes .bin.bin4 {
2419 .cs_files .changes .bin.bin4 {
2420 background-color: #6D99FF;
2420 background-color: #6D99FF;
2421 }
2421 }
2422
2422
2423 /*chmod file*/
2423 /*chmod file*/
2424 .cs_files .changes .bin.bin5 {
2424 .cs_files .changes .bin.bin5 {
2425 background-color: #6D99FF;
2425 background-color: #6D99FF;
2426 }
2426 }
2427
2427
2428 .cs_files .cs_added,
2428 .cs_files .cs_added,
2429 .cs_files .cs_A {
2429 .cs_files .cs_A {
2430 height: 16px;
2430 height: 16px;
2431 margin-top: 7px;
2431 margin-top: 7px;
2432 text-align: left;
2432 text-align: left;
2433 }
2433 }
2434
2434
2435 .cs_files .cs_changed,
2435 .cs_files .cs_changed,
2436 .cs_files .cs_M {
2436 .cs_files .cs_M {
2437 height: 16px;
2437 height: 16px;
2438 margin-top: 7px;
2438 margin-top: 7px;
2439 text-align: left;
2439 text-align: left;
2440 }
2440 }
2441
2441
2442 .cs_files .cs_removed,
2442 .cs_files .cs_removed,
2443 .cs_files .cs_D {
2443 .cs_files .cs_D {
2444 height: 16px;
2444 height: 16px;
2445 margin-top: 7px;
2445 margin-top: 7px;
2446 text-align: left;
2446 text-align: left;
2447 }
2447 }
2448
2448
2449 .cs_files .cs_renamed,
2449 .cs_files .cs_renamed,
2450 .cs_files .cs_R {
2450 .cs_files .cs_R {
2451 height: 16px;
2451 height: 16px;
2452 margin-top: 7px;
2452 margin-top: 7px;
2453 text-align: left;
2453 text-align: left;
2454 }
2454 }
2455
2455
2456 .table {
2456 .table {
2457 position: relative;
2457 position: relative;
2458 }
2458 }
2459
2459
2460 #graph {
2460 #graph {
2461 position: relative;
2461 position: relative;
2462 overflow: hidden;
2462 overflow: hidden;
2463 }
2463 }
2464
2464
2465 #graph_nodes {
2465 #graph_nodes {
2466 position: absolute;
2466 position: absolute;
2467 }
2467 }
2468
2468
2469 #graph_content,
2469 #graph_content,
2470 #graph .info_box,
2470 #graph .info_box,
2471 #graph .container_header {
2471 #graph .container_header {
2472 margin-left: 100px;
2472 margin-left: 100px;
2473 }
2473 }
2474
2474
2475 #graph_content {
2475 #graph_content {
2476 position: relative;
2476 position: relative;
2477 }
2477 }
2478
2478
2479 #graph .container_header {
2479 #graph .container_header {
2480 padding: 10px;
2480 padding: 10px;
2481 height: 25px;
2481 height: 25px;
2482 }
2482 }
2483
2483
2484 #graph_content #rev_range_container {
2484 #graph_content #rev_range_container {
2485 float: left;
2485 float: left;
2486 margin: 0px 0px 0px 3px;
2486 margin: 0px 0px 0px 3px;
2487 }
2487 }
2488
2488
2489 #graph_content #rev_range_clear {
2489 #graph_content #rev_range_clear {
2490 float: left;
2490 float: left;
2491 margin: 0px 0px 0px 3px;
2491 margin: 0px 0px 0px 3px;
2492 }
2492 }
2493
2493
2494 #graph_content #changesets {
2494 #graph_content #changesets {
2495 table-layout: fixed;
2495 table-layout: fixed;
2496 border-collapse: collapse;
2496 border-collapse: collapse;
2497 border-left: none;
2497 border-left: none;
2498 border-right: none;
2498 border-right: none;
2499 border-color: #cdcdcd;
2499 border-color: #cdcdcd;
2500 }
2500 }
2501
2501
2502 #graph_content #changesets td {
2502 #graph_content #changesets td {
2503 overflow: hidden;
2503 overflow: hidden;
2504 text-overflow: ellipsis;
2504 text-overflow: ellipsis;
2505 white-space: nowrap;
2505 white-space: nowrap;
2506 height: 31px;
2506 height: 31px;
2507 border-color: #cdcdcd;
2507 border-color: #cdcdcd;
2508 text-align: left;
2508 text-align: left;
2509 }
2509 }
2510
2510
2511 #graph_content .container .checkbox {
2511 #graph_content .container .checkbox {
2512 width: 12px;
2512 width: 12px;
2513 font-size: 0.85em;
2513 font-size: 0.85em;
2514 }
2514 }
2515
2515
2516 #graph_content .container .status {
2516 #graph_content .container .status {
2517 width: 14px;
2517 width: 14px;
2518 font-size: 0.85em;
2518 font-size: 0.85em;
2519 }
2519 }
2520
2520
2521 #graph_content .container .author {
2521 #graph_content .container .author {
2522 width: 105px;
2522 width: 105px;
2523 }
2523 }
2524
2524
2525 #graph_content .container .hash {
2525 #graph_content .container .hash {
2526 width: 100px;
2526 width: 100px;
2527 font-size: 0.85em;
2527 font-size: 0.85em;
2528 }
2528 }
2529
2529
2530 #graph_content #changesets .container .date {
2530 #graph_content #changesets .container .date {
2531 width: 76px;
2531 width: 76px;
2532 color: #666;
2532 color: #666;
2533 font-size: 10px;
2533 font-size: 10px;
2534 }
2534 }
2535
2535
2536 #graph_content_pr .compare_view_commits .expand_commit,
2536 #graph_content_pr .compare_view_commits .expand_commit,
2537 #graph_content .container .expand_commit {
2537 #graph_content .container .expand_commit {
2538 width: 24px;
2538 width: 24px;
2539 cursor: pointer;
2539 cursor: pointer;
2540 }
2540 }
2541
2541
2542 #graph_content #changesets .container .right {
2542 #graph_content #changesets .container .right {
2543 width: 120px;
2543 width: 120px;
2544 padding-right: 0px;
2544 padding-right: 0px;
2545 overflow: visible;
2545 overflow: visible;
2546 position: relative;
2546 position: relative;
2547 }
2547 }
2548
2548
2549 #graph_content .container .mid {
2549 #graph_content .container .mid {
2550 padding: 0;
2550 padding: 0;
2551 }
2551 }
2552
2552
2553 #graph_content .log-container {
2553 #graph_content .log-container {
2554 position: relative;
2554 position: relative;
2555 }
2555 }
2556
2556
2557 #graph_content .container .changeset_range {
2557 #graph_content .container .changeset_range {
2558 float: left;
2558 float: left;
2559 margin: 6px 3px;
2559 margin: 6px 3px;
2560 }
2560 }
2561
2561
2562 #graph_content .container .author img {
2562 #graph_content .container .author img {
2563 vertical-align: middle;
2563 vertical-align: middle;
2564 }
2564 }
2565
2565
2566 #graph_content .container .author .user {
2566 #graph_content .container .author .user {
2567 color: #444444;
2567 color: #444444;
2568 }
2568 }
2569
2569
2570 #graph_content .container .mid .message {
2570 #graph_content .container .mid .message {
2571 white-space: pre-wrap;
2571 white-space: pre-wrap;
2572 padding: 0;
2572 padding: 0;
2573 overflow: hidden;
2573 overflow: hidden;
2574 height: 1.1em;
2574 height: 1.1em;
2575 }
2575 }
2576
2576
2577 #graph_content_pr .compare_view_commits .message {
2577 #graph_content_pr .compare_view_commits .message {
2578 padding: 0 !important;
2578 padding: 0 !important;
2579 height: 1.1em;
2579 height: 1.1em;
2580 }
2580 }
2581
2581
2582 #graph_content .container .mid .message.expanded,
2582 #graph_content .container .mid .message.expanded,
2583 #graph_content_pr .compare_view_commits .message.expanded {
2583 #graph_content_pr .compare_view_commits .message.expanded {
2584 height: auto;
2584 height: auto;
2585 margin: 8px 0px 8px 0px;
2585 margin: 8px 0px 8px 0px;
2586 overflow: initial;
2586 overflow: initial;
2587 }
2587 }
2588
2588
2589 #graph_content .container .extra-container {
2589 #graph_content .container .extra-container {
2590 display: block;
2590 display: block;
2591 position: absolute;
2591 position: absolute;
2592 top: -15px;
2592 top: -15px;
2593 right: 0;
2593 right: 0;
2594 padding-left: 5px;
2594 padding-left: 5px;
2595 background: #FFFFFF;
2595 background: #FFFFFF;
2596 height: 41px;
2596 height: 41px;
2597 }
2597 }
2598
2598
2599 #pull_request_overview .comments-container,
2599 #pull_request_overview .comments-container,
2600 #changeset_compare_view_content .comments-container,
2600 #changeset_compare_view_content .comments-container,
2601 #graph_content .comments-container,
2601 #graph_content .comments-container,
2602 #shortlog_data .comments-container,
2602 #shortlog_data .comments-container,
2603 #graph_content .logtags {
2603 #graph_content .logtags {
2604 display: block;
2604 display: block;
2605 float: left;
2605 float: left;
2606 overflow: hidden;
2606 overflow: hidden;
2607 padding: 0;
2607 padding: 0;
2608 margin: 0;
2608 margin: 0;
2609 white-space: nowrap;
2609 white-space: nowrap;
2610 }
2610 }
2611
2611
2612 #graph_content .comments-container {
2612 #graph_content .comments-container {
2613 margin: 0.8em 0;
2613 margin: 0.8em 0;
2614 margin-right: 0.5em;
2614 margin-right: 0.5em;
2615 }
2615 }
2616
2616
2617 #graph_content .tagcontainer {
2617 #graph_content .tagcontainer {
2618 width: 80px;
2618 width: 80px;
2619 position: relative;
2619 position: relative;
2620 float: right;
2620 float: right;
2621 height: 100%;
2621 height: 100%;
2622 top: 7px;
2622 top: 7px;
2623 margin-left: 0.5em;
2623 margin-left: 0.5em;
2624 }
2624 }
2625
2625
2626 #graph_content .logtags {
2626 #graph_content .logtags {
2627 min-width: 80px;
2627 min-width: 80px;
2628 height: 1.1em;
2628 height: 1.1em;
2629 position: absolute;
2629 position: absolute;
2630 left: 0px;
2630 left: 0px;
2631 width: auto;
2631 width: auto;
2632 top: 0px;
2632 top: 0px;
2633 }
2633 }
2634
2634
2635 #graph_content .logtags.tags {
2635 #graph_content .logtags.tags {
2636 top: 14px;
2636 top: 14px;
2637 }
2637 }
2638
2638
2639 #graph_content .logtags:hover {
2639 #graph_content .logtags:hover {
2640 overflow: visible;
2640 overflow: visible;
2641 position: absolute;
2641 position: absolute;
2642 width: auto;
2642 width: auto;
2643 right: 0;
2643 right: 0;
2644 left: initial;
2644 left: initial;
2645 }
2645 }
2646
2646
2647 #graph_content .logtags .booktag,
2647 #graph_content .logtags .booktag,
2648 #graph_content .logtags .tagtag {
2648 #graph_content .logtags .tagtag {
2649 float: left;
2649 float: left;
2650 line-height: 1em;
2650 line-height: 1em;
2651 margin-bottom: 1px;
2651 margin-bottom: 1px;
2652 margin-right: 1px;
2652 margin-right: 1px;
2653 padding: 1px 3px;
2653 padding: 1px 3px;
2654 font-size: 10px;
2654 font-size: 10px;
2655 }
2655 }
2656
2656
2657 #graph_content .container .mid .message a:hover {
2657 #graph_content .container .mid .message a:hover {
2658 text-decoration: none;
2658 text-decoration: none;
2659 }
2659 }
2660
2660
2661 #compare_branches + .table .revision-link,
2661 #compare_branches + .table .revision-link,
2662 #compare_tags + .table .revision-link,
2662 #compare_tags + .table .revision-link,
2663 #compare_bookmarks + .table .revision-link,
2663 #compare_bookmarks + .table .revision-link,
2664 .table #files_data .revision-link,
2664 .table #files_data .revision-link,
2665 #repos_list_wrap .revision-link,
2665 #repos_list_wrap .revision-link,
2666 #shortlog_data .revision-link {
2666 #shortlog_data .revision-link {
2667 font-weight: normal !important;
2667 font-weight: normal !important;
2668 font-family: monospace;
2668 font-family: monospace;
2669 font-size: 12px;
2669 font-size: 12px;
2670 color: #577632;
2670 color: #577632;
2671 }
2671 }
2672
2672
2673 .revision-link {
2673 .revision-link {
2674 color: #3F6F9F;
2674 color: #3F6F9F;
2675 font-weight: bold !important;
2675 font-weight: bold !important;
2676 }
2676 }
2677
2677
2678 .issue-tracker-link {
2678 .issue-tracker-link {
2679 color: #3F6F9F;
2679 color: #3F6F9F;
2680 font-weight: bold !important;
2680 font-weight: bold !important;
2681 }
2681 }
2682
2682
2683 .changeset-status-container {
2683 .changeset-status-container {
2684 padding-right: 5px;
2684 padding-right: 5px;
2685 margin-top: 1px;
2685 margin-top: 1px;
2686 float: right;
2686 float: right;
2687 height: 14px;
2687 height: 14px;
2688 }
2688 }
2689 .code-header .changeset-status-container {
2689 .code-header .changeset-status-container {
2690 float: left;
2690 float: left;
2691 padding: 2px 0px 0px 2px;
2691 padding: 2px 0px 0px 2px;
2692 }
2692 }
2693 .changeset-status-container .changeset-status-lbl {
2693 .changeset-status-container .changeset-status-lbl {
2694 float: left;
2694 float: left;
2695 padding: 3px 4px 0px 0px
2695 padding: 3px 4px 0px 0px
2696 }
2696 }
2697 .code-header .changeset-status-container .changeset-status-lbl {
2697 .code-header .changeset-status-container .changeset-status-lbl {
2698 float: left;
2698 float: left;
2699 padding: 0px 4px 0px 0px;
2699 padding: 0px 4px 0px 0px;
2700 }
2700 }
2701 .changeset-status-container .changeset-status-ico {
2701 .changeset-status-container .changeset-status-ico {
2702 float: left;
2702 float: left;
2703 }
2703 }
2704 .code-header .changeset-status-container .changeset-status-ico,
2704 .code-header .changeset-status-container .changeset-status-ico,
2705 .container .changeset-status-ico {
2705 .container .changeset-status-ico {
2706 float: left;
2706 float: left;
2707 }
2707 }
2708
2708
2709 /* changeset statuses (must be the same name as the status) */
2709 /* changeset statuses (must be the same name as the status) */
2710 .changeset-status-not_reviewed {
2710 .changeset-status-not_reviewed {
2711 color: #bababa;
2711 color: #bababa;
2712 }
2712 }
2713 .changeset-status-approved {
2713 .changeset-status-approved {
2714 color: #81ba51;
2714 color: #81ba51;
2715 }
2715 }
2716 .changeset-status-rejected {
2716 .changeset-status-rejected {
2717 color: #cc392e;
2717 color: #cc392e;
2718 }
2718 }
2719 .changeset-status-under_review {
2719 .changeset-status-under_review {
2720 color: #ffc71e;
2720 color: #ffc71e;
2721 }
2721 }
2722
2722
2723 #graph_content .comments-cnt {
2723 #graph_content .comments-cnt {
2724 color: rgb(136, 136, 136);
2724 color: rgb(136, 136, 136);
2725 padding: 5px 0;
2725 padding: 5px 0;
2726 }
2726 }
2727
2727
2728 #shortlog_data .comments-cnt {
2728 #shortlog_data .comments-cnt {
2729 color: rgb(136, 136, 136);
2729 color: rgb(136, 136, 136);
2730 padding: 3px 0;
2730 padding: 3px 0;
2731 }
2731 }
2732
2732
2733 .right .changes {
2733 .right .changes {
2734 clear: both;
2734 clear: both;
2735 }
2735 }
2736
2736
2737 .right .changes .changed_total {
2737 .right .changes .changed_total {
2738 display: block;
2738 display: block;
2739 float: right;
2739 float: right;
2740 text-align: center;
2740 text-align: center;
2741 min-width: 45px;
2741 min-width: 45px;
2742 cursor: pointer;
2742 cursor: pointer;
2743 color: #444444;
2743 color: #444444;
2744 background: #FEA;
2744 background: #FEA;
2745 -webkit-border-radius: 0px 0px 0px 6px;
2745 -webkit-border-radius: 0px 0px 0px 6px;
2746 border-radius: 0px 0px 0px 6px;
2746 border-radius: 0px 0px 0px 6px;
2747 padding: 1px;
2747 padding: 1px;
2748 }
2748 }
2749
2749
2750 .right .changes .added,
2750 .right .changes .added,
2751 .changed, .removed {
2751 .changed, .removed {
2752 display: block;
2752 display: block;
2753 padding: 1px;
2753 padding: 1px;
2754 color: #444444;
2754 color: #444444;
2755 float: right;
2755 float: right;
2756 text-align: center;
2756 text-align: center;
2757 min-width: 15px;
2757 min-width: 15px;
2758 }
2758 }
2759
2759
2760 .right .changes .added {
2760 .right .changes .added {
2761 background: #CFC;
2761 background: #CFC;
2762 }
2762 }
2763
2763
2764 .right .changes .changed {
2764 .right .changes .changed {
2765 background: #FEA;
2765 background: #FEA;
2766 }
2766 }
2767
2767
2768 .right .changes .removed {
2768 .right .changes .removed {
2769 background: #FAA;
2769 background: #FAA;
2770 }
2770 }
2771
2771
2772 .right .merge {
2772 .right .merge {
2773 padding: 1px 3px 1px 3px;
2773 padding: 1px 3px 1px 3px;
2774 background-color: #fca062;
2774 background-color: #fca062;
2775 font-size: 10px;
2775 font-size: 10px;
2776 color: #ffffff;
2776 color: #ffffff;
2777 text-transform: uppercase;
2777 text-transform: uppercase;
2778 white-space: nowrap;
2778 white-space: nowrap;
2779 -webkit-border-radius: 3px;
2779 -webkit-border-radius: 3px;
2780 border-radius: 3px;
2780 border-radius: 3px;
2781 margin-right: 2px;
2781 margin-right: 2px;
2782 }
2782 }
2783
2783
2784 .right .parent {
2784 .right .parent {
2785 color: #666666;
2785 color: #666666;
2786 clear: both;
2786 clear: both;
2787 }
2787 }
2788 .right .logtags {
2788 .right .logtags {
2789 line-height: 2.2em;
2789 line-height: 2.2em;
2790 }
2790 }
2791 .repotag, .branchtag, .logtags .tagtag, .logtags .booktag {
2791 .repotag, .branchtag, .logtags .tagtag, .logtags .booktag {
2792 margin: 0px 2px;
2792 margin: 0px 2px;
2793 }
2793 }
2794
2794
2795 .repotag,
2795 .repotag,
2796 .branchtag,
2796 .branchtag,
2797 .tagtag,
2797 .tagtag,
2798 .booktag,
2798 .booktag,
2799 .spantag {
2799 .spantag {
2800 padding: 1px 3px 1px 3px;
2800 padding: 1px 3px 1px 3px;
2801 font-size: 10px;
2801 font-size: 10px;
2802 color: #577632;
2802 color: #577632;
2803 white-space: nowrap;
2803 white-space: nowrap;
2804 -webkit-border-radius: 4px;
2804 -webkit-border-radius: 4px;
2805 border-radius: 4px;
2805 border-radius: 4px;
2806 border: 1px solid #d9e8f8;
2806 border: 1px solid #d9e8f8;
2807 line-height: 1.5em;
2807 line-height: 1.5em;
2808 }
2808 }
2809
2809
2810 #graph_content .branchtag,
2810 #graph_content .branchtag,
2811 #graph_content .tagtag,
2811 #graph_content .tagtag,
2812 #graph_content .booktag {
2812 #graph_content .booktag {
2813 margin: 1.1em 0;
2813 margin: 1.1em 0;
2814 margin-right: 0.5em;
2814 margin-right: 0.5em;
2815 }
2815 }
2816
2816
2817 .repotag,
2817 .repotag,
2818 .branchtag,
2818 .branchtag,
2819 .tagtag,
2819 .tagtag,
2820 .booktag {
2820 .booktag {
2821 float: left;
2821 float: left;
2822 }
2822 }
2823
2823
2824 .right .logtags .branchtag,
2824 .right .logtags .branchtag,
2825 .right .logtags .tagtag,
2825 .right .logtags .tagtag,
2826 .right .logtags .booktag,
2826 .right .logtags .booktag,
2827 .right .merge {
2827 .right .merge {
2828 float: right;
2828 float: right;
2829 line-height: 1em;
2829 line-height: 1em;
2830 margin: 1px 1px !important;
2830 margin: 1px 1px !important;
2831 display: block;
2831 display: block;
2832 }
2832 }
2833
2833
2834 .repotag {
2834 .repotag {
2835 border-color: #56A546;
2835 border-color: #56A546;
2836 color: #46A546;
2836 color: #46A546;
2837 font-size: 8px;
2837 font-size: 8px;
2838 text-transform: uppercase;
2838 text-transform: uppercase;
2839 }
2839 }
2840
2840
2841 #context-bar .repotag,
2841 #context-bar .repotag,
2842 .repo-icons .repotag {
2842 .repo-icons .repotag {
2843 border-color: white;
2843 border-color: white;
2844 color: white;
2844 color: white;
2845 margin-top: 3px;
2845 margin-top: 3px;
2846 }
2846 }
2847
2847
2848 .repo-icons .repotag {
2848 .repo-icons .repotag {
2849 margin-top: 0px;
2849 margin-top: 0px;
2850 padding-top: 0px;
2850 padding-top: 0px;
2851 padding-bottom: 0px;
2851 padding-bottom: 0px;
2852 }
2852 }
2853
2853
2854 .booktag {
2854 .booktag {
2855 border-color: #46A546;
2855 border-color: #46A546;
2856 color: #46A546;
2856 color: #46A546;
2857 }
2857 }
2858
2858
2859 .tagtag {
2859 .tagtag {
2860 border-color: #62cffc;
2860 border-color: #62cffc;
2861 color: #62cffc;
2861 color: #62cffc;
2862 }
2862 }
2863
2863
2864 .logtags .branchtag a:hover,
2864 .logtags .branchtag a:hover,
2865 .logtags .branchtag a,
2865 .logtags .branchtag a,
2866 .branchtag a,
2866 .branchtag a,
2867 .branchtag a:hover {
2867 .branchtag a:hover {
2868 text-decoration: none;
2868 text-decoration: none;
2869 color: inherit;
2869 color: inherit;
2870 }
2870 }
2871 .logtags .tagtag {
2871 .logtags .tagtag {
2872 padding: 1px 3px 1px 3px;
2872 padding: 1px 3px 1px 3px;
2873 background-color: #62cffc;
2873 background-color: #62cffc;
2874 font-size: 10px;
2874 font-size: 10px;
2875 color: #ffffff;
2875 color: #ffffff;
2876 white-space: nowrap;
2876 white-space: nowrap;
2877 -webkit-border-radius: 3px;
2877 -webkit-border-radius: 3px;
2878 border-radius: 3px;
2878 border-radius: 3px;
2879 }
2879 }
2880
2880
2881 .tagtag a,
2881 .tagtag a,
2882 .tagtag a:hover,
2882 .tagtag a:hover,
2883 .logtags .tagtag a,
2883 .logtags .tagtag a,
2884 .logtags .tagtag a:hover {
2884 .logtags .tagtag a:hover {
2885 text-decoration: none;
2885 text-decoration: none;
2886 color: inherit;
2886 color: inherit;
2887 }
2887 }
2888 .logbooks .booktag,
2888 .logbooks .booktag,
2889 .logbooks .booktag,
2889 .logbooks .booktag,
2890 .logtags .booktag,
2890 .logtags .booktag,
2891 .logtags .booktag {
2891 .logtags .booktag {
2892 padding: 1px 3px 1px 3px;
2892 padding: 1px 3px 1px 3px;
2893 background-color: #46A546;
2893 background-color: #46A546;
2894 font-size: 10px;
2894 font-size: 10px;
2895 color: #ffffff;
2895 color: #ffffff;
2896 white-space: nowrap;
2896 white-space: nowrap;
2897 -webkit-border-radius: 3px;
2897 -webkit-border-radius: 3px;
2898 border-radius: 3px;
2898 border-radius: 3px;
2899 }
2899 }
2900 .logbooks .booktag,
2900 .logbooks .booktag,
2901 .logbooks .booktag a,
2901 .logbooks .booktag a,
2902 .right .logtags .booktag,
2902 .right .logtags .booktag,
2903 .logtags .booktag a {
2903 .logtags .booktag a {
2904 color: #ffffff;
2904 color: #ffffff;
2905 }
2905 }
2906
2906
2907 .logbooks .booktag,
2907 .logbooks .booktag,
2908 .logbooks .booktag a:hover,
2908 .logbooks .booktag a:hover,
2909 .logtags .booktag,
2909 .logtags .booktag,
2910 .logtags .booktag a:hover,
2910 .logtags .booktag a:hover,
2911 .booktag a,
2911 .booktag a,
2912 .booktag a:hover {
2912 .booktag a:hover {
2913 text-decoration: none;
2913 text-decoration: none;
2914 color: inherit;
2914 color: inherit;
2915 }
2915 }
2916 div.browserblock {
2916 div.browserblock {
2917 overflow: hidden;
2917 overflow: hidden;
2918 border: 1px solid #ccc;
2918 border: 1px solid #ccc;
2919 background: #f8f8f8;
2919 background: #f8f8f8;
2920 font-size: 100%;
2920 font-size: 100%;
2921 line-height: 125%;
2921 line-height: 125%;
2922 padding: 0;
2922 padding: 0;
2923 -webkit-border-radius: 6px 6px 0px 0px;
2923 -webkit-border-radius: 6px 6px 0px 0px;
2924 border-radius: 6px 6px 0px 0px;
2924 border-radius: 6px 6px 0px 0px;
2925 }
2925 }
2926
2926
2927 div.browserblock .browser-header {
2927 div.browserblock .browser-header {
2928 background: #FFF;
2928 background: #FFF;
2929 padding: 10px 0px 15px 0px;
2929 padding: 10px 0px 15px 0px;
2930 width: 100%;
2930 width: 100%;
2931 }
2931 }
2932
2932
2933 div.browserblock .browser-nav {
2933 div.browserblock .browser-nav {
2934 float: left
2934 float: left
2935 }
2935 }
2936
2936
2937 div.browserblock .browser-branch {
2937 div.browserblock .browser-branch {
2938 float: left;
2938 float: left;
2939 }
2939 }
2940
2940
2941 div.browserblock .browser-branch label {
2941 div.browserblock .browser-branch label {
2942 color: #4A4A4A;
2942 color: #4A4A4A;
2943 vertical-align: text-top;
2943 vertical-align: text-top;
2944 padding-right: 2px;
2944 padding-right: 2px;
2945 }
2945 }
2946
2946
2947 div.browserblock .browser-header span {
2947 div.browserblock .browser-header span {
2948 margin-left: 5px;
2948 margin-left: 5px;
2949 font-weight: 700;
2949 font-weight: 700;
2950 }
2950 }
2951
2951
2952 div.browserblock .browser-search {
2952 div.browserblock .browser-search {
2953 clear: both;
2953 clear: both;
2954 padding: 8px 8px 0px 5px;
2954 padding: 8px 8px 0px 5px;
2955 height: 20px;
2955 height: 20px;
2956 }
2956 }
2957
2957
2958 div.browserblock #node_filter_box {
2958 div.browserblock #node_filter_box {
2959 }
2959 }
2960
2960
2961 div.browserblock .search_activate {
2961 div.browserblock .search_activate {
2962 float: left
2962 float: left
2963 }
2963 }
2964
2964
2965 div.browserblock .add_node {
2965 div.browserblock .add_node {
2966 float: left;
2966 float: left;
2967 padding-left: 5px;
2967 padding-left: 5px;
2968 }
2968 }
2969
2969
2970 div.browserblock .search_activate a:hover,
2970 div.browserblock .search_activate a:hover,
2971 div.browserblock .add_node a:hover {
2971 div.browserblock .add_node a:hover {
2972 text-decoration: none !important;
2972 text-decoration: none !important;
2973 }
2973 }
2974
2974
2975 div.browserblock .browser-body {
2975 div.browserblock .browser-body {
2976 background: #EEE;
2976 background: #EEE;
2977 border-top: 1px solid #CCC;
2977 border-top: 1px solid #CCC;
2978 }
2978 }
2979
2979
2980 table.code-browser {
2980 table.code-browser {
2981 border-collapse: collapse;
2981 border-collapse: collapse;
2982 width: 100%;
2982 width: 100%;
2983 }
2983 }
2984
2984
2985 table.code-browser tr {
2985 table.code-browser tr {
2986 margin: 3px;
2986 margin: 3px;
2987 }
2987 }
2988
2988
2989 table.code-browser thead th {
2989 table.code-browser thead th {
2990 background-color: #EEE;
2990 background-color: #EEE;
2991 height: 20px;
2991 height: 20px;
2992 font-size: 1.1em;
2992 font-size: 1.1em;
2993 font-weight: 700;
2993 font-weight: 700;
2994 text-align: left;
2994 text-align: left;
2995 padding-left: 10px;
2995 padding-left: 10px;
2996 }
2996 }
2997
2997
2998 table.code-browser tbody td {
2998 table.code-browser tbody td {
2999 padding-left: 10px;
2999 padding-left: 10px;
3000 height: 20px;
3000 height: 20px;
3001 }
3001 }
3002
3002
3003 table.code-browser .browser-file {
3003 table.code-browser .browser-file {
3004 height: 16px;
3004 height: 16px;
3005 padding-left: 5px;
3005 padding-left: 5px;
3006 text-align: left;
3006 text-align: left;
3007 }
3007 }
3008 .diffblock .changeset_header {
3008 .diffblock .changeset_header {
3009 height: 16px;
3009 height: 16px;
3010 }
3010 }
3011 .diffblock .changeset_file {
3011 .diffblock .changeset_file {
3012 float: left;
3012 float: left;
3013 }
3013 }
3014 .diffblock .diff-menu-wrapper {
3014 .diffblock .diff-menu-wrapper {
3015 float: left;
3015 float: left;
3016 }
3016 }
3017
3017
3018 .diffblock .diff-menu {
3018 .diffblock .diff-menu {
3019 position: absolute;
3019 position: absolute;
3020 background: none repeat scroll 0 0 #FFFFFF;
3020 background: none repeat scroll 0 0 #FFFFFF;
3021 border-color: #577632 #666666 #666666;
3021 border-color: #577632 #666666 #666666;
3022 border-right: 1px solid #666666;
3022 border-right: 1px solid #666666;
3023 border-style: solid solid solid;
3023 border-style: solid solid solid;
3024 border-width: 1px;
3024 border-width: 1px;
3025 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
3025 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
3026 margin-top: 5px;
3026 margin-top: 5px;
3027 margin-left: 1px;
3027 margin-left: 1px;
3028
3028
3029 }
3029 }
3030 .diffblock .diff-actions {
3030 .diffblock .diff-actions {
3031 padding: 2px 0px 0px 2px;
3031 padding: 2px 0px 0px 2px;
3032 float: left;
3032 float: left;
3033 }
3033 }
3034 .diffblock .diff-menu ul li {
3034 .diffblock .diff-menu ul li {
3035 padding: 0px 0px 0px 0px !important;
3035 padding: 0px 0px 0px 0px !important;
3036 }
3036 }
3037 .diffblock .diff-menu ul li a {
3037 .diffblock .diff-menu ul li a {
3038 display: block;
3038 display: block;
3039 padding: 3px 8px 3px 8px !important;
3039 padding: 3px 8px 3px 8px !important;
3040 }
3040 }
3041 .diffblock .diff-menu ul li a:hover {
3041 .diffblock .diff-menu ul li a:hover {
3042 text-decoration: none;
3042 text-decoration: none;
3043 background-color: #EEEEEE;
3043 background-color: #EEEEEE;
3044 }
3044 }
3045 table.code-browser .browser-dir {
3045 table.code-browser .browser-dir {
3046 height: 16px;
3046 height: 16px;
3047 padding-left: 5px;
3047 padding-left: 5px;
3048 text-align: left;
3048 text-align: left;
3049 }
3049 }
3050
3050
3051 table.code-browser .submodule-dir {
3051 table.code-browser .submodule-dir {
3052 height: 16px;
3052 height: 16px;
3053 padding-left: 5px;
3053 padding-left: 5px;
3054 text-align: left;
3054 text-align: left;
3055 }
3055 }
3056
3056
3057 /* add some padding to the right of the file, folder, or submodule icon and
3057 /* add some padding to the right of the file, folder, or submodule icon and
3058 before the text */
3058 before the text */
3059 table.code-browser i[class^='icon-'] {
3059 table.code-browser i[class^='icon-'] {
3060 padding-right: .3em;
3060 padding-right: .3em;
3061 }
3061 }
3062
3062
3063 .box .search {
3063 .box .search {
3064 clear: both;
3064 clear: both;
3065 overflow: hidden;
3065 overflow: hidden;
3066 margin: 0;
3066 margin: 0;
3067 padding: 0 20px 10px;
3067 padding: 0 20px 10px;
3068 }
3068 }
3069
3069
3070 .box .search div.search_path {
3070 .box .search div.search_path {
3071 background: none repeat scroll 0 0 #EEE;
3071 background: none repeat scroll 0 0 #EEE;
3072 border: 1px solid #CCC;
3072 border: 1px solid #CCC;
3073 color: blue;
3073 color: blue;
3074 margin-bottom: 10px;
3074 margin-bottom: 10px;
3075 padding: 10px 0;
3075 padding: 10px 0;
3076 }
3076 }
3077
3077
3078 .box .search div.search_path div.link {
3078 .box .search div.search_path div.link {
3079 font-weight: 700;
3079 font-weight: 700;
3080 margin-left: 25px;
3080 margin-left: 25px;
3081 }
3081 }
3082
3082
3083 .box .search div.search_path div.link a {
3083 .box .search div.search_path div.link a {
3084 color: #577632;
3084 color: #577632;
3085 cursor: pointer;
3085 cursor: pointer;
3086 text-decoration: none;
3086 text-decoration: none;
3087 }
3087 }
3088
3088
3089 #path_unlock {
3089 #path_unlock {
3090 color: red;
3090 color: red;
3091 font-size: 1.2em;
3091 font-size: 1.2em;
3092 padding-left: 4px;
3092 padding-left: 4px;
3093 }
3093 }
3094
3094
3095 .info_box span {
3095 .info_box span {
3096 margin-left: 3px;
3096 margin-left: 3px;
3097 margin-right: 3px;
3097 margin-right: 3px;
3098 }
3098 }
3099
3099
3100 .info_box .rev {
3100 .info_box .rev {
3101 color: #577632;
3101 color: #577632;
3102 font-size: 1.6em;
3102 font-size: 1.6em;
3103 font-weight: bold;
3103 font-weight: bold;
3104 vertical-align: sub;
3104 vertical-align: sub;
3105 }
3105 }
3106
3106
3107 .info_box input#at_rev,
3107 .info_box input#at_rev,
3108 .info_box input#size {
3108 .info_box input#size {
3109 background: #FFF;
3109 background: #FFF;
3110 border-top: 1px solid #b3b3b3;
3110 border-top: 1px solid #b3b3b3;
3111 border-left: 1px solid #b3b3b3;
3111 border-left: 1px solid #b3b3b3;
3112 border-right: 1px solid #eaeaea;
3112 border-right: 1px solid #eaeaea;
3113 border-bottom: 1px solid #eaeaea;
3113 border-bottom: 1px solid #eaeaea;
3114 color: #000;
3114 color: #000;
3115 font-size: 12px;
3115 font-size: 12px;
3116 margin: 0;
3116 margin: 0;
3117 padding: 1px 5px 1px;
3117 padding: 1px 5px 1px;
3118 }
3118 }
3119
3119
3120 .info_box input#view {
3120 .info_box input#view {
3121 text-align: center;
3121 text-align: center;
3122 padding: 4px 3px 2px 2px;
3122 padding: 4px 3px 2px 2px;
3123 }
3123 }
3124
3124
3125 .info_box_elem {
3125 .info_box_elem {
3126 display: inline-block;
3126 display: inline-block;
3127 padding: 0 2px;
3127 padding: 0 2px;
3128 }
3128 }
3129
3129
3130 .yui-overlay, .yui-panel-container {
3130 .yui-overlay, .yui-panel-container {
3131 visibility: hidden;
3131 visibility: hidden;
3132 position: absolute;
3132 position: absolute;
3133 z-index: 2;
3133 z-index: 2;
3134 }
3134 }
3135
3135
3136 #tip-box {
3136 #tip-box {
3137 position: absolute;
3137 position: absolute;
3138
3138
3139 background-color: #FFF;
3139 background-color: #FFF;
3140 border: 2px solid #577632;
3140 border: 2px solid #577632;
3141 font: 100% sans-serif;
3141 font: 100% sans-serif;
3142 width: auto;
3142 width: auto;
3143 opacity: 1;
3143 opacity: 1;
3144 padding: 8px;
3144 padding: 8px;
3145
3145
3146 white-space: pre-wrap;
3146 white-space: pre-wrap;
3147 -webkit-border-radius: 8px 8px 8px 8px;
3147 -webkit-border-radius: 8px 8px 8px 8px;
3148 -khtml-border-radius: 8px 8px 8px 8px;
3148 -khtml-border-radius: 8px 8px 8px 8px;
3149 border-radius: 8px 8px 8px 8px;
3149 border-radius: 8px 8px 8px 8px;
3150 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3150 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3151 -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3151 -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3152 z-index: 100000;
3152 z-index: 100000;
3153 }
3153 }
3154
3154
3155 .hl-tip-box {
3155 .hl-tip-box {
3156 z-index: 1;
3156 z-index: 1;
3157 position: absolute;
3157 position: absolute;
3158 color: #666;
3158 color: #666;
3159 background-color: #FFF;
3159 background-color: #FFF;
3160 border: 2px solid #577632;
3160 border: 2px solid #577632;
3161 font: 100% sans-serif;
3161 font: 100% sans-serif;
3162 width: auto;
3162 width: auto;
3163 opacity: 1;
3163 opacity: 1;
3164 padding: 8px;
3164 padding: 8px;
3165 white-space: pre-wrap;
3165 white-space: pre-wrap;
3166 -webkit-border-radius: 8px 8px 8px 8px;
3166 -webkit-border-radius: 8px 8px 8px 8px;
3167 -khtml-border-radius: 8px 8px 8px 8px;
3167 -khtml-border-radius: 8px 8px 8px 8px;
3168 border-radius: 8px 8px 8px 8px;
3168 border-radius: 8px 8px 8px 8px;
3169 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3169 box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
3170 }
3170 }
3171
3171
3172
3172
3173 .mentions-container {
3173 .mentions-container {
3174 width: 90% !important;
3174 width: 90% !important;
3175 }
3175 }
3176 .mentions-container .yui-ac-content {
3176 .mentions-container .yui-ac-content {
3177 width: 100% !important;
3177 width: 100% !important;
3178 }
3178 }
3179
3179
3180 .ac {
3180 .ac {
3181 vertical-align: top;
3181 vertical-align: top;
3182 }
3182 }
3183
3183
3184 .ac .yui-ac {
3184 .ac .yui-ac {
3185 position: inherit;
3185 position: inherit;
3186 font-size: 100%;
3186 font-size: 100%;
3187 }
3187 }
3188
3188
3189 .ac .perm_ac {
3189 .ac .perm_ac {
3190 width: 20em;
3190 width: 20em;
3191 }
3191 }
3192
3192
3193 .ac .yui-ac-input {
3193 .ac .yui-ac-input {
3194 width: 100%;
3194 width: 100%;
3195 }
3195 }
3196
3196
3197 .ac .yui-ac-container {
3197 .ac .yui-ac-container {
3198 position: absolute;
3198 position: absolute;
3199 top: 1.6em;
3199 top: 1.6em;
3200 width: auto;
3200 width: auto;
3201 }
3201 }
3202
3202
3203 .ac .yui-ac-content {
3203 .ac .yui-ac-content {
3204 position: absolute;
3204 position: absolute;
3205 border: 1px solid gray;
3205 border: 1px solid gray;
3206 background: #fff;
3206 background: #fff;
3207 z-index: 9050;
3207 z-index: 9050;
3208 }
3208 }
3209
3209
3210 .ac .yui-ac-shadow {
3210 .ac .yui-ac-shadow {
3211 position: absolute;
3211 position: absolute;
3212 width: 100%;
3212 width: 100%;
3213 background: #000;
3213 background: #000;
3214 opacity: .10;
3214 opacity: .10;
3215 filter: alpha(opacity = 10);
3215 filter: alpha(opacity = 10);
3216 z-index: 9049;
3216 z-index: 9049;
3217 margin: .3em;
3217 margin: .3em;
3218 }
3218 }
3219
3219
3220 .ac .yui-ac-content ul {
3220 .ac .yui-ac-content ul {
3221 width: 100%;
3221 width: 100%;
3222 margin: 0;
3222 margin: 0;
3223 padding: 0;
3223 padding: 0;
3224 z-index: 9050;
3224 z-index: 9050;
3225 }
3225 }
3226
3226
3227 .ac .yui-ac-content li {
3227 .ac .yui-ac-content li {
3228 cursor: default;
3228 cursor: default;
3229 white-space: nowrap;
3229 white-space: nowrap;
3230 margin: 0;
3230 margin: 0;
3231 padding: 2px 5px;
3231 padding: 2px 5px;
3232 height: 18px;
3232 height: 18px;
3233 z-index: 9050;
3233 z-index: 9050;
3234 display: block;
3234 display: block;
3235 width: auto !important;
3235 width: auto !important;
3236 }
3236 }
3237
3237
3238 .ac .yui-ac-content li .ac-container-wrap {
3238 .ac .yui-ac-content li .ac-container-wrap {
3239 width: auto;
3239 width: auto;
3240 }
3240 }
3241
3241
3242 .ac .yui-ac-content li.yui-ac-prehighlight {
3242 .ac .yui-ac-content li.yui-ac-prehighlight {
3243 background: #B3D4FF;
3243 background: #B3D4FF;
3244 z-index: 9050;
3244 z-index: 9050;
3245 }
3245 }
3246
3246
3247 .ac .yui-ac-content li.yui-ac-highlight {
3247 .ac .yui-ac-content li.yui-ac-highlight {
3248 background: #556CB5;
3248 background: #556CB5;
3249 color: #FFF;
3249 color: #FFF;
3250 z-index: 9050;
3250 z-index: 9050;
3251 }
3251 }
3252 .ac .yui-ac-bd {
3252 .ac .yui-ac-bd {
3253 z-index: 9050;
3253 z-index: 9050;
3254 }
3254 }
3255
3255
3256 #repo_size {
3256 #repo_size {
3257 display: block;
3257 display: block;
3258 margin-top: 4px;
3258 margin-top: 4px;
3259 color: #666;
3259 color: #666;
3260 float: right;
3260 float: right;
3261 }
3261 }
3262
3262
3263 .currently_following {
3263 .currently_following {
3264 padding-left: 10px;
3264 padding-left: 10px;
3265 padding-bottom: 5px;
3265 padding-bottom: 5px;
3266 }
3266 }
3267
3267
3268 .action_button {
3268 .action_button {
3269 border: 0;
3269 border: 0;
3270 display: inline;
3270 display: inline;
3271 }
3271 }
3272
3272
3273 .action_button:hover {
3273 .action_button:hover {
3274 border: 0;
3274 border: 0;
3275 text-decoration: underline;
3275 text-decoration: underline;
3276 cursor: pointer;
3276 cursor: pointer;
3277 }
3277 }
3278
3278
3279 #switch_repos {
3279 #switch_repos {
3280 position: absolute;
3280 position: absolute;
3281 height: 25px;
3281 height: 25px;
3282 z-index: 1;
3282 z-index: 1;
3283 }
3283 }
3284
3284
3285 #switch_repos select {
3285 #switch_repos select {
3286 min-width: 150px;
3286 min-width: 150px;
3287 max-height: 250px;
3287 max-height: 250px;
3288 z-index: 1;
3288 z-index: 1;
3289 }
3289 }
3290
3290
3291 .breadcrumbs {
3291 .breadcrumbs {
3292 border: medium none;
3292 border: medium none;
3293 color: #FFF;
3293 color: #FFF;
3294 float: left;
3294 float: left;
3295 font-weight: 700;
3295 font-weight: 700;
3296 font-size: 14px;
3296 font-size: 14px;
3297 margin: 0;
3297 margin: 0;
3298 padding: 11px 0 11px 10px;
3298 padding: 11px 0 11px 10px;
3299 }
3299 }
3300
3300
3301 .breadcrumbs .hash {
3301 .breadcrumbs .hash {
3302 text-transform: none;
3302 text-transform: none;
3303 color: #fff;
3303 color: #fff;
3304 }
3304 }
3305
3305
3306 .breadcrumbs a {
3306 .breadcrumbs a {
3307 color: #FFF;
3307 color: #FFF;
3308 }
3308 }
3309
3309
3310 .flash_msg {
3310 .flash_msg {
3311 }
3311 }
3312
3312
3313 .flash_msg ul {
3313 .flash_msg ul {
3314 }
3314 }
3315
3315
3316 .error_red {
3316 .error_red {
3317 color: red;
3317 color: red;
3318 }
3318 }
3319
3319
3320 .flash_msg .alert-error {
3320 .flash_msg .alert-error {
3321 background-color: #c43c35;
3321 background-color: #c43c35;
3322 background-repeat: repeat-x;
3322 background-repeat: repeat-x;
3323 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35) );
3323 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35) );
3324 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3324 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3325 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3325 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3326 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35) );
3326 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35) );
3327 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3327 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3328 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3328 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3329 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3329 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3330 border-color: #c43c35 #c43c35 #882a25;
3330 border-color: #c43c35 #c43c35 #882a25;
3331 }
3331 }
3332
3332
3333 .flash_msg .alert-error a {
3333 .flash_msg .alert-error a {
3334 text-decoration: underline;
3334 text-decoration: underline;
3335 }
3335 }
3336
3336
3337 .flash_msg .alert-warning {
3337 .flash_msg .alert-warning {
3338 color: #404040 !important;
3338 color: #404040 !important;
3339 background-color: #eedc94;
3339 background-color: #eedc94;
3340 background-repeat: repeat-x;
3340 background-repeat: repeat-x;
3341 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
3341 background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94) );
3342 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3342 background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
3343 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3343 background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
3344 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94) );
3344 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94) );
3345 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3345 background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
3346 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3346 background-image: -o-linear-gradient(top, #fceec1, #eedc94);
3347 background-image: linear-gradient(to bottom, #fceec1, #eedc94);
3347 background-image: linear-gradient(to bottom, #fceec1, #eedc94);
3348 border-color: #eedc94 #eedc94 #e4c652;
3348 border-color: #eedc94 #eedc94 #e4c652;
3349 }
3349 }
3350
3350
3351 .flash_msg .alert-warning a {
3351 .flash_msg .alert-warning a {
3352 text-decoration: underline;
3352 text-decoration: underline;
3353 }
3353 }
3354
3354
3355 .flash_msg .alert-success {
3355 .flash_msg .alert-success {
3356 background-color: #57a957;
3356 background-color: #57a957;
3357 background-repeat: repeat-x !important;
3357 background-repeat: repeat-x !important;
3358 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957) );
3358 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957) );
3359 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3359 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3360 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3360 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3361 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957) );
3361 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957) );
3362 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3362 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3363 background-image: -o-linear-gradient(top, #62c462, #57a957);
3363 background-image: -o-linear-gradient(top, #62c462, #57a957);
3364 background-image: linear-gradient(to bottom, #62c462, #57a957);
3364 background-image: linear-gradient(to bottom, #62c462, #57a957);
3365 border-color: #57a957 #57a957 #3d773d;
3365 border-color: #57a957 #57a957 #3d773d;
3366 }
3366 }
3367
3367
3368 .flash_msg .alert-success a {
3368 .flash_msg .alert-success a {
3369 text-decoration: underline;
3369 text-decoration: underline;
3370 color: #FFF !important;
3370 color: #FFF !important;
3371 }
3371 }
3372
3372
3373 .flash_msg .alert-info {
3373 .flash_msg .alert-info {
3374 background-color: #339bb9;
3374 background-color: #339bb9;
3375 background-repeat: repeat-x;
3375 background-repeat: repeat-x;
3376 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9) );
3376 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9) );
3377 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3377 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3378 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3378 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3379 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9) );
3379 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9) );
3380 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3380 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3381 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3381 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3382 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3382 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3383 border-color: #339bb9 #339bb9 #22697d;
3383 border-color: #339bb9 #339bb9 #22697d;
3384 }
3384 }
3385
3385
3386 .flash_msg .alert-info a {
3386 .flash_msg .alert-info a {
3387 text-decoration: underline;
3387 text-decoration: underline;
3388 }
3388 }
3389
3389
3390 .flash_msg .alert-error,
3390 .flash_msg .alert-error,
3391 .flash_msg .alert-warning,
3391 .flash_msg .alert-warning,
3392 .flash_msg .alert-success,
3392 .flash_msg .alert-success,
3393 .flash_msg .alert-info {
3393 .flash_msg .alert-info {
3394 font-size: 12px;
3394 font-size: 12px;
3395 font-weight: 700;
3395 font-weight: 700;
3396 min-height: 14px;
3396 min-height: 14px;
3397 line-height: 14px;
3397 line-height: 14px;
3398 margin-bottom: 10px;
3398 margin-bottom: 10px;
3399 margin-top: 0;
3399 margin-top: 0;
3400 display: block;
3400 display: block;
3401 overflow: auto;
3401 overflow: auto;
3402 padding: 6px 10px 6px 10px;
3402 padding: 6px 10px 6px 10px;
3403 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3403 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3404 position: relative;
3404 position: relative;
3405 color: #FFF;
3405 color: #FFF;
3406 border-width: 1px;
3406 border-width: 1px;
3407 border-style: solid;
3407 border-style: solid;
3408 -webkit-border-radius: 4px;
3408 -webkit-border-radius: 4px;
3409 border-radius: 4px;
3409 border-radius: 4px;
3410 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3410 -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3411 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3411 box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
3412 }
3412 }
3413
3413
3414 div#legend_data {
3414 div#legend_data {
3415 padding-left: 10px;
3415 padding-left: 10px;
3416 }
3416 }
3417 div#legend_container table {
3417 div#legend_container table {
3418 border: none !important;
3418 border: none !important;
3419 }
3419 }
3420 div#legend_container table,
3420 div#legend_container table,
3421 div#legend_choices table {
3421 div#legend_choices table {
3422 width: auto !important;
3422 width: auto !important;
3423 }
3423 }
3424
3424
3425 table#permissions_manage {
3425 table#permissions_manage {
3426 width: 0 !important;
3426 width: 0 !important;
3427 }
3427 }
3428
3428
3429 table#permissions_manage span.private_repo_msg {
3429 table#permissions_manage span.private_repo_msg {
3430 font-size: 0.8em;
3430 font-size: 0.8em;
3431 opacity: 0.6;
3431 opacity: 0.6;
3432 }
3432 }
3433
3433
3434 table#permissions_manage td.private_repo_msg {
3434 table#permissions_manage td.private_repo_msg {
3435 font-size: 0.8em;
3435 font-size: 0.8em;
3436 }
3436 }
3437
3437
3438 table#permissions_manage tr#add_perm_input td {
3438 table#permissions_manage tr#add_perm_input td {
3439 vertical-align: middle;
3439 vertical-align: middle;
3440 }
3440 }
3441
3441
3442 div.gravatar {
3442 div.gravatar {
3443 background-color: #FFF;
3443 background-color: #FFF;
3444 float: left;
3444 float: left;
3445 margin-right: 0.7em;
3445 margin-right: 0.7em;
3446 padding: 1px 1px 1px 1px;
3446 padding: 1px 1px 1px 1px;
3447 line-height: 0;
3447 line-height: 0;
3448 -webkit-border-radius: 3px;
3448 -webkit-border-radius: 3px;
3449 -khtml-border-radius: 3px;
3449 -khtml-border-radius: 3px;
3450 border-radius: 3px;
3450 border-radius: 3px;
3451 }
3451 }
3452
3452
3453 div.gravatar img {
3453 div.gravatar img {
3454 -webkit-border-radius: 2px;
3454 -webkit-border-radius: 2px;
3455 -khtml-border-radius: 2px;
3455 -khtml-border-radius: 2px;
3456 border-radius: 2px;
3456 border-radius: 2px;
3457 }
3457 }
3458
3458
3459 #header, #content, #footer {
3459 #header, #content, #footer {
3460 min-width: 978px;
3460 min-width: 978px;
3461 }
3461 }
3462
3462
3463 #content {
3463 #content {
3464 clear: both;
3464 clear: both;
3465 padding: 10px 10px 14px 10px;
3465 padding: 10px 10px 14px 10px;
3466 }
3466 }
3467
3467
3468 #content.hover {
3468 #content.hover {
3469 padding: 55px 10px 14px 10px !important;
3469 padding: 55px 10px 14px 10px !important;
3470 }
3470 }
3471
3471
3472 #content div.box div.title div.search {
3472 #content div.box div.title div.search {
3473 border-left: 1px solid #576622;
3473 border-left: 1px solid #576622;
3474 }
3474 }
3475
3475
3476 #content div.box div.title div.search div.input input {
3476 #content div.box div.title div.search div.input input {
3477 border: 1px solid #576622;
3477 border: 1px solid #576622;
3478 }
3478 }
3479
3479
3480 .btn {
3480 .btn {
3481 color: #515151;
3481 color: #515151;
3482 background-color: #DADADA;
3482 background-color: #DADADA;
3483 background-repeat: repeat-x;
3483 background-repeat: repeat-x;
3484 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3484 background-image: -khtml-gradient(linear, left top, left bottom, from(#F4F4F4),to(#DADADA) );
3485 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3485 background-image: -moz-linear-gradient(top, #F4F4F4, #DADADA);
3486 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3486 background-image: -ms-linear-gradient(top, #F4F4F4, #DADADA);
3487 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3487 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #F4F4F4),color-stop(100%, #DADADA) );
3488 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA);
3488 background-image: -webkit-linear-gradient(top, #F4F4F4, #DADADA);
3489 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA);
3489 background-image: -o-linear-gradient(top, #F4F4F4, #DADADA);
3490 background-image: linear-gradient(to bottom, #F4F4F4, #DADADA);
3490 background-image: linear-gradient(to bottom, #F4F4F4, #DADADA);
3491
3491
3492 border-top: 1px solid #DDD;
3492 border-top: 1px solid #DDD;
3493 border-left: 1px solid #c6c6c6;
3493 border-left: 1px solid #c6c6c6;
3494 border-right: 1px solid #DDD;
3494 border-right: 1px solid #DDD;
3495 border-bottom: 1px solid #c6c6c6;
3495 border-bottom: 1px solid #c6c6c6;
3496 outline: none;
3496 outline: none;
3497 margin: 0px 3px 3px 0px;
3497 margin: 0px 3px 3px 0px;
3498 -webkit-border-radius: 4px 4px 4px 4px !important;
3498 -webkit-border-radius: 4px 4px 4px 4px !important;
3499 -khtml-border-radius: 4px 4px 4px 4px !important;
3499 -khtml-border-radius: 4px 4px 4px 4px !important;
3500 border-radius: 4px 4px 4px 4px !important;
3500 border-radius: 4px 4px 4px 4px !important;
3501 cursor: pointer !important;
3501 cursor: pointer !important;
3502 padding: 3px 3px 3px 3px;
3502 padding: 3px 3px 3px 3px;
3503 display: inline-block;
3503 display: inline-block;
3504 }
3504 }
3505
3505
3506 ul.nav-stacked {
3506 ul.nav-stacked {
3507 margin: 20px;
3507 margin: 20px;
3508 color: #393939;
3508 color: #393939;
3509 font-weight: 700;
3509 font-weight: 700;
3510 }
3510 }
3511
3511
3512 ul.nav-stacked a {
3512 ul.nav-stacked a {
3513 color: inherit;
3513 color: inherit;
3514 }
3514 }
3515
3515
3516 /* make .btn inputs and buttons and divs look the same */
3516 /* make .btn inputs and buttons and divs look the same */
3517 button.btn,
3517 button.btn,
3518 input.btn {
3518 input.btn {
3519 font-family: inherit;
3519 font-family: inherit;
3520 font-size: inherit;
3520 font-size: inherit;
3521 line-height: inherit;
3521 line-height: inherit;
3522 }
3522 }
3523
3523
3524 .btn::-moz-focus-inner {
3524 .btn::-moz-focus-inner {
3525 border: 0;
3525 border: 0;
3526 padding: 0;
3526 padding: 0;
3527 }
3527 }
3528
3528
3529 .btn.badge {
3529 .btn.badge {
3530 cursor: default !important;
3530 cursor: default !important;
3531 }
3531 }
3532
3532
3533 input[disabled].btn,
3533 input[disabled].btn,
3534 .btn.disabled {
3534 .btn.disabled {
3535 color: #999;
3535 color: #999;
3536 }
3536 }
3537
3537
3538 .btn.btn-danger.disabled {
3538 .btn.btn-danger.disabled {
3539 color: #eee;
3539 color: #eee;
3540 background-color: #c77;
3540 background-color: #c77;
3541 border-color: #b66
3541 border-color: #b66
3542 }
3542 }
3543
3543
3544 .btn.btn-small {
3544 .btn.btn-small {
3545 padding: 2px 6px;
3545 padding: 2px 6px;
3546 }
3546 }
3547
3547
3548 .btn.btn-mini {
3548 .btn.btn-mini {
3549 padding: 0px 4px;
3549 padding: 0px 4px;
3550 }
3550 }
3551
3551
3552 .btn:focus {
3552 .btn:focus {
3553 outline: none;
3553 outline: none;
3554 }
3554 }
3555 .btn:hover {
3555 .btn:hover {
3556 text-decoration: none;
3556 text-decoration: none;
3557 color: #515151;
3557 color: #515151;
3558 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3558 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 0 3px #FFFFFF !important;
3559 }
3559 }
3560 .btn.badge:hover {
3560 .btn.badge:hover {
3561 box-shadow: none !important;
3561 box-shadow: none !important;
3562 }
3562 }
3563 .btn.disabled:hover {
3563 .btn.disabled:hover {
3564 background-position: 0;
3564 background-position: 0;
3565 color: #999;
3565 color: #999;
3566 text-decoration: none;
3566 text-decoration: none;
3567 box-shadow: none !important;
3567 box-shadow: none !important;
3568 }
3568 }
3569
3569
3570 .btn.red {
3570 .btn.red {
3571 color: #fff;
3571 color: #fff;
3572 background-color: #c43c35;
3572 background-color: #c43c35;
3573 background-repeat: repeat-x;
3573 background-repeat: repeat-x;
3574 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3574 background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
3575 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3575 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
3576 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3576 background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
3577 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3577 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
3578 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3578 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
3579 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3579 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
3580 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3580 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
3581 border-color: #c43c35 #c43c35 #882a25;
3581 border-color: #c43c35 #c43c35 #882a25;
3582 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3582 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3583 }
3583 }
3584
3584
3585
3585
3586 .btn.blue {
3586 .btn.blue {
3587 color: #fff;
3587 color: #fff;
3588 background-color: #339bb9;
3588 background-color: #339bb9;
3589 background-repeat: repeat-x;
3589 background-repeat: repeat-x;
3590 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3590 background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
3591 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3591 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
3592 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3592 background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
3593 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3593 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
3594 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3594 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
3595 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3595 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
3596 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3596 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
3597 border-color: #339bb9 #339bb9 #22697d;
3597 border-color: #339bb9 #339bb9 #22697d;
3598 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3598 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3599 }
3599 }
3600
3600
3601 .btn.green {
3601 .btn.green {
3602 color: #fff;
3602 color: #fff;
3603 background-color: #57a957;
3603 background-color: #57a957;
3604 background-repeat: repeat-x;
3604 background-repeat: repeat-x;
3605 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3605 background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
3606 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3606 background-image: -moz-linear-gradient(top, #62c462, #57a957);
3607 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3607 background-image: -ms-linear-gradient(top, #62c462, #57a957);
3608 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3608 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
3609 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3609 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
3610 background-image: -o-linear-gradient(top, #62c462, #57a957);
3610 background-image: -o-linear-gradient(top, #62c462, #57a957);
3611 background-image: linear-gradient(to bottom, #62c462, #57a957);
3611 background-image: linear-gradient(to bottom, #62c462, #57a957);
3612 border-color: #57a957 #57a957 #3d773d;
3612 border-color: #57a957 #57a957 #3d773d;
3613 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3613 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3614 }
3614 }
3615
3615
3616 .btn.yellow {
3616 .btn.yellow {
3617 color: #fff;
3617 color: #fff;
3618 background-color: #faa732;
3618 background-color: #faa732;
3619 background-repeat: repeat-x;
3619 background-repeat: repeat-x;
3620 background-image: -khtml-gradient(linear, left top, left bottom, from(#fbb450), to(#f89406));
3620 background-image: -khtml-gradient(linear, left top, left bottom, from(#fbb450), to(#f89406));
3621 background-image: -moz-linear-gradient(top, #fbb450, #f89406);
3621 background-image: -moz-linear-gradient(top, #fbb450, #f89406);
3622 background-image: -ms-linear-gradient(top, #fbb450, #f89406);
3622 background-image: -ms-linear-gradient(top, #fbb450, #f89406);
3623 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fbb450), color-stop(100%, #f89406));
3623 background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fbb450), color-stop(100%, #f89406));
3624 background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
3624 background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
3625 background-image: -o-linear-gradient(top, #fbb450, #f89406);
3625 background-image: -o-linear-gradient(top, #fbb450, #f89406);
3626 background-image: linear-gradient(to bottom, #fbb450, #f89406);
3626 background-image: linear-gradient(to bottom, #fbb450, #f89406);
3627 border-color: #f89406 #f89406 #ad6704;
3627 border-color: #f89406 #f89406 #ad6704;
3628 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3628 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3629 }
3629 }
3630
3630
3631 label.disabled {
3631 label.disabled {
3632 color: #aaa;
3632 color: #aaa;
3633 }
3633 }
3634
3634
3635 .btn.blue.hidden {
3635 .btn.blue.hidden {
3636 display: none;
3636 display: none;
3637 }
3637 }
3638
3638
3639 .btn.active {
3639 .btn.active {
3640 font-weight: bold;
3640 font-weight: bold;
3641 }
3641 }
3642
3642
3643 ins, div.options a:hover {
3643 ins, div.options a:hover {
3644 text-decoration: none;
3644 text-decoration: none;
3645 }
3645 }
3646
3646
3647 img,
3647 img,
3648 #header #header-inner #quick li a:hover span.normal,
3648 #header #header-inner #quick li a:hover span.normal,
3649 #content div.box div.form div.fields div.field div.textarea table td table td a,
3649 #content div.box div.form div.fields div.field div.textarea table td table td a,
3650 #clone_url,
3650 #clone_url,
3651 #clone_url_id
3651 #clone_url_id
3652 {
3652 {
3653 border: none;
3653 border: none;
3654 }
3654 }
3655
3655
3656 img.icon, .right .merge img {
3656 img.icon, .right .merge img {
3657 vertical-align: bottom;
3657 vertical-align: bottom;
3658 }
3658 }
3659
3659
3660 #header ul#logged-user,
3660 #header ul#logged-user,
3661 #content div.box div.title ul.links,
3661 #content div.box div.title ul.links,
3662 #content div.box div.message div.dismiss,
3662 #content div.box div.message div.dismiss,
3663 #content div.box div.traffic div.legend ul {
3663 #content div.box div.traffic div.legend ul {
3664 float: right;
3664 float: right;
3665 margin: 0;
3665 margin: 0;
3666 padding: 0;
3666 padding: 0;
3667 }
3667 }
3668
3668
3669 #header #header-inner #home,
3669 #header #header-inner #home,
3670 #header #header-inner #logo,
3670 #header #header-inner #logo,
3671 #content div.box ul.left,
3671 #content div.box ul.left,
3672 #content div.box ol.left,
3672 #content div.box ol.left,
3673 div#commit_history,
3673 div#commit_history,
3674 div#legend_data, div#legend_container, div#legend_choices {
3674 div#legend_data, div#legend_container, div#legend_choices {
3675 float: left;
3675 float: left;
3676 }
3676 }
3677
3677
3678 #header #header-inner #quick li #quick_login,
3678 #header #header-inner #quick li #quick_login,
3679 #header #header-inner #quick li:hover ul ul,
3679 #header #header-inner #quick li:hover ul ul,
3680 #header #header-inner #quick li:hover ul ul ul,
3680 #header #header-inner #quick li:hover ul ul ul,
3681 #header #header-inner #quick li:hover ul ul ul ul,
3681 #header #header-inner #quick li:hover ul ul ul ul,
3682 #content #left #menu ul.closed,
3682 #content #left #menu ul.closed,
3683 #content #left #menu li ul.collapsed,
3683 #content #left #menu li ul.collapsed,
3684 .yui-tt-shadow {
3684 .yui-tt-shadow {
3685 display: none;
3685 display: none;
3686 }
3686 }
3687
3687
3688 #header #header-inner #quick li:hover #quick_login,
3688 #header #header-inner #quick li:hover #quick_login,
3689 #header #header-inner #quick li:hover ul,
3689 #header #header-inner #quick li:hover ul,
3690 #header #header-inner #quick li li:hover ul,
3690 #header #header-inner #quick li li:hover ul,
3691 #header #header-inner #quick li li li:hover ul,
3691 #header #header-inner #quick li li li:hover ul,
3692 #header #header-inner #quick li li li li:hover ul,
3692 #header #header-inner #quick li li li li:hover ul,
3693 #content #left #menu ul.opened,
3693 #content #left #menu ul.opened,
3694 #content #left #menu li ul.expanded {
3694 #content #left #menu li ul.expanded {
3695 display: block;
3695 display: block;
3696 }
3696 }
3697
3697
3698 .repo-switcher .select2-choice {
3698 .repo-switcher .select2-choice {
3699 padding: 0px 8px 1px !important;
3699 padding: 0px 8px 1px !important;
3700 display: block;
3700 display: block;
3701 height: 100%;
3701 height: 100%;
3702 }
3702 }
3703
3703
3704 .repo-switcher .select2-container,
3704 .repo-switcher .select2-container,
3705 .repo-switcher .select2-choice,
3705 .repo-switcher .select2-choice,
3706 .repo-switcher .select2-choice span {
3706 .repo-switcher .select2-choice span {
3707 background: transparent !important;
3707 background: transparent !important;
3708 border: 0 !important;
3708 border: 0 !important;
3709 box-shadow: none !important;
3709 box-shadow: none !important;
3710 color: #FFFFFF !important;
3710 color: #FFFFFF !important;
3711 }
3711 }
3712
3712
3713 .repo-switcher .select2-arrow {
3713 .repo-switcher .select2-arrow {
3714 display: none !important;
3714 display: none !important;
3715 }
3715 }
3716
3716
3717 .repo-switcher .select2-chosen:after {
3717 .repo-switcher .select2-chosen:after {
3718 font-family: 'kallithea';
3718 font-family: 'kallithea';
3719 content: ' \23f7';
3719 content: ' \23f7';
3720 }
3720 }
3721
3721
3722 .repo-switcher-dropdown.select2-drop.select2-drop-active {
3722 .repo-switcher-dropdown.select2-drop.select2-drop-active {
3723 xborder-color: black;
3723 xborder-color: black;
3724 -webkit-box-shadow: none;
3724 -webkit-box-shadow: none;
3725 -moz-box-shadow: none;
3725 -moz-box-shadow: none;
3726 box-shadow: none;
3726 box-shadow: none;
3727 color: #fff;
3727 color: #fff;
3728 background-color: #576622;
3728 background-color: #576622;
3729 }
3729 }
3730
3730
3731 .repo-switcher-dropdown.select2-drop.select2-drop-active .select2-results .select2-highlighted {
3731 .repo-switcher-dropdown.select2-drop.select2-drop-active .select2-results .select2-highlighted {
3732 background-color: #6388ad;
3732 background-color: #6388ad;
3733 }
3733 }
3734
3734
3735 #content div.graph {
3735 #content div.graph {
3736 padding: 0 10px 10px;
3736 padding: 0 10px 10px;
3737 height: 450px;
3737 height: 450px;
3738 }
3738 }
3739
3739
3740 #content div.box ol.lower-roman,
3740 #content div.box ol.lower-roman,
3741 #content div.box ol.upper-roman,
3741 #content div.box ol.upper-roman,
3742 #content div.box ol.lower-alpha,
3742 #content div.box ol.lower-alpha,
3743 #content div.box ol.upper-alpha,
3743 #content div.box ol.upper-alpha,
3744 #content div.box ol.decimal {
3744 #content div.box ol.decimal {
3745 margin: 10px 24px 10px 44px;
3745 margin: 10px 24px 10px 44px;
3746 }
3746 }
3747
3747
3748 #content div.box div.form,
3748 #content div.box div.form,
3749 #content div.box div.table,
3749 #content div.box div.table,
3750 #content div.box div.traffic {
3750 #content div.box div.traffic {
3751 position: relative;
3751 position: relative;
3752 clear: both;
3752 clear: both;
3753 margin: 0;
3753 margin: 0;
3754 padding: 0 20px 10px;
3754 padding: 0 20px 10px;
3755 }
3755 }
3756
3756
3757 #content div.box div.form div.fields,
3757 #content div.box div.form div.fields,
3758 #login div.form,
3758 #login div.form,
3759 #login div.form div.fields,
3759 #login div.form div.fields,
3760 #register div.form,
3760 #register div.form,
3761 #register div.form div.fields {
3761 #register div.form div.fields {
3762 clear: both;
3762 clear: both;
3763 overflow: hidden;
3763 overflow: hidden;
3764 margin: 0;
3764 margin: 0;
3765 padding: 0;
3765 padding: 0;
3766 }
3766 }
3767
3767
3768 #content div.box div.form div.fields div.field div.label span,
3768 #content div.box div.form div.fields div.field div.label span,
3769 #login div.form div.fields div.field div.label span,
3769 #login div.form div.fields div.field div.label span,
3770 #register div.form div.fields div.field div.label span {
3770 #register div.form div.fields div.field div.label span {
3771 height: 1%;
3771 height: 1%;
3772 display: block;
3772 display: block;
3773 color: #363636;
3773 color: #363636;
3774 margin: 0;
3774 margin: 0;
3775 padding: 2px 0 0;
3775 padding: 2px 0 0;
3776 }
3776 }
3777
3777
3778 #content div.box div.form div.fields div.field div.input input.error,
3778 #content div.box div.form div.fields div.field div.input input.error,
3779 #login div.form div.fields div.field div.input input.error,
3779 #login div.form div.fields div.field div.input input.error,
3780 #register div.form div.fields div.field div.input input.error {
3780 #register div.form div.fields div.field div.input input.error {
3781 background: #FBE3E4;
3781 background: #FBE3E4;
3782 border-top: 1px solid #e1b2b3;
3782 border-top: 1px solid #e1b2b3;
3783 border-left: 1px solid #e1b2b3;
3783 border-left: 1px solid #e1b2b3;
3784 border-right: 1px solid #FBC2C4;
3784 border-right: 1px solid #FBC2C4;
3785 border-bottom: 1px solid #FBC2C4;
3785 border-bottom: 1px solid #FBC2C4;
3786 }
3786 }
3787
3787
3788 #content div.box div.form div.fields div.field div.input input.success,
3788 #content div.box div.form div.fields div.field div.input input.success,
3789 #login div.form div.fields div.field div.input input.success,
3789 #login div.form div.fields div.field div.input input.success,
3790 #register div.form div.fields div.field div.input input.success {
3790 #register div.form div.fields div.field div.input input.success {
3791 background: #E6EFC2;
3791 background: #E6EFC2;
3792 border-top: 1px solid #cebb98;
3792 border-top: 1px solid #cebb98;
3793 border-left: 1px solid #cebb98;
3793 border-left: 1px solid #cebb98;
3794 border-right: 1px solid #c6d880;
3794 border-right: 1px solid #c6d880;
3795 border-bottom: 1px solid #c6d880;
3795 border-bottom: 1px solid #c6d880;
3796 }
3796 }
3797
3797
3798 #content div.box-left div.form div.fields div.field div.textarea,
3798 #content div.box-left div.form div.fields div.field div.textarea,
3799 #content div.box-right div.form div.fields div.field div.textarea,
3799 #content div.box-right div.form div.fields div.field div.textarea,
3800 #content div.box div.form div.fields div.field div.select select,
3800 #content div.box div.form div.fields div.field div.select select,
3801 #content div.box table th.selected input,
3801 #content div.box table th.selected input,
3802 #content div.box table td.selected input {
3802 #content div.box table td.selected input {
3803 margin: 0;
3803 margin: 0;
3804 }
3804 }
3805
3805
3806 #content div.box-left div.form div.fields div.field div.select,
3806 #content div.box-left div.form div.fields div.field div.select,
3807 #content div.box-left div.form div.fields div.field div.checkboxes,
3807 #content div.box-left div.form div.fields div.field div.checkboxes,
3808 #content div.box-left div.form div.fields div.field div.radios,
3808 #content div.box-left div.form div.fields div.field div.radios,
3809 #content div.box-right div.form div.fields div.field div.select,
3809 #content div.box-right div.form div.fields div.field div.select,
3810 #content div.box-right div.form div.fields div.field div.checkboxes,
3810 #content div.box-right div.form div.fields div.field div.checkboxes,
3811 #content div.box-right div.form div.fields div.field div.radios {
3811 #content div.box-right div.form div.fields div.field div.radios {
3812 margin: 0 0 0 0px !important;
3812 margin: 0 0 0 0px !important;
3813 padding: 0;
3813 padding: 0;
3814 }
3814 }
3815
3815
3816 #content div.box div.form div.fields div.field div.select,
3816 #content div.box div.form div.fields div.field div.select,
3817 #content div.box div.form div.fields div.field div.checkboxes,
3817 #content div.box div.form div.fields div.field div.checkboxes,
3818 #content div.box div.form div.fields div.field div.radios {
3818 #content div.box div.form div.fields div.field div.radios {
3819 margin: 0 0 0 200px;
3819 margin: 0 0 0 200px;
3820 padding: 0;
3820 padding: 0;
3821 }
3821 }
3822
3822
3823 #content div.box div.form div.fields div.field div.select a:hover,
3823 #content div.box div.form div.fields div.field div.select a:hover,
3824 #content div.box div.form div.fields div.field div.select a.ui-selectmenu:hover,
3824 #content div.box div.form div.fields div.field div.select a.ui-selectmenu:hover,
3825 #content div.box div.action a:hover {
3825 #content div.box div.action a:hover {
3826 color: #000;
3826 color: #000;
3827 text-decoration: none;
3827 text-decoration: none;
3828 }
3828 }
3829
3829
3830 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus,
3830 #content div.box div.form div.fields div.field div.select a.ui-selectmenu-focus,
3831 #content div.box div.action a.ui-selectmenu-focus {
3831 #content div.box div.action a.ui-selectmenu-focus {
3832 border: 1px solid #666;
3832 border: 1px solid #666;
3833 }
3833 }
3834
3834
3835 #content div.box div.form div.fields div.field div.checkboxes div.checkbox,
3835 #content div.box div.form div.fields div.field div.checkboxes div.checkbox,
3836 #content div.box div.form div.fields div.field div.radios div.radio {
3836 #content div.box div.form div.fields div.field div.radios div.radio {
3837 clear: both;
3837 clear: both;
3838 overflow: hidden;
3838 overflow: hidden;
3839 margin: 0;
3839 margin: 0;
3840 padding: 8px 0 2px;
3840 padding: 8px 0 2px;
3841 }
3841 }
3842
3842
3843 #content div.box div.form div.fields div.field div.checkboxes div.checkbox input,
3843 #content div.box div.form div.fields div.field div.checkboxes div.checkbox input,
3844 #content div.box div.form div.fields div.field div.radios div.radio input {
3844 #content div.box div.form div.fields div.field div.radios div.radio input {
3845 float: left;
3845 float: left;
3846 margin: 0;
3846 margin: 0;
3847 }
3847 }
3848
3848
3849 #content div.box div.form div.fields div.field div.checkboxes div.checkbox label,
3849 #content div.box div.form div.fields div.field div.checkboxes div.checkbox label,
3850 #content div.box div.form div.fields div.field div.radios div.radio label {
3850 #content div.box div.form div.fields div.field div.radios div.radio label {
3851 height: 1%;
3851 height: 1%;
3852 display: block;
3852 display: block;
3853 float: left;
3853 float: left;
3854 margin: 2px 0 0 4px;
3854 margin: 2px 0 0 4px;
3855 }
3855 }
3856
3856
3857 div.form div.fields div.field div.button input,
3857 div.form div.fields div.field div.button input,
3858 #content div.box div.form div.fields div.buttons input
3858 #content div.box div.form div.fields div.buttons input
3859 div.form div.fields div.buttons input,
3859 div.form div.fields div.buttons input,
3860 #content div.box div.action div.button input {
3860 #content div.box div.action div.button input {
3861 font-size: 11px;
3861 font-size: 11px;
3862 font-weight: 700;
3862 font-weight: 700;
3863 margin: 0;
3863 margin: 0;
3864 }
3864 }
3865
3865
3866 div.form div.fields div.field div.highlight,
3866 div.form div.fields div.field div.highlight,
3867 #content div.box div.form div.fields div.buttons div.highlight {
3867 #content div.box div.form div.fields div.buttons div.highlight {
3868 display: inline;
3868 display: inline;
3869 }
3869 }
3870
3870
3871 #content div.box div.form div.fields div.buttons,
3871 #content div.box div.form div.fields div.buttons,
3872 div.form div.fields div.buttons {
3872 div.form div.fields div.buttons {
3873 margin: 10px 0 0 200px;
3873 margin: 10px 0 0 200px;
3874 padding: 0;
3874 padding: 0;
3875 }
3875 }
3876
3876
3877 #content div.box-left div.form div.fields div.buttons,
3877 #content div.box-left div.form div.fields div.buttons,
3878 #content div.box-right div.form div.fields div.buttons,
3878 #content div.box-right div.form div.fields div.buttons,
3879 div.box-left div.form div.fields div.buttons,
3879 div.box-left div.form div.fields div.buttons,
3880 div.box-right div.form div.fields div.buttons {
3880 div.box-right div.form div.fields div.buttons {
3881 margin: 10px 0 0;
3881 margin: 10px 0 0;
3882 }
3882 }
3883
3883
3884 #content div.box table td.user,
3884 #content div.box table td.user,
3885 #content div.box table td.address {
3885 #content div.box table td.address {
3886 width: 10%;
3886 width: 10%;
3887 text-align: center;
3887 text-align: center;
3888 }
3888 }
3889
3889
3890 #content div.box div.action div.button,
3890 #content div.box div.action div.button,
3891 #login div.form div.fields div.field div.input div.link,
3891 #login div.form div.fields div.field div.input div.link,
3892 #register div.form div.fields div.field div.input div.link {
3892 #register div.form div.fields div.field div.input div.link {
3893 text-align: right;
3893 text-align: right;
3894 margin: 6px 0 0;
3894 margin: 6px 0 0;
3895 padding: 0;
3895 padding: 0;
3896 }
3896 }
3897
3897
3898 #content div.box div.pagination div.results,
3898 #content div.box div.pagination div.results,
3899 #content div.box div.pagination-wh div.results {
3899 #content div.box div.pagination-wh div.results {
3900 text-align: left;
3900 text-align: left;
3901 float: left;
3901 float: left;
3902 margin: 0;
3902 margin: 0;
3903 padding: 0;
3903 padding: 0;
3904 }
3904 }
3905
3905
3906 #content div.box div.pagination div.results span,
3906 #content div.box div.pagination div.results span,
3907 #content div.box div.pagination-wh div.results span {
3907 #content div.box div.pagination-wh div.results span {
3908 height: 1%;
3908 height: 1%;
3909 display: block;
3909 display: block;
3910 float: left;
3910 float: left;
3911 background: #ebebeb url("../images/pager.png") repeat-x;
3911 background: #ebebeb url("../images/pager.png") repeat-x;
3912 border-top: 1px solid #dedede;
3912 border-top: 1px solid #dedede;
3913 border-left: 1px solid #cfcfcf;
3913 border-left: 1px solid #cfcfcf;
3914 border-right: 1px solid #c4c4c4;
3914 border-right: 1px solid #c4c4c4;
3915 border-bottom: 1px solid #c4c4c4;
3915 border-bottom: 1px solid #c4c4c4;
3916 color: #4A4A4A;
3916 color: #4A4A4A;
3917 font-weight: 700;
3917 font-weight: 700;
3918 margin: 0;
3918 margin: 0;
3919 padding: 6px 8px;
3919 padding: 6px 8px;
3920 }
3920 }
3921
3921
3922 #content div.box div.pagination ul.pager li.disabled,
3922 #content div.box div.pagination ul.pager li.disabled,
3923 #content div.box div.pagination-wh a.disabled {
3923 #content div.box div.pagination-wh a.disabled {
3924 color: #B4B4B4;
3924 color: #B4B4B4;
3925 padding: 6px;
3925 padding: 6px;
3926 }
3926 }
3927
3927
3928 #login, #register {
3928 #login, #register {
3929 width: 520px;
3929 width: 520px;
3930 margin: 10% auto 0;
3930 margin: 10% auto 0;
3931 padding: 0;
3931 padding: 0;
3932 }
3932 }
3933
3933
3934 #login div.color,
3934 #login div.color,
3935 #register div.color {
3935 #register div.color {
3936 clear: both;
3936 clear: both;
3937 overflow: hidden;
3937 overflow: hidden;
3938 background: #FFF;
3938 background: #FFF;
3939 margin: 10px auto 0;
3939 margin: 10px auto 0;
3940 padding: 3px 3px 3px 0;
3940 padding: 3px 3px 3px 0;
3941 }
3941 }
3942
3942
3943 #login div.color a,
3943 #login div.color a,
3944 #register div.color a {
3944 #register div.color a {
3945 width: 20px;
3945 width: 20px;
3946 height: 20px;
3946 height: 20px;
3947 display: block;
3947 display: block;
3948 float: left;
3948 float: left;
3949 margin: 0 0 0 3px;
3949 margin: 0 0 0 3px;
3950 padding: 0;
3950 padding: 0;
3951 }
3951 }
3952
3952
3953 #login div.title h5,
3953 #login div.title h5,
3954 #register div.title h5 {
3954 #register div.title h5 {
3955 color: #fff;
3955 color: #fff;
3956 margin: 10px;
3956 margin: 10px;
3957 padding: 0;
3957 padding: 0;
3958 }
3958 }
3959
3959
3960 #login div.form div.fields div.field,
3960 #login div.form div.fields div.field,
3961 #register div.form div.fields div.field {
3961 #register div.form div.fields div.field {
3962 clear: both;
3962 clear: both;
3963 overflow: hidden;
3963 overflow: hidden;
3964 margin: 0;
3964 margin: 0;
3965 padding: 0 0 10px;
3965 padding: 0 0 10px;
3966 }
3966 }
3967
3967
3968 #login div.form div.fields div.field span.error-message,
3968 #login div.form div.fields div.field span.error-message,
3969 #register div.form div.fields div.field span.error-message {
3969 #register div.form div.fields div.field span.error-message {
3970 height: 1%;
3970 height: 1%;
3971 display: block;
3971 display: block;
3972 color: red;
3972 color: red;
3973 margin: 8px 0 0;
3973 margin: 8px 0 0;
3974 padding: 0;
3974 padding: 0;
3975 max-width: 320px;
3975 max-width: 320px;
3976 }
3976 }
3977
3977
3978 #login div.form div.fields div.field div.label label,
3978 #login div.form div.fields div.field div.label label,
3979 #register div.form div.fields div.field div.label label {
3979 #register div.form div.fields div.field div.label label {
3980 color: #000;
3980 color: #000;
3981 font-weight: 700;
3981 font-weight: 700;
3982 }
3982 }
3983
3983
3984 #login div.form div.fields div.field div.input,
3984 #login div.form div.fields div.field div.input,
3985 #register div.form div.fields div.field div.input {
3985 #register div.form div.fields div.field div.input {
3986 float: left;
3986 float: left;
3987 margin: 0;
3987 margin: 0;
3988 padding: 0;
3988 padding: 0;
3989 }
3989 }
3990
3990
3991 #login div.form div.fields div.field div.input input.large {
3991 #login div.form div.fields div.field div.input input.large {
3992 width: 250px;
3992 width: 250px;
3993 }
3993 }
3994
3994
3995 #login div.form div.fields div.field div.checkbox,
3995 #login div.form div.fields div.field div.checkbox,
3996 #register div.form div.fields div.field div.checkbox {
3996 #register div.form div.fields div.field div.checkbox {
3997 margin: 0 0 0 184px;
3997 margin: 0 0 0 184px;
3998 padding: 0;
3998 padding: 0;
3999 }
3999 }
4000
4000
4001 #login div.form div.fields div.field div.checkbox label,
4001 #login div.form div.fields div.field div.checkbox label,
4002 #register div.form div.fields div.field div.checkbox label {
4002 #register div.form div.fields div.field div.checkbox label {
4003 color: #565656;
4003 color: #565656;
4004 font-weight: 700;
4004 font-weight: 700;
4005 }
4005 }
4006
4006
4007 #login div.form div.fields div.buttons input,
4007 #login div.form div.fields div.buttons input,
4008 #register div.form div.fields div.buttons input {
4008 #register div.form div.fields div.buttons input {
4009 color: #000;
4009 color: #000;
4010 font-size: 1em;
4010 font-size: 1em;
4011 font-weight: 700;
4011 font-weight: 700;
4012 margin: 0;
4012 margin: 0;
4013 }
4013 }
4014
4014
4015 #changeset_content .container .wrapper,
4015 #changeset_content .container .wrapper,
4016 #graph_content .container .wrapper {
4016 #graph_content .container .wrapper {
4017 width: 600px;
4017 width: 600px;
4018 }
4018 }
4019
4019
4020 #changeset_content .container .date,
4020 #changeset_content .container .date,
4021 .ac .match {
4021 .ac .match {
4022 font-weight: 700;
4022 font-weight: 700;
4023 padding-top: 5px;
4023 padding-top: 5px;
4024 padding-bottom: 5px;
4024 padding-bottom: 5px;
4025 }
4025 }
4026
4026
4027 div#legend_container table td,
4027 div#legend_container table td,
4028 div#legend_choices table td {
4028 div#legend_choices table td {
4029 border: none !important;
4029 border: none !important;
4030 height: 20px !important;
4030 height: 20px !important;
4031 padding: 0 !important;
4031 padding: 0 !important;
4032 }
4032 }
4033
4033
4034 .q_filter_box {
4034 .q_filter_box {
4035 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4035 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4036 -webkit-border-radius: 4px;
4036 -webkit-border-radius: 4px;
4037 border-radius: 4px;
4037 border-radius: 4px;
4038 border: 0 none;
4038 border: 0 none;
4039 margin-bottom: -4px;
4039 margin-bottom: -4px;
4040 margin-top: -4px;
4040 margin-top: -4px;
4041 padding-left: 3px;
4041 padding-left: 3px;
4042 }
4042 }
4043
4043
4044 #node_filter {
4044 #node_filter {
4045 border: 0px solid #545454;
4045 border: 0px solid #545454;
4046 color: #AAAAAA;
4046 color: #AAAAAA;
4047 padding-left: 3px;
4047 padding-left: 3px;
4048 }
4048 }
4049
4049
4050
4050
4051 .group_members_wrap {
4051 .group_members_wrap {
4052 min-height: 85px;
4052 min-height: 85px;
4053 padding-left: 20px;
4053 padding-left: 20px;
4054 }
4054 }
4055
4055
4056 .group_members .group_member {
4056 .group_members .group_member {
4057 height: 30px;
4057 height: 30px;
4058 padding: 0px 0px 0px 0px;
4058 padding: 0px 0px 0px 0px;
4059 }
4059 }
4060
4060
4061 .reviewer_status {
4061 .reviewer_status {
4062 float: left;
4062 float: left;
4063 }
4063 }
4064
4064
4065 .reviewers_member {
4065 .reviewers_member {
4066 height: 15px;
4066 height: 15px;
4067 padding: 0px 0px 0px 10px;
4067 padding: 0px 0px 0px 10px;
4068 }
4068 }
4069
4069
4070 .emails_wrap {
4070 .emails_wrap {
4071 padding: 0px 20px;
4071 padding: 0px 20px;
4072 }
4072 }
4073
4073
4074 .emails_wrap .email_entry {
4074 .emails_wrap .email_entry {
4075 height: 30px;
4075 height: 30px;
4076 padding: 0px 0px 0px 10px;
4076 padding: 0px 0px 0px 10px;
4077 }
4077 }
4078 .emails_wrap .email_entry .email {
4078 .emails_wrap .email_entry .email {
4079 float: left
4079 float: left
4080 }
4080 }
4081 .emails_wrap .email_entry .email_action {
4081 .emails_wrap .email_entry .email_action {
4082 float: left
4082 float: left
4083 }
4083 }
4084
4084
4085 .ips_wrap {
4085 .ips_wrap {
4086 padding: 0px 20px;
4086 padding: 0px 20px;
4087 }
4087 }
4088
4088
4089 .ips_wrap .ip_entry {
4089 .ips_wrap .ip_entry {
4090 height: 30px;
4090 height: 30px;
4091 padding: 0px 0px 0px 10px;
4091 padding: 0px 0px 0px 10px;
4092 }
4092 }
4093 .ips_wrap .ip_entry .ip {
4093 .ips_wrap .ip_entry .ip {
4094 float: left
4094 float: left
4095 }
4095 }
4096 .ips_wrap .ip_entry .ip_action {
4096 .ips_wrap .ip_entry .ip_action {
4097 float: left
4097 float: left
4098 }
4098 }
4099
4099
4100
4100
4101 /*README STYLE*/
4101 /*README STYLE*/
4102
4102
4103 div.readme {
4103 div.readme {
4104 padding: 0px;
4104 padding: 0px;
4105 }
4105 }
4106
4106
4107 div.readme h2 {
4107 div.readme h2 {
4108 font-weight: normal;
4108 font-weight: normal;
4109 }
4109 }
4110
4110
4111 div.readme .readme_box {
4111 div.readme .readme_box {
4112 background-color: #fafafa;
4112 background-color: #fafafa;
4113 }
4113 }
4114
4114
4115 div.readme .readme_box {
4115 div.readme .readme_box {
4116 clear: both;
4116 clear: both;
4117 overflow: hidden;
4117 overflow: hidden;
4118 margin: 0;
4118 margin: 0;
4119 padding: 0 20px 10px;
4119 padding: 0 20px 10px;
4120 }
4120 }
4121
4121
4122 div.readme .readme_box h1,
4122 div.readme .readme_box h1,
4123 div.readme .readme_box h2,
4123 div.readme .readme_box h2,
4124 div.readme .readme_box h3,
4124 div.readme .readme_box h3,
4125 div.readme .readme_box h4,
4125 div.readme .readme_box h4,
4126 div.readme .readme_box h5,
4126 div.readme .readme_box h5,
4127 div.readme .readme_box h6 {
4127 div.readme .readme_box h6 {
4128 border-bottom: 0 !important;
4128 border-bottom: 0 !important;
4129 margin: 0 !important;
4129 margin: 0 !important;
4130 padding: 0 !important;
4130 padding: 0 !important;
4131 line-height: 1.5em !important;
4131 line-height: 1.5em !important;
4132 }
4132 }
4133
4133
4134
4134
4135 div.readme .readme_box h1:first-child {
4135 div.readme .readme_box h1:first-child {
4136 padding-top: .25em !important;
4136 padding-top: .25em !important;
4137 }
4137 }
4138
4138
4139 div.readme .readme_box h2,
4139 div.readme .readme_box h2,
4140 div.readme .readme_box h3 {
4140 div.readme .readme_box h3 {
4141 margin: 1em 0 !important;
4141 margin: 1em 0 !important;
4142 }
4142 }
4143
4143
4144 div.readme .readme_box h2 {
4144 div.readme .readme_box h2 {
4145 margin-top: 1.5em !important;
4145 margin-top: 1.5em !important;
4146 border-top: 4px solid #e0e0e0 !important;
4146 border-top: 4px solid #e0e0e0 !important;
4147 padding-top: .5em !important;
4147 padding-top: .5em !important;
4148 }
4148 }
4149
4149
4150 div.readme .readme_box p {
4150 div.readme .readme_box p {
4151 color: black !important;
4151 color: black !important;
4152 margin: 1em 0 !important;
4152 margin: 1em 0 !important;
4153 line-height: 1.5em !important;
4153 line-height: 1.5em !important;
4154 }
4154 }
4155
4155
4156 div.readme .readme_box ul {
4156 div.readme .readme_box ul {
4157 list-style: disc !important;
4157 list-style: disc !important;
4158 margin: 1em 0 1em 2em !important;
4158 margin: 1em 0 1em 2em !important;
4159 }
4159 }
4160
4160
4161 div.readme .readme_box ol {
4161 div.readme .readme_box ol {
4162 list-style: decimal;
4162 list-style: decimal;
4163 margin: 1em 0 1em 2em !important;
4163 margin: 1em 0 1em 2em !important;
4164 }
4164 }
4165
4165
4166 div.readme .readme_box code {
4166 div.readme .readme_box code {
4167 font-size: 12px !important;
4167 font-size: 12px !important;
4168 background-color: ghostWhite !important;
4168 background-color: ghostWhite !important;
4169 color: #444 !important;
4169 color: #444 !important;
4170 padding: 0 .2em !important;
4170 padding: 0 .2em !important;
4171 border: 1px solid #dedede !important;
4171 border: 1px solid #dedede !important;
4172 }
4172 }
4173
4173
4174 div.readme .readme_box pre code {
4174 div.readme .readme_box pre code {
4175 padding: 0 !important;
4175 padding: 0 !important;
4176 font-size: 12px !important;
4176 font-size: 12px !important;
4177 background-color: #eee !important;
4177 background-color: #eee !important;
4178 border: none !important;
4178 border: none !important;
4179 }
4179 }
4180
4180
4181 div.readme .readme_box pre {
4181 div.readme .readme_box pre {
4182 margin: 1em 0;
4182 margin: 1em 0;
4183 font-size: 12px;
4183 font-size: 12px;
4184 background-color: #eee;
4184 background-color: #eee;
4185 border: 1px solid #ddd;
4185 border: 1px solid #ddd;
4186 padding: 5px;
4186 padding: 5px;
4187 color: #444;
4187 color: #444;
4188 overflow: auto;
4188 overflow: auto;
4189 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4189 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4190 -webkit-border-radius: 3px;
4190 -webkit-border-radius: 3px;
4191 border-radius: 3px;
4191 border-radius: 3px;
4192 }
4192 }
4193
4193
4194 div.readme .readme_box table {
4194 div.readme .readme_box table {
4195 display: table;
4195 display: table;
4196 border-collapse: separate;
4196 border-collapse: separate;
4197 border-spacing: 2px;
4197 border-spacing: 2px;
4198 border-color: gray;
4198 border-color: gray;
4199 width: auto !important;
4199 width: auto !important;
4200 }
4200 }
4201
4201
4202
4202
4203 /** RST STYLE **/
4203 /** RST STYLE **/
4204
4204
4205
4205
4206 div.rst-block {
4206 div.rst-block {
4207 padding: 0px;
4207 padding: 0px;
4208 }
4208 }
4209
4209
4210 div.rst-block h2 {
4210 div.rst-block h2 {
4211 font-weight: normal;
4211 font-weight: normal;
4212 }
4212 }
4213
4213
4214 div.rst-block {
4214 div.rst-block {
4215 background-color: #fafafa;
4215 background-color: #fafafa;
4216 }
4216 }
4217
4217
4218 div.rst-block {
4218 div.rst-block {
4219 clear: both;
4219 clear: both;
4220 overflow: hidden;
4220 overflow: hidden;
4221 margin: 0;
4221 margin: 0;
4222 padding: 0 20px 10px;
4222 padding: 0 20px 10px;
4223 }
4223 }
4224
4224
4225 div.rst-block h1,
4225 div.rst-block h1,
4226 div.rst-block h2,
4226 div.rst-block h2,
4227 div.rst-block h3,
4227 div.rst-block h3,
4228 div.rst-block h4,
4228 div.rst-block h4,
4229 div.rst-block h5,
4229 div.rst-block h5,
4230 div.rst-block h6 {
4230 div.rst-block h6 {
4231 border-bottom: 0 !important;
4231 border-bottom: 0 !important;
4232 margin: 0 !important;
4232 margin: 0 !important;
4233 padding: 0 !important;
4233 padding: 0 !important;
4234 line-height: 1.5em !important;
4234 line-height: 1.5em !important;
4235 }
4235 }
4236
4236
4237
4237
4238 div.rst-block h1:first-child {
4238 div.rst-block h1:first-child {
4239 padding-top: .25em !important;
4239 padding-top: .25em !important;
4240 }
4240 }
4241
4241
4242 div.rst-block h2,
4242 div.rst-block h2,
4243 div.rst-block h3 {
4243 div.rst-block h3 {
4244 margin: 1em 0 !important;
4244 margin: 1em 0 !important;
4245 }
4245 }
4246
4246
4247 div.rst-block h2 {
4247 div.rst-block h2 {
4248 margin-top: 1.5em !important;
4248 margin-top: 1.5em !important;
4249 border-top: 4px solid #e0e0e0 !important;
4249 border-top: 4px solid #e0e0e0 !important;
4250 padding-top: .5em !important;
4250 padding-top: .5em !important;
4251 }
4251 }
4252
4252
4253 div.rst-block p {
4253 div.rst-block p {
4254 color: black !important;
4254 color: black !important;
4255 margin: 1em 0 !important;
4255 margin: 1em 0 !important;
4256 line-height: 1.5em !important;
4256 line-height: 1.5em !important;
4257 }
4257 }
4258
4258
4259 div.rst-block ul {
4259 div.rst-block ul {
4260 list-style: disc !important;
4260 list-style: disc !important;
4261 margin: 1em 0 1em 2em !important;
4261 margin: 1em 0 1em 2em !important;
4262 }
4262 }
4263
4263
4264 div.rst-block ol {
4264 div.rst-block ol {
4265 list-style: decimal;
4265 list-style: decimal;
4266 margin: 1em 0 1em 2em !important;
4266 margin: 1em 0 1em 2em !important;
4267 }
4267 }
4268
4268
4269 div.rst-block code {
4269 div.rst-block code {
4270 font-size: 12px !important;
4270 font-size: 12px !important;
4271 background-color: ghostWhite !important;
4271 background-color: ghostWhite !important;
4272 color: #444 !important;
4272 color: #444 !important;
4273 padding: 0 .2em !important;
4273 padding: 0 .2em !important;
4274 border: 1px solid #dedede !important;
4274 border: 1px solid #dedede !important;
4275 }
4275 }
4276
4276
4277 div.rst-block pre code {
4277 div.rst-block pre code {
4278 padding: 0 !important;
4278 padding: 0 !important;
4279 font-size: 12px !important;
4279 font-size: 12px !important;
4280 background-color: #eee !important;
4280 background-color: #eee !important;
4281 border: none !important;
4281 border: none !important;
4282 }
4282 }
4283
4283
4284 div.rst-block pre {
4284 div.rst-block pre {
4285 margin: 1em 0;
4285 margin: 1em 0;
4286 font-size: 12px;
4286 font-size: 12px;
4287 background-color: #eee;
4287 background-color: #eee;
4288 border: 1px solid #ddd;
4288 border: 1px solid #ddd;
4289 padding: 5px;
4289 padding: 5px;
4290 color: #444;
4290 color: #444;
4291 overflow: auto;
4291 overflow: auto;
4292 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4292 -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
4293 -webkit-border-radius: 3px;
4293 -webkit-border-radius: 3px;
4294 border-radius: 3px;
4294 border-radius: 3px;
4295 }
4295 }
4296
4296
4297
4297
4298 /** comment main **/
4298 /** comment main **/
4299 .comments {
4299 .comments {
4300 padding: 10px 20px;
4300 padding: 10px 20px;
4301 max-width: 978px;
4301 max-width: 978px;
4302 }
4302 }
4303
4303
4304 .comments .comment {
4304 .comments .comment {
4305 border: 1px solid #ddd;
4305 border: 1px solid #ddd;
4306 margin-top: 10px;
4306 margin-top: 10px;
4307 -webkit-border-radius: 4px;
4307 -webkit-border-radius: 4px;
4308 border-radius: 4px;
4308 border-radius: 4px;
4309 }
4309 }
4310
4310
4311 .comments .comment .meta {
4311 .comments .comment .meta {
4312 background: #f8f8f8;
4312 background: #f8f8f8;
4313 padding: 4px;
4313 padding: 4px;
4314 border-bottom: 1px solid #ddd;
4314 border-bottom: 1px solid #ddd;
4315 min-height: 18px;
4315 min-height: 18px;
4316 overflow: auto;
4316 overflow: auto;
4317 }
4317 }
4318
4318
4319 .comments .comment .meta img {
4319 .comments .comment .meta img {
4320 vertical-align: middle;
4320 vertical-align: middle;
4321 }
4321 }
4322
4322
4323 .comments .comment .meta .user {
4323 .comments .comment .meta .user {
4324 font-weight: bold;
4324 font-weight: bold;
4325 float: left;
4325 float: left;
4326 padding: 4px 2px 2px 2px;
4326 padding: 4px 2px 2px 2px;
4327 }
4327 }
4328
4328
4329 .comments .comment .meta .date {
4329 .comments .comment .meta .date {
4330 float: left;
4330 float: left;
4331 padding: 4px 4px 0px 4px;
4331 padding: 4px 4px 0px 4px;
4332 }
4332 }
4333
4333
4334 .comments .comment .text {
4334 .comments .comment .text {
4335 background-color: #FAFAFA;
4335 background-color: #FAFAFA;
4336 }
4336 }
4337 .comment .text div.rst-block p {
4337 .comment .text div.rst-block p {
4338 margin: 0.5em 0px !important;
4338 margin: 0.5em 0px !important;
4339 }
4339 }
4340
4340
4341 .comments .comments-number,
4341 .comments .comments-number,
4342 .pr-comments-number {
4342 .pr-comments-number {
4343 margin: 5px;
4343 margin: 5px;
4344 padding: 0px 0px 10px 0px;
4344 padding: 0px 0px 10px 0px;
4345 font-weight: bold;
4345 font-weight: bold;
4346 color: #666;
4346 color: #666;
4347 font-size: 16px;
4347 font-size: 16px;
4348 }
4348 }
4349
4349
4350 .automatic-comment {
4351 font-style: italic;
4352 }
4353
4350 /** comment form **/
4354 /** comment form **/
4351
4355
4352 .status-block {
4356 .status-block {
4353 margin: 5px;
4357 margin: 5px;
4354 clear: both
4358 clear: both
4355 }
4359 }
4356
4360
4357
4361
4358 div.comment-form {
4362 div.comment-form {
4359 margin-top: 20px;
4363 margin-top: 20px;
4360 }
4364 }
4361
4365
4362 .comment-form strong {
4366 .comment-form strong {
4363 display: block;
4367 display: block;
4364 margin-bottom: 15px;
4368 margin-bottom: 15px;
4365 }
4369 }
4366
4370
4367 .comment-form textarea {
4371 .comment-form textarea {
4368 width: 100%;
4372 width: 100%;
4369 height: 100px;
4373 height: 100px;
4370 font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
4374 font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
4371 }
4375 }
4372
4376
4373 form.comment-form {
4377 form.comment-form {
4374 margin-top: 10px;
4378 margin-top: 10px;
4375 margin-left: 10px;
4379 margin-left: 10px;
4376 }
4380 }
4377
4381
4378 .comment-inline-form .comment-block-ta,
4382 .comment-inline-form .comment-block-ta,
4379 .comment-form .comment-block-ta {
4383 .comment-form .comment-block-ta {
4380 border: 1px solid #ccc;
4384 border: 1px solid #ccc;
4381 border-radius: 3px;
4385 border-radius: 3px;
4382 box-sizing: border-box;
4386 box-sizing: border-box;
4383 }
4387 }
4384
4388
4385 .comment-form-submit {
4389 .comment-form-submit {
4386 margin-top: 5px;
4390 margin-top: 5px;
4387 margin-left: 525px;
4391 margin-left: 525px;
4388 }
4392 }
4389
4393
4390 .file-comments {
4394 .file-comments {
4391 display: none;
4395 display: none;
4392 }
4396 }
4393
4397
4394 .comment-form .comment {
4398 .comment-form .comment {
4395 margin-left: 10px;
4399 margin-left: 10px;
4396 }
4400 }
4397
4401
4398 .comment-form .comment-help {
4402 .comment-form .comment-help {
4399 padding: 5px 5px 5px 5px;
4403 padding: 5px 5px 5px 5px;
4400 color: #666;
4404 color: #666;
4401 }
4405 }
4402 .comment-form .comment-help .preview-btn,
4406 .comment-form .comment-help .preview-btn,
4403 .comment-form .comment-help .edit-btn {
4407 .comment-form .comment-help .edit-btn {
4404 float: right;
4408 float: right;
4405 margin: -6px 0px 0px 0px;
4409 margin: -6px 0px 0px 0px;
4406 }
4410 }
4407
4411
4408 .comment-form .preview-box.unloaded,
4412 .comment-form .preview-box.unloaded,
4409 .comment-inline-form .preview-box.unloaded {
4413 .comment-inline-form .preview-box.unloaded {
4410 height: 50px;
4414 height: 50px;
4411 text-align: center;
4415 text-align: center;
4412 padding: 20px;
4416 padding: 20px;
4413 background-color: #fafafa;
4417 background-color: #fafafa;
4414 }
4418 }
4415
4419
4416 .comment-form .comment-button {
4420 .comment-form .comment-button {
4417 padding-top: 5px;
4421 padding-top: 5px;
4418 }
4422 }
4419
4423
4420 .add-another-button {
4424 .add-another-button {
4421 margin-left: 10px;
4425 margin-left: 10px;
4422 margin-top: 10px;
4426 margin-top: 10px;
4423 margin-bottom: 10px;
4427 margin-bottom: 10px;
4424 }
4428 }
4425
4429
4426 .comment .buttons {
4430 .comment .buttons {
4427 float: right;
4431 float: right;
4428 margin: -1px 0px 0px 0px;
4432 margin: -1px 0px 0px 0px;
4429 }
4433 }
4430
4434
4431
4435
4432 .show-inline-comments {
4436 .show-inline-comments {
4433 position: relative;
4437 position: relative;
4434 top: 1px
4438 top: 1px
4435 }
4439 }
4436
4440
4437 /** comment inline form **/
4441 /** comment inline form **/
4438 .comment-inline-form {
4442 .comment-inline-form {
4439 margin: 4px;
4443 margin: 4px;
4440 max-width: 978px;
4444 max-width: 978px;
4441 }
4445 }
4442 .comment-inline-form .submitting-overlay {
4446 .comment-inline-form .submitting-overlay {
4443 display: none;
4447 display: none;
4444 height: 0;
4448 height: 0;
4445 text-align: center;
4449 text-align: center;
4446 font-size: 16px;
4450 font-size: 16px;
4447 opacity: 0.5;
4451 opacity: 0.5;
4448 }
4452 }
4449
4453
4450 .comment-inline-form .clearfix,
4454 .comment-inline-form .clearfix,
4451 .comment-form .clearfix {
4455 .comment-form .clearfix {
4452 background: #EEE;
4456 background: #EEE;
4453 -webkit-border-radius: 4px;
4457 -webkit-border-radius: 4px;
4454 border-radius: 4px;
4458 border-radius: 4px;
4455 padding: 5px;
4459 padding: 5px;
4456 margin: 0px;
4460 margin: 0px;
4457 }
4461 }
4458
4462
4459 div.comment-inline-form {
4463 div.comment-inline-form {
4460 padding: 4px 0px 6px 0px;
4464 padding: 4px 0px 6px 0px;
4461 }
4465 }
4462
4466
4463 .comment-inline-form strong {
4467 .comment-inline-form strong {
4464 display: block;
4468 display: block;
4465 margin-bottom: 15px;
4469 margin-bottom: 15px;
4466 }
4470 }
4467
4471
4468 .comment-inline-form textarea {
4472 .comment-inline-form textarea {
4469 width: 100%;
4473 width: 100%;
4470 height: 100px;
4474 height: 100px;
4471 font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
4475 font-family: Consolas, Monaco, Inconsolata, Liberation Mono, monospace;
4472 }
4476 }
4473
4477
4474 form.comment-inline-form {
4478 form.comment-inline-form {
4475 margin-top: 10px;
4479 margin-top: 10px;
4476 margin-left: 10px;
4480 margin-left: 10px;
4477 }
4481 }
4478
4482
4479 .comment-inline-form-submit {
4483 .comment-inline-form-submit {
4480 margin-top: 5px;
4484 margin-top: 5px;
4481 margin-left: 525px;
4485 margin-left: 525px;
4482 }
4486 }
4483
4487
4484 .file-comments {
4488 .file-comments {
4485 display: none;
4489 display: none;
4486 }
4490 }
4487
4491
4488 .comment-inline-form .comment {
4492 .comment-inline-form .comment {
4489 margin-left: 10px;
4493 margin-left: 10px;
4490 }
4494 }
4491
4495
4492 .comment-inline-form .comment-help {
4496 .comment-inline-form .comment-help {
4493 padding: 5px 5px 5px 5px;
4497 padding: 5px 5px 5px 5px;
4494 color: #666;
4498 color: #666;
4495 }
4499 }
4496
4500
4497 .comment-inline-form .comment-help .preview-btn,
4501 .comment-inline-form .comment-help .preview-btn,
4498 .comment-inline-form .comment-help .edit-btn {
4502 .comment-inline-form .comment-help .edit-btn {
4499 float: right;
4503 float: right;
4500 margin: -6px 0px 0px 0px;
4504 margin: -6px 0px 0px 0px;
4501 }
4505 }
4502
4506
4503 .comment-inline-form .comment-button {
4507 .comment-inline-form .comment-button {
4504 padding-top: 5px;
4508 padding-top: 5px;
4505 }
4509 }
4506
4510
4507 /** comment inline **/
4511 /** comment inline **/
4508 .inline-comments {
4512 .inline-comments {
4509 padding: 10px 20px;
4513 padding: 10px 20px;
4510 }
4514 }
4511
4515
4512 .inline-comments div.rst-block {
4516 .inline-comments div.rst-block {
4513 clear: both;
4517 clear: both;
4514 overflow: hidden;
4518 overflow: hidden;
4515 margin: 0;
4519 margin: 0;
4516 padding: 0 20px 0px;
4520 padding: 0 20px 0px;
4517 }
4521 }
4518 .inline-comments .comment {
4522 .inline-comments .comment {
4519 max-width: 978px;
4523 max-width: 978px;
4520 border: 1px solid #ddd;
4524 border: 1px solid #ddd;
4521 -webkit-border-radius: 4px;
4525 -webkit-border-radius: 4px;
4522 border-radius: 4px;
4526 border-radius: 4px;
4523 margin: 3px 3px 5px 5px;
4527 margin: 3px 3px 5px 5px;
4524 background-color: #FAFAFA;
4528 background-color: #FAFAFA;
4525 }
4529 }
4526 .inline-comments .add-comment {
4530 .inline-comments .add-comment {
4527 padding: 2px 4px 8px 5px;
4531 padding: 2px 4px 8px 5px;
4528 }
4532 }
4529
4533
4530 .inline-comments .comment-wrapp {
4534 .inline-comments .comment-wrapp {
4531 padding: 1px;
4535 padding: 1px;
4532 }
4536 }
4533 .inline-comments .comment .meta {
4537 .inline-comments .comment .meta {
4534 background: #f8f8f8;
4538 background: #f8f8f8;
4535 padding: 4px;
4539 padding: 4px;
4536 border-bottom: 1px solid #ddd;
4540 border-bottom: 1px solid #ddd;
4537 min-height: 20px;
4541 min-height: 20px;
4538 overflow: auto;
4542 overflow: auto;
4539 }
4543 }
4540
4544
4541 .inline-comments .comment .meta img {
4545 .inline-comments .comment .meta img {
4542 vertical-align: middle;
4546 vertical-align: middle;
4543 }
4547 }
4544
4548
4545 .inline-comments .comment .meta .user {
4549 .inline-comments .comment .meta .user {
4546 font-weight: bold;
4550 font-weight: bold;
4547 float: left;
4551 float: left;
4548 padding: 3px;
4552 padding: 3px;
4549 }
4553 }
4550
4554
4551 .inline-comments .comment .meta .date {
4555 .inline-comments .comment .meta .date {
4552 float: left;
4556 float: left;
4553 padding: 3px;
4557 padding: 3px;
4554 }
4558 }
4555
4559
4556 .inline-comments .comment .text {
4560 .inline-comments .comment .text {
4557 background-color: #FAFAFA;
4561 background-color: #FAFAFA;
4558 }
4562 }
4559
4563
4560 .inline-comments .comments-number {
4564 .inline-comments .comments-number {
4561 padding: 0px 0px 10px 0px;
4565 padding: 0px 0px 10px 0px;
4562 font-weight: bold;
4566 font-weight: bold;
4563 color: #666;
4567 color: #666;
4564 font-size: 16px;
4568 font-size: 16px;
4565 }
4569 }
4566 .inline-comments-button .add-comment {
4570 .inline-comments-button .add-comment {
4567 margin: 2px 0px 8px 5px !important
4571 margin: 2px 0px 8px 5px !important
4568 }
4572 }
4569
4573
4570 .notification-paginator {
4574 .notification-paginator {
4571 padding: 0px 0px 4px 16px;
4575 padding: 0px 0px 4px 16px;
4572 }
4576 }
4573
4577
4574 #context-pages .pull-request span,
4578 #context-pages .pull-request span,
4575 .menu_link_notifications {
4579 .menu_link_notifications {
4576 padding: 4px 4px !important;
4580 padding: 4px 4px !important;
4577 text-align: center;
4581 text-align: center;
4578 color: #888 !important;
4582 color: #888 !important;
4579 background-color: #DEDEDE !important;
4583 background-color: #DEDEDE !important;
4580 border-radius: 4px !important;
4584 border-radius: 4px !important;
4581 -webkit-border-radius: 4px !important;
4585 -webkit-border-radius: 4px !important;
4582 }
4586 }
4583
4587
4584 #context-pages .forks span,
4588 #context-pages .forks span,
4585 .menu_link_notifications {
4589 .menu_link_notifications {
4586 padding: 4px 4px !important;
4590 padding: 4px 4px !important;
4587 text-align: center;
4591 text-align: center;
4588 color: #888 !important;
4592 color: #888 !important;
4589 background-color: #DEDEDE !important;
4593 background-color: #DEDEDE !important;
4590 border-radius: 4px !important;
4594 border-radius: 4px !important;
4591 -webkit-border-radius: 4px !important;
4595 -webkit-border-radius: 4px !important;
4592 }
4596 }
4593
4597
4594
4598
4595 .notification-header {
4599 .notification-header {
4596 padding-top: 6px;
4600 padding-top: 6px;
4597 }
4601 }
4598 .notification-header .desc {
4602 .notification-header .desc {
4599 font-size: 16px;
4603 font-size: 16px;
4600 height: 24px;
4604 height: 24px;
4601 float: left
4605 float: left
4602 }
4606 }
4603 .notification-list .container.unread {
4607 .notification-list .container.unread {
4604 background: none repeat scroll 0 0 rgba(255, 255, 180, 0.6);
4608 background: none repeat scroll 0 0 rgba(255, 255, 180, 0.6);
4605 }
4609 }
4606 .notification-header .gravatar {
4610 .notification-header .gravatar {
4607 background: none repeat scroll 0 0 transparent;
4611 background: none repeat scroll 0 0 transparent;
4608 padding: 0px 0px 0px 8px;
4612 padding: 0px 0px 0px 8px;
4609 }
4613 }
4610 .notification-list .container .notification-header .desc {
4614 .notification-list .container .notification-header .desc {
4611 font-weight: bold;
4615 font-weight: bold;
4612 font-size: 17px;
4616 font-size: 17px;
4613 }
4617 }
4614 .notification-table {
4618 .notification-table {
4615 border: 1px solid #ccc;
4619 border: 1px solid #ccc;
4616 -webkit-border-radius: 6px 6px 6px 6px;
4620 -webkit-border-radius: 6px 6px 6px 6px;
4617 border-radius: 6px 6px 6px 6px;
4621 border-radius: 6px 6px 6px 6px;
4618 clear: both;
4622 clear: both;
4619 margin: 0px 20px 0px 20px;
4623 margin: 0px 20px 0px 20px;
4620 }
4624 }
4621 .notification-header .delete-notifications {
4625 .notification-header .delete-notifications {
4622 float: right;
4626 float: right;
4623 padding-top: 8px;
4627 padding-top: 8px;
4624 cursor: pointer;
4628 cursor: pointer;
4625 }
4629 }
4626 .notification-header .read-notifications {
4630 .notification-header .read-notifications {
4627 float: right;
4631 float: right;
4628 padding-top: 8px;
4632 padding-top: 8px;
4629 cursor: pointer;
4633 cursor: pointer;
4630 }
4634 }
4631 .notification-subject {
4635 .notification-subject {
4632 clear: both;
4636 clear: both;
4633 border-bottom: 1px solid #eee;
4637 border-bottom: 1px solid #eee;
4634 padding: 5px 0px 5px 38px;
4638 padding: 5px 0px 5px 38px;
4635 }
4639 }
4636
4640
4637 .notification-body {
4641 .notification-body {
4638 clear: both;
4642 clear: both;
4639 margin: 34px 2px 2px 8px
4643 margin: 34px 2px 2px 8px
4640 }
4644 }
4641
4645
4642 /****
4646 /****
4643 PULL REQUESTS
4647 PULL REQUESTS
4644 *****/
4648 *****/
4645 .pullrequests_section_head {
4649 .pullrequests_section_head {
4646 padding: 10px 10px 10px 0px;
4650 padding: 10px 10px 10px 0px;
4647 margin: 0 20px;
4651 margin: 0 20px;
4648 font-size: 16px;
4652 font-size: 16px;
4649 font-weight: bold;
4653 font-weight: bold;
4650 }
4654 }
4651
4655
4652 div.pr-details-title.closed {
4656 div.pr-details-title.closed {
4653 color: #555;
4657 color: #555;
4654 background: #eee;
4658 background: #eee;
4655 }
4659 }
4656
4660
4657 div.pr-details-title {
4661 div.pr-details-title {
4658 font-size: 1.6em;
4662 font-size: 1.6em;
4659 padding: 5px 0px 5px 10px;
4663 padding: 5px 0px 5px 10px;
4660 }
4664 }
4661
4665
4662 div.pr {
4666 div.pr {
4663 margin: 0px 20px;
4667 margin: 0px 20px;
4664 padding: 4px 4px;
4668 padding: 4px 4px;
4665 }
4669 }
4666 div.pr-desc {
4670 div.pr-desc {
4667 margin: 0px 20px;
4671 margin: 0px 20px;
4668 }
4672 }
4669 tr.pr-closed td {
4673 tr.pr-closed td {
4670 background-color: #eee !important;
4674 background-color: #eee !important;
4671 color: #555 !important;
4675 color: #555 !important;
4672 }
4676 }
4673
4677
4674 span.pr-closed-tag {
4678 span.pr-closed-tag {
4675 margin-bottom: 1px;
4679 margin-bottom: 1px;
4676 margin-right: 1px;
4680 margin-right: 1px;
4677 padding: 1px 3px;
4681 padding: 1px 3px;
4678 font-size: 10px;
4682 font-size: 10px;
4679 padding: 1px 3px 1px 3px;
4683 padding: 1px 3px 1px 3px;
4680 font-size: 10px;
4684 font-size: 10px;
4681 color: #577632;
4685 color: #577632;
4682 white-space: nowrap;
4686 white-space: nowrap;
4683 -webkit-border-radius: 4px;
4687 -webkit-border-radius: 4px;
4684 border-radius: 4px;
4688 border-radius: 4px;
4685 border: 1px solid #d9e8f8;
4689 border: 1px solid #d9e8f8;
4686 line-height: 1.5em;
4690 line-height: 1.5em;
4687 }
4691 }
4688
4692
4689 .pr-box {
4693 .pr-box {
4690 max-width: 978px;
4694 max-width: 978px;
4691 }
4695 }
4692
4696
4693 #s2id_org_ref,
4697 #s2id_org_ref,
4694 #s2id_other_ref,
4698 #s2id_other_ref,
4695 #s2id_org_repo,
4699 #s2id_org_repo,
4696 #s2id_other_repo {
4700 #s2id_other_repo {
4697 min-width: 150px;
4701 min-width: 150px;
4698 margin: 5px;
4702 margin: 5px;
4699 }
4703 }
4700
4704
4701 #pr-summary .msg-div {
4705 #pr-summary .msg-div {
4702 margin: 5px 0;
4706 margin: 5px 0;
4703 }
4707 }
4704
4708
4705 /****
4709 /****
4706 PERMS
4710 PERMS
4707 *****/
4711 *****/
4708 #perms .perms_section_head {
4712 #perms .perms_section_head {
4709 padding: 10px 10px 10px 0px;
4713 padding: 10px 10px 10px 0px;
4710 font-size: 16px;
4714 font-size: 16px;
4711 font-weight: bold;
4715 font-weight: bold;
4712 text-transform: capitalize;
4716 text-transform: capitalize;
4713 }
4717 }
4714
4718
4715 #perms .perm_tag {
4719 #perms .perm_tag {
4716 padding: 1px 3px 1px 3px;
4720 padding: 1px 3px 1px 3px;
4717 font-size: 10px;
4721 font-size: 10px;
4718 font-weight: bold;
4722 font-weight: bold;
4719 text-transform: uppercase;
4723 text-transform: uppercase;
4720 white-space: nowrap;
4724 white-space: nowrap;
4721 -webkit-border-radius: 3px;
4725 -webkit-border-radius: 3px;
4722 border-radius: 3px;
4726 border-radius: 3px;
4723 }
4727 }
4724
4728
4725 #perms .perm_tag.admin {
4729 #perms .perm_tag.admin {
4726 background-color: #B94A48;
4730 background-color: #B94A48;
4727 color: #ffffff;
4731 color: #ffffff;
4728 }
4732 }
4729
4733
4730 #perms .perm_tag.write {
4734 #perms .perm_tag.write {
4731 background-color: #DB7525;
4735 background-color: #DB7525;
4732 color: #ffffff;
4736 color: #ffffff;
4733 }
4737 }
4734
4738
4735 #perms .perm_tag.read {
4739 #perms .perm_tag.read {
4736 background-color: #468847;
4740 background-color: #468847;
4737 color: #ffffff;
4741 color: #ffffff;
4738 }
4742 }
4739
4743
4740 #perms .perm_tag.none {
4744 #perms .perm_tag.none {
4741 background-color: #bfbfbf;
4745 background-color: #bfbfbf;
4742 color: #ffffff;
4746 color: #ffffff;
4743 }
4747 }
4744
4748
4745 .perm-gravatar {
4749 .perm-gravatar {
4746 vertical-align: middle;
4750 vertical-align: middle;
4747 padding: 2px;
4751 padding: 2px;
4748 }
4752 }
4749 .perm-gravatar-ac {
4753 .perm-gravatar-ac {
4750 vertical-align: middle;
4754 vertical-align: middle;
4751 padding: 2px;
4755 padding: 2px;
4752 width: 14px;
4756 width: 14px;
4753 height: 14px;
4757 height: 14px;
4754 }
4758 }
4755
4759
4756 /*****************************************************************************
4760 /*****************************************************************************
4757 DIFFS CSS
4761 DIFFS CSS
4758 ******************************************************************************/
4762 ******************************************************************************/
4759 .diff-collapse {
4763 .diff-collapse {
4760 text-align: center;
4764 text-align: center;
4761 margin-bottom: -15px;
4765 margin-bottom: -15px;
4762 }
4766 }
4763 .diff-collapse-button {
4767 .diff-collapse-button {
4764 cursor: pointer;
4768 cursor: pointer;
4765 color: #666;
4769 color: #666;
4766 font-size: 16px;
4770 font-size: 16px;
4767 }
4771 }
4768 .diff-container {
4772 .diff-container {
4769
4773
4770 }
4774 }
4771
4775
4772 .diff-container.hidden {
4776 .diff-container.hidden {
4773 display: none;
4777 display: none;
4774 overflow: hidden;
4778 overflow: hidden;
4775 }
4779 }
4776
4780
4777
4781
4778 div.diffblock {
4782 div.diffblock {
4779 overflow: auto;
4783 overflow: auto;
4780 padding: 0px;
4784 padding: 0px;
4781 border: 1px solid #ccc;
4785 border: 1px solid #ccc;
4782 background: #f8f8f8;
4786 background: #f8f8f8;
4783 font-size: 100%;
4787 font-size: 100%;
4784 line-height: 100%;
4788 line-height: 100%;
4785 /* new */
4789 /* new */
4786 line-height: 125%;
4790 line-height: 125%;
4787 -webkit-border-radius: 6px 6px 0px 0px;
4791 -webkit-border-radius: 6px 6px 0px 0px;
4788 border-radius: 6px 6px 0px 0px;
4792 border-radius: 6px 6px 0px 0px;
4789 }
4793 }
4790 div.diffblock.margined {
4794 div.diffblock.margined {
4791 margin: 0px 20px 0px 20px;
4795 margin: 0px 20px 0px 20px;
4792 overflow: hidden;
4796 overflow: hidden;
4793 }
4797 }
4794 div.diffblock .code-header {
4798 div.diffblock .code-header {
4795 border-bottom: 1px solid #CCCCCC;
4799 border-bottom: 1px solid #CCCCCC;
4796 background: #EEEEEE;
4800 background: #EEEEEE;
4797 padding: 10px 0 10px 0;
4801 padding: 10px 0 10px 0;
4798 min-height: 14px;
4802 min-height: 14px;
4799 }
4803 }
4800
4804
4801 div.diffblock .code-header.banner {
4805 div.diffblock .code-header.banner {
4802 border-bottom: 1px solid #CCCCCC;
4806 border-bottom: 1px solid #CCCCCC;
4803 background: #EEEEEE;
4807 background: #EEEEEE;
4804 height: 14px;
4808 height: 14px;
4805 margin: 0;
4809 margin: 0;
4806 padding: 3px 100px 11px 100px;
4810 padding: 3px 100px 11px 100px;
4807 }
4811 }
4808
4812
4809 div.diffblock .code-header-title {
4813 div.diffblock .code-header-title {
4810 padding: 0px 0px 10px 5px !important;
4814 padding: 0px 0px 10px 5px !important;
4811 margin: 0 !important;
4815 margin: 0 !important;
4812 }
4816 }
4813 div.diffblock .code-header .hash {
4817 div.diffblock .code-header .hash {
4814 float: left;
4818 float: left;
4815 padding: 2px 0 0 2px;
4819 padding: 2px 0 0 2px;
4816 }
4820 }
4817 div.diffblock .code-header .date {
4821 div.diffblock .code-header .date {
4818 float: left;
4822 float: left;
4819 text-transform: uppercase;
4823 text-transform: uppercase;
4820 padding: 2px 0px 0px 2px;
4824 padding: 2px 0px 0px 2px;
4821 }
4825 }
4822 div.diffblock .code-header div {
4826 div.diffblock .code-header div {
4823 margin-left: 4px;
4827 margin-left: 4px;
4824 font-weight: bold;
4828 font-weight: bold;
4825 font-size: 14px;
4829 font-size: 14px;
4826 }
4830 }
4827
4831
4828 div.diffblock .parents {
4832 div.diffblock .parents {
4829 float: left;
4833 float: left;
4830 min-height: 26px;
4834 min-height: 26px;
4831 font-size: 10px;
4835 font-size: 10px;
4832 font-weight: 400;
4836 font-weight: 400;
4833 vertical-align: middle;
4837 vertical-align: middle;
4834 padding: 0px 2px 2px 2px;
4838 padding: 0px 2px 2px 2px;
4835 background-color: #eeeeee;
4839 background-color: #eeeeee;
4836 border-bottom: 1px solid #CCCCCC;
4840 border-bottom: 1px solid #CCCCCC;
4837 }
4841 }
4838
4842
4839 div.diffblock .children {
4843 div.diffblock .children {
4840 float: right;
4844 float: right;
4841 min-height: 26px;
4845 min-height: 26px;
4842 font-size: 10px;
4846 font-size: 10px;
4843 font-weight: 400;
4847 font-weight: 400;
4844 vertical-align: middle;
4848 vertical-align: middle;
4845 text-align: right;
4849 text-align: right;
4846 padding: 0px 2px 2px 2px;
4850 padding: 0px 2px 2px 2px;
4847 background-color: #eeeeee;
4851 background-color: #eeeeee;
4848 border-bottom: 1px solid #CCCCCC;
4852 border-bottom: 1px solid #CCCCCC;
4849 }
4853 }
4850
4854
4851 div.diffblock .code-body {
4855 div.diffblock .code-body {
4852 background: #FFFFFF;
4856 background: #FFFFFF;
4853 clear: both;
4857 clear: both;
4854 }
4858 }
4855 div.diffblock pre.raw {
4859 div.diffblock pre.raw {
4856 background: #FFFFFF;
4860 background: #FFFFFF;
4857 color: #000000;
4861 color: #000000;
4858 }
4862 }
4859 table.code-difftable {
4863 table.code-difftable {
4860 border-collapse: collapse;
4864 border-collapse: collapse;
4861 width: 99%;
4865 width: 99%;
4862 border-radius: 0px !important;
4866 border-radius: 0px !important;
4863 }
4867 }
4864 table.code-difftable td {
4868 table.code-difftable td {
4865 padding: 0 !important;
4869 padding: 0 !important;
4866 background: none !important;
4870 background: none !important;
4867 border: 0 !important;
4871 border: 0 !important;
4868 vertical-align: baseline !important
4872 vertical-align: baseline !important
4869 }
4873 }
4870 table.code-difftable .context {
4874 table.code-difftable .context {
4871 background: none repeat scroll 0 0 #DDE7EF;
4875 background: none repeat scroll 0 0 #DDE7EF;
4872 color: #999;
4876 color: #999;
4873 }
4877 }
4874 table.code-difftable .add {
4878 table.code-difftable .add {
4875 background: none repeat scroll 0 0 #DDFFDD;
4879 background: none repeat scroll 0 0 #DDFFDD;
4876 }
4880 }
4877 table.code-difftable .add ins {
4881 table.code-difftable .add ins {
4878 background: none repeat scroll 0 0 #AAFFAA;
4882 background: none repeat scroll 0 0 #AAFFAA;
4879 text-decoration: none;
4883 text-decoration: none;
4880 }
4884 }
4881 table.code-difftable .del {
4885 table.code-difftable .del {
4882 background: none repeat scroll 0 0 #FFDDDD;
4886 background: none repeat scroll 0 0 #FFDDDD;
4883 }
4887 }
4884 table.code-difftable .del del {
4888 table.code-difftable .del del {
4885 background: none repeat scroll 0 0 #FFAAAA;
4889 background: none repeat scroll 0 0 #FFAAAA;
4886 text-decoration: none;
4890 text-decoration: none;
4887 }
4891 }
4888
4892
4889 table.code-highlighttable div.code-highlight pre u:before,
4893 table.code-highlighttable div.code-highlight pre u:before,
4890 table.code-difftable td.code pre u:before {
4894 table.code-difftable td.code pre u:before {
4891 content: "\21a6";
4895 content: "\21a6";
4892 display: inline-block;
4896 display: inline-block;
4893 width: 0;
4897 width: 0;
4894 }
4898 }
4895 table.code-highlighttable div.code-highlight pre u.cr:before,
4899 table.code-highlighttable div.code-highlight pre u.cr:before,
4896 table.code-difftable td.code pre u.cr:before {
4900 table.code-difftable td.code pre u.cr:before {
4897 content: "\21a4";
4901 content: "\21a4";
4898 display: inline-block;
4902 display: inline-block;
4899 color: rgba(0,0,0,0.5);
4903 color: rgba(0,0,0,0.5);
4900 }
4904 }
4901 table.code-highlighttable div.code-highlight pre u,
4905 table.code-highlighttable div.code-highlight pre u,
4902 table.code-difftable td.code pre u {
4906 table.code-difftable td.code pre u {
4903 color: rgba(0,0,0,0.15);
4907 color: rgba(0,0,0,0.15);
4904 }
4908 }
4905 table.code-highlighttable div.code-highlight pre i,
4909 table.code-highlighttable div.code-highlight pre i,
4906 table.code-difftable td.code pre i {
4910 table.code-difftable td.code pre i {
4907 border-style: solid;
4911 border-style: solid;
4908 border-left-width: 1px;
4912 border-left-width: 1px;
4909 color: rgba(0,0,0,0.5);
4913 color: rgba(0,0,0,0.5);
4910 }
4914 }
4911
4915
4912 /** LINE NUMBERS **/
4916 /** LINE NUMBERS **/
4913 table.code-difftable .lineno {
4917 table.code-difftable .lineno {
4914 padding-left: 2px;
4918 padding-left: 2px;
4915 padding-right: 2px !important;
4919 padding-right: 2px !important;
4916 text-align: right;
4920 text-align: right;
4917 width: 30px;
4921 width: 30px;
4918 -moz-user-select: none;
4922 -moz-user-select: none;
4919 -webkit-user-select: none;
4923 -webkit-user-select: none;
4920 border-right: 1px solid #CCC !important;
4924 border-right: 1px solid #CCC !important;
4921 border-left: 0px solid #CCC !important;
4925 border-left: 0px solid #CCC !important;
4922 border-top: 0px solid #CCC !important;
4926 border-top: 0px solid #CCC !important;
4923 border-bottom: none !important;
4927 border-bottom: none !important;
4924 vertical-align: middle !important;
4928 vertical-align: middle !important;
4925 }
4929 }
4926 table.code-difftable .lineno.new {
4930 table.code-difftable .lineno.new {
4927 }
4931 }
4928 table.code-difftable .lineno.old {
4932 table.code-difftable .lineno.old {
4929 }
4933 }
4930 table.code-difftable .lineno a {
4934 table.code-difftable .lineno a {
4931 color: #aaa !important;
4935 color: #aaa !important;
4932 font: 11px Consolas, Monaco, Inconsolata, Liberation Mono, monospace !important;
4936 font: 11px Consolas, Monaco, Inconsolata, Liberation Mono, monospace !important;
4933 letter-spacing: -1px;
4937 letter-spacing: -1px;
4934 text-align: right;
4938 text-align: right;
4935 padding-right: 8px;
4939 padding-right: 8px;
4936 cursor: pointer;
4940 cursor: pointer;
4937 display: block;
4941 display: block;
4938 width: 30px;
4942 width: 30px;
4939 }
4943 }
4940
4944
4941 table.code-difftable .lineno-inline {
4945 table.code-difftable .lineno-inline {
4942 background: none repeat scroll 0 0 #FFF !important;
4946 background: none repeat scroll 0 0 #FFF !important;
4943 padding-left: 2px;
4947 padding-left: 2px;
4944 padding-right: 2px;
4948 padding-right: 2px;
4945 text-align: right;
4949 text-align: right;
4946 width: 30px;
4950 width: 30px;
4947 -moz-user-select: none;
4951 -moz-user-select: none;
4948 -webkit-user-select: none;
4952 -webkit-user-select: none;
4949 }
4953 }
4950
4954
4951 /** CODE **/
4955 /** CODE **/
4952 table.code-difftable .code {
4956 table.code-difftable .code {
4953 display: block;
4957 display: block;
4954 width: 100%;
4958 width: 100%;
4955 }
4959 }
4956 table.code-difftable .code td {
4960 table.code-difftable .code td {
4957 margin: 0;
4961 margin: 0;
4958 padding: 0;
4962 padding: 0;
4959 }
4963 }
4960 table.code-difftable .code pre {
4964 table.code-difftable .code pre {
4961 margin: 0 0 0 12px;
4965 margin: 0 0 0 12px;
4962 padding: 0;
4966 padding: 0;
4963 min-height: 17px;
4967 min-height: 17px;
4964 line-height: 17px;
4968 line-height: 17px;
4965 white-space: pre-wrap;
4969 white-space: pre-wrap;
4966 }
4970 }
4967
4971
4968 table.code-difftable .del .code pre:before {
4972 table.code-difftable .del .code pre:before {
4969 content: "-";
4973 content: "-";
4970 color: #550000;
4974 color: #550000;
4971 }
4975 }
4972
4976
4973 table.code-difftable .add .code pre:before {
4977 table.code-difftable .add .code pre:before {
4974 content: "+";
4978 content: "+";
4975 color: #005500;
4979 color: #005500;
4976 }
4980 }
4977
4981
4978 table.code-difftable .unmod .code pre:before {
4982 table.code-difftable .unmod .code pre:before {
4979 content: " ";
4983 content: " ";
4980 }
4984 }
4981
4985
4982 .add-bubble {
4986 .add-bubble {
4983 position: relative;
4987 position: relative;
4984 display: none;
4988 display: none;
4985 float: left;
4989 float: left;
4986 width: 0px;
4990 width: 0px;
4987 height: 0px;
4991 height: 0px;
4988 left: -8px;
4992 left: -8px;
4989 box-sizing: border-box;
4993 box-sizing: border-box;
4990 }
4994 }
4991
4995
4992 tr.line.add:hover td .add-bubble,
4996 tr.line.add:hover td .add-bubble,
4993 tr.line.del:hover td .add-bubble,
4997 tr.line.del:hover td .add-bubble,
4994 tr.line.unmod:hover td .add-bubble {
4998 tr.line.unmod:hover td .add-bubble {
4995 display: block;
4999 display: block;
4996 }
5000 }
4997
5001
4998 .add-bubble div {
5002 .add-bubble div {
4999 background: #577632;
5003 background: #577632;
5000 width: 16px;
5004 width: 16px;
5001 height: 16px;
5005 height: 16px;
5002 cursor: pointer;
5006 cursor: pointer;
5003 padding: 0 2px 2px 0.5px;
5007 padding: 0 2px 2px 0.5px;
5004 border: 1px solid #577632;
5008 border: 1px solid #577632;
5005 border-radius: 3px;
5009 border-radius: 3px;
5006 box-sizing: border-box;
5010 box-sizing: border-box;
5007 }
5011 }
5008
5012
5009 .add-bubble div:before {
5013 .add-bubble div:before {
5010 font-size: 14px;
5014 font-size: 14px;
5011 color: #ffffff;
5015 color: #ffffff;
5012 font-family: "kallithea";
5016 font-family: "kallithea";
5013 content: '\1f5ea';
5017 content: '\1f5ea';
5014 }
5018 }
5015
5019
5016 .add-bubble div:hover {
5020 .add-bubble div:hover {
5017 transform: scale(1.2, 1.2);
5021 transform: scale(1.2, 1.2);
5018 }
5022 }
5019
5023
5020 div.comment:target>.comment-wrapp {
5024 div.comment:target>.comment-wrapp {
5021 border: solid 2px #ee0 !important;
5025 border: solid 2px #ee0 !important;
5022 }
5026 }
5023
5027
5024 .lineno:target a {
5028 .lineno:target a {
5025 border: solid 2px #ee0 !important;
5029 border: solid 2px #ee0 !important;
5026 margin: -2px;
5030 margin: -2px;
5027 }
5031 }
5028
5032
5029 .btn-image-diff-show,
5033 .btn-image-diff-show,
5030 .btn-image-diff-swap {
5034 .btn-image-diff-swap {
5031 margin: 5px;
5035 margin: 5px;
5032 }
5036 }
5033
5037
5034 .img-diff {
5038 .img-diff {
5035 max-width: 45%;
5039 max-width: 45%;
5036 height: auto;
5040 height: auto;
5037 margin: 5px;
5041 margin: 5px;
5038 /* http://lea.verou.me/demos/css3-patterns.html */
5042 /* http://lea.verou.me/demos/css3-patterns.html */
5039 background-image:
5043 background-image:
5040 linear-gradient(45deg, #888 25%, transparent 25%, transparent),
5044 linear-gradient(45deg, #888 25%, transparent 25%, transparent),
5041 linear-gradient(-45deg, #888 25%, transparent 25%, transparent),
5045 linear-gradient(-45deg, #888 25%, transparent 25%, transparent),
5042 linear-gradient(45deg, transparent 75%, #888 75%),
5046 linear-gradient(45deg, transparent 75%, #888 75%),
5043 linear-gradient(-45deg, transparent 75%, #888 75%);
5047 linear-gradient(-45deg, transparent 75%, #888 75%);
5044 background-size: 10px 10px;
5048 background-size: 10px 10px;
5045 background-color: #999;
5049 background-color: #999;
5046 }
5050 }
5047
5051
5048 .img-preview {
5052 .img-preview {
5049 max-width: 100%;
5053 max-width: 100%;
5050 height: auto;
5054 height: auto;
5051 margin: 5px;
5055 margin: 5px;
5052 }
5056 }
5053
5057
5054 div.prev-next-comment div.prev-comment,
5058 div.prev-next-comment div.prev-comment,
5055 div.prev-next-comment div.next-comment {
5059 div.prev-next-comment div.next-comment {
5056 display: inline-block;
5060 display: inline-block;
5057 min-width: 150px;
5061 min-width: 150px;
5058 margin: 3px 6px;
5062 margin: 3px 6px;
5059 }
5063 }
5060
5064
5061 #help_kb {
5065 #help_kb {
5062 display: none;
5066 display: none;
5063 }
5067 }
5064
5068
5065 .icon-only-links i {
5069 .icon-only-links i {
5066 color: white;
5070 color: white;
5067 }
5071 }
@@ -1,263 +1,269 b''
1 ## -*- coding: utf-8 -*-
1 ## -*- coding: utf-8 -*-
2 ## usage:
2 ## usage:
3 ## <%namespace name="comment" file="/changeset/changeset_file_comment.html"/>
3 ## <%namespace name="comment" file="/changeset/changeset_file_comment.html"/>
4 ## ${comment.comment_block(co)}
4 ## ${comment.comment_block(co)}
5 ##
5 ##
6 <%def name="comment_block(co)">
6 <%def name="comment_block(co)">
7 <div class="comment" id="comment-${co.comment_id}" line="${co.line_no}">
7 <div class="comment" id="comment-${co.comment_id}" line="${co.line_no}">
8 <div class="comment-wrapp">
8 <div class="comment-wrapp">
9 <div class="meta">
9 <div class="meta">
10 <div style="float:left">
10 <div style="float:left">
11 ${h.gravatar(co.author.email, size=20)}
11 ${h.gravatar(co.author.email, size=20)}
12 </div>
12 </div>
13 <div class="user">
13 <div class="user">
14 ${co.author.username_and_name}
14 ${co.author.username_and_name}
15 </div>
15 </div>
16 <div class="date">
16 <div class="date">
17 ${h.age(co.modified_at)}
17 ${h.age(co.modified_at)}
18 </div>
18 </div>
19
19
20 <div style="float:left;padding:4px 0px 0px 5px">
20 <div style="float:left;padding:4px 0px 0px 5px">
21 <span class="">
21 <span class="">
22 %if co.pull_request:
22 %if co.pull_request:
23 %if co.status_change:
23 %if co.status_change:
24 ${_('Status change from pull request')}
24 ${_('Status change from pull request')}
25 <a href="${co.pull_request.url()}">"${co.pull_request.title or _("No title")}"</a>:
25 <a href="${co.pull_request.url()}">"${co.pull_request.title or _("No title")}"</a>:
26 %else:
26 %else:
27 ${_('Comment from pull request')}
27 ${_('Comment from pull request')}
28 <a href="${co.pull_request.url()}">"${co.pull_request.title or _("No title")}"</a>
28 <a href="${co.pull_request.url()}">"${co.pull_request.title or _("No title")}"</a>
29 %endif
29 %endif
30 %else:
30 %else:
31 %if co.status_change:
31 %if co.status_change:
32 ${_('Status change on changeset')}:
32 ${_('Status change on changeset')}:
33 %else:
33 %else:
34 ${_('Comment on changeset')}
34 ${_('Comment on changeset')}
35 %endif
35 %endif
36 %endif
36 %endif
37 </span>
37 </span>
38 </div>
38 </div>
39
39
40 %if co.status_change:
40 %if co.status_change:
41 <div style="float:left" class="changeset-status-container">
41 <div style="float:left" class="changeset-status-container">
42 <div style="float:left;padding:10px 2px 0px 2px"></div>
42 <div style="float:left;padding:10px 2px 0px 2px"></div>
43 <div title="${_('Changeset status')}" class="changeset-status-lbl"> ${co.status_change[0].status_lbl}</div>
43 <div title="${_('Changeset status')}" class="changeset-status-lbl"> ${co.status_change[0].status_lbl}</div>
44 <div class="changeset-status-ico"><i class="icon-circle changeset-status-${co.status_change[0].status}"></i></div>
44 <div class="changeset-status-ico"><i class="icon-circle changeset-status-${co.status_change[0].status}"></i></div>
45 </div>
45 </div>
46 %endif
46 %endif
47
47
48 <a class="permalink" href="#comment-${co.comment_id}">&para;</a>
48 <a class="permalink" href="#comment-${co.comment_id}">&para;</a>
49 %if h.HasPermissionAny('hg.admin')() or h.HasRepoPermissionAny('repository.admin')(c.repo_name) or co.author.user_id == c.authuser.user_id:
49 %if h.HasPermissionAny('hg.admin')() or h.HasRepoPermissionAny('repository.admin')(c.repo_name) or co.author.user_id == c.authuser.user_id:
50 <div onClick="confirm('${_("Delete comment?")}') && deleteComment(${co.comment_id})" class="buttons delete-comment btn btn-mini">${_('Delete')}</div>
50 <div onClick="confirm('${_("Delete comment?")}') && deleteComment(${co.comment_id})" class="buttons delete-comment btn btn-mini">${_('Delete')}</div>
51 %endif
51 %endif
52 </div>
52 </div>
53 <div class="text">
53 <div class="text">
54 %if co.text:
54 ${h.rst_w_mentions(co.text)|n}
55 ${h.rst_w_mentions(co.text)|n}
56 %else:
57 <div class="rst-block automatic-comment">
58 <p>${_('No comments.')}</p>
59 </div>
60 %endif
55 </div>
61 </div>
56 </div>
62 </div>
57 </div>
63 </div>
58 </%def>
64 </%def>
59
65
60
66
61 <%def name="comment_inline_form()">
67 <%def name="comment_inline_form()">
62 <div id='comment-inline-form-template' style="display:none">
68 <div id='comment-inline-form-template' style="display:none">
63 <div class="comment-inline-form ac">
69 <div class="comment-inline-form ac">
64 %if c.authuser.username != 'default':
70 %if c.authuser.username != 'default':
65 ${h.form('#', class_='inline-form')}
71 ${h.form('#', class_='inline-form')}
66 <div id="edit-container_{1}" class="clearfix">
72 <div id="edit-container_{1}" class="clearfix">
67 <div class="comment-help">${_('Commenting on line {1}.')}
73 <div class="comment-help">${_('Commenting on line {1}.')}
68 ${(_('Comments parsed using %s syntax with %s support.') % (
74 ${(_('Comments parsed using %s syntax with %s support.') % (
69 ('<a href="%s">RST</a>' % h.url('rst_help')),
75 ('<a href="%s">RST</a>' % h.url('rst_help')),
70 ('<span style="color:#577632" class="tooltip" title="%s">@mention</span>' % _('Use @username inside this text to notify another user'))
76 ('<span style="color:#577632" class="tooltip" title="%s">@mention</span>' % _('Use @username inside this text to notify another user'))
71 )
77 )
72 )|n
78 )|n
73 }
79 }
74 </div>
80 </div>
75 <div class="mentions-container" id="mentions_container_{1}"></div>
81 <div class="mentions-container" id="mentions_container_{1}"></div>
76 <textarea id="text_{1}" name="text" class="comment-block-ta yui-ac-input"></textarea>
82 <textarea id="text_{1}" name="text" class="comment-block-ta yui-ac-input"></textarea>
77 </div>
83 </div>
78 <div id="preview-container_{1}" class="clearfix" style="display:none">
84 <div id="preview-container_{1}" class="clearfix" style="display:none">
79 <div class="comment-help">
85 <div class="comment-help">
80 ${_('Comment preview')}
86 ${_('Comment preview')}
81 </div>
87 </div>
82 <div id="preview-box_{1}" class="preview-box"></div>
88 <div id="preview-box_{1}" class="preview-box"></div>
83 </div>
89 </div>
84 <div class="comment-button">
90 <div class="comment-button">
85 <div class="submitting-overlay">${_('Submitting ...')}</div>
91 <div class="submitting-overlay">${_('Submitting ...')}</div>
86 <input type="hidden" name="f_path" value="{0}">
92 <input type="hidden" name="f_path" value="{0}">
87 <input type="hidden" name="line" value="{1}">
93 <input type="hidden" name="line" value="{1}">
88 ${h.submit('save', _('Comment'), class_='btn btn-small save-inline-form')}
94 ${h.submit('save', _('Comment'), class_='btn btn-small save-inline-form')}
89 ${h.reset('hide-inline-form', _('Cancel'), class_='btn btn-small hide-inline-form')}
95 ${h.reset('hide-inline-form', _('Cancel'), class_='btn btn-small hide-inline-form')}
90 <div id="preview-btn_{1}" class="preview-btn btn btn-small">${_('Preview')}</div>
96 <div id="preview-btn_{1}" class="preview-btn btn btn-small">${_('Preview')}</div>
91 <div id="edit-btn_{1}" class="edit-btn btn btn-small" style="display:none">${_('Edit')}</div>
97 <div id="edit-btn_{1}" class="edit-btn btn btn-small" style="display:none">${_('Edit')}</div>
92 </div>
98 </div>
93 ${h.end_form()}
99 ${h.end_form()}
94 %else:
100 %else:
95 ${h.form('')}
101 ${h.form('')}
96 <div class="clearfix">
102 <div class="clearfix">
97 <div class="comment-help">
103 <div class="comment-help">
98 ${_('You need to be logged in to comment.')} <a href="${h.url('login_home',came_from=h.url.current())}">${_('Login now')}</a>
104 ${_('You need to be logged in to comment.')} <a href="${h.url('login_home',came_from=h.url.current())}">${_('Login now')}</a>
99 </div>
105 </div>
100 </div>
106 </div>
101 <div class="comment-button">
107 <div class="comment-button">
102 ${h.reset('hide-inline-form', _('Hide'), class_='btn btn-small hide-inline-form')}
108 ${h.reset('hide-inline-form', _('Hide'), class_='btn btn-small hide-inline-form')}
103 </div>
109 </div>
104 ${h.end_form()}
110 ${h.end_form()}
105 %endif
111 %endif
106 </div>
112 </div>
107 </div>
113 </div>
108 </%def>
114 </%def>
109
115
110
116
111 ## show comment count as "x comments (y inline, z general)"
117 ## show comment count as "x comments (y inline, z general)"
112 <%def name="comment_count(inline_cnt, general_cnt)">
118 <%def name="comment_count(inline_cnt, general_cnt)">
113 ${'%s (%s, %s)' % (
119 ${'%s (%s, %s)' % (
114 ungettext("%d comment", "%d comments", inline_cnt + general_cnt) % (inline_cnt + general_cnt),
120 ungettext("%d comment", "%d comments", inline_cnt + general_cnt) % (inline_cnt + general_cnt),
115 ungettext("%d inline", "%d inline", inline_cnt) % inline_cnt,
121 ungettext("%d inline", "%d inline", inline_cnt) % inline_cnt,
116 ungettext("%d general", "%d general", general_cnt) % general_cnt
122 ungettext("%d general", "%d general", general_cnt) % general_cnt
117 )}
123 )}
118 <span class="firstlink"></span>
124 <span class="firstlink"></span>
119 </%def>
125 </%def>
120
126
121 ## generates inlines taken from c.comments var
127 ## generates inlines taken from c.comments var
122 <%def name="inlines()">
128 <%def name="inlines()">
123 <div class="comments-number">
129 <div class="comments-number">
124 ${comment_count(c.inline_cnt, len(c.comments))}
130 ${comment_count(c.inline_cnt, len(c.comments))}
125 </div>
131 </div>
126 %for path, lines in c.inline_comments:
132 %for path, lines in c.inline_comments:
127 % for line,comments in lines.iteritems():
133 % for line,comments in lines.iteritems():
128 <div style="display:none" class="inline-comment-placeholder" path="${path}" target_id="${h.safeid(h.safe_unicode(path))}">
134 <div style="display:none" class="inline-comment-placeholder" path="${path}" target_id="${h.safeid(h.safe_unicode(path))}">
129 %for co in comments:
135 %for co in comments:
130 ${comment_block(co)}
136 ${comment_block(co)}
131 %endfor
137 %endfor
132 </div>
138 </div>
133 %endfor
139 %endfor
134 %endfor
140 %endfor
135
141
136 </%def>
142 </%def>
137
143
138 ## generate inline comments and the main ones
144 ## generate inline comments and the main ones
139 <%def name="generate_comments()">
145 <%def name="generate_comments()">
140 <div class="comments">
146 <div class="comments">
141 <div id="inline-comments-container">
147 <div id="inline-comments-container">
142 ## generate inlines for this changeset
148 ## generate inlines for this changeset
143 ${inlines()}
149 ${inlines()}
144 </div>
150 </div>
145
151
146 %for co in c.comments:
152 %for co in c.comments:
147 <div id="comment-tr-${co.comment_id}">
153 <div id="comment-tr-${co.comment_id}">
148 ${comment_block(co)}
154 ${comment_block(co)}
149 </div>
155 </div>
150 %endfor
156 %endfor
151 </div>
157 </div>
152 </%def>
158 </%def>
153
159
154 ## MAIN COMMENT FORM
160 ## MAIN COMMENT FORM
155 <%def name="comments(post_url, cur_status, is_pr=False, change_status=True)">
161 <%def name="comments(post_url, cur_status, is_pr=False, change_status=True)">
156
162
157 <div class="comments">
163 <div class="comments">
158 %if c.authuser.username != 'default':
164 %if c.authuser.username != 'default':
159 <div class="comment-form ac">
165 <div class="comment-form ac">
160 ${h.form(post_url, id="main_form")}
166 ${h.form(post_url, id="main_form")}
161 <div id="edit-container" class="clearfix">
167 <div id="edit-container" class="clearfix">
162 <div class="comment-help">
168 <div class="comment-help">
163 ${(_('Comments parsed using %s syntax with %s support.') % (('<a href="%s">RST</a>' % h.url('rst_help')),
169 ${(_('Comments parsed using %s syntax with %s support.') % (('<a href="%s">RST</a>' % h.url('rst_help')),
164 '<span style="color:#577632" class="tooltip" title="%s">@mention</span>' %
170 '<span style="color:#577632" class="tooltip" title="%s">@mention</span>' %
165 _('Use @username inside this text to notify another user.')))|n}
171 _('Use @username inside this text to notify another user.')))|n}
166 </div>
172 </div>
167 <div class="mentions-container" id="mentions_container"></div>
173 <div class="mentions-container" id="mentions_container"></div>
168 ${h.textarea('text', class_="comment-block-ta")}
174 ${h.textarea('text', class_="comment-block-ta")}
169 %if change_status:
175 %if change_status:
170 <div id="status_block_container" class="status-block">
176 <div id="status_block_container" class="status-block">
171 %if is_pr:
177 %if is_pr:
172 ${_('Vote for pull request status')}:
178 ${_('Vote for pull request status')}:
173 %else:
179 %else:
174 ${_('Set changeset status')}:
180 ${_('Set changeset status')}:
175 %endif
181 %endif
176 <input type="radio" class="status_change_radio" name="changeset_status" id="changeset_status_unchanged" value="" checked="checked" />
182 <input type="radio" class="status_change_radio" name="changeset_status" id="changeset_status_unchanged" value="" checked="checked" />
177 <label for="changeset_status_unchanged">
183 <label for="changeset_status_unchanged">
178 ${_('No change')}
184 ${_('No change')}
179 </label>
185 </label>
180 %for status,lbl in c.changeset_statuses:
186 %for status,lbl in c.changeset_statuses:
181 <span style="margin-left: 15px;">
187 <span style="margin-left: 15px;">
182 <input type="radio" class="status_change_radio" name="changeset_status" id="${status}" value="${status}">
188 <input type="radio" class="status_change_radio" name="changeset_status" id="${status}" value="${status}">
183 <label for="${status}"><i class="icon-circle changeset-status-${status}" /></i>${lbl}</label>
189 <label for="${status}"><i class="icon-circle changeset-status-${status}" /></i>${lbl}</label>
184 </span>
190 </span>
185 %endfor
191 %endfor
186
192
187 %if is_pr and ( \
193 %if is_pr and ( \
188 h.HasPermissionAny('hg.admin')() or h.HasRepoPermissionAny('repository.admin')(c.repo_name) \
194 h.HasPermissionAny('hg.admin')() or h.HasRepoPermissionAny('repository.admin')(c.repo_name) \
189 or c.pull_request.author.user_id == c.authuser.user_id):
195 or c.pull_request.author.user_id == c.authuser.user_id):
190 <input id="save_close" type="checkbox" name="save_close">
196 <input id="save_close" type="checkbox" name="save_close">
191 <label id="save_close_label" for="save_close">${_("Close")}</label>
197 <label id="save_close_label" for="save_close">${_("Close")}</label>
192 %endif
198 %endif
193 </div>
199 </div>
194 %endif
200 %endif
195 </div>
201 </div>
196
202
197 <div id="preview-container" class="clearfix" style="display:none">
203 <div id="preview-container" class="clearfix" style="display:none">
198 <div class="comment-help">
204 <div class="comment-help">
199 ${_('Comment preview')}
205 ${_('Comment preview')}
200 </div>
206 </div>
201 <div id="preview-box" class="preview-box"></div>
207 <div id="preview-box" class="preview-box"></div>
202 </div>
208 </div>
203
209
204 <div class="comment-button">
210 <div class="comment-button">
205 ${h.submit('save', _('Comment'), class_="btn")}
211 ${h.submit('save', _('Comment'), class_="btn")}
206 <div id="preview-btn" class="preview-btn btn">${_('Preview')}</div>
212 <div id="preview-btn" class="preview-btn btn">${_('Preview')}</div>
207 <div id="edit-btn" class="edit-btn btn" style="display:none">${_('Edit')}</div>
213 <div id="edit-btn" class="edit-btn btn" style="display:none">${_('Edit')}</div>
208 </div>
214 </div>
209 ${h.end_form()}
215 ${h.end_form()}
210 </div>
216 </div>
211 %endif
217 %endif
212 </div>
218 </div>
213
219
214 <script>
220 <script>
215
221
216 $(document).ready(function () {
222 $(document).ready(function () {
217 MentionsAutoComplete('text', 'mentions_container', _USERS_AC_DATA, _GROUPS_AC_DATA);
223 MentionsAutoComplete('text', 'mentions_container', _USERS_AC_DATA, _GROUPS_AC_DATA);
218
224
219 $(window).on('beforeunload', function(){
225 $(window).on('beforeunload', function(){
220 if($('.form-open').size() || $('textarea#text').val()){
226 if($('.form-open').size() || $('textarea#text').val()){
221 // this message will not be displayed on all browsers
227 // this message will not be displayed on all browsers
222 // (e.g. some versions of Firefox), but the user will still be warned
228 // (e.g. some versions of Firefox), but the user will still be warned
223 return 'There are uncommitted comments.';
229 return 'There are uncommitted comments.';
224 }
230 }
225 });
231 });
226
232
227 $('form#main_form').submit(function(){
233 $('form#main_form').submit(function(){
228 // if no open inline forms, disable the beforeunload check - it would
234 // if no open inline forms, disable the beforeunload check - it would
229 // fail in the check for the textarea we are about to submit
235 // fail in the check for the textarea we are about to submit
230 if(!$('.form-open').size()){
236 if(!$('.form-open').size()){
231 $(window).off('beforeunload');
237 $(window).off('beforeunload');
232 }
238 }
233 });
239 });
234
240
235 $('#preview-btn').click(function(){
241 $('#preview-btn').click(function(){
236 var _text = $('#text').val();
242 var _text = $('#text').val();
237 if(!_text){
243 if(!_text){
238 return;
244 return;
239 }
245 }
240 var post_data = {'text': _text};
246 var post_data = {'text': _text};
241 $('#preview-box').addClass('unloaded');
247 $('#preview-box').addClass('unloaded');
242 $('#preivew-box').html(_TM['Loading ...']);
248 $('#preivew-box').html(_TM['Loading ...']);
243 $('#edit-container').hide();
249 $('#edit-container').hide();
244 $('#edit-btn').show();
250 $('#edit-btn').show();
245 $('#preview-container').show();
251 $('#preview-container').show();
246 $('#preview-btn').hide();
252 $('#preview-btn').hide();
247
253
248 var url = pyroutes.url('changeset_comment_preview', {'repo_name': '${c.repo_name}'});
254 var url = pyroutes.url('changeset_comment_preview', {'repo_name': '${c.repo_name}'});
249 ajaxPOST(url,post_data,function(html){
255 ajaxPOST(url,post_data,function(html){
250 $('#preview-box').html(html);
256 $('#preview-box').html(html);
251 $('#preview-box').removeClass('unloaded');
257 $('#preview-box').removeClass('unloaded');
252 });
258 });
253 });
259 });
254 $('#edit-btn').click(function(){
260 $('#edit-btn').click(function(){
255 $('#edit-container').show();
261 $('#edit-container').show();
256 $('#edit-btn').hide();
262 $('#edit-btn').hide();
257 $('#preview-container').hide();
263 $('#preview-container').hide();
258 $('#preview-btn').show();
264 $('#preview-btn').show();
259 });
265 });
260
266
261 });
267 });
262 </script>
268 </script>
263 </%def>
269 </%def>
General Comments 0
You need to be logged in to leave comments. Login now