├── .gitignore ├── git-logo.png ├── git-favicon.png ├── README.markdown ├── setup └── gitweb.css /.gitignore: -------------------------------------------------------------------------------- 1 | test/ -------------------------------------------------------------------------------- /git-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kogakure/gitweb-theme/HEAD/git-logo.png -------------------------------------------------------------------------------- /git-favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kogakure/gitweb-theme/HEAD/git-favicon.png -------------------------------------------------------------------------------- /README.markdown: -------------------------------------------------------------------------------- 1 | ![Maintenance](https://img.shields.io/maintenance/yes/2020.svg) 2 | ![GitHub Stars](https://img.shields.io/github/stars/kogakure/gitweb-theme.svg?style=social&label=Star) 3 | ![GitHub Forks](https://img.shields.io/github/forks/kogakure/gitweb-theme.svg?style=social&label=Fork) 4 | 5 | # Theme for gitweb 6 | 7 | This is an alternative theme for [gitweb] (tested with git web interface version 2.0.4). It is *strongly* inspired by GitHub. 8 | 9 | Fullsize screenshots available on [kogakure.github.io/gitweb-theme][gitweb-theme]. 10 | 11 | ## Installation 12 | The installation of this stylesheet is very easy: 13 | 14 | 1. Clone the repository to a location of your choice `git clone https://github.com/kogakure/gitweb-theme.git` 15 | 2. Run `./setup -vi --install` and your gitweb will be themed! 16 | - If you are on Ubuntu, then the script will default to gitweb's installation directory **/usr/share/gitweb/**. 17 | - If this is not where gitweb is located, then pass the directory to the script with the `--target` or `-t` option. 18 | 3. Of course you can just copy them to the new location too. 19 | 20 | If you see some missing things or errors, please create a ticket or fix it and send a pull request. 21 | 22 | ### Configuration file 23 | *Did you know?* 24 | 25 | Updating Gitweb can be quite time consuming because you have to adjust your settings in the `gitweb.cgi`. **You don’t have to!**. 26 | 27 | Create a file with the name `gitweb_config.perl` and put it into the same directory as `gitweb.cgi`. 28 | 29 | In this file you write only your custom settings and they will override the settings in `gitweb.cgi` like this: 30 | 31 | ```perl 32 | $GIT = "/bin/git"; 33 | $projectroot = "/www/git/repositories"; 34 | $project_maxdepth = 2009; 35 | $home_link_str = "Projekte"; 36 | $projects_list_group_categories = 1; 37 | $export_ok = "GITWEB_EXPORT_OK"; 38 | $feature{'avatar'}{'default'} = ['gravatar']; 39 | $feature{'highlight'}{'default'} = [1]; 40 | ``` 41 | 42 | ### Syntax highlighting 43 | Optionally, you can enable syntax highlighting for your code. Install the highlight package with your package manager and add this line to /etc/gitweb.conf: 44 | 45 | ```perl 46 | $feature{'highlight'}{'default'} = [1]; 47 | ``` 48 | 49 | ### Gravatar support 50 | You can enable Gravatar support with this line: 51 | 52 | ```perl 53 | $feature{'avatar'}{'default'} = ['gravatar']; 54 | ``` 55 | 56 | [gitweb]: http://git.or.cz/gitwiki/Gitweb 57 | [gitweb-theme]: https://kogakure.github.io/gitweb-theme/ 58 | 59 | ### Categories 60 | 61 | Gitweb and this theme support categories, which can be enabled by the following gitweb config option: 62 | 63 | ```perl 64 | $projects_list_group_categories = true;¬ 65 | ``` 66 | 67 | The category name for each repository is read from `.git/category`, in the same manner as `.git/description`. 68 | 69 | 70 | ## Setup Script 71 | 72 | ### Usage: 73 | - `./setup [-v|-i] [-t |--target ] [--install|--remove|--repair]` or: 74 | - `./setup [-V|-h|--version|--help]` 75 | 76 | This script will create symlinks to your gitweb install for themeing. The default location is **/usr/share/gitweb** unless set via `-t` or `--target`. 77 | 78 | ### Options: 79 | | Parameter | Description | 80 | | ----------------- | ----------------------------------------------------------------- | 81 | | -v, --verbose | Verbose output | 82 | | -i, --interactive | Pauses for confirmation at each step | 83 | | -t, --target | Where to create the symlinks, gitweb installation path | 84 | | -h, --help | Shows this usage message | 85 | | -V, --version | Displays version information | 86 | | --install | Adds '.bak' to original files and creates symlinks to theme files | 87 | | --remove | Deletes themed symlinks and restores the original files. | 88 | | --repair | Removes all theme files, then reinstalls | 89 | 90 | ## Licence 91 | (The MIT License) 92 | 93 | Copyright (c) 2009-2014 **Stefan Imhoff** 94 | 95 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 96 | 97 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 98 | 99 | THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 100 | -------------------------------------------------------------------------------- /setup: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ########################################################## 4 | # Configuration 5 | ########################################################## 6 | # 7 | # Here you can set the default installation directory 8 | # 9 | DEFAULT_TARGET="/usr/share/gitweb" 10 | 11 | 12 | 13 | 14 | ########################################################## 15 | # Functions 16 | ########################################################## 17 | # 18 | # (no need to modify, unless you want to) 19 | # 20 | install() 21 | { 22 | set_target 23 | set_cmd_args 24 | 25 | if [[ $(check_for_symlinks) == $TRUE && $(check_for_backups) == $TRUE ]] 26 | then 27 | log "" 28 | log "[ERROR] - Symlinks and backups found in target, nothing to do." 29 | log "[ERROR] - (Is the theme already installed?)" 30 | exit 1 31 | else 32 | 33 | #Backing up 34 | if [[ $INTERACTIVE == $TRUE ]] 35 | then 36 | log "" 37 | if [[ $(confirm "Backing up original files, continue?") == $FALSE ]] 38 | then 39 | echo "" 40 | exit 1 41 | else 42 | echo "" 43 | fi 44 | fi 45 | 46 | if [[ $(check_for_backups) == $TRUE ]] 47 | then 48 | log "[NOTICE] - Backups present, skipping..." 49 | else 50 | log "" 51 | log "Backing up..." 52 | log "" 53 | for FILE in "${THEME_FILES[@]}" 54 | do 55 | if [[ -e "$TARGET/$FILE.bak" ]] 56 | then 57 | log "Skipping $FILE.bak, file exists..." 58 | else 59 | mv -f $MV_ARGS "$TARGET/$FILE" "$TARGET/$FILE.bak" 60 | fi 61 | done 62 | log "" 63 | log "...done" 64 | fi 65 | 66 | #Symlinking 67 | if [[ $INTERACTIVE == $TRUE ]] 68 | then 69 | log "" 70 | if [[ $(confirm "Linking theme files, continue?") == $FALSE ]] 71 | then 72 | echo "" 73 | exit 1 74 | else 75 | echo "" 76 | fi 77 | fi 78 | 79 | if [[ $(check_for_symlinks) == $TRUE ]] 80 | then 81 | log "[NOTICE] - Symlinks present, skipping..." 82 | else 83 | log "" 84 | log "Linking..." 85 | log "" 86 | for FILE in "${THEME_FILES[@]}" 87 | do 88 | if [[ -h "$TARGET/$FILE" ]] 89 | then 90 | log "Skipping $FILE, symlink exists..." 91 | else 92 | ln $LN_ARGS "$THEME/$FILE" "$TARGET/$FILE" 93 | fi 94 | done 95 | log "" 96 | log "...done" 97 | fi 98 | fi 99 | 100 | log "" 101 | log "[NOTICE] - Installation complete!" 102 | } 103 | 104 | remove() 105 | { 106 | set_target 107 | set_cmd_args 108 | 109 | if [[ $(check_for_symlinks "missing") == $TRUE && $(check_for_backups "missing") == $TRUE ]] 110 | then 111 | log "" 112 | log "[ERROR] - No symlinks or backups found in target, Nothing to do." 113 | log "[ERROR] - (Is the theme already removed?)" 114 | exit 1 115 | else 116 | 117 | #Deleting 118 | if [[ $INTERACTIVE == $TRUE ]] 119 | then 120 | log "" 121 | if [[ $(confirm "Deleting symlinks, continue?") == $FALSE ]] 122 | then 123 | echo "" 124 | exit 1 125 | else 126 | echo "" 127 | fi 128 | fi 129 | 130 | if [[ $(check_for_symlinks) == $TRUE ]] 131 | then 132 | log "" 133 | log "Deleting symlinks..." 134 | log "" 135 | for FILE in "${THEME_FILES[@]}" 136 | do 137 | if [[ -h "$TARGET/$FILE" ]] 138 | then 139 | rm $RM_ARGS "$TARGET/$FILE" 140 | else 141 | log "Skipping $FILE, not found..." 142 | fi 143 | done 144 | log "" 145 | log "...done" 146 | else 147 | log "[NOTICE] - Symlinks not found, skipping..." 148 | fi 149 | 150 | #Restoring 151 | if [[ $INTERACTIVE == $TRUE ]] 152 | then 153 | log "" 154 | if [[ $(confirm "Restoring original files, continue?") == $FALSE ]] 155 | then 156 | echo "" 157 | exit 1 158 | else 159 | echo "" 160 | fi 161 | fi 162 | 163 | if [[ $(check_for_backups) == $TRUE ]] 164 | then 165 | log "" 166 | log "Restoring..." 167 | log "" 168 | for FILE in "${THEME_FILES[@]}" 169 | do 170 | if [[ -e "$TARGET/$FILE.bak" ]] 171 | then 172 | mv $MV_ARGS "$TARGET/$FILE.bak" "$TARGET/$FILE" 173 | else 174 | log "Skipping $FILE.bak, not found..." 175 | fi 176 | done 177 | log "" 178 | log "...done" 179 | else 180 | log "[NOTICE] - Backups not found, skipping..." 181 | fi 182 | fi 183 | 184 | log "" 185 | log "[NOTICE] - Removal complete!" 186 | } 187 | 188 | set_target() 189 | { 190 | if [[ $TARGET && $(check_for_static $TARGET) == $TRUE ]] 191 | then 192 | log "[NOTICE] - Using specified target path: '$TARGET'" 193 | 194 | if [[ $INTERACTIVE == $TRUE ]]; then 195 | if [[ $(confirm "Is this correct?") == $FALSE ]]; then 196 | echo "" 197 | exit 1 198 | else 199 | echo "" 200 | fi 201 | fi 202 | 203 | TARGET="$TARGET/static" 204 | else 205 | if [[ $(check_for_static $DEFAULT_TARGET) == $TRUE ]] 206 | then 207 | log "[NOTICE] - Target not set, using default path: '$DEFAULT_TARGET'" 208 | 209 | if [[ $INTERACTIVE == $TRUE ]] 210 | then 211 | log "" 212 | if [[ $(confirm "Is this ok?") == $FALSE ]] 213 | then 214 | echo "" 215 | exit 1 216 | else 217 | echo "" 218 | fi 219 | fi 220 | 221 | TARGET="$DEFAULT_TARGET/static" 222 | else 223 | log "" 224 | log "[ERROR] - Couldn't find folder 'static/' in the target path: '$TARGET'" 225 | log "[ERROR] - (Are you sure this folder contains gitweb?)" 226 | exit 1 227 | fi 228 | fi 229 | } 230 | 231 | set_cmd_args() 232 | { 233 | MV_ARGS="" 234 | LN_ARGS="-s" 235 | RM_ARGS="" 236 | 237 | if [[ $VERBOSE == $TRUE ]]; 238 | then 239 | MV_ARGS="-v" 240 | LN_ARGS="-v -s" 241 | RM_ARGS="-v" 242 | fi 243 | 244 | if [[ $INTERACTIVE == $TRUE ]]; 245 | then 246 | MV_ARGS="-i" 247 | LN_ARGS="-i -s" 248 | RM_ARGS="-i" 249 | fi 250 | 251 | if [[ $INTERACTIVE == $TRUE && $VERBOSE == $TRUE ]]; 252 | then 253 | MV_ARGS="-i -v" 254 | LN_ARGS="-i -v -s" 255 | RM_ARGS="-i -v" 256 | fi 257 | } 258 | 259 | check_for_static() 260 | { 261 | local RETURN=$FALSE 262 | 263 | if [[ -d "$1/static" ]] 264 | then 265 | RETURN=$TRUE 266 | fi 267 | 268 | echo $RETURN 269 | } 270 | 271 | #If all present, true 272 | #If passed "missing", and all missing, true 273 | check_for_symlinks() 274 | { 275 | local RETURN=$TRUE 276 | 277 | if [[ $1 == "missing" ]] 278 | then 279 | local COUNT=0 280 | 281 | for FILE in "${THEME_FILES[@]}" 282 | do 283 | if [[ ! -h "$TARGET/$FILE" ]] 284 | then 285 | COUNT=$(expr $COUNT + 1) 286 | fi 287 | done 288 | 289 | if [[ $COUNT == "${THEME_FILES[@]}" ]] 290 | then 291 | RETURN=$TRUE 292 | else 293 | RETURN=$FALSE 294 | fi 295 | else 296 | for FILE in "${THEME_FILES[@]}" 297 | do 298 | if [[ ! -h "$TARGET/$FILE" ]] 299 | then 300 | RETURN=$FALSE 301 | fi 302 | done 303 | fi 304 | 305 | echo $RETURN 306 | } 307 | 308 | #If all present, true 309 | #If passed "missing", and all missing, true 310 | check_for_backups() 311 | { 312 | local RETURN=$TRUE 313 | 314 | if [[ $1 == "missing" ]] 315 | then 316 | local COUNT=0 317 | 318 | for FILE in "${THEME_FILES[@]}" 319 | do 320 | if [[ ! -e "$TARGET/$FILE.bak" ]] 321 | then 322 | COUNT=$(expr $COUNT + 1) 323 | fi 324 | done 325 | 326 | if [[ $COUNT == "${THEME_FILES[@]}" ]] 327 | then 328 | RETURN=$TRUE 329 | else 330 | RETURN=$FALSE 331 | fi 332 | else 333 | for FILE in "${THEME_FILES[@]}" 334 | do 335 | if [[ ! -e "$TARGET/$FILE.bak" ]] 336 | then 337 | RETURN=$FALSE 338 | fi 339 | done 340 | fi 341 | 342 | echo $RETURN 343 | } 344 | 345 | confirm() 346 | { 347 | read -n 1 -p "$0: $1 [y] | [n] : " REPLY 348 | 349 | case $REPLY in 350 | y|Y) 351 | echo $TRUE 352 | ;; 353 | n|N) 354 | echo $FALSE 355 | ;; 356 | *) 357 | echo "$0: [ERROR] - You must answer [y] | [n]" 358 | confirm "$1" 359 | ;; 360 | esac 361 | } 362 | 363 | log() 364 | { 365 | if [[ $VERBOSE == $TRUE ]] 366 | then 367 | echo "$0: $1" 368 | fi 369 | } 370 | 371 | usage() 372 | { 373 | cat << EOF 374 | Usage: $0 [-v|-i] [-t |--target ] [--install|--remove|--repair] 375 | Or: $0 [-V|-h|--version|--help] 376 | 377 | This script will create symlinks to your gitweb install for themeing. 378 | The default location is '/usr/share/gitweb' unless set via -t or --target. 379 | 380 | OPTIONS: 381 | -v, --verbose Verbose output 382 | -i, --interactive Pauses for confirmation at each step 383 | -t, --target Where to create the symlinks, gitweb installation path 384 | -h, --help Shows this usage message 385 | -V, --version Displays version information 386 | --install Adds '.bak' to original files and creates symlinks to theme files 387 | --remove Deletes themed symlinks and restores the original files. 388 | --repair Removes all theme files, then reinstalls 389 | EOF 390 | } 391 | 392 | 393 | 394 | ########################################################## 395 | # Let's Go! 396 | ########################################################## 397 | # 398 | PROG_NAME=$0 399 | PROG_VERSION="0.9.0" 400 | AUTHOR="Kevin Hill " 401 | 402 | readonly TRUE=0 403 | readonly FALSE=1 404 | 405 | TARGET= 406 | THEME=$(pwd) 407 | INTERACTIVE=$FALSE 408 | VERBOSE=$FALSE 409 | 410 | THEME_FILES=( "gitweb.css" "git-favicon.png" "git-logo.png" ) 411 | 412 | SHORT_OPTS="Vhvit:" 413 | LONG_OPTS="version,help,verbose,interactive,target:,install,remove,repair" 414 | OPTS=$(getopt -o "$SHORT_OPTS" -l "$LONG_OPTS" --name "$0" -- "$@") 415 | 416 | if [ $? != 0 ]; then 417 | exit 1 418 | fi 419 | 420 | eval set -- "$OPTS" 421 | unset OPTS 422 | 423 | if [ $# -eq 0 ]; then 424 | echo "$0: [ERROR] - no options specified" >&2 425 | usage 426 | fi 427 | 428 | while [ $# -gt 0 ]; do 429 | case $1 in 430 | -h|--help|-\?) 431 | usage 432 | exit 0 433 | ;; 434 | -v|--verbose) 435 | VERBOSE=$TRUE 436 | ;; 437 | -i|--interactive) 438 | INTERACTIVE=$TRUE 439 | ;; 440 | -t|--target) 441 | TARGET=$2 442 | shift 443 | ;; 444 | -V|--version) 445 | echo "Gitweb Theme Installer Script - v$PROG_VERSION" 446 | echo " Author: $AUTHOR" 447 | ;; 448 | --install) 449 | install 450 | ;; 451 | --remove) 452 | remove 453 | ;; 454 | --repair) 455 | remove 456 | install 457 | ;; 458 | --) 459 | shift 460 | break 461 | ;; 462 | -*) 463 | echo "$0: [ERROR] - unrecognized option $1" >&2 464 | shift 465 | ;; 466 | *) 467 | break 468 | ;; 469 | esac 470 | shift 471 | done 472 | 473 | exit 0 474 | -------------------------------------------------------------------------------- /gitweb.css: -------------------------------------------------------------------------------- 1 | /* Reset 2 | ------------------------------------------------------------------------- */ 3 | 4 | /* Based on http://meyerweb.com/eric/tools/css/reset/ */ 5 | /* v1.0 | 20080212 */ 6 | 7 | html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, 8 | blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, 9 | font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, 10 | u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, 11 | caption, tbody, tfoot, thead, tr, th, td { 12 | margin: 0; 13 | padding: 0; 14 | border: 0; 15 | outline: 0; 16 | font-size: 100%; 17 | vertical-align: baseline; 18 | background: transparent; 19 | } 20 | 21 | ol, ul { list-style: none; } 22 | 23 | blockquote, q { quotes: none; } 24 | 25 | blockquote:before, blockquote:after, 26 | q:before, q:after { 27 | content: ''; 28 | content: none; 29 | } 30 | 31 | :focus { outline: 0; } 32 | 33 | ins { text-decoration: none; } 34 | 35 | del { text-decoration: line-through; } 36 | 37 | table { 38 | border-collapse: collapse; 39 | border-spacing: 0; 40 | } 41 | 42 | a { outline: none; } 43 | 44 | /* General 45 | ---------------------------------------------------------------------------- */ 46 | 47 | html { 48 | position: relative; 49 | min-height: 100%; 50 | } 51 | 52 | body { 53 | font: 13px Helvetica,arial,freesans,clean,sans-serif; 54 | line-height: 1.4; 55 | margin: 0 0 105px; 56 | background-color: #fff; 57 | color: #000000; 58 | } 59 | 60 | /* Monospaced Fonts */ 61 | .sha1, .mode, .diff_tree .list, .pre, .diff, .patchset { 62 | font-family: 'Consolas','Bitstream Vera Sans Mono',monospace; 63 | } 64 | 65 | a:link, a:visited { 66 | color: #4183C4; 67 | text-decoration: none; 68 | } 69 | 70 | a:hover { 71 | text-decoration: underline; 72 | } 73 | 74 | td.list a[href*='tree'], td.list a[href*='blob'] { 75 | padding-left: 20px; 76 | display: block; 77 | float: left; 78 | height: 16px; 79 | line-height: 16px; 80 | } 81 | 82 | td.list a[href*='tree'] { 83 | background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABq0lEQVQ4y8WTu4oUQRSGv+rtGVuxhwVFdFEEE2c3d0HYTEMTn8DEVxADQTDUF9DMwMxQMBMx8AEWzRQ3cBHd9TI91+2urjq/QbczY2IygSep4nD+79yqnCRWsYQVbWVACvDh5ZXdrLe15dwyT1TjT/sxFFeB6i+VA2B6+cb7kAI4Jf0LO087zjlQI8Y5Qvnj0sHug321XoC1bk+K9eHk6+s7wPMUgKAS88eqb4+Jfg2SHs7lZBvX2Nh+2EUCDGSAcMnJsx9f7NxfAGqXyDzRd5EJO/pMPT1gcviGTnYOVIN5pAAE8v7dLrKL8xnglFk4ws9Afko9HpH3b5Gd2mwb/lOBmgrSdYhJugDUCenxM6xv3p4HCsP8F0LxCsUhCkMURihOyM7fg0osASTFEpu9a4LjGIUCqwcoDiEUrX+E4hRUQb20RiokC1j9vckUhygU7X3QZh7NAVKYL7YBeMkRUfjVCotF2XGIwnghtrJpMywB5G0QZj9P1JNujuWJ1AHLQadRrACPkuZ0SSSWpeStWgDK6tHek5vbiOs48n++XQHurcf0rFng//6NvwG+iB9/4duaTgAAAABJRU5ErkJgggo=) center left no-repeat; 84 | } 85 | 86 | td.list a[href*='blob'] { 87 | background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA6ElEQVQoFQXBMW5TQRgGwNnHnoE0QbiCjoIooUmTU3AuS1BwIoTSUdJBigg3GCWOg9/++zHTop078wIAsPMrE4SL5/1aIyMjIyMjz/m0tbFECFdrPeaQQw75mz/5nZH7fN7aWILmauSYfznmmIfss8vIUx7zZWsTTXM5vpWvTk5Wq9VHQP/gtgOLa0Qpw940vAQdaG6thpOhlOkG0AEuAVGmEkAH+G4YSikxXQM6wDsAMRFAB/ihDNNUmN4DOsAbBAEAdICfpmmaAt4COoj2GgCASbIkZh1NAACznhQt2itnFgAAlF3u/gMDtJXPzQxoswAAAABJRU5ErkJgggo=) center left no-repeat; 88 | } 89 | 90 | i { 91 | font-style: normal; 92 | } 93 | 94 | td, th { 95 | padding: 5px; 96 | } 97 | 98 | .page_nav br { 99 | display: none; 100 | } 101 | 102 | #generating_info { 103 | font-size: 10px; 104 | color: #aaa; 105 | text-align: center; 106 | } 107 | 108 | #generating_time, #generating_cmd { 109 | font-weight: bold; 110 | } 111 | 112 | /* Page Header 113 | ---------------------------------------------------------------------------- */ 114 | 115 | .page_header { 116 | height: 50px; 117 | line-height: 50px; 118 | position: relative; 119 | padding: 0 27px; 120 | margin-bottom: 20px; 121 | font-size: 20px; 122 | font-family: Helvetica, Arial, Freesans, Clean, sans-serif; 123 | background: #FFFFFF; /* old browsers */ 124 | background: -moz-linear-gradient(top, #FFFFFF 0%, #F5F5F5 100%); /* firefox */ 125 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#FFFFFF), color-stop(100%,#F5F5F5)); /* webkit */ 126 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#FFFFFF', endColorstr='#F5F5F5',GradientType=0 ); /* ie */ 127 | background: -o-linear-gradient(top, #FFFFFF 0%, #F5F5F5 100%); 128 | border-bottom: 1px solid #dfdfdf; 129 | } 130 | 131 | .page_header a:link, .page_header a:visited { 132 | color: #4183C4; 133 | text-decoration: none; 134 | padding: 3px; 135 | font-weight: bold; 136 | } 137 | 138 | .page_header a:hover { 139 | font-weight: bold; 140 | padding: 3px; 141 | text-decoration: underline; 142 | } 143 | 144 | .page_header a:first-child { 145 | background: transparent; 146 | } 147 | 148 | .page_header img.logo { 149 | position: relative; 150 | top: 7px; 151 | margin-right: 5px; 152 | } 153 | 154 | /* Page Footer 155 | ---------------------------------------------------------------------------- */ 156 | 157 | .page_footer { 158 | position: absolute; 159 | left: 0; 160 | bottom: 0; 161 | width: 100%; 162 | height: 80px; 163 | line-height: 80px; 164 | margin-top: 15px; 165 | background: #f1f1f1; 166 | border-top: 2px solid #ddd; 167 | border-bottom: 1px solid #ddd; 168 | } 169 | 170 | .page_footer_text { 171 | color: #666; 172 | display: inline; 173 | float: left; 174 | margin-left: 25px; 175 | width: 80%; 176 | overflow: hidden; 177 | white-space: nowrap; 178 | text-overflow: ellipsis; 179 | } 180 | 181 | a.rss_logo { 182 | float: right; 183 | padding: 3px 1px; 184 | width: 35px; 185 | line-height: 10px; 186 | border: 1px solid; 187 | border-color: #fcc7a5 #7d3302 #3e1a01 #ff954e; 188 | color: #ffffff; 189 | background-color: #ff6600; 190 | font-weight: bold; 191 | font-family: sans-serif; 192 | font-size: 80%; 193 | text-align: center; 194 | text-decoration: none; 195 | margin-top: 30px; 196 | margin-left: 5px; 197 | } 198 | 199 | a.rss_logo:hover { 200 | background-color: #ee5500; 201 | } 202 | 203 | .rss_logo { 204 | margin-right: 25px; 205 | background: yellow; 206 | } 207 | 208 | .rss_logo:last-child { 209 | margin-right: 5px; 210 | } 211 | 212 | /* Index include 213 | ---------------------------------------------------------------------------- */ 214 | 215 | .index_include { 216 | width: 95%; 217 | margin: 0 auto 15px; 218 | background: -moz-linear-gradient(center top , #FFFFFF 0%, #F5F5F5 100%) repeat scroll 0 0 transparent; 219 | border: 1px solid #DFDFDF; 220 | padding: 8px; 221 | -webkit-box-sizing: border-box; 222 | -moz-box-sizing: border-box; 223 | box-sizing: border-box; 224 | } 225 | 226 | /* Elements 227 | ---------------------------------------------------------------------------- */ 228 | 229 | .project_list, 230 | .shortlog, 231 | .tree, 232 | .commit_search, 233 | .history { 234 | width: 95%; 235 | margin: 0 auto 15px auto; 236 | border: 1px solid #d8d8d8; 237 | -moz-box-shadow: 0 0 3px rgba(0,0,0,0.2); 238 | -webkit-box-shadow: 0 0 3px rgba(0,0,0,0.2); 239 | box-shadow: 0 0 3px rgba(0,0,0,0.2); 240 | } 241 | 242 | .project_list th, 243 | .shortlog th, 244 | .tree th, 245 | .commit_search th { 246 | color: #afafaf; 247 | font-weight: normal; 248 | } 249 | 250 | .project_list th { 251 | font-weight: bold; 252 | } 253 | 254 | .project_list tr, 255 | .shortlog tr, 256 | .tree tr, 257 | .commit_search tr { 258 | background: #eaeaea; 259 | height: 2.5em; 260 | text-align: left; 261 | color: #545454; 262 | } 263 | 264 | .project_list tr.dark, .project_list tr.light, 265 | .shortlog tr.dark, .shortlog tr.light, 266 | .tree tr.dark, .tree tr.light, 267 | .commit_search tr.dark, .commit_search tr.light, 268 | .history tr.dark, .history tr.light, 269 | .heads tr.dark, .heads tr.light { 270 | background: #F9F9F9; /* old browsers */ 271 | background: -moz-linear-gradient(top, #F9F9F9 0%, #EFEFEF 100%); /* firefox */ 272 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#F9F9F9), color-stop(100%,#EFEFEF)); /* webkit */ 273 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#F9F9F9', endColorstr='#EFEFEF',GradientType=0 ); /* ie */ 274 | background: -o-linear-gradient(top, #F9F9F9 0%, #EFEFEF 100%); 275 | height: 2.5em; 276 | border-bottom: 1px solid #e1e1e1; 277 | } 278 | 279 | th .header { 280 | background: transparent; 281 | border: 0; 282 | padding: 0; 283 | font-weight: bold; 284 | } 285 | 286 | .tree { 287 | width: 100%; 288 | margin: 0; 289 | } 290 | 291 | .projsearch { 292 | position: absolute; 293 | right: 4%; 294 | top: 15px; 295 | } 296 | 297 | .projsearch a { 298 | display: none; 299 | } 300 | 301 | .commit_search { 302 | background: #eaeaea; 303 | } 304 | 305 | .page_nav, 306 | .list_head, 307 | .page_path, 308 | .search { 309 | width: 94%; 310 | background: #eaeaea; 311 | color: #545454; 312 | border: 1px solid #d8d8d8; 313 | padding: 5px; 314 | margin: 0 auto 15px auto; 315 | } 316 | 317 | .history { 318 | background: #eaeaea; 319 | } 320 | 321 | .title { 322 | margin: 0 auto 15px auto; 323 | padding: 5px; 324 | width: 95%; 325 | } 326 | 327 | .readme { 328 | background: #eaf2f5; 329 | border: 1px solid #bedce7; 330 | -moz-box-sizing: border-box; 331 | -webkit-box-sizing: border-box; 332 | box-sizing: border-box; 333 | margin: 0 auto 15px auto; 334 | padding: 15px; 335 | width: 95%; 336 | } 337 | 338 | .readme h1 { 339 | display: block; 340 | font-size: 2em; 341 | font-weight: bold; 342 | margin-bottom: 0.67em; 343 | margin-top: 0; 344 | } 345 | 346 | .readme h2 { 347 | font-size: 1.5em; 348 | font-weight: bold; 349 | margin-bottom: 0.83em; 350 | } 351 | 352 | 353 | .readme h3 { 354 | font-size: 1.17em; 355 | font-weight: bold; 356 | margin-bottom: 1em; 357 | } 358 | 359 | .readme p { 360 | margin-bottom: 1em; 361 | } 362 | 363 | .readme ul { 364 | list-style: disc; 365 | margin-bottom: 1em; 366 | margin-left: 1.5em; 367 | } 368 | 369 | .readme ul ul { 370 | margin-bottom: 0; 371 | } 372 | 373 | .readme ol { 374 | list-style: decimal; 375 | margin-bottom: 1em; 376 | margin-left: 1.5em; 377 | } 378 | 379 | .readme ol ol { 380 | margin-bottom: 0; 381 | } 382 | 383 | .readme pre { 384 | font-family: monospace; 385 | margin: 1em 0; 386 | white-space: pre; 387 | } 388 | 389 | .readme tt, .readme code, .readme kbd, .readme samp { 390 | font-family: monospace; 391 | } 392 | 393 | .readme blockquote { 394 | margin: 1em; 395 | } 396 | 397 | .projects_list, 398 | .tags { 399 | width: 95%; 400 | background: #f0f0f0; 401 | color: #545454; 402 | border: 1px solid #d8d8d8; 403 | padding: 5px; 404 | margin: 0 auto 15px auto; 405 | } 406 | 407 | .heads { 408 | width: 95%; 409 | color: #545454; 410 | border: 1px solid #d8d8d8; 411 | padding: 5px; 412 | margin: 0 auto 15px auto; 413 | } 414 | 415 | .header { 416 | width: 94%; 417 | margin: 0 auto 15px auto; 418 | background: #eaf2f5; 419 | border: 1px solid #bedce7; 420 | padding: 5px; 421 | } 422 | 423 | .header .age { 424 | float: left; 425 | color: #000; 426 | font-weight: bold; 427 | width: 10em; 428 | } 429 | 430 | .title_text { 431 | width: 94%; 432 | background: #eaf2f5; 433 | border: 1px solid #bedce7; 434 | padding: 5px; 435 | margin: 0 auto 0 auto; 436 | } 437 | 438 | .log_body { 439 | width: 94%; 440 | background: #eaf2f5; 441 | border: 1px solid #bedce7; 442 | border-top: 0; 443 | padding: 5px; 444 | margin: 0 auto 15px auto; 445 | } 446 | 447 | .page_body { 448 | line-height: 1.4em; 449 | width: 94%; 450 | background: #f8f8f8; 451 | border: 1px solid #d8d8d8; 452 | padding: 5px; 453 | margin: 15px auto 15px auto; 454 | } 455 | 456 | .diff_tree { 457 | width: 95%; 458 | background: #f0f0f0; 459 | border: 1px solid #d8d8d8; 460 | padding: 5px; 461 | margin: 0 auto 15px auto; 462 | } 463 | 464 | .page_body > .list_head { 465 | width: 98.5%; 466 | } 467 | 468 | .page_body > .diff_tree { 469 | width: 99.5%; 470 | } 471 | 472 | .patch > .header { 473 | width: 99%; 474 | } 475 | 476 | .author .avatar, 477 | .author_date .avatar { 478 | position: relative; 479 | top: 3px; 480 | } 481 | 482 | .object_header .avatar { 483 | border: 1px solid #D8D8D8; 484 | float: right; 485 | } 486 | 487 | .object_header td, 488 | .object_header th { 489 | vertical-align: top; 490 | } 491 | 492 | /* Refs 493 | ---------------------------------------------------------------------------- */ 494 | 495 | span.refs span { 496 | color: #707070; 497 | display: inline-block; 498 | margin: 0; 499 | background-color: #eee; 500 | border: 1px solid #ccc; 501 | border-radius: 3px; 502 | height: 18px; 503 | padding: 0 6px; 504 | text-overflow: ellipsis; 505 | } 506 | 507 | span.refs span.ref { 508 | color: #707070; 509 | display: inline-block; 510 | margin: 0; 511 | background-color: #c4c4ff; 512 | border: 1px solid #7878ff; 513 | border-radius: 3px; 514 | height: 18px; 515 | padding: 0 6px; 516 | text-overflow: ellipsis; 517 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gIKFSUnpolg7AAAAHJQTFRFAAAAVVWqZmbMVVXVYGDgbW3td3fuc3PzdHT0cHD1d3f6dHT6dnb7dHT7dnb8dnb8dnb9d3f9dnb+eHj+d3f+eHj+d3f+d3f+d3f+eHj+d3f+eHj+d3f+eHj+d3f+d3f+eHj+d3f+d3f+d3f+eHj/////V9oQhQAAACR0Uk5TAAIEBQcNDhMVGCotNTZAT217i5CgobvExtjZ4eLr7vP09ff7uqQ6cgAAAAFiS0dEJcMByQ8AAABUSURBVBjTpc43AoAwDENRh95bgNBM1f3PyOpslD++RSJ61YgH5M2IbIkn4GocSR1MZVBL4t2n4FgkbaxI8Sqph041WknZCWAIrcmEUbpf3lNe0N9u59YFYHnZ78gAAAAASUVORK5CYII=); 518 | background-repeat: no-repeat; 519 | padding-left: 18px; 520 | } 521 | 522 | span.refs span.tag { 523 | color: #707070; 524 | display: inline-block; 525 | margin: 0; 526 | background-color: #ffffab; 527 | border: 1px solid #d9d93b; 528 | border-radius: 3px; 529 | height: 18px; 530 | padding: 0 6px; 531 | text-overflow: ellipsis; 532 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gIKFSUZZ+h9RwAAAGZQTFRFAAAAtrYkwMBAwMBAx8c4yso11NQ71NQ51dU52Ng71tY519c719c719c62Ng719c719c62Ng72dk62Ng62Ng72Ng72dk62Ng72Ng62dk62dk72dk62Ng62dk72Ng72Ng72dk7////ou/AnQAAACB0Uk5TAAYHCxESLjRCWWlqa4uNkpissbrO19jc3ufs8vf6/f7atAU2AAAAAWJLR0QhxGwNFgAAAF1JREFUGFeNy0cOgCAABVGw94rY5d//lC7omhhn+ZIh5Gf1xPk0Zi5dAABROIQjSU/fsAXhDkCUljAv8jW2wlQpaixpo4Nj+dtatVpjkSJjLNaizRVpvhBCu/4h391jzw1lU12Z7wAAAABJRU5ErkJggg==); 533 | background-repeat: no-repeat; 534 | padding-left: 18px; 535 | } 536 | 537 | span.refs span.head { 538 | color: #707070; 539 | display: inline-block; 540 | margin: 0; 541 | background-color: #c4ffc4; 542 | border: 1px solid #78ff78; 543 | border-radius: 3px; 544 | height: 18px; 545 | padding: 0 6px; 546 | text-overflow: ellipsis; 547 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gIKFSYDsafX/gAAAUpJREFUOMvVkjFLA0EQhd/s7l06MSCihbV/wC5/QBDEIFYWprRIIQQJFqKFQi4kUbBQsFSwtrUQLQULUTBFLCzVIgimCXe7z0q5yIWcqfRVwzDzMTNvgL8mSUqWw3JOtFQJdsIwLDYyjdYgkEmkazl2oVtQWk36nn8AYBYASmFpxmizGtnoqO7Vb+M9KglEkASdpWU872nvVCiPRpuTnz2JIHGyqX3d0kZfR1G0Ht+g/do+FIhOBbLW3n/FNb/28D0puZ+dyL44ur1UoH5yzt2JyIj6UGdDgwrPhYzSagNEszJaeU/lWlylbmnaeGZZICsAppxzi6nt73HK85oQCMknOuarpno+FIjglVjZDXaCS2yDv3rIHlCb88FY0BlUl3hs7ektkhckb5DFWhoz+n12zr7ZPLpYUqLm0oBMn8NUzLhpAgjpWMS/1CcSJ3ykD7Rk1QAAAABJRU5ErkJggg==); 548 | background-repeat: no-repeat; 549 | padding-left: 18px; 550 | } 551 | 552 | span.refs a { 553 | color: #4e4e4e; 554 | font: 11px "Bitstream Vera Sans Mono", "DejaVu Sans Mono", Monaco, monospace; 555 | line-height: 18px; 556 | } 557 | 558 | /* Diffs 559 | ---------------------------------------------------------------------------- */ 560 | 561 | div.diff.to_file a.path, 562 | div.diff.to_file { 563 | color: #007000; 564 | } 565 | 566 | div.diff.from_file a.path, 567 | div.diff.from_file { 568 | color: #aa0000; 569 | } 570 | 571 | .patch .header { 572 | margin: 0; 573 | } 574 | 575 | .patchset { 576 | overflow-x: auto; 577 | overflow-y: hidden; 578 | } 579 | 580 | .chunk_header { 581 | background: #eaf2f5; 582 | color: #999; 583 | } 584 | 585 | .rem { 586 | background: #ffdddd; 587 | } 588 | .rem .marked { 589 | background: #ffaaaa; 590 | } 591 | .add { 592 | background: #ddffdd; 593 | } 594 | .add .marked { 595 | background: #7dff7d; 596 | } 597 | 598 | .extended_header { 599 | width: 99.5%; 600 | } 601 | 602 | div.chunk_block { 603 | overflow: hidden; 604 | } 605 | 606 | div.chunk_block div.old { 607 | float: left; 608 | width: 50%; 609 | overflow: hidden; 610 | border-right: 5px solid #EAF2F5; 611 | } 612 | 613 | div.chunk_block.rem, 614 | div.chunk_block.add { 615 | background: transparent; 616 | } 617 | 618 | div.chunk_block div.old .add, 619 | div.chunk_block div.old .rem { 620 | padding-right: 3px; 621 | } 622 | 623 | div.chunk_block div.new .add, 624 | div.chunk_block div.new .rem { 625 | padding-left: 3px; 626 | } 627 | 628 | div.chunk_block div.new { 629 | margin-left: 50%; 630 | width: 50%; 631 | border-left: 5px solid #EAF2F5; 632 | } 633 | 634 | /* Category 635 | ---------------------------------------------------------------------------- */ 636 | 637 | td.category { 638 | background: #E6F1F6; /* old browsers */ 639 | background: -moz-linear-gradient(top, #C8D8E7 0%, #E6F1F3 100%); /* firefox */ 640 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#C8D8E7), color-stop(100%,#E6F1F3)); /* webkit */ 641 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#C8D8E7', endColorstr='#E6F1F3',GradientType=0 ); /* ie */ 642 | background: -o-linear-gradient(top, #C8D8E7 0%, #E6F1F3 100%); 643 | font-weight: bold; 644 | border-bottom: 1px solid #D1D1D1; 645 | border-top: 1px solid #D1D1D1; 646 | } 647 | 648 | /* Age 649 | ---------------------------------------------------------------------------- */ 650 | 651 | /* noage: "No commits" */ 652 | .project_list td.noage { 653 | color: #cdcdcd; 654 | } 655 | 656 | /* age2: 60*60*24*2 <= age */ 657 | .project_list td.age2, .blame td.age2 { 658 | color: #545454; 659 | } 660 | 661 | /* age1: 60*60*2 <= age < 60*60*24*2 */ 662 | .project_list td.age1 { 663 | color: #009900; 664 | } 665 | 666 | /* age0: age < 60*60*2 */ 667 | .project_list td.age0 { 668 | color: #009900; 669 | font-weight: bold; 670 | } 671 | 672 | /* File status 673 | ---------------------------------------------------------------------------- */ 674 | 675 | .diff_tree span.file_status.new { 676 | color: #008000; 677 | } 678 | 679 | table.diff_tree span.file_status.deleted { 680 | color: #c00000; 681 | } 682 | 683 | table.diff_tree span.file_status.moved, 684 | table.diff_tree span.file_status.mode_chnge { 685 | color: #545454; 686 | } 687 | 688 | table.diff_tree span.file_status.copied { 689 | color: #70a070; 690 | } 691 | 692 | span.cntrl { 693 | border: dashed #aaaaaa; 694 | border-width: 1px; 695 | padding: 0px 2px 0px 2px; 696 | margin: 0px 2px 0px 2px; 697 | } 698 | 699 | span.match { 700 | background: #aaffaa; 701 | color: #000; 702 | } 703 | 704 | td.error { 705 | color: red; 706 | background: yellow; 707 | } 708 | 709 | /* blob view */ 710 | 711 | td.pre, div.pre, div.diff { 712 | white-space: pre-wrap; 713 | } 714 | 715 | /* JavaScript-based timezone manipulation */ 716 | 717 | .popup { /* timezone selection UI */ 718 | position: absolute; 719 | /* "top: 0; right: 0;" would be better, if not for bugs in browsers */ 720 | top: 0; left: 0; 721 | border: 1px solid #d8d8d8; 722 | padding: 2px; 723 | background-color: #f0f0f0; 724 | font-style: normal; 725 | color: #545454; 726 | cursor: auto; 727 | } 728 | 729 | .close-button { /* close timezone selection UI without selecting */ 730 | /* float doesn't work within absolutely positioned container, 731 | * if width of container is not set explicitly */ 732 | /* float: right; */ 733 | position: absolute; 734 | top: 0px; right: 0px; 735 | border: 1px solid #ffaaaa; 736 | margin: 1px 1px 1px 1px; 737 | padding-bottom: 2px; 738 | width: 12px; 739 | height: 10px; 740 | font-size: 9px; 741 | font-weight: bold; 742 | text-align: center; 743 | background-color: #ffdddd; 744 | cursor: pointer; 745 | } 746 | 747 | /* Style definition generated by highlight 2.4.5, http://www.andre-simon.de/ */ 748 | 749 | /* Highlighting theme definition: */ 750 | 751 | .num { color:#6ecf36; } 752 | .esc { color:#ff00ff; } 753 | .str { color:#ff00d3; background-color: #edc9ec } 754 | .dstr { color:#818100; } 755 | .slc { color:#838183; font-style:italic; } 756 | .com { color:#838183; font-style:italic; } 757 | .dir { color:#008200; } 758 | .sym { color:#000000; } 759 | .line { color:#555555; } 760 | .kwa { color:#666666; font-weight:bold; } 761 | .kwb { color:#6b3099; } 762 | .kwc { color:#d4663d; } 763 | .kwd { color:#2928ff; } 764 | 765 | --------------------------------------------------------------------------------