##// END OF EJS Templates
implemented rawdiff and diff download into diff view....
marcink -
r160:0f7f93df default
parent child Browse files
Show More
@@ -1,104 +1,117 b''
1 import logging
1 import logging
2
2
3 from pylons import request, response, session, tmpl_context as c, url, config, app_globals as g
3 from pylons import request, response, session, tmpl_context as c, url, config, app_globals as g
4 from pylons.controllers.util import abort, redirect
4 from pylons.controllers.util import abort, redirect
5
5
6 from pylons_app.lib.base import BaseController, render
6 from pylons_app.lib.base import BaseController, render
7 from pylons_app.lib.utils import get_repo_slug
7 from pylons_app.lib.utils import get_repo_slug
8 from pylons_app.model.hg_model import HgModel
8 from pylons_app.model.hg_model import HgModel
9 from vcs.utils import diffs as differ
9 from vcs.utils import diffs as differ
10 from vcs.exceptions import RepositoryError, ChangesetError
10 from vcs.exceptions import RepositoryError, ChangesetError
11
11
12 log = logging.getLogger(__name__)
12 log = logging.getLogger(__name__)
13
13
14 class FilesController(BaseController):
14 class FilesController(BaseController):
15 def __before__(self):
15 def __before__(self):
16 c.repos_prefix = config['repos_name']
16 c.repos_prefix = config['repos_name']
17 c.repo_name = get_repo_slug(request)
17 c.repo_name = get_repo_slug(request)
18
18
19 def index(self, repo_name, revision, f_path):
19 def index(self, repo_name, revision, f_path):
20 hg_model = HgModel()
20 hg_model = HgModel()
21 c.repo = repo = hg_model.get_repo(c.repo_name)
21 c.repo = repo = hg_model.get_repo(c.repo_name)
22 revision = request.POST.get('at_rev', None) or revision
22 revision = request.POST.get('at_rev', None) or revision
23
23
24 def get_next_rev(cur):
24 def get_next_rev(cur):
25 max_rev = len(c.repo.revisions) - 1
25 max_rev = len(c.repo.revisions) - 1
26 r = cur + 1
26 r = cur + 1
27 if r > max_rev:
27 if r > max_rev:
28 r = max_rev
28 r = max_rev
29 return r
29 return r
30
30
31 def get_prev_rev(cur):
31 def get_prev_rev(cur):
32 r = cur - 1
32 r = cur - 1
33 return r
33 return r
34
34
35 c.f_path = f_path
35 c.f_path = f_path
36
36
37
37
38 try:
38 try:
39 cur_rev = repo.get_changeset(revision).revision
39 cur_rev = repo.get_changeset(revision).revision
40 prev_rev = repo.get_changeset(get_prev_rev(cur_rev)).raw_id
40 prev_rev = repo.get_changeset(get_prev_rev(cur_rev)).raw_id
41 next_rev = repo.get_changeset(get_next_rev(cur_rev)).raw_id
41 next_rev = repo.get_changeset(get_next_rev(cur_rev)).raw_id
42
42
43 c.url_prev = url('files_home', repo_name=c.repo_name,
43 c.url_prev = url('files_home', repo_name=c.repo_name,
44 revision=prev_rev, f_path=f_path)
44 revision=prev_rev, f_path=f_path)
45 c.url_next = url('files_home', repo_name=c.repo_name,
45 c.url_next = url('files_home', repo_name=c.repo_name,
46 revision=next_rev, f_path=f_path)
46 revision=next_rev, f_path=f_path)
47
47
48 c.changeset = repo.get_changeset(revision)
48 c.changeset = repo.get_changeset(revision)
49 try:
49 try:
50 c.file_msg = c.changeset.get_file_message(f_path)
50 c.file_msg = c.changeset.get_file_message(f_path)
51 except:
51 except:
52 c.file_msg = None
52 c.file_msg = None
53
53
54 c.cur_rev = c.changeset.raw_id
54 c.cur_rev = c.changeset.raw_id
55 c.rev_nr = c.changeset.revision
55 c.rev_nr = c.changeset.revision
56 c.files_list = c.changeset.get_node(f_path)
56 c.files_list = c.changeset.get_node(f_path)
57 c.file_history = self._get_history(repo, c.files_list, f_path)
57 c.file_history = self._get_history(repo, c.files_list, f_path)
58
58
59 except (RepositoryError, ChangesetError):
59 except (RepositoryError, ChangesetError):
60 c.files_list = None
60 c.files_list = None
61
61
62 return render('files/files.html')
62 return render('files/files.html')
63
63
64 def rawfile(self, repo_name, revision, f_path):
64 def rawfile(self, repo_name, revision, f_path):
65 hg_model = HgModel()
65 hg_model = HgModel()
66 c.repo = hg_model.get_repo(c.repo_name)
66 c.repo = hg_model.get_repo(c.repo_name)
67 file_node = c.repo.get_changeset(revision).get_node(f_path)
67 file_node = c.repo.get_changeset(revision).get_node(f_path)
68 response.headers['Content-type'] = file_node.mimetype
68 response.content_type = file_node.mimetype
69 response.headers['Content-disposition'] = 'attachment; filename=%s' \
69 response.content_disposition = 'attachment; filename=%s' \
70 % f_path.split('/')[-1]
70 % f_path.split('/')[-1]
71 return file_node.content
71 return file_node.content
72
72
73 def archivefile(self, repo_name, revision, fileformat):
73 def archivefile(self, repo_name, revision, fileformat):
74 return '%s %s %s' % (repo_name, revision, fileformat)
74 return '%s %s %s' % (repo_name, revision, fileformat)
75
75
76 def diff(self, repo_name, f_path):
76 def diff(self, repo_name, f_path):
77 hg_model = HgModel()
77 hg_model = HgModel()
78 diff1 = request.GET.get('diff1')
78 diff1 = request.GET.get('diff1')
79 diff2 = request.GET.get('diff2')
79 diff2 = request.GET.get('diff2')
80 c.action = action = request.GET.get('diff')
80 c.no_changes = diff1 == diff2
81 c.no_changes = diff1 == diff2
81 c.f_path = f_path
82 c.f_path = f_path
82 c.repo = hg_model.get_repo(c.repo_name)
83 c.repo = hg_model.get_repo(c.repo_name)
83 c.changeset_1 = c.repo.get_changeset(diff1)
84 c.changeset_1 = c.repo.get_changeset(diff1)
84 c.changeset_2 = c.repo.get_changeset(diff2)
85 c.changeset_2 = c.repo.get_changeset(diff2)
85
86
86 c.diff1 = 'r%s:%s' % (c.changeset_1.revision, c.changeset_1._short)
87 c.diff1 = 'r%s:%s' % (c.changeset_1.revision, c.changeset_1._short)
87 c.diff2 = 'r%s:%s' % (c.changeset_2.revision, c.changeset_2._short)
88 c.diff2 = 'r%s:%s' % (c.changeset_2.revision, c.changeset_2._short)
88
89
90 f_udiff = differ.get_udiff(c.changeset_1.get_node(f_path),
89 f_udiff = differ.get_udiff(c.changeset_1.get_node(f_path),
91 c.changeset_2.get_node(f_path))
90 c.changeset_2.get_node(f_path))
92 c.differ = differ.DiffProcessor(f_udiff)
91
92 diff = differ.DiffProcessor(f_udiff)
93
94 if action == 'download':
95 diff_name = '%s_vs_%s.diff' % (diff1, diff2)
96 response.content_type = 'text/plain'
97 response.content_disposition = 'attachment; filename=%s' \
98 % diff_name
99 return diff.raw_diff()
100
101 elif action == 'raw':
102 c.cur_diff = '<pre class="raw">%s</pre>' % diff.raw_diff()
103 elif action == 'diff':
104 c.cur_diff = diff.as_html()
105
93 return render('files/file_diff.html')
106 return render('files/file_diff.html')
94
107
95 def _get_history(self, repo, node, f_path):
108 def _get_history(self, repo, node, f_path):
96 from vcs.nodes import NodeKind
109 from vcs.nodes import NodeKind
97 if not node.kind is NodeKind.FILE:
110 if not node.kind is NodeKind.FILE:
98 return []
111 return []
99 changesets = node.history
112 changesets = node.history
100 hist_l = []
113 hist_l = []
101 for chs in changesets:
114 for chs in changesets:
102 n_desc = 'r%s:%s' % (chs.revision, chs._short)
115 n_desc = 'r%s:%s' % (chs.revision, chs._short)
103 hist_l.append((chs._short, n_desc,))
116 hist_l.append((chs._short, n_desc,))
104 return hist_l
117 return hist_l
@@ -1,103 +1,107 b''
1 div.diffblock {
1 div.diffblock {
2 overflow: auto;
2 overflow: auto;
3 padding: 0px;
3 padding: 0px;
4 border: 1px solid #ccc;
4 border: 1px solid #ccc;
5 background: #f8f8f8;
5 background: #f8f8f8;
6 font-size: 100%;
6 font-size: 100%;
7 line-height: 100%;
7 line-height: 100%;
8 /* new */
8 /* new */
9 line-height: 125%;
9 line-height: 125%;
10 }
10 }
11 div.diffblock .code-header{
11 div.diffblock .code-header{
12 border-bottom: 1px solid #CCCCCC;
12 border-bottom: 1px solid #CCCCCC;
13 background: #EEEEEE;
13 background: #EEEEEE;
14 color:blue;
14 color:blue;
15 padding:10px 0 10px 0;
15 padding:10px 0 10px 0;
16 }
16 }
17 div.diffblock .code-header span{
17 div.diffblock .code-header div{
18 margin-left:25px;
18 margin-left:25px;
19 font-weight: bold;
19 font-weight: bold;
20 }
20 }
21 div.diffblock .code-body{
21 div.diffblock .code-body{
22 background: #EEEEEE;
22 background: #EEEEEE;
23 }
23 }
24 div.diffblock pre.raw{
25 background: #FFFFFF;
26 color:#000000;
27 }
24
28
25 .code-difftable{
29 .code-difftable{
26 border-collapse: collapse;
30 border-collapse: collapse;
27 width: 99%;
31 width: 99%;
28 }
32 }
29 .code-difftable td:target *{
33 .code-difftable td:target *{
30 background: repeat scroll 0 0 #FFFFBE !important;
34 background: repeat scroll 0 0 #FFFFBE !important;
31 text-decoration: underline;
35 text-decoration: underline;
32 }
36 }
33 .code-difftable .context{
37 .code-difftable .context{
34 background:none repeat scroll 0 0 #DDE7EF;
38 background:none repeat scroll 0 0 #DDE7EF;
35 }
39 }
36 .code-difftable .add{
40 .code-difftable .add{
37 background:none repeat scroll 0 0 #DDFFDD;
41 background:none repeat scroll 0 0 #DDFFDD;
38 }
42 }
39 .code-difftable .add ins{
43 .code-difftable .add ins{
40 background:none repeat scroll 0 0 #AAFFAA;
44 background:none repeat scroll 0 0 #AAFFAA;
41 text-decoration:none;
45 text-decoration:none;
42 }
46 }
43
47
44 .code-difftable .del{
48 .code-difftable .del{
45 background:none repeat scroll 0 0 #FFDDDD;
49 background:none repeat scroll 0 0 #FFDDDD;
46 }
50 }
47 .code-difftable .del del{
51 .code-difftable .del del{
48 background:none repeat scroll 0 0 #FFAAAA;
52 background:none repeat scroll 0 0 #FFAAAA;
49 text-decoration:none;
53 text-decoration:none;
50 }
54 }
51
55
52 .code-difftable .lineno{
56 .code-difftable .lineno{
53 background:none repeat scroll 0 0 #EEEEEE !important;
57 background:none repeat scroll 0 0 #EEEEEE !important;
54 border-right:1px solid #DDDDDD;
58 border-right:1px solid #DDDDDD;
55 padding-left:2px;
59 padding-left:2px;
56 padding-right:2px;
60 padding-right:2px;
57 text-align:right;
61 text-align:right;
58 width:20px;
62 width:20px;
59 -moz-user-select:none;
63 -moz-user-select:none;
60 -webkit-user-select: none;
64 -webkit-user-select: none;
61 }
65 }
62 .code-difftable .lineno pre{
66 .code-difftable .lineno pre{
63 color:#747474 !important;
67 color:#747474 !important;
64 font:11px "Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace !important;
68 font:11px "Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace !important;
65 letter-spacing:-1px;
69 letter-spacing:-1px;
66 text-align:right;
70 text-align:right;
67 width:20px;
71 width:20px;
68 }
72 }
69 .code-difftable .lineno a{
73 .code-difftable .lineno a{
70 color:#0000CC !important;
74 color:#0000CC !important;
71 }
75 }
72 .code-difftable .code td{
76 .code-difftable .code td{
73 margin:0;
77 margin:0;
74 padding: 0;
78 padding: 0;
75 }
79 }
76 .code-difftable .code pre{
80 .code-difftable .code pre{
77 margin:0;
81 margin:0;
78 padding:0;
82 padding:0;
79 }
83 }
80
84
81
85
82 .code {
86 .code {
83 display: block;
87 display: block;
84 width: 100%;
88 width: 100%;
85 }
89 }
86 .code-diff {
90 .code-diff {
87 padding: 0px;
91 padding: 0px;
88 margin-top: 5px;
92 margin-top: 5px;
89 margin-bottom: 5px;
93 margin-bottom: 5px;
90 border-left: 2px solid #ccc;
94 border-left: 2px solid #ccc;
91 }
95 }
92 .code-diff pre, .line pre {
96 .code-diff pre, .line pre {
93 padding: 3px;
97 padding: 3px;
94 margin: 0;
98 margin: 0;
95 }
99 }
96 .lineno a {
100 .lineno a {
97 text-decoration: none;
101 text-decoration: none;
98 }
102 }
99
103
100 .line{
104 .line{
101 padding:0;
105 padding:0;
102 margin:0;
106 margin:0;
103 } No newline at end of file
107 }
@@ -1,558 +1,584 b''
1 /*** Initial Settings ***/
1 /*** Initial Settings ***/
2 #mainhtml{
2 #mainhtml{
3 margin: 15px 50px;
3 margin: 15px 50px;
4 background: #DBD4C6;
4 background: #DBD4C6;
5 font-family: sans-serif;
5 font-family: sans-serif;
6 }
6 }
7
7
8 a {
8 a {
9 color: #0000cc;
9 color: #0000cc;
10 text-decoration: none;
10 text-decoration: none;
11 }
11 }
12 a:HOVER{
12 a:HOVER{
13 text-decoration: underline;
13 text-decoration: underline;
14 }
14 }
15 /*** end of Initial Settings ***/ /** common settings **/
15 /*** end of Initial Settings ***/
16
17 /** common settings **/
16 div#main {
18 div#main {
17 padding: 5px;
19 padding: 5px;
18 }
20 }
19
21
20 div#container {
22 div#container {
21 background: #FFFFFF;
23 background: #FFFFFF;
22 position: relative;
24 position: relative;
23 color: #666;
25 color: #666;
24 }
26 }
25
27
26 div.page-header {
28 div.page-header {
27 padding: 50px 20px 0;
29 padding: 50px 20px 0;
28 background: #556cb5 top left repeat-x;
30 background: #556cb5 top left repeat-x;
29 position: relative;
31 position: relative;
30 }
32 }
31
33
32 div.page-header h1 {
34 div.page-header h1 {
33 margin: 10px 0 30px;
35 margin: 10px 0 30px;
34 font-size: 1.8em;
36 font-size: 1.8em;
35 font-weight: bold;
37 font-weight: bold;
36 font-family: sans-serif;
38 font-family: sans-serif;
37 letter-spacing: 1px;
39 letter-spacing: 1px;
38 color: #DDD;
40 color: #DDD;
39 }
41 }
40
42
41 div.page-header h1 a {
43 div.page-header h1 a {
42 font-weight: bold;
44 font-weight: bold;
43 color: #FFF;
45 color: #FFF;
44 }
46 }
45
47
46 div.page-header a {
48 div.page-header a {
47 text-decoration: none;
49 text-decoration: none;
48 }
50 }
49
51
50 div.page-header form {
52 div.page-header form {
51 position: absolute;
53 position: absolute;
52 margin-bottom: 2px;
54 margin-bottom: 2px;
53 bottom: 0;
55 bottom: 0;
54 right: 20px;
56 right: 20px;
55 }
57 }
56
58
57 div.page-header form label {
59 div.page-header form label {
58 color: #DDD;
60 color: #DDD;
59 }
61 }
60
62
61 div.page-header form input {
63 div.page-header form input {
62 padding: 2px;
64 padding: 2px;
63 border: solid 1px #DDD;
65 border: solid 1px #DDD;
64 }
66 }
65
67
66 div.page-header form dl {
68 div.page-header form dl {
67 overflow: hidden;
69 overflow: hidden;
68 }
70 }
69
71
70 div.page-header form dl dt {
72 div.page-header form dl dt {
71 font-size: 1.2em;
73 font-size: 1.2em;
72 }
74 }
73
75
74 div.page-header form dl dt,div.page-header form dl dd {
76 div.page-header form dl dt,div.page-header form dl dd {
75 margin: 0 0 0 5px;
77 margin: 0 0 0 5px;
76 float: left;
78 float: left;
77 height: 24px;
79 height: 24px;
78 line-height: 20px;
80 line-height: 20px;
79 }
81 }
80
82
81 ul.page-nav {
83 ul.page-nav {
82 margin: 10px 0 0 0;
84 margin: 10px 0 0 0;
83 list-style-type: none;
85 list-style-type: none;
84 overflow: hidden;
86 overflow: hidden;
85 width: 800px;
87 width: 800px;
86 padding: 0;
88 padding: 0;
87 }
89 }
88
90
89 ul.page-nav li {
91 ul.page-nav li {
90 margin: 0 2px 0 0;
92 margin: 0 2px 0 0;
91 float: left;
93 float: left;
92 height: 24px;
94 height: 24px;
93 font-size: 1.1em;
95 font-size: 1.1em;
94 line-height: 24px;
96 line-height: 24px;
95 text-align: center;
97 text-align: center;
96 background: #DDD;
98 background: #DDD;
97 }
99 }
98
100
99 ul.page-nav li.current {
101 ul.page-nav li.current {
100 background: #FFF;
102 background: #FFF;
101 padding-right: 5px;
103 padding-right: 5px;
102 padding-left: 5px;
104 padding-left: 5px;
103 }
105 }
104
106
105 ul.page-nav li a {
107 ul.page-nav li a {
106 height: 24px;
108 height: 24px;
107 color: #666;
109 color: #666;
108 padding-right: 5px;
110 padding-right: 5px;
109 padding-left: 5px;
111 padding-left: 5px;
110 display: block;
112 display: block;
111 text-decoration: none;
113 text-decoration: none;
112 }
114 }
113
115
114 ul.page-nav li a:hover {
116 ul.page-nav li a:hover {
115 color: #333;
117 color: #333;
116 background: #FFF;
118 background: #FFF;
117 }
119 }
118
120
119 ul.submenu {
121 ul.submenu {
120 margin: 10px 0 -10px 20px;
122 margin: 10px 0 -10px 20px;
121 list-style-type: none;
123 list-style-type: none;
122 }
124 }
123
125
124 ul.submenu li {
126 ul.submenu li {
125 margin: 0 10px 0 0;
127 margin: 0 10px 0 0;
126 font-size: 1.2em;
128 font-size: 1.2em;
127 display: inline;
129 display: inline;
128 }
130 }
129
131
130 h2 {
132 h2 {
131 margin: 20px 0 10px;
133 margin: 20px 0 10px;
132 height: 30px;
134 height: 30px;
133 line-height: 30px;
135 line-height: 30px;
134 text-indent: 20px;
136 text-indent: 20px;
135 background: #FFF;
137 background: #FFF;
136 font-size: 1.2em;
138 font-size: 1.2em;
137 border-top: dotted 1px #D5E1E6;
139 border-top: dotted 1px #D5E1E6;
138 font-weight: bold;
140 font-weight: bold;
139 }
141 }
140
142
141 h2.no-link {
143 h2.no-link {
142 color: #006699;
144 color: #006699;
143 }
145 }
144
146
145 h2.no-border {
147 h2.no-border {
146 color: #FFF;
148 color: #FFF;
147 background: #556CB5;
149 background: #556CB5;
148 border: 0;
150 border: 0;
149 }
151 }
150
152
151 h2 a {
153 h2 a {
152 font-weight: bold;
154 font-weight: bold;
153 color: #006699;
155 color: #006699;
154 }
156 }
155
157
156 div.page-path {
158 div.page-path {
157 text-align: right;
159 text-align: right;
158 padding: 20px 30px 10px 0;
160 padding: 20px 30px 10px 0;
159 border: solid #d9d8d1;
161 border: solid #d9d8d1;
160 border-width: 0px 0px 1px;
162 border-width: 0px 0px 1px;
161 font-size: 1.2em;
163 font-size: 1.2em;
162 }
164 }
163
165
164 div.page-footer {
166 div.page-footer {
165 margin: 50px 0 0;
167 margin: 50px 0 0;
166 position: relative;
168 position: relative;
167 }
169 }
168
170
169 div.page-footer p {
171 div.page-footer p {
170 position: relative;
172 position: relative;
171 left: 20px;
173 left: 20px;
172 bottom: 5px;
174 bottom: 5px;
173 font-size: 1.2em;
175 font-size: 1.2em;
174 }
176 }
175
177
176 ul.rss-logo {
178 ul.rss-logo {
177 position: absolute;
179 position: absolute;
178 top: -10px;
180 top: -10px;
179 right: 20px;
181 right: 20px;
180 height: 20px;
182 height: 20px;
181 list-style-type: none;
183 list-style-type: none;
182 }
184 }
183
185
184 ul.rss-logo li {
186 ul.rss-logo li {
185 display: inline;
187 display: inline;
186 }
188 }
187
189
188 ul.rss-logo li a {
190 ul.rss-logo li a {
189 padding: 3px 6px;
191 padding: 3px 6px;
190 line-height: 10px;
192 line-height: 10px;
191 border: 1px solid;
193 border: 1px solid;
192 border-color: #fcc7a5 #7d3302 #3e1a01 #ff954e;
194 border-color: #fcc7a5 #7d3302 #3e1a01 #ff954e;
193 color: #ffffff;
195 color: #ffffff;
194 background-color: #ff6600;
196 background-color: #ff6600;
195 font-weight: bold;
197 font-weight: bold;
196 font-family: sans-serif;
198 font-family: sans-serif;
197 font-size: 10px;
199 font-size: 10px;
198 text-align: center;
200 text-align: center;
199 text-decoration: none;
201 text-decoration: none;
200 }
202 }
201
203
202 div.rss-logo li a:hover {
204 div.rss-logo li a:hover {
203 background-color: #ee5500;
205 background-color: #ee5500;
204 }
206 }
205
207
206 p.normal {
208 p.normal {
207 margin: 20px 0 20px 30px;
209 margin: 20px 0 20px 30px;
208 font-size: 1.2em;
210 font-size: 1.2em;
209 }
211 }
210
212
211 table tr.parity0:hover,table tr.parity1:hover {
213 table tr.parity0:hover,table tr.parity1:hover {
212 background: #D5E1E6;
214 background: #D5E1E6;
213 }
215 }
214
216
215 table tr.parity0 {
217 table tr.parity0 {
216 background: #EAEAE9;
218 background: #EAEAE9;
217 }
219 }
218
220
219 table tr.parity1 {
221 table tr.parity1 {
220 background: #FFFFFF;
222 background: #FFFFFF;
221 }
223 }
222
224
223 span.logtags span {
225 span.logtags span {
224 background-repeat: no-repeat;
226 background-repeat: no-repeat;
225 height: 16px;
227 height: 16px;
226 padding-left: 20px;
228 padding-left: 20px;
227 padding-top: 0px;
229 padding-top: 0px;
228 text-align: left;
230 text-align: left;
229 font-weight: bold;
231 font-weight: bold;
230 }
232 }
231
233
232 span.logtags span.tagtag {
234 span.logtags span.tagtag {
233 background-image: url("/images/label_16.png");
235 background-image: url("/images/label_16.png");
234 }
236 }
235
237
236 span.logtags span.branchtag {
238 span.logtags span.branchtag {
237 background-image: url("/images/left_16.png");
239 background-image: url("/images/left_16.png");
238 color: #628F53;
240 color: #628F53;
239 }
241 }
240
242
241 span.logtags span.inbranchtag {
243 span.logtags span.inbranchtag {
242 background-image: url("/images/left_16.png");
244 background-image: url("/images/left_16.png");
243 }
245 }
244
246
245 div.diff pre {
247 div.diff pre {
246 margin: 10px 0 0 0;
248 margin: 10px 0 0 0;
247 }
249 }
248
250
249 div.diff pre span {
251 div.diff pre span {
250 font-family: monospace;
252 font-family: monospace;
251 white-space: pre;
253 white-space: pre;
252 font-size: 1.2em;
254 font-size: 1.2em;
253 padding: 3px 0;
255 padding: 3px 0;
254 }
256 }
255
257
256 td.source {
258 td.source {
257 white-space: pre;
259 white-space: pre;
258 font-family: monospace;
260 font-family: monospace;
259 margin: 10px 30px 0;
261 margin: 10px 30px 0;
260 font-size: 1.2em;
262 font-size: 1.2em;
261 font-family: monospace;
263 font-family: monospace;
262 }
264 }
263
265
264 div.source div.parity0,div.source div.parity1 {
266 div.source div.parity0,div.source div.parity1 {
265 padding: 1px;
267 padding: 1px;
266 font-size: 1.2em;
268 font-size: 1.2em;
267 }
269 }
268
270
269 div.source div.parity0 {
271 div.source div.parity0 {
270 background: #F1F6F7;
272 background: #F1F6F7;
271 }
273 }
272
274
273 div.source div.parity1 {
275 div.source div.parity1 {
274 background: #FFFFFF;
276 background: #FFFFFF;
275 }
277 }
276
278
277 div.parity0:hover,div.parity1:hover {
279 div.parity0:hover,div.parity1:hover {
278 background: #D5E1E6;
280 background: #D5E1E6;
279 }
281 }
280
282
281 .linenr {
283 .linenr {
282 color: #999;
284 color: #999;
283 text-align: right;
285 text-align: right;
284 }
286 }
285
287
286 .lineno {
288 .lineno {
287 text-align: right;
289 text-align: right;
288 }
290 }
289
291
290 .lineno a {
292 .lineno a {
291 color: #999;
293 color: #999;
292 }
294 }
293
295
294 td.linenr {
296 td.linenr {
295 width: 60px;
297 width: 60px;
296 }
298 }
297
299
298 div#powered-by {
300 div#powered-by {
299 position: absolute;
301 position: absolute;
300 width: 75px;
302 width: 75px;
301 top: 15px;
303 top: 15px;
302 right: 20px;
304 right: 20px;
303 font-size: 1.2em;
305 font-size: 1.2em;
304 }
306 }
305
307
306 div#powered-by a {
308 div#powered-by a {
307 color: #EEE;
309 color: #EEE;
308 text-decoration: none;
310 text-decoration: none;
309 }
311 }
310
312
311 div#powered-by a:hover {
313 div#powered-by a:hover {
312 text-decoration: underline;
314 text-decoration: underline;
313 }
315 }
314
316
315 dl.overview {
317 dl.overview {
316 margin: 0 0 0 30px;
318 margin: 0 0 0 30px;
317 font-size: 1.1em;
319 font-size: 1.1em;
318 overflow: hidden;
320 overflow: hidden;
319 }
321 }
320
322
321 dl.overview dt,dl.overview dd {
323 dl.overview dt,dl.overview dd {
322 margin: 5px 0;
324 margin: 5px 0;
323 float: left;
325 float: left;
324 }
326 }
325
327
326 dl.overview dt {
328 dl.overview dt {
327 clear: left;
329 clear: left;
328 font-weight: bold;
330 font-weight: bold;
329 width: 150px;
331 width: 150px;
330 }
332 }
331
333
332 /** end of summary **/
334 /** end of summary **/
333
335
334 /** chagelog **/
336 /** chagelog **/
335 h3.changelog {
337 h3.changelog {
336 margin: 20px 0 5px 30px;
338 margin: 20px 0 5px 30px;
337 padding: 0 0 2px;
339 padding: 0 0 2px;
338 font-size: 1.4em;
340 font-size: 1.4em;
339 border-bottom: dotted 1px #D5E1E6;
341 border-bottom: dotted 1px #D5E1E6;
340 }
342 }
341
343
342 ul.changelog-entry {
344 ul.changelog-entry {
343 margin: 0 0 10px 30px;
345 margin: 0 0 10px 30px;
344 list-style-type: none;
346 list-style-type: none;
345 position: relative;
347 position: relative;
346 }
348 }
347
349
348 ul.changelog-entry li span.revdate {
350 ul.changelog-entry li span.revdate {
349 font-size: 1.1em;
351 font-size: 1.1em;
350 }
352 }
351
353
352 ul.changelog-entry li.age {
354 ul.changelog-entry li.age {
353 position: absolute;
355 position: absolute;
354 top: -25px;
356 top: -25px;
355 right: 10px;
357 right: 10px;
356 font-size: 1.4em;
358 font-size: 1.4em;
357 color: #CCC;
359 color: #CCC;
358 font-weight: bold;
360 font-weight: bold;
359 font-style: italic;
361 font-style: italic;
360 }
362 }
361
363
362 ul.changelog-entry li span.name {
364 ul.changelog-entry li span.name {
363 font-size: 1.2em;
365 font-size: 1.2em;
364 font-weight: bold;
366 font-weight: bold;
365 }
367 }
366
368
367 ul.changelog-entry li.description {
369 ul.changelog-entry li.description {
368 margin: 10px 0 0;
370 margin: 10px 0 0;
369 font-size: 1.1em;
371 font-size: 1.1em;
370 }
372 }
371
373
372 /** end of changelog **/
374 /** end of changelog **/
373
375
374 /** file **/
376 /** file **/
375 p.files {
377 p.files {
376 margin: 0 0 0 20px;
378 margin: 0 0 0 20px;
377 font-size: 2.0em;
379 font-size: 2.0em;
378 font-weight: bold;
380 font-weight: bold;
379 }
381 }
380
382
381 /** end of file **/
383 /** end of file **/
382
384
383 /** changeset **/
385 /** changeset **/
384 h3.changeset {
385 margin: 20px 0 5px 20px;
386 padding: 0 0 2px;
387 font-size: 1.6em;
388 border-bottom: dotted 1px #D5E1E6;
389 }
390
386
391 p.changeset-age {
387 .cs_files{
392 position: relative;
388 border: 2px solid #CCCCCC;
393 }
389 width: 60%;
394
390
395 p.changeset-age span {
391 }
396 position: absolute;
392 .cs_files .cs_added{
397 top: -25px;
393 background:#BBFFBB;
398 right: 10px;
399 font-size: 1.4em;
400 color: #CCC;
401 font-weight: bold;
402 font-style: italic;
403 }
394 }
404
395 .cs_files .cs_changed{
405 p.description {
396 background: #FFDD88;
406 margin: 10px 30px 0 30px;
397 }
407 padding: 10px;
398 .cs_files .cs_removed{
408 border: solid 1px #CCC;
399 background: #FF8888;
409 font-size: 1.2em;
410 }
400 }
411
401
412 /** end of changeset **/
402 /** end of changeset **/
413
403
414 /** canvas **/
404 /** canvas **/
415 div#wrapper {
416 position: relative;
417 font-size: 1.2em;
418 }
419
420 canvas {
405 canvas {
421 position: absolute;
406 position: absolute;
422 z-index: 5;
407 z-index: 5;
423 top: -0.7em;
408 top: -0.7em;
424 }
409 }
410 #graph{
411 overflow: hidden;
425
412
426 ul#nodebgs li.parity0 {
413 }
427 background: #F1F6F7;
414 #graph_nodes{
415 width:160px;
416 float:left;
428 }
417 }
429
418
430 ul#nodebgs li.parity1 {
419 #graph_content{
431 background: #FFFFFF;
420 width:800px;
421 float:left;
422 }
423 #graph_content .container_header{
424 border:1px solid #CCCCCC;
425 height:30px;
426 background: #EEEEEE;
427 }
428
429
430 #graph_content .container .wrapper{
431 width: 600px;
432 }
433 #graph_content .container{
434 border-bottom: 1px solid #CCCCCC;
435 border-left: 1px solid #CCCCCC;
436 border-right: 1px solid #CCCCCC;
437 height:120px;
432 }
438 }
433
439
434 ul#graphnodes {
440 #graph_content .container .left{
435 position: absolute;
441 float:left;
436 z-index: 10;
442 width: 70%;
437 top: 7px;
443 padding-left: 5px;
438 list-style: none inside none;
439 }
444 }
440
445
441 ul#nodebgs {
446 #graph_content .container .right{
442 list-style: none inside none;
447 float:right;
448 width: 25%;
449 }
450 #graph_content .container .left .date{
451 font-weight:bold;
452 }
453 #graph_content .container .left .author{
454
455 }
456 #graph_content .container .left .message{
457 font-size: 80%;
443 }
458 }
444
459
445 ul#graphnodes li,ul#nodebgs li {
460 .right .added,.changed,.removed{
446 height: 39px;
461 border:1px solid #DDDDDD;
462 display:block;
463 float:right;
464 font-size:0.75em;
465 text-align:center;
466 min-width:15px;
447 }
467 }
448
468 .right .added{
449 ul#graphnodes li .info {
469 background:#BBFFBB;
450 display: block;
451 position: relative;
452 }
470 }
453
471 .right .changed{
472 background: #FFDD88;
473 }
474 .right .removed{
475 background: #FF8888;
476 }
454 /** end of canvas **/
477 /** end of canvas **/
455
478
456 /* FILE BROWSER */
479 /* FILE BROWSER */
457 div.browserblock {
480 div.browserblock {
458 overflow: hidden;
481 overflow: hidden;
459 padding: 0px;
482 padding: 0px;
460 border: 1px solid #ccc;
483 border: 1px solid #ccc;
461 background: #f8f8f8;
484 background: #f8f8f8;
462 font-size: 100%;
485 font-size: 100%;
463 line-height: 100%;
486 line-height: 100%;
464 /* new */
487 /* new */
465 line-height: 125%;
488 line-height: 125%;
466 }
489 }
467 div.browserblock .browser-header{
490 div.browserblock .browser-header{
468 border-bottom: 1px solid #CCCCCC;
491 border-bottom: 1px solid #CCCCCC;
469 background: #EEEEEE;
492 background: #EEEEEE;
470 color:blue;
493 color:blue;
471 padding:10px 0 10px 0;
494 padding:10px 0 10px 0;
472 }
495 }
473 div.browserblock .browser-header span{
496 div.browserblock .browser-header span{
474 margin-left:25px;
497 margin-left:25px;
475 font-weight: bold;
498 font-weight: bold;
476 }
499 }
477 div.browserblock .browser-body{
500 div.browserblock .browser-body{
478 background: #EEEEEE;
501 background: #EEEEEE;
479 }
502 }
480
503
481 table.code-browser {
504 table.code-browser {
482 border-collapse:collapse;
505 border-collapse:collapse;
506 width: 100%;
483 }
507 }
484 table.code-browser tr{
508 table.code-browser tr{
485 margin:3px;
509 margin:3px;
486 }
510 }
487
511
488 table.code-browser thead th {
512 table.code-browser thead th {
489 background-color: #EEEEEE;
513 background-color: #EEEEEE;
490 height: 20px;
514 height: 20px;
491 font-size: 1.1em;
515 font-size: 1.1em;
492 font-weight: bold;
516 font-weight: bold;
493 text-align: center;
517 text-align: center;
518 text-align: left;
519 padding-left: 10px;
494 }
520 }
495 table.code-browser tbody tr {
521 table.code-browser tbody tr {
496
522
497 }
523 }
498
524
499 table.code-browser tbody td {
525 table.code-browser tbody td {
500
526
501 padding-left:10px;
527 padding-left:10px;
502 height: 20px;
528 height: 20px;
503 }
529 }
504
530
505 .info-table {
531 .info-table {
506 background: none repeat scroll 0 0 #FAFAFA;
532 background: none repeat scroll 0 0 #FAFAFA;
507 border-bottom: 1px solid #DDDDDD;
533 border-bottom: 1px solid #DDDDDD;
508 width: 100%;
534 width: 100%;
509 }
535 }
510
536
511 .rss_logo {
537 .rss_logo {
512 background-image: url("/images/feed.png");
538 background-image: url("/images/feed.png");
513 background-repeat: no-repeat;
539 background-repeat: no-repeat;
514 display: block;
540 display: block;
515 height: 16px;
541 height: 16px;
516 padding-left: 20px;
542 padding-left: 20px;
517 padding-top: 0px;
543 padding-top: 0px;
518 text-align: left;
544 text-align: left;
519 }
545 }
520
546
521 .atom_logo {
547 .atom_logo {
522 background-image: url("/images/atom.png");
548 background-image: url("/images/atom.png");
523 background-repeat: no-repeat;
549 background-repeat: no-repeat;
524 display: block;
550 display: block;
525 height: 16px;
551 height: 16px;
526 padding-left: 20px;
552 padding-left: 20px;
527 padding-top: 0px;
553 padding-top: 0px;
528 text-align: left;
554 text-align: left;
529 }
555 }
530
556
531 .browser-file {
557 .browser-file {
532 background-image: url("/images/document_16.png");
558 background-image: url("/images/document_16.png");
533 background-repeat: no-repeat;
559 background-repeat: no-repeat;
534 display: block;
560 display: block;
535 height: 16px;
561 height: 16px;
536 padding-left: 20px;
562 padding-left: 20px;
537 padding-top: 0px;
563 padding-top: 0px;
538 text-align: left;
564 text-align: left;
539 }
565 }
540
566
541 .browser-dir {
567 .browser-dir {
542 background-image: url("/images/folder_16.png");
568 background-image: url("/images/folder_16.png");
543 background-repeat: no-repeat;
569 background-repeat: no-repeat;
544 display: block;
570 display: block;
545 height: 16px;
571 height: 16px;
546 padding-left: 20px;
572 padding-left: 20px;
547 padding-top: 0px;
573 padding-top: 0px;
548 text-align: left;
574 text-align: left;
549 }
575 }
550
576
551 .current_submenu {
577 .current_submenu {
552 border-bottom: 2px solid;
578 border-bottom: 2px solid;
553 }
579 }
554
580
555 #repos_list {
581 #repos_list {
556 border: 1px solid #556CB5;
582 border: 1px solid #556CB5;
557 background: #FFFFFF;
583 background: #FFFFFF;
558 } No newline at end of file
584 }
@@ -1,41 +1,50 b''
1 <%inherit file="/base/base.html"/>
1 <%inherit file="/base/base.html"/>
2
2
3 <%def name="title()">
3 <%def name="title()">
4 ${_('Repository managment')}
4 ${_('Repository managment')}
5 </%def>
5 </%def>
6 <%def name="breadcrumbs()">
6 <%def name="breadcrumbs()">
7 ${h.link_to(u'Home',h.url('/'))}
7 ${h.link_to(u'Home',h.url('/'))}
8 /
8 /
9 ${h.link_to(c.repo_name,h.url('files_home',repo_name=c.repo_name))}
9 ${h.link_to(c.repo_name,h.url('files_home',repo_name=c.repo_name))}
10 /
10 /
11 ${_('files')}
11 ${_('files')}
12 </%def>
12 </%def>
13 <%def name="page_nav()">
13 <%def name="page_nav()">
14 <form action="log">
14 <form action="log">
15 <dl class="search">
15 <dl class="search">
16 <dt><label>Search: </label></dt>
16 <dt><label>Search: </label></dt>
17 <dd><input type="text" name="rev" /></dd>
17 <dd><input type="text" name="rev" /></dd>
18 </dl>
18 </dl>
19 </form>
19 </form>
20
20
21 ${self.menu('files')}
21 ${self.menu('files')}
22 </%def>
22 </%def>
23 <%def name="css()">
23 <%def name="css()">
24 <link rel="stylesheet" href="/css/monoblue_custom.css" type="text/css" />
24 <link rel="stylesheet" href="/css/monoblue_custom.css" type="text/css" />
25 <link rel="stylesheet" href="/css/diff.css" type="text/css" />
25 <link rel="stylesheet" href="/css/diff.css" type="text/css" />
26 </%def>
26 </%def>
27 <%def name="main()">
27 <%def name="main()">
28 <h2 class="no-link no-border">${'%s: %s %s %s' % (_('File diff'),c.diff2,'&rarr;',c.diff1)|n}</h2>
28 <h2 class="no-link no-border">${'%s: %s %s %s' % (_('File diff'),c.diff2,'&rarr;',c.diff1)|n}</h2>
29 <div id="body" class="diffblock">
29 <div id="body" class="diffblock">
30 <div class="code-header">
30 <div class="code-header">
31 <span>${h.link_to(c.f_path,h.url('files_home',repo_name=c.repo_name,revision=c.diff2.split(':')[1],f_path=c.f_path))}</span>
31 <div>
32 <span>${h.link_to(c.f_path,h.url('files_home',repo_name=c.repo_name,
33 revision=c.diff2.split(':')[1],f_path=c.f_path))}</span>
34 &raquo; <span style="font-size:77%">${h.link_to(_('diff'),
35 h.url.current(diff2=c.diff2.split(':')[-1],diff1=c.diff1.split(':')[-1],diff='diff'))}</span>
36 &raquo; <span style="font-size:77%">${h.link_to(_('raw diff'),
37 h.url.current(diff2=c.diff2.split(':')[-1],diff1=c.diff1.split(':')[-1],diff='raw'))}</span>
38 &raquo; <span style="font-size:77%">${h.link_to(_('download diff'),
39 h.url.current(diff2=c.diff2.split(':')[-1],diff1=c.diff1.split(':')[-1],diff='download'))}</span>
40 </div>
32 </div>
41 </div>
33 <div class="code-body">
42 <div class="code-body">
34 %if c.no_changes:
43 %if c.no_changes:
35 ${_('No changes')}
44 ${_('No changes')}
36 %else:
45 %else:
37 ${c.differ.as_HTML()|n}
46 ${c.cur_diff|n}
38 %endif
47 %endif
39 </div>
48 </div>
40 </div>
49 </div>
41 </%def> No newline at end of file
50 </%def>
General Comments 0
You need to be logged in to leave comments. Login now