Commit 66399d558da45fb9cd3ea972a47a4f7bb12bfc8d

Authored by Robert Speicher
2 parents 70174a1e 05da3801

Merge branch 'master' into hooray_apostrophes

app/assets/stylesheets/common.scss
@@ -249,7 +249,7 @@ ul.bordered-list li:last-child { border:none } @@ -249,7 +249,7 @@ ul.bordered-list li:last-child { border:none }
249 li.commit { 249 li.commit {
250 .avatar { 250 .avatar {
251 width:24px; 251 width:24px;
252 - top:-3px; 252 + top:-5px;
253 margin-right:10px; 253 margin-right:10px;
254 margin-left:10px; 254 margin-left:10px;
255 } 255 }
@@ -305,12 +305,7 @@ p.time { @@ -305,12 +305,7 @@ p.time {
305 } 305 }
306 306
307 .styled_image { 307 .styled_image {
308 - -webkit-border-radius: 4px;  
309 - -moz-border-radius: 4px;  
310 - border-radius: 4px;  
311 - -moz-box-shadow: 0 0 5px #888;  
312 - -webkit-box-shadow: 0 0 5px#888;  
313 - box-shadow: 0 0 5px #888; 308 + border:2px solid #ddd;
314 } 309 }
315 310
316 .event_feed { 311 .event_feed {
@@ -729,3 +724,14 @@ li.note { @@ -729,3 +724,14 @@ li.note {
729 } 724 }
730 } 725 }
731 } 726 }
  727 +
  728 +.git_error_tips {
  729 + @extend .span6;
  730 + text-align:left;
  731 + margin-top:40px;
  732 + pre {
  733 + background:white;
  734 + border:none;
  735 + font-size: 12px;
  736 + }
  737 +}
app/assets/stylesheets/gitlab_bootstrap.scss
1 -body { 1 +body {
2 margin-bottom:20px; 2 margin-bottom:20px;
3 } 3 }
4 a { 4 a {
5 outline: none; 5 outline: none;
6 color: $link_color; 6 color: $link_color;
7 - &:hover {  
8 - text-decoration:none; 7 + &:hover {
  8 + text-decoration:none;
9 color: $blue_link; 9 color: $blue_link;
10 } 10 }
11 11
12 - &.btn { 12 + &.btn {
13 color: $style_color; 13 color: $style_color;
14 } 14 }
15 15
16 - &.dark { 16 + &.dark {
17 color: $style_color; 17 color: $style_color;
18 } 18 }
19 19
20 - &.lined {  
21 - text-decoration:underline; 20 + &.lined {
  21 + text-decoration:underline;
22 &:hover { text-decoration:underline; } 22 &:hover { text-decoration:underline; }
23 } 23 }
24 24
25 - &.gray { 25 + &.gray {
26 color:gray; 26 color:gray;
27 } 27 }
28 28
29 - &.supp_diff_link { 29 + &.supp_diff_link {
30 text-align:center; 30 text-align:center;
31 padding:20px 0; 31 padding:20px 0;
32 background:#f1f1f1; 32 background:#f1f1f1;
@@ -39,24 +39,24 @@ a { @@ -39,24 +39,24 @@ a {
39 } 39 }
40 } 40 }
41 41
42 -.neib { 42 +.neib {
43 margin-right:10px; 43 margin-right:10px;
44 } 44 }
45 45
46 -.alert-message { 46 +.alert-message {
47 @extend .alert; 47 @extend .alert;
48 48
49 - &.success { 49 + &.success {
50 @extend .alert-success; 50 @extend .alert-success;
51 } 51 }
52 52
53 - &.error { 53 + &.error {
54 @extend .alert-error; 54 @extend .alert-error;
55 } 55 }
56 } 56 }
57 57
58 -.alert {  
59 - &.alert-well { 58 +.alert {
  59 + &.alert-well {
60 background:#ddd; 60 background:#ddd;
61 border:1px solid #ccc; 61 border:1px solid #ccc;
62 background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #ddd), to(#dfdfdf)); 62 background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #ddd), to(#dfdfdf));
@@ -71,12 +71,12 @@ h3, h4, h5, h6 { @@ -71,12 +71,12 @@ h3, h4, h5, h6 {
71 line-height: 36px; 71 line-height: 36px;
72 } 72 }
73 73
74 -h5 { 74 +h5 {
75 font-size:14px; 75 font-size:14px;
76 } 76 }
77 77
78 78
79 -table { 79 +table {
80 width:100%; 80 width:100%;
81 th { 81 th {
82 padding-top: 9px; 82 padding-top: 9px;
@@ -97,12 +97,12 @@ table { @@ -97,12 +97,12 @@ table {
97 border-radius: 4px; 97 border-radius: 4px;
98 } 98 }
99 99
100 - &.zebra-striped { 100 + &.zebra-striped {
101 @extend .table-striped; 101 @extend .table-striped;
102 } 102 }
103 } 103 }
104 104
105 -.btn { 105 +.btn {
106 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f1f1f1), color-stop(25%, #f1f1f1), to(#e6e6e6)); 106 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f1f1f1), color-stop(25%, #f1f1f1), to(#e6e6e6));
107 background-image: -webkit-linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6); 107 background-image: -webkit-linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6);
108 background-image: -moz-linear-gradient(top, #f1f1f1, #f1f1f1 25%, #e6e6e6); 108 background-image: -moz-linear-gradient(top, #f1f1f1, #f1f1f1 25%, #e6e6e6);
@@ -110,63 +110,63 @@ table { @@ -110,63 +110,63 @@ table {
110 background-image: -o-linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6); 110 background-image: -o-linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6);
111 background-image: linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6); 111 background-image: linear-gradient(#f1f1f1, #f1f1f1 25%, #e6e6e6);
112 112
113 - &:hover { 113 + &:hover {
114 } 114 }
115 115
116 - &.btn-primary { 116 + &.btn-primary {
117 background:$link_color; 117 background:$link_color;
118 border-color: #2A79A3; 118 border-color: #2A79A3;
119 - &:hover { 119 + &:hover {
120 background:$blue_link; 120 background:$blue_link;
121 } 121 }
122 } 122 }
123 - &.primary { 123 + &.primary {
124 @extend .btn-primary; 124 @extend .btn-primary;
125 } 125 }
126 126
127 - &.success { 127 + &.success {
128 color: #fff; 128 color: #fff;
129 text-shadow: 0 0 1px #111; 129 text-shadow: 0 0 1px #111;
130 background: #5bb75b;; 130 background: #5bb75b;;
131 font-weight: bold; 131 font-weight: bold;
132 132
133 - &:hover { 133 + &:hover {
134 background-color: #51a351; 134 background-color: #51a351;
135 color: #fff; 135 color: #fff;
136 } 136 }
137 } 137 }
138 138
139 &.danger, 139 &.danger,
140 - &.btn-danger { 140 + &.btn-danger {
141 color:#fff; 141 color:#fff;
142 background: #DA4E49; 142 background: #DA4E49;
143 border-color: #BD362F; 143 border-color: #BD362F;
144 144
145 - &:hover { 145 + &:hover {
146 color:#fff; 146 color:#fff;
147 background: #EE4E49; 147 background: #EE4E49;
148 } 148 }
149 } 149 }
150 150
151 - &.danger { 151 + &.danger {
152 @extend .btn-danger; 152 @extend .btn-danger;
153 } 153 }
154 154
155 - &.small { 155 + &.small {
156 @extend .btn-small; 156 @extend .btn-small;
157 } 157 }
158 158
159 - &.active { 159 + &.active {
160 border-color:#aaa; 160 border-color:#aaa;
161 background-color:#ccc; 161 background-color:#ccc;
162 } 162 }
163 } 163 }
164 164
165 -a:focus {  
166 - outline: none; 165 +a:focus {
  166 + outline: none;
167 } 167 }
168 168
169 -.nav-pills a:hover { 169 +.nav-pills a:hover {
170 background-color:#888; 170 background-color:#888;
171 } 171 }
172 172
@@ -174,20 +174,20 @@ a:focus { @@ -174,20 +174,20 @@ a:focus {
174 background-color: $style_color; 174 background-color: $style_color;
175 } 175 }
176 176
177 -.label { 177 +.label {
178 background-color: #474D57; 178 background-color: #474D57;
179 - &.label-important { 179 + &.label-important {
180 background-color: #B94A48; 180 background-color: #B94A48;
181 } 181 }
182 182
183 - &.label-issue { 183 + &.label-issue {
184 background-color: #eee; 184 background-color: #eee;
185 border: 1px solid #ccc; 185 border: 1px solid #ccc;
186 padding:4px 6px; 186 padding:4px 6px;
187 color:#444; 187 color:#444;
188 text-shadow:0 0 1px #fff; 188 text-shadow:0 0 1px #fff;
189 189
190 - &.grouped { 190 + &.grouped {
191 float: left; 191 float: left;
192 margin-right: 6px; 192 margin-right: 6px;
193 padding: 6px; 193 padding: 6px;
@@ -199,7 +199,7 @@ a:focus { @@ -199,7 +199,7 @@ a:focus {
199 color:$style_color; 199 color:$style_color;
200 } 200 }
201 201
202 -.nav-tabs > .active > a { 202 +.nav-tabs > .active > a {
203 font-weight:bold; 203 font-weight:bold;
204 } 204 }
205 205
@@ -248,39 +248,39 @@ a:focus { @@ -248,39 +248,39 @@ a:focus {
248 margin-top:20px; 248 margin-top:20px;
249 } 249 }
250 250
251 -.padded { 251 +.padded {
252 padding:20px; 252 padding:20px;
253 } 253 }
254 254
255 -.ipadded { 255 +.ipadded {
256 padding:20px !important; 256 padding:20px !important;
257 } 257 }
258 -.lborder { 258 +.lborder {
259 border-left:1px solid #eee; 259 border-left:1px solid #eee;
260 } 260 }
261 261
262 -.borders { 262 +.borders {
263 border: 1px solid #ccc; 263 border: 1px solid #ccc;
264 @include shade; 264 @include shade;
265 } 265 }
266 -.no-borders { 266 +.no-borders {
267 border:none; 267 border:none;
268 } 268 }
269 -table.no-borders { 269 +table.no-borders {
270 border:none; 270 border:none;
271 tr, td { border:none } 271 tr, td { border:none }
272 } 272 }
273 -.no-padding { 273 +.no-padding {
274 padding:0 !important; 274 padding:0 !important;
275 } 275 }
276 -.underlined { 276 +.underlined {
277 border-bottom: 1px solid $border_color; 277 border-bottom: 1px solid $border_color;
278 } 278 }
279 -.vlink { 279 +.vlink {
280 color: $link_color !important; 280 color: $link_color !important;
281 } 281 }
282 282
283 -.pretty_label { 283 +.pretty_label {
284 @include round-borders-all(4px); 284 @include round-borders-all(4px);
285 padding:2px 4px; 285 padding:2px 4px;
286 background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.076, #fefefe), to(#F6F7F8)); 286 background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.076, #fefefe), to(#F6F7F8));
@@ -290,7 +290,7 @@ table.no-borders { @@ -290,7 +290,7 @@ table.no-borders {
290 color: #777; 290 color: #777;
291 border: 1px solid #DEDFE1; 291 border: 1px solid #DEDFE1;
292 292
293 - &.branch { 293 + &.branch {
294 border:none; 294 border:none;
295 font-size:13px; 295 font-size:13px;
296 background: #474D57; 296 background: #474D57;
@@ -300,73 +300,71 @@ table.no-borders { @@ -300,73 +300,71 @@ table.no-borders {
300 } 300 }
301 } 301 }
302 302
303 -.event_label { 303 +.event_label {
304 @extend .label; 304 @extend .label;
305 background-color: #999; 305 background-color: #999;
306 306
307 - &.pushed { 307 + &.pushed {
308 background-color: #3A87AD; 308 background-color: #3A87AD;
309 } 309 }
310 310
311 - &.opened { 311 + &.opened {
312 background-color: #468847; 312 background-color: #468847;
313 } 313 }
314 314
315 - &.closed { 315 + &.closed {
316 background-color: #B94A48; 316 background-color: #B94A48;
317 } 317 }
318 318
319 - &.merged { 319 + &.merged {
320 background-color: #2A2; 320 background-color: #2A2;
321 } 321 }
322 } 322 }
323 323
324 -img.avatar { 324 +img.avatar {
325 float:left; 325 float:left;
326 margin-right:15px; 326 margin-right:15px;
327 width:40px; 327 width:40px;
328 - -webkit-border-radius: 4px;  
329 - -moz-border-radius: 4px;  
330 - border-radius: 4px; 328 + border:2px solid #ddd;
331 329
332 - &.s16 { 330 + &.s16 {
333 width:16px; 331 width:16px;
334 } 332 }
335 - &.s24 { 333 + &.s24 {
336 width:24px; 334 width:24px;
337 } 335 }
338 - &.s32 { 336 + &.s32 {
339 width:32px; 337 width:32px;
340 } 338 }
341 } 339 }
342 340
343 -img.lil_av { 341 +img.lil_av {
344 padding-left: 4px; 342 padding-left: 4px;
345 padding-right:3px; 343 padding-right:3px;
346 } 344 }
347 345
348 -form { 346 +form {
349 @extend .form-horizontal; 347 @extend .form-horizontal;
350 348
351 - .actions { 349 + .actions {
352 @extend .form-actions; 350 @extend .form-actions;
353 } 351 }
354 352
355 - .clearfix { 353 + .clearfix {
356 @extend .control-group; 354 @extend .control-group;
357 } 355 }
358 356
359 - .input { 357 + .input {
360 @extend .controls; 358 @extend .controls;
361 } 359 }
362 360
363 - label { 361 + label {
364 @extend .control-label; 362 @extend .control-label;
365 } 363 }
366 - .xlarge { 364 + .xlarge {
367 @extend .input-xlarge; 365 @extend .input-xlarge;
368 } 366 }
369 - .xxlarge { 367 + .xxlarge {
370 @extend .input-xxlarge; 368 @extend .input-xxlarge;
371 } 369 }
372 } 370 }
@@ -375,25 +373,25 @@ form { @@ -375,25 +373,25 @@ form {
375 * List li block element #1 373 * List li block element #1
376 * 374 *
377 */ 375 */
378 -.wll { 376 +.wll {
379 background-color: #FFF; 377 background-color: #FFF;
380 padding: 10px 5px; 378 padding: 10px 5px;
381 min-height: 20px; 379 min-height: 20px;
382 border-bottom: 1px solid #eee; 380 border-bottom: 1px solid #eee;
383 border-bottom: 1px solid rgba(0, 0, 0, 0.05); 381 border-bottom: 1px solid rgba(0, 0, 0, 0.05);
384 - &.smoke { 382 + &.smoke {
385 background-color:#f5f5f5; 383 background-color:#f5f5f5;
386 } 384 }
387 - &:hover { 385 + &:hover {
388 background:$hover; 386 background:$hover;
389 } 387 }
390 &:last-child { border:none } 388 &:last-child { border:none }
391 p { padding-top:5px; margin:0; color:$style_color;} 389 p { padding-top:5px; margin:0; color:$style_color;}
392 .author { color: #999; } 390 .author { color: #999; }
393 - p { 391 + p {
394 color:#222; 392 color:#222;
395 margin-bottom: 0; 393 margin-bottom: 0;
396 - img { 394 + img {
397 position:relative; 395 position:relative;
398 top:3px; 396 top:3px;
399 } 397 }
@@ -405,7 +403,7 @@ form { @@ -405,7 +403,7 @@ form {
405 * Block element #2 403 * Block element #2
406 * 404 *
407 */ 405 */
408 -.entry { 406 +.entry {
409 position: relative; 407 position: relative;
410 padding: 7px 15px; 408 padding: 7px 15px;
411 margin-bottom: 18px; 409 margin-bottom: 18px;
@@ -427,10 +425,10 @@ form { @@ -427,10 +425,10 @@ form {
427 border: 1px solid #ccc; 425 border: 1px solid #ccc;
428 426
429 427
430 - p { 428 + p {
431 color:$style_color; 429 color:$style_color;
432 margin-bottom: 0; 430 margin-bottom: 0;
433 - img { 431 + img {
434 position:relative; 432 position:relative;
435 top:3px; 433 top:3px;
436 } 434 }
@@ -442,18 +440,18 @@ form { @@ -442,18 +440,18 @@ form {
442 * Big UI Block for show page content 440 * Big UI Block for show page content
443 * 441 *
444 */ 442 */
445 -.ui-box { 443 +.ui-box {
446 background:#F9F9F9; 444 background:#F9F9F9;
447 margin-bottom: 25px; 445 margin-bottom: 25px;
448 @include round-borders-all(4px); 446 @include round-borders-all(4px);
449 border-color: #CCC; 447 border-color: #CCC;
450 @include solid_shade; 448 @include solid_shade;
451 449
452 - ul { 450 + ul {
453 margin:0; 451 margin:0;
454 } 452 }
455 453
456 - h5, .title { 454 + h5, .title {
457 padding: 0 10px; 455 padding: 0 10px;
458 @include round-borders-top(4px); 456 @include round-borders-top(4px);
459 border-bottom: 1px solid #bbb; 457 border-bottom: 1px solid #bbb;
@@ -463,30 +461,30 @@ form { @@ -463,30 +461,30 @@ form {
463 background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); 461 background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
464 background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf); 462 background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf);
465 463
466 - &.small { 464 + &.small {
467 line-height: 28px; 465 line-height: 28px;
468 font-size: 14px; 466 font-size: 14px;
469 line-height:28px; 467 line-height:28px;
470 text-shadow: 0 1px 1px white; 468 text-shadow: 0 1px 1px white;
471 } 469 }
472 470
473 - form { 471 + form {
474 padding:9px 0; 472 padding:9px 0;
475 margin:0px; 473 margin:0px;
476 } 474 }
477 475
478 - .nav-pills {  
479 - li { 476 + .nav-pills {
  477 + li {
480 padding:3px 0; 478 padding:3px 0;
481 &.active a { background-color:$style_color; } 479 &.active a { background-color:$style_color; }
482 - a { 480 + a {
483 border-radius:7px; 481 border-radius:7px;
484 } 482 }
485 } 483 }
486 } 484 }
487 } 485 }
488 486
489 - .bottom { 487 + .bottom {
490 background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); 488 background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
491 background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf); 489 background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf);
492 background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf); 490 background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
@@ -496,13 +494,13 @@ form { @@ -496,13 +494,13 @@ form {
496 border-top: 1px solid #bbb; 494 border-top: 1px solid #bbb;
497 } 495 }
498 496
499 - &.padded {  
500 - h5, .title { 497 + &.padded {
  498 + h5, .title {
501 margin: -20px; 499 margin: -20px;
502 margin-bottom: 0; 500 margin-bottom: 0;
503 padding: 5px 20px; 501 padding: 5px 20px;
504 } 502 }
505 - .middle_title { 503 + .middle_title {
506 background:#f5f5f5; 504 background:#f5f5f5;
507 margin:20px -20px; 505 margin:20px -20px;
508 padding: 0 20px; 506 padding: 0 20px;
@@ -512,7 +510,7 @@ form { @@ -512,7 +510,7 @@ form {
512 color:#777; 510 color:#777;
513 } 511 }
514 } 512 }
515 - .row_title { 513 + .row_title {
516 font-weight:bold; 514 font-weight:bold;
517 color:#444; 515 color:#444;
518 &:hover { 516 &:hover {
@@ -523,12 +521,12 @@ form { @@ -523,12 +521,12 @@ form {
523 521
524 li, .wll { 522 li, .wll {
525 padding:10px; 523 padding:10px;
526 - &:first-child { 524 + &:first-child {
527 @include round-borders-top(4px); 525 @include round-borders-top(4px);
528 border-top:none; 526 border-top:none;
529 } 527 }
530 528
531 - &:last-child { 529 + &:last-child {
532 @include round-borders-bottom(4px); 530 @include round-borders-bottom(4px);
533 border:none; 531 border:none;
534 } 532 }
@@ -537,10 +535,10 @@ form { @@ -537,10 +535,10 @@ form {
537 } 535 }
538 536
539 table.admin-table { 537 table.admin-table {
540 - @extend .table-bordered; 538 + @extend .table-bordered;
541 @extend .zebra-striped; 539 @extend .zebra-striped;
542 @include solid_shade; 540 @include solid_shade;
543 - th { 541 + th {
544 border-color: #CCC; 542 border-color: #CCC;
545 border-bottom: 1px solid #bbb; 543 border-bottom: 1px solid #bbb;
546 background:#eee; 544 background:#eee;
@@ -551,7 +549,7 @@ table.admin-table { @@ -551,7 +549,7 @@ table.admin-table {
551 } 549 }
552 } 550 }
553 551
554 -.field_with_errors { 552 +.field_with_errors {
555 display:inline; 553 display:inline;
556 } 554 }
557 555
@@ -563,13 +561,13 @@ ul.breadcrumb { @@ -563,13 +561,13 @@ ul.breadcrumb {
563 text-shadow: 0 1px 0 white 561 text-shadow: 0 1px 0 white
564 } 562 }
565 563
566 - a { 564 + a {
567 color:#474D57; 565 color:#474D57;
568 font-weight:bold; 566 font-weight:bold;
569 font-size:14px; 567 font-size:14px;
570 } 568 }
571 569
572 - .arrow { 570 + .arrow {
573 background: url("images.png") no-repeat -85px -77px; 571 background: url("images.png") no-repeat -85px -77px;
574 width: 19px; 572 width: 19px;
575 height: 16px; 573 height: 16px;
@@ -581,18 +579,18 @@ ul.breadcrumb { @@ -581,18 +579,18 @@ ul.breadcrumb {
581 } 579 }
582 } 580 }
583 581
584 -.nothing_here_message { 582 +.nothing_here_message {
585 text-align:center; 583 text-align:center;
586 padding:20px; 584 padding:20px;
587 color:#777; 585 color:#777;
588 } 586 }
589 587
590 /** 588 /**
591 - * UI box element 589 + * UI box element
592 * contains top, middle, bottom blocks 590 * contains top, middle, bottom blocks
593 - * 591 + *
594 */ 592 */
595 -.main_box { 593 +.main_box {
596 @extend .borders; 594 @extend .borders;
597 @extend .prepend-top-20; 595 @extend .prepend-top-20;
598 @extend .append-bottom-20; 596 @extend .append-bottom-20;
@@ -608,9 +606,9 @@ ul.breadcrumb { @@ -608,9 +606,9 @@ ul.breadcrumb {
608 } 606 }
609 } 607 }
610 608
611 - .top_box_content,  
612 - .middle_box_content,  
613 - .bottom_box_content { 609 + .top_box_content,
  610 + .middle_box_content,
  611 + .bottom_box_content {
614 padding:15px; 612 padding:15px;
615 613
616 pre { 614 pre {
@@ -621,7 +619,7 @@ ul.breadcrumb { @@ -621,7 +619,7 @@ ul.breadcrumb {
621 } 619 }
622 } 620 }
623 621
624 - .middle_box_content { 622 + .middle_box_content {
625 border-radius:0; 623 border-radius:0;
626 border:none; 624 border:none;
627 font-size:12px; 625 font-size:12px;
@@ -630,20 +628,20 @@ ul.breadcrumb { @@ -630,20 +628,20 @@ ul.breadcrumb {
630 border-top:1px solid #eee; 628 border-top:1px solid #eee;
631 } 629 }
632 630
633 - .bottom_box_content { 631 + .bottom_box_content {
634 border-top:1px solid #eee; 632 border-top:1px solid #eee;
635 } 633 }
636 } 634 }
637 635
638 -input[type=text] {  
639 - &.large_text { 636 +input[type=text] {
  637 + &.large_text {
640 padding:6px; 638 padding:6px;
641 font-size:16px; 639 font-size:16px;
642 } 640 }
643 } 641 }
644 642
645 -p {  
646 - &.slead { 643 +p {
  644 + &.slead {
647 color:#456; 645 color:#456;
648 font-size:16px; 646 font-size:16px;
649 margin-bottom: 12px; 647 margin-bottom: 12px;
@@ -652,7 +650,7 @@ p { @@ -652,7 +650,7 @@ p {
652 } 650 }
653 } 651 }
654 652
655 -h3.page_title { 653 +h3.page_title {
656 color:#456; 654 color:#456;
657 font-size:20px; 655 font-size:20px;
658 font-weight: normal; 656 font-weight: normal;
@@ -660,15 +658,15 @@ h3.page_title { @@ -660,15 +658,15 @@ h3.page_title {
660 } 658 }
661 659
662 /** 660 /**
663 - * File content holder 661 + * File content holder
664 * 662 *
665 */ 663 */
666 -.file_holder { 664 +.file_holder {
667 border:1px solid #CCC; 665 border:1px solid #CCC;
668 margin-bottom:1em; 666 margin-bottom:1em;
669 @include solid_shade; 667 @include solid_shade;
670 668
671 - .file_title { 669 + .file_title {
672 border-bottom: 1px solid #bbb; 670 border-bottom: 1px solid #bbb;
673 background:#eee; 671 background:#eee;
674 background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf)); 672 background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
@@ -683,16 +681,16 @@ h3.page_title { @@ -683,16 +681,16 @@ h3.page_title {
683 padding: 9px 10px; 681 padding: 9px 10px;
684 height:18px; 682 height:18px;
685 683
686 - .options { 684 + .options {
687 float:right; 685 float:right;
688 margin-top: -5px; 686 margin-top: -5px;
689 } 687 }
690 688
691 - .file_name { 689 + .file_name {
692 color:$style_color; 690 color:$style_color;
693 font-size:14px; 691 font-size:14px;
694 text-shadow: 0 1px 1px #fff; 692 text-shadow: 0 1px 1px #fff;
695 - small { 693 + small {
696 color:#999; 694 color:#999;
697 font-size:13px; 695 font-size:13px;
698 } 696 }
@@ -702,21 +700,21 @@ h3.page_title { @@ -702,21 +700,21 @@ h3.page_title {
702 background:#fff; 700 background:#fff;
703 font-size: 11px; 701 font-size: 11px;
704 702
705 - &.wiki { 703 + &.wiki {
706 font-size: 13px; 704 font-size: 13px;
707 - code { 705 + code {
708 padding:0 4px; 706 padding:0 4px;
709 } 707 }
710 padding:20px; 708 padding:20px;
711 - h1, h2 {  
712 - line-height: 46px;  
713 - }  
714 - h3, h4 {  
715 - line-height: 40px;  
716 - } 709 + h1, h2 {
  710 + line-height: 46px;
  711 + }
  712 + h3, h4 {
  713 + line-height: 40px;
  714 + }
717 } 715 }
718 716
719 - &.image_file { 717 + &.image_file {
720 background:#eee; 718 background:#eee;
721 text-align:center; 719 text-align:center;
722 img { 720 img {
@@ -725,27 +723,27 @@ h3.page_title { @@ -725,27 +723,27 @@ h3.page_title {
725 } 723 }
726 } 724 }
727 725
728 - &.blob_file { 726 + &.blob_file {
729 727
730 } 728 }
731 729
732 /** 730 /**
733 * Blame file 731 * Blame file
734 */ 732 */
735 - &.blame {  
736 - tr { 733 + &.blame {
  734 + tr {
737 border-bottom: 1px solid #eee; 735 border-bottom: 1px solid #eee;
738 } 736 }
739 - td { 737 + td {
740 padding:5px; 738 padding:5px;
741 } 739 }
742 - .author,  
743 - .blame_commit { 740 + .author,
  741 + .blame_commit {
744 background:#f5f5f5; 742 background:#f5f5f5;
745 vertical-align:top; 743 vertical-align:top;
746 } 744 }
747 - .lines {  
748 - pre { 745 + .lines {
  746 + pre {
749 padding:0; 747 padding:0;
750 margin:0; 748 margin:0;
751 background:none; 749 background:none;
@@ -754,27 +752,27 @@ h3.page_title { @@ -754,27 +752,27 @@ h3.page_title {
754 } 752 }
755 } 753 }
756 754
757 - &.logs { 755 + &.logs {
758 background:#eee; 756 background:#eee;
759 max-height: 700px; 757 max-height: 700px;
760 overflow-y: auto; 758 overflow-y: auto;
761 759
762 - ol { 760 + ol {
763 margin-left:40px; 761 margin-left:40px;
764 padding: 10px 0; 762 padding: 10px 0;
765 border-left: 1px solid #CCC; 763 border-left: 1px solid #CCC;
766 margin-bottom:0; 764 margin-bottom:0;
767 background: white; 765 background: white;
768 - li { 766 + li {
769 color:#888; 767 color:#888;
770 - p { 768 + p {
771 margin:0; 769 margin:0;
772 color:#333; 770 color:#333;
773 line-height:24px; 771 line-height:24px;
774 padding-left: 10px; 772 padding-left: 10px;
775 } 773 }
776 774
777 - &:hover { 775 + &:hover {
778 background:$hover; 776 background:$hover;
779 } 777 }
780 } 778 }
@@ -784,7 +782,7 @@ h3.page_title { @@ -784,7 +782,7 @@ h3.page_title {
784 /** 782 /**
785 * Code file 783 * Code file
786 */ 784 */
787 - &.code { 785 + &.code {
788 padding:0; 786 padding:0;
789 td.code { 787 td.code {
790 width: 100%; 788 width: 100%;
app/assets/stylesheets/sections/header.scss
@@ -2,14 +2,14 @@ @@ -2,14 +2,14 @@
2 * Application Header 2 * Application Header
3 * 3 *
4 */ 4 */
5 -header { 5 +header {
6 width:100%; 6 width:100%;
7 padding:0; 7 padding:0;
8 margin:0; 8 margin:0;
9 top:1px; 9 top:1px;
10 left:0; 10 left:0;
11 background: #F1F1F1; /* for non-css3 browsers */ 11 background: #F1F1F1; /* for non-css3 browsers */
12 - border-bottom: 1px solid #ccc; 12 + border-bottom: 1px solid #ccc;
13 box-shadow: 0 -1px 0 white inset; 13 box-shadow: 0 -1px 0 white inset;
14 -moz-box-shadow: 0 -1px 0 white inset; 14 -moz-box-shadow: 0 -1px 0 white inset;
15 -webkit-box-shadow: 0 -1px 0 white inset; 15 -webkit-box-shadow: 0 -1px 0 white inset;
@@ -17,7 +17,7 @@ header { @@ -17,7 +17,7 @@ header {
17 height:60px; 17 height:60px;
18 18
19 /** 19 /**
20 - * 20 + *
21 * Logo holder 21 * Logo holder
22 * 22 *
23 */ 23 */
@@ -27,10 +27,10 @@ header { @@ -27,10 +27,10 @@ header {
27 position:relative; 27 position:relative;
28 top:-5px; 28 top:-5px;
29 29
30 - a { 30 + a {
31 float:left; 31 float:left;
32 32
33 - h1 { 33 + h1 {
34 text-indent:-9999px; 34 text-indent:-9999px;
35 width:102px; 35 width:102px;
36 background: url('logo_text.png') no-repeat 0px -3px; 36 background: url('logo_text.png') no-repeat 0px -3px;
@@ -54,8 +54,8 @@ header { @@ -54,8 +54,8 @@ header {
54 margin-top: -10px; 54 margin-top: -10px;
55 } 55 }
56 } 56 }
57 - .container {  
58 - .top_panel_content { 57 + .container {
  58 + .top_panel_content {
59 margin:auto; 59 margin:auto;
60 position:relative; 60 position:relative;
61 padding:15px 0; 61 padding:15px 0;
@@ -63,7 +63,7 @@ header { @@ -63,7 +63,7 @@ header {
63 } 63 }
64 64
65 /** 65 /**
66 - * 66 + *
67 * Project / Area name 67 * Project / Area name
68 * 68 *
69 */ 69 */
@@ -78,10 +78,10 @@ header { @@ -78,10 +78,10 @@ header {
78 text-shadow: 0 1px 1px #FFF; 78 text-shadow: 0 1px 1px #FFF;
79 } 79 }
80 80
81 - .fbtn { 81 + .fbtn {
82 float: right; 82 float: right;
83 margin-right:10px; 83 margin-right:10px;
84 - .btn { 84 + .btn {
85 margin-left:7px; 85 margin-left:7px;
86 background: #F1F1F1; 86 background: #F1F1F1;
87 border: 1px solid #CCC; 87 border: 1px solid #CCC;
@@ -90,13 +90,13 @@ header { @@ -90,13 +90,13 @@ header {
90 90
91 91
92 /** 92 /**
93 - * 93 + *
94 * Search box 94 * Search box
95 * 95 *
96 */ 96 */
97 - .search { 97 + .search {
98 float: right; 98 float: right;
99 - margin-right: 50px; 99 + margin-right: 45px;
100 100
101 .search-input { 101 .search-input {
102 @extend .span2; 102 @extend .span2;
@@ -110,7 +110,7 @@ header { @@ -110,7 +110,7 @@ header {
110 } 110 }
111 111
112 /** 112 /**
113 - * 113 + *
114 * Account box 114 * Account box
115 * 115 *
116 */ 116 */
@@ -125,13 +125,13 @@ header { @@ -125,13 +125,13 @@ header {
125 display: block; 125 display: block;
126 cursor: pointer; 126 cursor: pointer;
127 img { 127 img {
128 - border-radius: 4px; 128 + @include border-radius(4px);
129 right: 5px; 129 right: 5px;
130 position: absolute; 130 position: absolute;
131 - width: 31px;  
132 - height: 31px; 131 + width: 28px;
  132 + height: 28px;
133 display: block; 133 display: block;
134 - top: 0; 134 + top: 2px;
135 &:after { 135 &:after {
136 content: " "; 136 content: " ";
137 display: block; 137 display: block;
@@ -186,7 +186,7 @@ header { @@ -186,7 +186,7 @@ header {
186 width: 100px; 186 width: 100px;
187 position: absolute; 187 position: absolute;
188 right: 10px; 188 right: 10px;
189 - top: 46px; 189 + top: 42px;
190 margin-top: 0; 190 margin-top: 0;
191 float: right; 191 float: right;
192 box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); 192 box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
app/assets/stylesheets/themes/ui_basic.scss
1 /** 1 /**
2 - * This file represent some UI that can be changed  
3 - * during web app restyle or theme select. 2 + * This file represent some UI that can be changed
  3 + * during web app restyle or theme select.
4 * 4 *
5 */ 5 */
6 -.ui_basic { 6 +.ui_basic {
7 /* 7 /*
8 * Common styles 8 * Common styles
9 * 9 *
10 */ 10 */
11 a { 11 a {
12 color: $link_color; 12 color: $link_color;
13 - &:hover {  
14 - text-decoration:none; 13 + &:hover {
  14 + text-decoration:none;
15 color: $blue_link; 15 color: $blue_link;
16 } 16 }
17 } 17 }
app/assets/stylesheets/themes/ui_mars.scss
1 /** 1 /**
2 - * This file represent some UI that can be changed  
3 - * during web app restyle or theme select.  
4 - * 2 + * This file represent some UI that can be changed
  3 + * during web app restyle or theme select.
  4 + *
5 * Next items should be placed there 5 * Next items should be placed there
6 * - link colors 6 * - link colors
7 * - header restyles 7 * - header restyles
@@ -13,20 +13,20 @@ @@ -13,20 +13,20 @@
13 * Application Header 13 * Application Header
14 * 14 *
15 */ 15 */
16 - header { 16 + header {
17 background: #474D57 url('bg-header.png') repeat-x bottom; 17 background: #474D57 url('bg-header.png') repeat-x bottom;
18 box-shadow:none; 18 box-shadow:none;
19 border-bottom: 1px solid #444; 19 border-bottom: 1px solid #444;
20 20
21 - .fbtn {  
22 - .btn { 21 + .fbtn {
  22 + .btn {
23 margin-left:8px; 23 margin-left:8px;
24 background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #595D63), to(#31363E)); 24 background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #595D63), to(#31363E));
25 background-image: -webkit-linear-gradient(#595D63 6.6%, #31363E); 25 background-image: -webkit-linear-gradient(#595D63 6.6%, #31363E);
26 background-image: -moz-linear-gradient(#595D63 6.6%, #31363E); 26 background-image: -moz-linear-gradient(#595D63 6.6%, #31363E);
27 background-image: -o-linear-gradient(#595D63 6.6%, #31363E); 27 background-image: -o-linear-gradient(#595D63 6.6%, #31363E);
28 font-size: 12px; 28 font-size: 12px;
29 - &:hover { 29 + &:hover {
30 background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #595D63), to(#2C2F35)); 30 background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #595D63), to(#2C2F35));
31 background-image: -webkit-linear-gradient(#595D63 6.6%, #2C2F35); 31 background-image: -webkit-linear-gradient(#595D63 6.6%, #2C2F35);
32 background-image: -moz-linear-gradient(#595D63 6.6%, #202227); 32 background-image: -moz-linear-gradient(#595D63 6.6%, #202227);
@@ -39,10 +39,10 @@ @@ -39,10 +39,10 @@
39 text-shadow: 0 -1px 0 #000000; 39 text-shadow: 0 -1px 0 #000000;
40 } 40 }
41 } 41 }
42 - .search { 42 + .search {
43 float: right; 43 float: right;
44 - margin-right: 55px;  
45 - .search-input { 44 + margin-right: 45px;
  45 + .search-input {
46 border: 1px solid rgba(0, 0, 0, 0.7); 46 border: 1px solid rgba(0, 0, 0, 0.7);
47 box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2), 0 2px 2px rgba(0, 0, 0, 0.4) inset; 47 box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2), 0 2px 2px rgba(0, 0, 0, 0.4) inset;
48 background-color: #D2D5DA; 48 background-color: #D2D5DA;
@@ -57,8 +57,8 @@ @@ -57,8 +57,8 @@
57 color: #666; 57 color: #666;
58 } 58 }
59 .app_logo { 59 .app_logo {
60 - a {  
61 - h1 { 60 + a {
  61 + h1 {
62 background: url('images.png') no-repeat -3px -6px; 62 background: url('images.png') no-repeat -3px -6px;
63 width: 65px; 63 width: 65px;
64 height: 26px; 64 height: 26px;
app/assets/stylesheets/themes/ui_modern.scss
@@ -91,7 +91,7 @@ @@ -91,7 +91,7 @@
91 */ 91 */
92 .search { 92 .search {
93 float: right; 93 float: right;
94 - margin-right: 55px; 94 + margin-right: 45px;
95 .search-input { 95 .search-input {
96 border: 1px solid rgba(0, 0, 0, 0.7); 96 border: 1px solid rgba(0, 0, 0, 0.7);
97 box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2), 0 2px 2px rgba(0, 0, 0, 0.4) inset; 97 box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2), 0 2px 2px rgba(0, 0, 0, 0.4) inset;
@@ -127,6 +127,7 @@ @@ -127,6 +127,7 @@
127 .account-box { 127 .account-box {
128 top:6px; 128 top:6px;
129 img { 129 img {
  130 + top:1px;
130 right: 5px; 131 right: 5px;
131 width: 26px; 132 width: 26px;
132 height: 26px; 133 height: 26px;
app/helpers/application_helper.rb
@@ -110,7 +110,7 @@ module ApplicationHelper @@ -110,7 +110,7 @@ module ApplicationHelper
110 when :admin_root; controller.controller_name == "dashboard" 110 when :admin_root; controller.controller_name == "dashboard"
111 when :admin_users; controller.controller_name == 'users' 111 when :admin_users; controller.controller_name == 'users'
112 when :admin_projects; controller.controller_name == "projects" 112 when :admin_projects; controller.controller_name == "projects"
113 - when :admin_emails; controller.controller_name == 'mailer' 113 + when :admin_hooks; controller.controller_name == 'hooks'
114 when :admin_resque; controller.controller_name == 'resque' 114 when :admin_resque; controller.controller_name == 'resque'
115 when :admin_logs; controller.controller_name == 'logs' 115 when :admin_logs; controller.controller_name == 'logs'
116 116
app/helpers/gitlab_markdown_helper.rb
@@ -12,53 +12,10 @@ module GitlabMarkdownHelper @@ -12,53 +12,10 @@ module GitlabMarkdownHelper
12 "{gfm-extraction-#{md5}}" 12 "{gfm-extraction-#{md5}}"
13 end 13 end
14 14
15 - # match 1 2 3 4 5 6  
16 - text.gsub!(/(\W)?(@([\w\._]+)|[#!$](\d+)|([\h]{6,40}))(\W)?/) do |match|  
17 - prefix = $1  
18 - reference = $2  
19 - user_name = $3  
20 - issue_id = $4  
21 - merge_request_id = $4  
22 - snippet_id = $4  
23 - commit_id = $5  
24 - suffix = $6 15 + # TODO: add popups with additional information
25 16
26 - # TODO: add popups with additional information  
27 - ref_link = case reference  
28 -  
29 - # team member: @foo  
30 - when /^@/  
31 - user = @project.users.where(name: user_name).first  
32 - member = @project.users_projects.where(user_id: user).first if user  
33 - link_to("@#{user_name}", project_team_member_path(@project, member), html_options.merge(class: "gfm gfm-team_member #{html_options[:class]}")) if member  
34 -  
35 - # issue: #123  
36 - when /^#/  
37 - # avoid HTML entities  
38 - unless prefix.try(:end_with?, "&") && suffix.try(:start_with?, ";")  
39 - issue = @project.issues.where(id: issue_id).first  
40 - link_to("##{issue_id}", project_issue_path(@project, issue), html_options.merge(title: "Issue: #{issue.title}", class: "gfm gfm-issue #{html_options[:class]}")) if issue  
41 - end  
42 -  
43 - # merge request: !123  
44 - when /^!/  
45 - merge_request = @project.merge_requests.where(id: merge_request_id).first  
46 - link_to("!#{merge_request_id}", project_merge_request_path(@project, merge_request), html_options.merge(title: "Merge Request: #{merge_request.title}", class: "gfm gfm-merge_request #{html_options[:class]}")) if merge_request  
47 -  
48 - # snippet: $123  
49 - when /^\$/  
50 - snippet = @project.snippets.where(id: snippet_id).first  
51 - link_to("$#{snippet_id}", project_snippet_path(@project, snippet), html_options.merge(title: "Snippet: #{snippet.title}", class: "gfm gfm-snippet #{html_options[:class]}")) if snippet  
52 -  
53 - # commit: 123456...  
54 - when /^\h/  
55 - commit = @project.commit(commit_id)  
56 - link_to(commit_id, project_commit_path(@project, id: commit.id), html_options.merge(title: "Commit: #{commit.author_name} - #{CommitDecorator.new(commit).title}", class: "gfm gfm-commit #{html_options[:class]}")) if commit  
57 -  
58 - end # case  
59 -  
60 - ref_link.nil? ? match : "#{prefix}#{ref_link}#{suffix}"  
61 - end # gsub 17 + parser = Gitlab::Markdown.new(@project, html_options)
  18 + text = parser.parse(text)
62 19
63 # Insert pre block extractions 20 # Insert pre block extractions
64 text.gsub!(/\{gfm-extraction-(\h{32})\}/) do 21 text.gsub!(/\{gfm-extraction-(\h{32})\}/) do
app/views/errors/access_denied.html.haml
1 -.alert-message.block-message.error  
2 - %h3 Access Denied  
3 - %hr  
4 - %p You are not allowed to access this page.  
5 - %p Read more about project permissions #{link_to "here", help_permissions_path, class: "vlink"} 1 +%h1 Access Denied
  2 +%hr
  3 +%h2 You are not allowed to access this page.
  4 +%p Read more about project permissions #{link_to "here", help_permissions_path, class: "vlink"}
app/views/errors/git_not_found.html.haml
1 -.alert-message.block-message.error  
2 - %h3 Git Resource Not found  
3 - %hr  
4 - %p  
5 - Application can't get access to some  
6 - %span.label branch  
7 - or  
8 - %span.label commit  
9 - in your repository. It may have been moved. 1 +%h1 404
  2 +%hr
  3 +%h2 Git Resource Not found
  4 +%p
  5 + Application can't get access to some branch or commit in your repository. It
  6 + may have been moved.
app/views/errors/gitolite.html.haml
1 -.alert-message.block-message.error  
2 - %h3 Gitolite Error  
3 - %h4 Application can't get access to your gitolite system. 1 +%h1 Git Error
  2 +%hr
  3 +%h2 Gitlab was unable to access your Gitolite system.
4 4
5 -%h4 Tips for Administrator:  
6 -  
7 -%ul  
8 - %li  
9 - %p  
10 - Check git logs in admin area  
11 - %li  
12 - %p  
13 - Check config/gitlab.yml for correct settings.  
14 - %li  
15 - %p  
16 - Diagnostic tool: 5 +.git_error_tips
  6 + %h4 Tips for Administrator:
  7 + %ol
  8 + %li
  9 + %p
  10 + Check git logs in admin area
  11 + %li
  12 + %p
  13 + Check config/gitlab.yml for correct settings.
  14 + %li
  15 + %p
  16 + Diagnostic tool:
  17 + %pre
  18 + bundle exec rake gitlab:app:status RAILS_ENV=production
  19 + %li
  20 + %p
  21 + Permissions:
17 %pre 22 %pre
18 - bundle exec rake gitlab:app:status RAILS_ENV=production  
19 - %li  
20 - %p  
21 - Permissions:  
22 - %pre  
23 - = preserve do  
24 - sudo chmod -R 770 /home/git/repositories/  
25 - sudo chown -R git:git /home/git/repositories/  
26 - sudo chown gitlab:gitlab /home/git/repositories/**/hooks/post-receive 23 + = preserve do
  24 + sudo chmod -R 770 /home/git/repositories/
  25 + sudo chown -R git:git /home/git/repositories/
  26 + sudo chown gitlab:gitlab /home/git/repositories/**/hooks/post-receive
27 27
app/views/errors/not_found.html.haml
1 -.alert-message.block-message.error  
2 - %h3 Not found  
3 - %hr  
4 - %p The resource you were looking for doesn't exist.  
5 - %p You may have mistyped the address or it may have been removed. 1 +%h1 404
  2 +%hr
  3 +%h2 The resource you were looking for doesn't exist.
  4 +%p You may have mistyped the address or the page may have moved.
app/views/layouts/admin.html.haml
@@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
14 = link_to "Users", admin_users_path 14 = link_to "Users", admin_users_path
15 %li{class: tab_class(:admin_logs)} 15 %li{class: tab_class(:admin_logs)}
16 = link_to "Logs", admin_logs_path 16 = link_to "Logs", admin_logs_path
17 - %li{class: tab_class(:admin_emails)} 17 + %li{class: tab_class(:admin_hooks)}
18 = link_to "Hooks", admin_hooks_path 18 = link_to "Hooks", admin_hooks_path
19 %li{class: tab_class(:admin_resque)} 19 %li{class: tab_class(:admin_resque)}
20 = link_to "Resque", admin_resque_path 20 = link_to "Resque", admin_resque_path
app/views/layouts/error.html.haml
@@ -6,5 +6,5 @@ @@ -6,5 +6,5 @@
6 = render "layouts/head_panel", title: "" 6 = render "layouts/head_panel", title: ""
7 .container 7 .container
8 .content 8 .content
9 - %br  
10 - %h3= yield 9 + %center.padded.prepend-top-20
  10 + = yield
lib/gitlab/markdown.rb 0 → 100644
@@ -0,0 +1,98 @@ @@ -0,0 +1,98 @@
  1 +module Gitlab
  2 + # Custom parsing for Gitlab-flavored Markdown
  3 + #
  4 + # Examples
  5 + #
  6 + # >> m = Markdown.new(...)
  7 + #
  8 + # >> m.parse("Hey @david, can you fix this?")
  9 + # => "Hey <a href="/gitlab/team_members/1">@david</a>, can you fix this?"
  10 + #
  11 + # >> m.parse("Commit 35d5f7c closes #1234")
  12 + # => "Commit <a href="/gitlab/commits/35d5f7c">35d5f7c</a> closes <a href="/gitlab/issues/1234">#1234</a>"
  13 + class Markdown
  14 + include Rails.application.routes.url_helpers
  15 + include ActionView::Helpers
  16 +
  17 + REFERENCE_PATTERN = %r{
  18 + ([^\w&;])? # Prefix (1)
  19 + ( # Reference (2)
  20 + @([\w\._]+) # User name (3)
  21 + |[#!$](\d+) # Issue/MR/Snippet ID (4)
  22 + |([\h]{6,40}) # Commit ID (5)
  23 + )
  24 + ([^\w&;])? # Suffix (6)
  25 + }x.freeze
  26 +
  27 + attr_reader :html_options
  28 +
  29 + def initialize(project, html_options = {})
  30 + @project = project
  31 + @html_options = html_options
  32 + end
  33 +
  34 + def parse(text)
  35 + text.gsub(REFERENCE_PATTERN) do |match|
  36 + prefix = $1 || ''
  37 + reference = $2
  38 + identifier = $3 || $4 || $5
  39 + suffix = $6 || ''
  40 +
  41 + if ref_link = reference_link(reference, identifier)
  42 + prefix + ref_link + suffix
  43 + else
  44 + match
  45 + end
  46 + end
  47 + end
  48 +
  49 + private
  50 +
  51 + # Private: Dispatches to a dedicated processing method based on reference
  52 + #
  53 + # reference - Object reference ("@1234", "!567", etc.)
  54 + # identifier - Object identifier (Issue ID, SHA hash, etc.)
  55 + #
  56 + # Returns string rendered by the processing method
  57 + def reference_link(reference, identifier)
  58 + case reference
  59 + when /^@/ then reference_user(identifier)
  60 + when /^#/ then reference_issue(identifier)
  61 + when /^!/ then reference_merge_request(identifier)
  62 + when /^\$/ then reference_snippet(identifier)
  63 + when /^\h/ then reference_commit(identifier)
  64 + end
  65 + end
  66 +
  67 + def reference_user(identifier)
  68 + if user = @project.users.where(name: identifier).first
  69 + member = @project.users_projects.where(user_id: user).first
  70 + link_to("@#{user.name}", project_team_member_path(@project, member), html_options.merge(class: "gfm gfm-team_member #{html_options[:class]}")) if member
  71 + end
  72 + end
  73 +
  74 + def reference_issue(identifier)
  75 + if issue = @project.issues.where(id: identifier).first
  76 + link_to("##{issue.id}", project_issue_path(@project, issue), html_options.merge(title: "Issue: #{issue.title}", class: "gfm gfm-issue #{html_options[:class]}"))
  77 + end
  78 + end
  79 +
  80 + def reference_merge_request(identifier)
  81 + if merge_request = @project.merge_requests.where(id: identifier).first
  82 + link_to("!#{merge_request.id}", project_merge_request_path(@project, merge_request), html_options.merge(title: "Merge Request: #{merge_request.title}", class: "gfm gfm-merge_request #{html_options[:class]}"))
  83 + end
  84 + end
  85 +
  86 + def reference_snippet(identifier)
  87 + if snippet = @project.snippets.where(id: identifier).first
  88 + link_to("$#{snippet.id}", project_snippet_path(@project, snippet), html_options.merge(title: "Snippet: #{snippet.title}", class: "gfm gfm-snippet #{html_options[:class]}"))
  89 + end
  90 + end
  91 +
  92 + def reference_commit(identifier)
  93 + if commit = @project.commit(identifier)
  94 + link_to(identifier, project_commit_path(@project, id: commit.id), html_options.merge(title: "Commit: #{commit.author_name} - #{CommitDecorator.new(commit).title}", class: "gfm gfm-commit #{html_options[:class]}"))
  95 + end
  96 + end
  97 + end
  98 +end
public/404.html
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 7
8 <body> 8 <body>
9 <h1>404</h1> 9 <h1>404</h1>
10 - <div class="alert-message block-message error"> 10 + <div>
11 <h2>The page you were looking for doesn't exist.</h2> 11 <h2>The page you were looking for doesn't exist.</h2>
12 <p>You may have mistyped the address or the page may have moved.</p> 12 <p>You may have mistyped the address or the page may have moved.</p>
13 </div> 13 </div>
public/422.html
@@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
8 <body> 8 <body>
9 <!-- This file lives in public/422.html --> 9 <!-- This file lives in public/422.html -->
10 <h1>422</h1> 10 <h1>422</h1>
11 - <div class="alert-message block-message error"> 11 + <div>
12 <h2>The change you wanted was rejected.</h2> 12 <h2>The change you wanted was rejected.</h2>
13 <p>Maybe you tried to change something you didn't have access to.</p> 13 <p>Maybe you tried to change something you didn't have access to.</p>
14 </div> 14 </div>
public/500.html
@@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
8 <body> 8 <body>
9 <!-- This file lives in public/500.html --> 9 <!-- This file lives in public/500.html -->
10 <h1>500</h1> 10 <h1>500</h1>
11 - <div class="alert-message block-message error"> 11 + <div>
12 <h2>We're sorry, but something went wrong.</h2> 12 <h2>We're sorry, but something went wrong.</h2>
13 <p>We've been notified about this issue and we'll take a look at it shortly.</p> 13 <p>We've been notified about this issue and we'll take a look at it shortly.</p>
14 </div> 14 </div>