├── .gitignore ├── .gitmodules ├── index ├── content.json ├── data │ └── users │ │ └── content.json ├── img │ ├── logo-yellow.png │ └── logo-yellow.svg └── index.html ├── main └── dist │ ├── assets │ ├── post-receive │ └── pre-receive │ ├── content.json │ ├── css │ ├── buttons.css │ ├── content.css │ ├── header.css │ └── main.css │ ├── data │ └── users │ │ └── content.json │ ├── dbschema.json │ ├── default │ ├── index.html │ └── js │ │ └── main.js │ ├── for-devs │ ├── index.html │ └── js │ │ └── main.js │ ├── guide │ ├── index.html │ └── js │ │ └── main.js │ ├── hljs │ ├── default.min.css │ └── highlight.min.js │ ├── img │ ├── MIT.LICENSE │ ├── back.svg │ ├── code.svg │ ├── directory.svg │ ├── download.svg │ ├── edit.svg │ ├── file.svg │ ├── info.svg │ ├── issue-closed-white.svg │ ├── issue-closed.svg │ ├── issue-open-white.svg │ ├── issue-open.svg │ ├── issue-reopened-white.svg │ ├── issue-reopened.svg │ ├── log.svg │ ├── logo-green.png │ ├── logo-green.svg │ ├── logo-red.png │ ├── logo-red.svg │ ├── logo-white.png │ ├── logo-white.svg │ ├── logo-yellow.png │ ├── logo-yellow.svg │ ├── logo.png │ ├── logo.svg │ ├── pr-merged-white.svg │ ├── pr-merged.svg │ ├── pr-opened-white.svg │ ├── pr-opened.svg │ ├── preview.svg │ ├── reactions │ │ ├── heart.svg │ │ ├── smile.svg │ │ ├── thumbs-down.svg │ │ └── thumbs-up.svg │ ├── releases.svg │ ├── remove.svg │ ├── settings.svg │ ├── star.svg │ ├── submodule.svg │ ├── terminal.svg │ ├── tick.svg │ ├── unknown.svg │ └── user.svg │ ├── index.html │ ├── index │ ├── css │ │ └── repo.css │ ├── index.html │ └── js │ │ └── main.js │ ├── install │ ├── index.html │ └── js │ │ └── main.js │ ├── js │ ├── git.js │ ├── git.md │ ├── hg.js │ ├── issues.js │ ├── main.js │ ├── pako.js │ ├── repo.js │ ├── root.js │ └── sha.js │ ├── marked │ └── marked.js │ ├── myrepos │ ├── css │ │ └── repo.css │ ├── index.html │ └── js │ │ └── main.js │ ├── profile │ ├── css │ │ └── profile.css │ ├── index.html │ └── js │ │ └── main.js │ ├── repo │ ├── commit │ │ ├── css │ │ │ ├── commit.css │ │ │ └── diff.css │ │ ├── index.html │ │ └── js │ │ │ └── main.js │ ├── css │ │ ├── comments.css │ │ ├── files.css │ │ ├── info.css │ │ ├── tabs.css │ │ └── tags.css │ ├── edit │ │ ├── css │ │ │ └── file.css │ │ ├── index.html │ │ └── js │ │ │ └── main.js │ ├── file │ │ ├── css │ │ │ └── file.css │ │ ├── index.html │ │ └── js │ │ │ └── main.js │ ├── filter │ │ ├── css │ │ │ └── filter.css │ │ ├── index.html │ │ └── js │ │ │ └── main.js │ ├── index.html │ ├── issues │ │ ├── css │ │ │ └── issues.css │ │ ├── index.html │ │ ├── js │ │ │ └── main.js │ │ ├── new │ │ │ ├── css │ │ │ │ └── issue.css │ │ │ ├── index.html │ │ │ └── js │ │ │ │ └── main.js │ │ └── view │ │ │ ├── css │ │ │ └── issue.css │ │ │ ├── index.html │ │ │ └── js │ │ │ └── main.js │ ├── js │ │ ├── common.js │ │ ├── main.js │ │ ├── objects.js │ │ ├── objects_view.js │ │ ├── path_common.js │ │ └── user_common.js │ ├── log │ │ ├── css │ │ │ └── network.css │ │ ├── index.html │ │ └── js │ │ │ └── main.js │ ├── newfile │ │ ├── css │ │ │ └── file.css │ │ ├── index.html │ │ └── js │ │ │ └── main.js │ ├── pull-requests │ │ ├── css │ │ │ └── pull-requests.css │ │ ├── index.html │ │ ├── js │ │ │ └── main.js │ │ ├── new │ │ │ ├── css │ │ │ │ └── pull_request.css │ │ │ ├── index.html │ │ │ └── js │ │ │ │ └── main.js │ │ └── view │ │ │ ├── css │ │ │ └── pull_request.css │ │ │ ├── index.html │ │ │ └── js │ │ │ └── main.js │ ├── releases │ │ ├── css │ │ │ └── releases.css │ │ ├── index.html │ │ └── js │ │ │ └── main.js │ └── settings │ │ ├── css │ │ └── settings.css │ │ ├── index.html │ │ └── js │ │ └── main.js │ ├── support │ ├── css │ │ └── support.css │ ├── index.html │ └── js │ │ └── main.js │ └── user │ ├── css │ └── user.css │ ├── index.html │ └── js │ └── main.js ├── repo ├── content.json ├── content.json-default ├── data-default │ └── users │ │ └── content.json-default ├── img │ ├── logo-red.png │ └── logo-red.svg ├── index.html └── js │ └── ZeroFrame.js └── status ├── content.json ├── css ├── buttons.css ├── content.css ├── header.css └── main.css ├── img ├── logo-green.png ├── logo-green.svg ├── logo-white.svg └── logo.png └── index.html /.gitignore: -------------------------------------------------------------------------------- 1 | data.txt 2 | *.db 3 | */dist/data/users/*/* 4 | */data/users/*/* -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "main/dist/workerout"] 2 | path = main/dist/workerout 3 | url = C:/Users/Ivanq/Documents/ZeroNet/data/19onTt5fo8czADiefEoPhPigk281Z5dBXU/workerout.git/ 4 | [submodule "main/dist/ZeroLib"] 5 | path = main/dist/ZeroLib 6 | url = git@github.com:imachug/ZeroDevLib.git 7 | [submodule "main/dist/jsdifflib"] 8 | path = main/dist/jsdifflib 9 | url = https://github.com/cemerick/jsdifflib.git 10 | -------------------------------------------------------------------------------- /index/content.json: -------------------------------------------------------------------------------- 1 | { 2 | "address": "1iNDExENNBsfHc6SKmy1HaeasHhm3RPcL", 3 | "address_index": 80074647, 4 | "background-color": "#FFF", 5 | "clone_root": "template-new", 6 | "cloned_from": "1HeLLo4uzjaLetFx6NH3PMwFP3qbRbTf3D", 7 | "description": "Repository Index for Git Center", 8 | "favicon": "img/logo-yellow.png", 9 | "files": { 10 | "img/logo-yellow.png": { 11 | "sha512": "665906822aa641ef406feb00f71e8ccb0d2a26f6fde82c7cb1c3f3b76e314bdd", 12 | "size": 32243 13 | }, 14 | "img/logo-yellow.svg": { 15 | "sha512": "c5e05d25c8bed9925de835319365b168d3d7ad66876a04303481fb5f91a4db66", 16 | "size": 888 17 | }, 18 | "index.html": { 19 | "sha512": "50aebc27e8ab33f5e7c91f6492052ff3e30818d9f311ae6dea85fd01eb4dbf19", 20 | "size": 542 21 | } 22 | }, 23 | "ignore": "data/.*", 24 | "includes": { 25 | "data/users/content.json": { 26 | "signers": [], 27 | "signers_required": 1 28 | } 29 | }, 30 | "inner_path": "content.json", 31 | "merged_type": "GitCenter", 32 | "modified": 1516086301, 33 | "postmessage_nonce_security": true, 34 | "signers_sign": "HKsMy57y3iIsurfPDcV9HfdYOu86640QOMlbssnj1zwmU613xBIl1JNl7Wy5Gf67C3cZa8VgvP9j6O3in4LjJHU=", 35 | "signs": { 36 | "1iNDExENNBsfHc6SKmy1HaeasHhm3RPcL": "HFkUVM9JcgHnBG8Nmn8WyUVt6ASfw6Ekbh2X7HCV6asNF6eD2rFnmmmjcHSJ79XW3b8WiHC3DLF6/PLRpuJyb/g=" 37 | }, 38 | "signs_required": 1, 39 | "title": "Git Center Index", 40 | "translate": ["js/all.js"], 41 | "zeronet_version": "0.6.0" 42 | } -------------------------------------------------------------------------------- /index/data/users/content.json: -------------------------------------------------------------------------------- 1 | { 2 | "address": "1iNDExENNBsfHc6SKmy1HaeasHhm3RPcL", 3 | "files": {}, 4 | "ignore": ".*", 5 | "inner_path": "data/users/content.json", 6 | "modified": 1506454973, 7 | "signs": { 8 | "1iNDExENNBsfHc6SKmy1HaeasHhm3RPcL": "G4mk0OJotv4TeHJdtFUWebifYuKOeGiyjAyuvtaLzJOUJnDB/dumw6qY31bzWFAf28W4Mj7FpQ10xc9967WtOYY=" 9 | }, 10 | "user_contents": { 11 | "cert_signers": { 12 | "zeroid.bit": ["1iD5ZQJMNXu43w1qLB8sfdHVKppVMduGz"] 13 | }, 14 | "permission_rules": { 15 | ".*": { 16 | "files_allowed": "data.json", 17 | "max_size": 50000 18 | } 19 | }, 20 | "permissions": {} 21 | } 22 | } -------------------------------------------------------------------------------- /index/img/logo-yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purplesyringa/gitcenter/d0d35f10e60e520ea8ab0541ba94931a7eaf3dac/index/img/logo-yellow.png -------------------------------------------------------------------------------- /index/img/logo-yellow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /index/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Git Center Index 5 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /main/dist/assets/post-receive: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | python_path=`which python2.7 2>/dev/null` 3 | if [ -z "$python_path" ]; then 4 | python_path=`which python 2>/dev/null` 5 | fi 6 | if [ -z "$python_path" ]; then 7 | python_path=`which python3 2>/dev/null` 8 | fi 9 | 10 | if [ -z "$python_path" ]; then 11 | echo "Python not installed. If you want to automatically sign and publish after pushing, please install it." 12 | exit 0 13 | fi 14 | 15 | ################################################################################ 16 | 17 | sign=1 18 | publish=1 19 | 20 | if test -n "$GIT_PUSH_OPTION_COUNT" 21 | then 22 | i=0 23 | while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" 24 | do 25 | eval "value=\$GIT_PUSH_OPTION_$i" 26 | case "$value" in 27 | no-sign) 28 | sign=0 29 | ;; 30 | no-publish) 31 | publish=0 32 | ;; 33 | esac 34 | i=$((i + 1)) 35 | done 36 | fi 37 | 38 | if [ $sign -eq 0 ]; then 39 | echo "no-sign rejects signing, rejecting." 40 | exit 0 41 | fi 42 | 43 | ################################################################################ 44 | 45 | zeronet_home=$(realpath `git config --get zeronet.home` 2>/dev/null) 46 | if [ -z "$zeronet_home" ]; then 47 | echo "zeronet.home not set, rejecting to sign." 48 | echo "Run 'git config --global zeronet.home path_to_zeronet'" 49 | exit 0 50 | fi 51 | 52 | # Handle paths without ZeroNet/ and core/ 53 | # ZeroBundle 54 | if [ ! -z "$zeronet_home" ] && [ -d "$zeronet_home/ZeroNet" ]; then 55 | zeronet_home="$zeronet_home/ZeroNet" 56 | # Windows distributable 57 | elif [ ! -z "$zeronet_home" ] && [ -d "$zeronet_home/core" ]; then 58 | zeronet_home="$zeronet_home/core" 59 | fi 60 | 61 | "$python_path" --version | grep "Python 3" >/dev/null 2>/dev/null 62 | if [ $? -eq 0 ]; then 63 | zeronet_home=$(realpath `git config --get zeronet.home`) 64 | 65 | # Windows ZeroBundle 66 | if [ ! -z "$zeronet_home" ] && [ -f "$zeronet_home/../Python/python.exe" ]; then 67 | python_path="$zeronet_home/../Python/python.exe" 68 | zeronet_py="\"$python_path\" \"$zeronet_home/zeronet.py\"" 69 | # Mac OS ZeroBundle 70 | elif [ ! -z "$zeronet_home" ] && [ -f "$zeronet_home/../../../Python/python" ]; then 71 | python_path="$zeronet_home/../../../Python/python" 72 | zeronet_py="\"$python_path\" \"$zeronet_home/zeronet.py\"" 73 | # Linux ZeroBundle 74 | elif [ ! -z "$zeronet_home" ] && [ -f "$zeronet_home/Python/python" ]; then 75 | python_path="$zeronet_home/Python/python" 76 | zeronet_py="\"$python_path\" \"$zeronet_home/zeronet.py\"" 77 | # Windows dist 78 | elif [ ! -z "$zeronet_home" ] && [ -f "$zeronet_home/ZeroNet.exe" ]; then 79 | zeronet_py="\"$zeronet_home/ZeroNet.exe\"" 80 | # Windows dist core 81 | elif [ ! -z "$zeronet_home" ] && [ -f "$zeronet_home/../ZeroNet.exe" ]; then 82 | zeronet_py="\"$zeronet_home/../ZeroNet.exe\"" 83 | else 84 | echo "Python 2 not installed. If you want to automatically sign and publish after pushing, please install it." 85 | exit 0 86 | fi 87 | else 88 | zeronet_py="\"$python_path\" \"$zeronet_home/zeronet.py\"" 89 | fi 90 | 91 | site=`basename $(realpath "$GIT_DIR/..")` 92 | 93 | echo "Retrieving data directory..." 94 | data_dir=`eval $zeronet_py --silent getConfig | "$python_path" -c "import sys, json; config = json.load(sys.stdin); print(config['data_dir'])"` 95 | 96 | privatekey=`cat "$data_dir/users.json" | "$python_path" -c "import sys, json; users = json.load(sys.stdin); print(users[list(users.keys())[0]]['sites']['$site']['privatekey'])" 2>/dev/null` 97 | if [ $? -ne 0 ]; then 98 | echo "Failed to get signing key, rejecting to sign." 99 | exit 0 100 | fi 101 | 102 | echo "Signing..." 103 | eval $zeronet_py siteSign "$site" "$privatekey" 2>&1 | grep "Private key invalid" >/dev/null 2>&1 104 | if [ $? -eq 0 ]; then 105 | echo "Failed to sign, invalid private key. Probably you are not a maintainer." 106 | exit 0 107 | fi 108 | 109 | if [ $publish -eq 0 ]; then 110 | echo "no-publish rejects publishing, rejecting." 111 | echo "Signed successfully" 112 | exit 0 113 | fi 114 | 115 | echo "Publishing..." 116 | eval $zeronet_py sitePublish "$site" >/dev/null 2>&1 117 | 118 | echo "Signed & published successfully" -------------------------------------------------------------------------------- /main/dist/assets/pre-receive: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | python_path=`which python2.7 2>/dev/null` 3 | if [ -z "$python_path" ]; then 4 | python_path=`which python 2>/dev/null` 5 | fi 6 | if [ -z "$python_path" ]; then 7 | python_path=`which python3 2>/dev/null` 8 | fi 9 | 10 | if [ -z "$python_path" ]; then 11 | exit 0 12 | fi 13 | 14 | ################################################################################ 15 | 16 | if test -n "$GIT_PUSH_OPTION_COUNT" 17 | then 18 | i=0 19 | while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" 20 | do 21 | eval "value=\$GIT_PUSH_OPTION_$i" 22 | case "$value" in 23 | no-fetch) 24 | echo "no-fetch cancels fetching, returning." 25 | exit 0 26 | ;; 27 | esac 28 | i=$((i + 1)) 29 | done 30 | fi 31 | 32 | ################################################################################ 33 | 34 | "$python_path" -c "import socket; s = socket.socket(); s.settimeout(2); s.connect(('127.0.0.1', 43110)); s.close()" >/dev/null 2>&1 35 | if [ $? -eq 0 ]; then 36 | echo "ZeroNet already running, skipping fetching." 37 | exit 0 38 | fi 39 | 40 | zeronet_home=$(realpath `git config --get zeronet.home` 2>/dev/null) 41 | 42 | # Handle paths without ZeroNet/ and core/ 43 | # ZeroBundle 44 | if [ ! -z "$zeronet_home" ] && [ -d "$zeronet_home/ZeroNet" ]; then 45 | zeronet_home="$zeronet_home/ZeroNet" 46 | # Windows distributable 47 | elif [ ! -z "$zeronet_home" ] && [ -d "$zeronet_home/core" ]; then 48 | zeronet_home="$zeronet_home/core" 49 | fi 50 | 51 | "$python_path" --version | grep "Python 3" >/dev/null 2>/dev/null 52 | if [ $? -eq 0 ]; then 53 | # Try to find Python 2 in bundles 54 | 55 | # Windows ZeroBundle 56 | if [ ! -z "$zeronet_home" ] && [ -f "$zeronet_home/../Python/python.exe" ]; then 57 | python_path="$zeronet_home/../Python/python.exe" 58 | zeronet_py="\"$python_path\" \"$zeronet_home/zeronet.py\"" 59 | # Mac OS ZeroBundle 60 | elif [ ! -z "$zeronet_home" ] && [ -f "$zeronet_home/../../../Python/python" ]; then 61 | python_path="$zeronet_home/../../../Python/python" 62 | zeronet_py="\"$python_path\" \"$zeronet_home/zeronet.py\"" 63 | # Linux ZeroBundle 64 | elif [ ! -z "$zeronet_home" ] && [ -f "$zeronet_home/Python/python" ]; then 65 | python_path="$zeronet_home/Python/python" 66 | zeronet_py="\"$python_path\" \"$zeronet_home/zeronet.py\"" 67 | # Windows dist 68 | elif [ ! -z "$zeronet_home" ] && [ -f "$zeronet_home/ZeroNet.exe" ]; then 69 | zeronet_py="\"$zeronet_home/ZeroNet.exe\"" 70 | # Windows dist core 71 | elif [ ! -z "$zeronet_home" ] && [ -f "$zeronet_home/../ZeroNet.exe" ]; then 72 | zeronet_py="\"$zeronet_home/../ZeroNet.exe\"" 73 | else 74 | exit 0 75 | fi 76 | else 77 | zeronet_py="\"$python_path\" \"$zeronet_home/zeronet.py\"" 78 | fi 79 | 80 | echo "Fetching ZeroNet..." 81 | eval $zeronet_py siteDownload "$site" >/dev/null 2>&1 82 | 83 | exit 0 -------------------------------------------------------------------------------- /main/dist/css/buttons.css: -------------------------------------------------------------------------------- 1 | .button, .select { 2 | display: inline-block; 3 | padding: 3px 10px 3px 8px; 4 | border: 1px solid #D5D5D5; 5 | border-radius: 4px; 6 | cursor: pointer; 7 | 8 | background-image: linear-gradient(to bottom, #FCFCFC 0%, #EEE 100%); 9 | background-repeat: no-repeat; 10 | 11 | font-weight: bold; 12 | white-space: nowrap; 13 | color: #333; 14 | font-size: 16px; 15 | line-height: 22px; 16 | text-decoration: none; 17 | text-shadow: 0 1px 0 #FFF; 18 | } 19 | .button:active, .select:active { 20 | background-image: linear-gradient(to top, #FCFCFC 0%, #EEE 100%); 21 | } 22 | 23 | .button-disabled, .button-disabled:active, .select-disabled, .select-disabled:active { 24 | cursor: not-allowed; 25 | background-image: linear-gradient(to bottom, #888 0%, #666 100%); 26 | color: #FFF; 27 | text-shadow: none; 28 | } 29 | 30 | .button-blue { 31 | border-color: #2967A4; 32 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); 33 | 34 | background-color: #3072B3; 35 | background-repeat: repeat-x; 36 | background-image: linear-gradient(to bottom, #599BDC 0%, #3072B3 100%); 37 | 38 | color: #FFF; 39 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .5); 40 | } 41 | .button-blue:active { 42 | background-image: linear-gradient(to top, #599BDC 0%, #3072B3 100%); 43 | } 44 | 45 | .button-blue.button-disabled, .button-blue.button-disabled:active { 46 | cursor: not-allowed; 47 | background-image: linear-gradient(to bottom, #005283 0%, #236EB4 100%); 48 | } 49 | 50 | .button-big { 51 | padding: 4.5px 15px 4.5px 12px; 52 | border-radius: 6px; 53 | 54 | font-size: 24px; 55 | line-height: 33px; 56 | } 57 | 58 | 59 | .input { 60 | display: inline-block; 61 | padding: 3px 10px 3px 8px; 62 | border: 1px solid #D5D5D5; 63 | border-radius: 4px; 64 | 65 | color: #000; 66 | font-size: 16px; 67 | line-height: 22px; 68 | text-decoration: none; 69 | text-shadow: 0 1px 0 #FFF; 70 | } 71 | .input-small { 72 | width: 64px; 73 | } 74 | 75 | .input-disabled { 76 | cursor: not-allowed; 77 | background-color: #888; 78 | color: #FFF; 79 | text-shadow: none; 80 | } -------------------------------------------------------------------------------- /main/dist/css/content.css: -------------------------------------------------------------------------------- 1 | .content { 2 | display: block; 3 | width: 896px; 4 | padding: 0 calc(50% - 448px); 5 | margin: 16px 0; 6 | } 7 | 8 | .middle { 9 | display: block; 10 | width: 896px; 11 | padding: 16px calc(50% - 448px) 0; 12 | background-color: #EEE; 13 | border-bottom: 1px solid #888; 14 | } 15 | .middle-buttons { 16 | float: right; 17 | vertical-align: top; 18 | margin-top: -40px; 19 | } 20 | .middle-button-margin { 21 | margin-left: 16px; 22 | } 23 | .publish, .button-star { 24 | display: none; 25 | } 26 | 27 | h1 { 28 | margin: 10px 0; 29 | font-size: 32px; 30 | } 31 | h2 { 32 | margin: 6px 0; 33 | font-size: 24px; 34 | } 35 | 36 | p, ul, ol { 37 | margin: 8px 0; 38 | font-size: 16px; 39 | } 40 | 41 | .center { 42 | text-align: center; 43 | } 44 | 45 | .info { 46 | display: block; 47 | width: 896px; 48 | padding: 0 calc(50% - 448px); 49 | margin: 16px 0; 50 | } 51 | .info-link { 52 | margin-left: 16px; 53 | font-size: 16px; 54 | } 55 | .info-link-nomargin { 56 | font-size: 16px; 57 | } 58 | 59 | .sidebar { 60 | position: absolute; 61 | 62 | display: block; 63 | width: 128px; 64 | padding-left: calc(50% - 448px); 65 | margin-top: 16px; 66 | margin-left: -144px; 67 | } 68 | 69 | /* Open / Closed */ 70 | .objects-header { 71 | background-color: #EEE; 72 | } 73 | .objects-header.objects-header td { /* Notice: No !important here! */ 74 | padding: 0; 75 | } 76 | .objects-header:hover { 77 | cursor: default; 78 | } 79 | .objects-menu { 80 | display: inline-block; 81 | height: 100%; 82 | padding: 12px 16px; 83 | 84 | cursor: pointer; 85 | opacity: 0.6; 86 | 87 | color: #000; 88 | text-decoration: none; 89 | } 90 | .objects-menu.current { 91 | opacity: 1; 92 | font-weight: bold; 93 | } 94 | .objects-menu img { 95 | height: 16px; 96 | vertical-align: top; 97 | } 98 | 99 | /* Nothing here yet :( */ 100 | .nothing-here-yet.nothing-here-yet { 101 | display: none; 102 | cursor: default; 103 | } 104 | 105 | .repo-label { 106 | display: inline-block; 107 | padding: 4px; 108 | margin-left: 8px; 109 | vertical-align: top; 110 | 111 | background-color: #DDD; 112 | border-radius: 4px; 113 | 114 | font-size: 12px; 115 | } 116 | 117 | 118 | .image-placeholder { 119 | padding: 8px 16px; 120 | background-color: #EEE; 121 | } -------------------------------------------------------------------------------- /main/dist/css/header.css: -------------------------------------------------------------------------------- 1 | .header { 2 | display: block; 3 | width: 896px; 4 | height: 64px; 5 | padding: 0 calc(50% - 448px); 6 | 7 | background-color: #222; 8 | } 9 | 10 | .header-logo { 11 | display: inline-block; 12 | width: 32px; 13 | height: 32px; 14 | margin: 16px 0; 15 | margin-right: 16px; 16 | } 17 | 18 | .header-name { 19 | display: inline-block; 20 | width: auto; 21 | height: 32px; 22 | margin: 16px 8px 16px 0; 23 | vertical-align: top; 24 | 25 | font-family: Verdana, Arial, sans-serif; 26 | font-size: 24px; 27 | line-height: 32px; 28 | color: #FFF; 29 | } 30 | 31 | .header-item { 32 | display: inline-block; 33 | width: auto; 34 | height: 24px; 35 | margin: 0 10px; 36 | padding: 20px 0; 37 | vertical-align: top; 38 | 39 | font-family: Verdana, Arial, sans-serif; 40 | font-size: 16px; 41 | line-height: 24px; 42 | color: #888; 43 | } 44 | .header-item:hover { 45 | color: #DDD; 46 | } 47 | .header-item-active, .header-item-active:hover { 48 | color: #FFF; 49 | } -------------------------------------------------------------------------------- /main/dist/css/main.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | margin: 0; 3 | padding: 0; 4 | height: 100%; 5 | background-color: #FFF; 6 | 7 | font-family: Helvetica, Arial, sans-serif; 8 | font-size: 0; 9 | } -------------------------------------------------------------------------------- /main/dist/data/users/content.json: -------------------------------------------------------------------------------- 1 | { 2 | "address": "1GitLiXB6t5r8vuU2zC6a8GYj9ME6HMQ4t", 3 | "files": {}, 4 | "ignore": ".*", 5 | "inner_path": "data/users/content.json", 6 | "modified": 1506454959, 7 | "signs": { 8 | "1GitLiXB6t5r8vuU2zC6a8GYj9ME6HMQ4t": "G661gZUKeHlJGUJPoDPqzfifaSGFA4TGswbSWYbw3pc5OBmIkUlCPTR3yel8qQgFDBPZwRmx/pbAHtjrpzdi5y0=" 9 | }, 10 | "user_contents": { 11 | "cert_signers": { 12 | "zeroid.bit": ["1iD5ZQJMNXu43w1qLB8sfdHVKppVMduGz"] 13 | }, 14 | "permission_rules": { 15 | ".*": { 16 | "files_allowed": "data.json", 17 | "max_size": 50000 18 | } 19 | }, 20 | "permissions": {} 21 | } 22 | } -------------------------------------------------------------------------------- /main/dist/default/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Default repository - Git Center 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 |
Git Center
22 |
23 | 24 |
Repository Index
25 |
26 | 27 |
My Repos
28 |
29 | 30 |
Beginner's Guide
31 |
32 | 33 |
Support
34 |
35 | 36 |
Profile
37 |
38 | 39 |
For devs
40 |
41 |
42 |
43 |

Default Git Center Repo

44 | 45 | 46 | 47 | Template 48 | 49 |
50 | 51 |
52 |

53 | Default Git Center Repo is a template for creating repositories. It cannot be accessed directly and only supports forking. 54 |

55 |
56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /main/dist/default/js/main.js: -------------------------------------------------------------------------------- 1 | window.addEventListener("load", () => { 2 | setTitle("Default Git Center Repo"); 3 | }); -------------------------------------------------------------------------------- /main/dist/for-devs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | For devs - Git Center 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 |
Git Center
20 |
21 | 22 |
Repository Index
23 |
24 | 25 |
My Repos
26 |
27 | 28 |
Beginner's Guide
29 |
30 | 31 |
Support
32 |
33 | 34 |
Profile
35 |
36 | 37 |
For devs
38 |
39 |
40 | 41 |
42 |

For devs

43 | 44 |

45 | Git Center Source
46 | Help wanted 47 |

48 |

49 | GitHub mirror
50 | GitLab mirror 51 |

52 |
53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /main/dist/for-devs/js/main.js: -------------------------------------------------------------------------------- 1 | window.addEventListener("load", () => { 2 | setTitle("For devs"); 3 | }); -------------------------------------------------------------------------------- /main/dist/guide/js/main.js: -------------------------------------------------------------------------------- 1 | window.addEventListener("load", () => { 2 | setTitle("Beginner's Guide"); 3 | }); -------------------------------------------------------------------------------- /main/dist/hljs/default.min.css: -------------------------------------------------------------------------------- 1 | .hljs{display:block;overflow-x:auto;padding:0.5em;background:#F0F0F0}.hljs,.hljs-subst{color:#444}.hljs-comment{color:#888888}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-selector-pseudo{color:#BC6060}.hljs-literal{color:#78A960}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta-string{color:#4d99bf}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold} -------------------------------------------------------------------------------- /main/dist/img/MIT.LICENSE: -------------------------------------------------------------------------------- 1 | This copyright applies to: 2 | 1. directory.svg (by GitHub); 3 | 2. info.svg (by jxnblk); 4 | 3. issue-closed.svg (by GitHub); 5 | 4. issue-closed-white.svg (by GitHub); 6 | 5. issue-open.svg (by GitHub); 7 | 6. issue-open-white.svg (by GitHub); 8 | 7. issue-reopened.svg (by GitHub); 9 | 8. issue-reopened-white.svg (by GitHub); 10 | 9. logo.png (by GitHub); 11 | 10. logo.svg (by GitHub); 12 | 11. logo-green.png (by GitHub); 13 | 12. logo-green.svg (by GitHub); 14 | 13. logo-red.png (by GitHub); 15 | 14. logo-red.svg (by GitHub); 16 | 15. logo-white.png (by GitHub); 17 | 16. logo-white.svg (by GitHub); 18 | 17. logo-yellow.png (by GitHub); 19 | 18. logo-yellow.svg (by GitHub); 20 | 19. pr-merged.svg (by GitHub); 21 | 20. pr-merged-white.svg (by GitHub); 22 | 21. pr-opened.svg (by GitHub); 23 | 22. pr-opened-white.svg (by GitHub); 24 | 23. tag.svg (by jxnblk); 25 | 24. star.svg (by jxnblk); 26 | 25. terminal.svg (by GitHub); 27 | 28 | --- 29 | 30 | Copyright 2017 31 | 32 | 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: 33 | 34 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 35 | 36 | 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. -------------------------------------------------------------------------------- /main/dist/img/back.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/code.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/directory.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/download.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/edit.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /main/dist/img/file.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/info.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/issue-closed-white.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/issue-closed.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/issue-open-white.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/issue-open.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/issue-reopened-white.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/issue-reopened.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/log.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/logo-green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purplesyringa/gitcenter/d0d35f10e60e520ea8ab0541ba94931a7eaf3dac/main/dist/img/logo-green.png -------------------------------------------------------------------------------- /main/dist/img/logo-green.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /main/dist/img/logo-red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purplesyringa/gitcenter/d0d35f10e60e520ea8ab0541ba94931a7eaf3dac/main/dist/img/logo-red.png -------------------------------------------------------------------------------- /main/dist/img/logo-red.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /main/dist/img/logo-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purplesyringa/gitcenter/d0d35f10e60e520ea8ab0541ba94931a7eaf3dac/main/dist/img/logo-white.png -------------------------------------------------------------------------------- /main/dist/img/logo-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /main/dist/img/logo-yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purplesyringa/gitcenter/d0d35f10e60e520ea8ab0541ba94931a7eaf3dac/main/dist/img/logo-yellow.png -------------------------------------------------------------------------------- /main/dist/img/logo-yellow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /main/dist/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purplesyringa/gitcenter/d0d35f10e60e520ea8ab0541ba94931a7eaf3dac/main/dist/img/logo.png -------------------------------------------------------------------------------- /main/dist/img/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /main/dist/img/pr-merged-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /main/dist/img/pr-merged.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /main/dist/img/pr-opened-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /main/dist/img/pr-opened.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /main/dist/img/preview.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/reactions/heart.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/reactions/smile.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/reactions/thumbs-down.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/reactions/thumbs-up.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/releases.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/remove.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/settings.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/star.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/submodule.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/terminal.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/tick.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/unknown.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/img/user.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Git Center 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 |
Git Center
20 |
21 | 22 |
Repository Index
23 |
24 | 25 |
My Repos
26 |
27 | 28 |
Beginner's Guide
29 |
30 | 31 |
Support
32 |
33 | 34 |
Profile
35 |
36 | 37 |
For devs
38 |
39 |
40 |
41 |

Welcome to Git Center!

42 |

43 | Git Center is a decentralized hosting platform for Git repositories. We provide several collaboration features such as bug tracking for every project, and private and public repositories for free. Join us by creating a new repository. 44 |

45 |

46 | Git Center is built using ZeroNet, so its workflow quite differs from GitHub. If you have any questions, ask us for support. 47 |

48 |

49 |
50 | Beginner's Guide 51 | New repository 52 |

53 | 54 |

Contributors

55 |

56 | If I missed you, mail me here. 57 |

58 | 64 |
65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /main/dist/index/css/repo.css: -------------------------------------------------------------------------------- 1 | .repo { 2 | display: block; 3 | margin-top: 16px; 4 | padding: 3px 10px 3px 8px; 5 | border: 1px solid #D5D5D5; 6 | border-radius: 4px; 7 | cursor: pointer; 8 | 9 | background-color: #FCFCFC; 10 | background-repeat: no-repeat; 11 | 12 | font-size: 16px; 13 | line-height: 24px; 14 | text-decoration: none; 15 | 16 | transition: all .1s; 17 | } 18 | .repo:hover { 19 | background-color: #DDF; 20 | } 21 | 22 | .repo-title { 23 | font-size: 24px; 24 | line-height: 32px; 25 | } 26 | 27 | .repo-address { 28 | color: #888; 29 | } 30 | 31 | .repo-stars { 32 | display: inline-block; 33 | height: 24px; 34 | float: right; 35 | margin-top: 4px; 36 | margin-left: 8px; 37 | padding-left: 28px; 38 | border-radius: 8px; 39 | color: black; 40 | 41 | background-image: url(../../img/star.svg); 42 | background-size: auto 16px; 43 | background-repeat: no-repeat; 44 | background-position: 8px 4px; 45 | } 46 | 47 | .repo-downloaded { 48 | display: inline-block; 49 | height: 24px; 50 | width: 24px; 51 | float: right; 52 | margin-top: 4px; 53 | 54 | background-image: url(../../img/download.svg); 55 | background-size: auto 16px; 56 | background-repeat: no-repeat; 57 | background-position: 8px 4px; 58 | } 59 | 60 | 61 | .search { 62 | display: block; 63 | width: calc(100% - 16px); 64 | padding: 4px 8px; 65 | border-radius: 4px; 66 | border: 1px solid black; 67 | 68 | font-size: 16px; 69 | } 70 | 71 | .hint { 72 | display: block; 73 | margin: 16px 0; 74 | font-size: 16px; 75 | } -------------------------------------------------------------------------------- /main/dist/index/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Repository Index - Git Center 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 |
Git Center
21 |
22 | 23 |
Repository Index
24 |
25 | 26 |
My Repos
27 |
28 | 29 |
Beginner's Guide
30 |
31 | 32 |
Support
33 |
34 | 35 |
Profile
36 |
37 | 38 |
For devs
39 |
40 |
41 | 42 |
43 |

Repository Index

44 | 45 | 46 |
47 | a b c matches a or b or c
48 | +a +b +c matches a and b and c
49 | +a b c matches a and (b or c)
50 | sort:date sorts by publish date
51 | sort:stars (default) sorts by star count
52 | sort:random uses random order
53 | is:downloaded shows only downloaded 54 |
55 | 56 |
57 |
58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /main/dist/index/js/main.js: -------------------------------------------------------------------------------- 1 | zeroFrame = new ZeroFrame(); 2 | zeroPage = new ZeroPage(zeroFrame); 3 | zeroDB = new ZeroDB(zeroPage); 4 | 5 | function escapeString(str) { 6 | return "\"" + ( 7 | str 8 | .replace(/\//g, "//") 9 | .replace(/"/g, "\"") 10 | ) + "\""; 11 | } 12 | function updateIndex(search) { 13 | let link = { 14 | stop: false 15 | }; 16 | 17 | let required = []; 18 | let maybe = []; 19 | let state = ""; 20 | let sort = "stars"; 21 | let isDownloaded = false; 22 | search.split(/\s+/) 23 | .filter(word => word.length) 24 | .forEach(word => { 25 | word = word 26 | .replace(/\*/g, "%") 27 | .replace(/\?/g, "_"); 28 | 29 | if(word.indexOf("sort:") > -1) { 30 | sort = word.substr(5); 31 | } else if(word[0] == "+" && word.length > 1) { 32 | required.push("\ 33 | repo_index.description LIKE " + escapeString("%" + word.substr(1) + "%") + "\ 34 | OR\ 35 | repo_index.title LIKE " + escapeString("%" + word.substr(1) + "%") + "\ 36 | "); 37 | } else if(word == "is:downloaded") { 38 | isDownloaded = true; 39 | } else { 40 | maybe.push("\ 41 | repo_index.description LIKE " + escapeString("%" + word + "%") + "\ 42 | OR\ 43 | repo_index.title LIKE " + escapeString("%" + word + "%") + "\ 44 | "); 45 | } 46 | }); 47 | 48 | if(sort == "stars") { 49 | sort = "stars DESC"; 50 | } else if(sort == "date") { 51 | sort = "\ 52 | CASE WHEN date_added IS NULL\ 53 | THEN 0\ 54 | ELSE date_added\ 55 | END DESC\ 56 | "; 57 | } else if(sort == "random") { 58 | sort = "RANDOM() ASC"; 59 | } else { 60 | sort = "stars DESC"; 61 | } 62 | 63 | link.promise = zeroDB.query(("\ 64 | SELECT repo_index.*, json.cert_user_id, COUNT(repo_stars.address) AS stars\ 65 | FROM repo_index, json\ 66 | LEFT JOIN repo_stars ON repo_stars.address = repo_index.address AND repo_stars.star = 1\ 67 | \ 68 | WHERE repo_index.json_id = json.json_id AND (" + 69 | (required.length ? "(" + required.join(") AND (") + ")" : "1 = 1") + "\ 70 | AND " + 71 | (maybe.length ? "(" + maybe.join(") OR (") + ")" : "1 = 1") + "\ 72 | AND " + 73 | (isDownloaded ? "?" : "1 = 1") + "\ 74 | )\ 75 | GROUP BY repo_index.address\ 76 | ORDER BY " + sort + "\ 77 | ").trim(), { 78 | "repo_index.address": downloaded 79 | }) 80 | .then(index => { 81 | if(link.stop) { 82 | return; 83 | } 84 | 85 | document.getElementById("repos").innerHTML = ""; 86 | 87 | index.forEach(repo => { 88 | let node = document.createElement("a"); 89 | node.className = "repo"; 90 | node.href = "/" + repo.address; 91 | 92 | let stars = document.createElement("div"); 93 | stars.className = "repo-stars"; 94 | stars.textContent = repo.stars; 95 | node.appendChild(stars); 96 | 97 | if(downloaded.indexOf(repo.address) > -1) { 98 | let downloaded = document.createElement("div"); 99 | downloaded.className = "repo-downloaded"; 100 | node.appendChild(downloaded); 101 | } 102 | 103 | let title = document.createElement("div"); 104 | title.className = "repo-title"; 105 | title.textContent = repo.title; 106 | node.appendChild(title); 107 | 108 | let address = document.createElement("div"); 109 | address.className = "repo-address"; 110 | address.textContent = repo.description; 111 | address.appendChild(document.createElement("br")); 112 | address.appendChild(document.createTextNode(repo.address)); 113 | node.appendChild(address); 114 | 115 | document.getElementById("repos").appendChild(node); 116 | }); 117 | }); 118 | 119 | return link; 120 | } 121 | 122 | let downloaded; 123 | Repository.getDownloadedRepos(zeroPage) 124 | .then(d => { 125 | downloaded = d; 126 | 127 | // Search 128 | let search = decodeURIComponent((location.search.match(/[?&]q=(.+?)(&|$)/) || ["", ""])[1]); 129 | document.getElementById("search").value = search; 130 | let link = updateIndex(search); 131 | link.promise.then(() => { 132 | document.getElementById("search").oninput = () => { 133 | link.stop = true; 134 | link = updateIndex(document.getElementById("search").value); 135 | 136 | zeroPage.cmd("wrapperReplaceState", [null, "Search - Git Center", "?q=" + document.getElementById("search").value]); 137 | }; 138 | }); 139 | }); 140 | 141 | window.addEventListener("load", () => { 142 | setTitle("Repository Index"); 143 | }); -------------------------------------------------------------------------------- /main/dist/install/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Create new repository - Git Center 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 |
Git Center
21 |
22 | 23 |
Repository Index
24 |
25 | 26 |
My Repos
27 |
28 | 29 |
Beginner's Guide
30 |
31 | 32 |
Support
33 |
34 | 35 |
Profile
36 |
37 |
38 |
39 |

Create new repository

40 |
41 | 42 |
43 |
44 | Repository type 45 |
46 |
47 | 51 |
52 |
53 | 54 |
55 |
56 | Title 57 |
58 |
59 | You won't be able to change it later. 60 |
61 |
62 | 63 |
64 |
65 | 66 |
67 |
68 | Folder name 69 |
70 |
71 | 72 |
73 |
74 | 75 |
76 |
77 | Description 78 |
79 |
80 | 81 |
82 |
83 | 84 |
85 | Create 86 |
87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /main/dist/install/js/main.js: -------------------------------------------------------------------------------- 1 | repo.addMerger() 2 | .then(() => { 3 | return repo.getContent(); 4 | }) 5 | .then(content => { 6 | if(content.installed) { 7 | location.href = "../repo/?" + address; 8 | } 9 | 10 | let title = document.getElementById("title"); 11 | let description = document.getElementById("description"); 12 | let gitAddress = document.getElementById("address"); 13 | 14 | let showGitAddress = () => { 15 | gitAddress.value = title.value.replace(/[^a-zA-Z0-9]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "").toLowerCase(); 16 | if(gitAddress.value) { 17 | if(typeSelect.value == "git") { 18 | gitAddress.value += ".git"; 19 | } else { 20 | gitAddress.value += "/.hg"; 21 | } 22 | } else { 23 | if(typeSelect.value == "git") { 24 | gitAddress.value = "repo.git"; 25 | } else { 26 | gitAddress.value = "repo/.hg"; 27 | } 28 | } 29 | }; 30 | 31 | title.oninput = () => { 32 | showGitAddress(); 33 | }; 34 | 35 | let installButton = document.getElementById("install"); 36 | installButton.onclick = () => { 37 | if(installButton.classList.contains("button-disabled")) { 38 | return; 39 | } else if(title.value == "" || description.value == "" || gitAddress.value == "") { 40 | return; 41 | } 42 | 43 | installButton.classList.add("button-disabled"); 44 | 45 | repo.install(title.value, description.value, gitAddress.value, typeSelect.value) 46 | .then(() => { 47 | location.href = "../repo/?" + address; 48 | }, e => { 49 | zeroPage.error(e); 50 | installButton.classList.remove("button-disabled"); 51 | }); 52 | }; 53 | 54 | let typeSelect = document.getElementById("type"); 55 | typeSelect.onchange = () => { 56 | showGitAddress(); 57 | }; 58 | }); 59 | 60 | window.addEventListener("load", () => { 61 | setTitle("Create new repository"); 62 | }); -------------------------------------------------------------------------------- /main/dist/js/main.js: -------------------------------------------------------------------------------- 1 | zeroFrame = new ZeroFrame(); 2 | zeroPage = new ZeroPage(zeroFrame); 3 | 4 | let siteInfo, list; 5 | zeroPage.getSiteInfo() 6 | .then(s => { 7 | siteInfo = s; 8 | if(siteInfo.settings.permissions.indexOf("Merger:GitCenter") == -1) { 9 | return zeroPage.cmd("wrapperPermissionAdd", ["Merger:GitCenter"]); 10 | } 11 | }) 12 | .then(() => { 13 | if(siteInfo.settings.permissions.indexOf("Cors:1iD5ZQJMNXu43w1qLB8sfdHVKppVMduGz") == -1) { 14 | return zeroPage.cmd("corsPermission", ["1iD5ZQJMNXu43w1qLB8sfdHVKppVMduGz"]); 15 | } 16 | }) 17 | .then(() => { 18 | return zeroPage.cmd("mergerSiteList"); 19 | }) 20 | .then(l => { 21 | list = l; 22 | if(!list["1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6"]) { 23 | return zeroPage.cmd("mergerSiteAdd", ["1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6"]); 24 | } 25 | }) 26 | .then(() => { 27 | if(!list["1iNDExENNBsfHc6SKmy1HaeasHhm3RPcL"]) { 28 | return zeroPage.cmd("mergerSiteAdd", ["1iNDExENNBsfHc6SKmy1HaeasHhm3RPcL"]); 29 | } 30 | }) 31 | .then(() => { 32 | let button = document.getElementById("create_repository"); 33 | button.classList.remove("button-disabled"); 34 | button.onclick = () => { 35 | Repository.createRepo(zeroPage); 36 | }; 37 | }); 38 | 39 | window.addEventListener("load", () => { 40 | setTitle(""); 41 | }); -------------------------------------------------------------------------------- /main/dist/js/root.js: -------------------------------------------------------------------------------- 1 | if(!window.zeroPage) { 2 | zeroFrame = new ZeroFrame(); 3 | zeroPage = new ZeroPage(zeroFrame); 4 | } 5 | 6 | ((self) => { 7 | // To those who don't understand why timeout is used here: 8 | // 9 | // ZeroNet changes title when it receives `setSiteInfo` event. And in many other 10 | // situations. I don't want to catch them, really, I tried and that was *much* 11 | // code. So please don't touch this *working* code! 12 | 13 | let currentTitle = null; 14 | 15 | function setTitle(title) { 16 | // Join " - Git Center" to title 17 | title = title ? title + " - Git Center" : "Git Center"; 18 | 19 | // Exit on exact title because otherwise we will be left with two timeouts 20 | // setting one title 21 | if(currentTitle === title) { 22 | return; 23 | } 24 | 25 | currentTitle = title; 26 | updateTitle(title); 27 | } 28 | 29 | function updateTitle(title) { 30 | // Check if title is the same as we set, if it was changed, then another timeout 31 | // was just ran 32 | if(currentTitle === title) { 33 | zeroPage.cmd("wrapperSetTitle", [title]); 34 | 35 | // Change title every second 36 | setTimeout(() => updateTitle(title), 1000); 37 | } 38 | } 39 | 40 | self.setTitle = setTitle; 41 | })(this); -------------------------------------------------------------------------------- /main/dist/myrepos/css/repo.css: -------------------------------------------------------------------------------- 1 | .repo { 2 | display: block; 3 | margin-top: 16px; 4 | padding: 3px 10px 3px 8px; 5 | border: 1px solid #D5D5D5; 6 | border-radius: 4px; 7 | cursor: pointer; 8 | 9 | background-color: #FCFCFC; 10 | background-repeat: no-repeat; 11 | 12 | font-size: 16px; 13 | line-height: 24px; 14 | text-decoration: none; 15 | 16 | transition: all .1s; 17 | } 18 | .repo:hover { 19 | background-color: #DDF; 20 | } 21 | 22 | .repo-title { 23 | font-size: 24px; 24 | line-height: 32px; 25 | } 26 | 27 | .repo-address { 28 | color: #888; 29 | } -------------------------------------------------------------------------------- /main/dist/myrepos/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | My Repos - Git Center 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 |
Git Center
21 |
22 | 23 |
Repository Index
24 |
25 | 26 |
My Repos
27 |
28 | 29 |
Beginner's Guide
30 |
31 | 32 |
Support
33 |
34 | 35 |
Profile
36 |
37 | 38 |
For devs
39 |
40 |
41 | 42 |
43 |

44 | My Repos 45 | New repository 46 |

47 | 48 |
49 |
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /main/dist/myrepos/js/main.js: -------------------------------------------------------------------------------- 1 | zeroFrame = new ZeroFrame(); 2 | zeroPage = new ZeroPage(zeroFrame); 3 | zeroFS = new ZeroFS(zeroPage); 4 | zeroDB = new ZeroDB(zeroPage); 5 | 6 | document.getElementById("create_repository").onclick = () => { 7 | Repository.createRepo(zeroPage); 8 | }; 9 | 10 | zeroPage.cmd("mergerSiteList", [true]) 11 | .then(repos => { 12 | repos = Object.keys(repos) 13 | .filter(repo => typeof repos[repo].privatekey != "undefined"); 14 | 15 | let index = repos.indexOf("1iNDExENNBsfHc6SKmy1HaeasHhm3RPcL"); 16 | if(index > -1) { 17 | repos.splice(index, 1); 18 | } 19 | 20 | return Promise.all( 21 | repos.map(repo => { 22 | return zeroFS.readFile("merged-GitCenter/" + repo + "/content.json") 23 | .then(content => { 24 | content = JSON.parse(content); 25 | 26 | return { 27 | title: content.title, 28 | description: content.description, 29 | address: repo 30 | }; 31 | }); 32 | }) 33 | ); 34 | }) 35 | .then(repos => { 36 | repos.forEach(repo => { 37 | let node = document.createElement("a"); 38 | node.className = "repo"; 39 | node.href = "/" + repo.address; 40 | 41 | let title = document.createElement("div"); 42 | title.className = "repo-title"; 43 | title.textContent = repo.title; 44 | node.appendChild(title); 45 | 46 | let address = document.createElement("div"); 47 | address.className = "repo-address"; 48 | address.textContent = repo.description; 49 | address.appendChild(document.createElement("br")); 50 | address.appendChild(document.createTextNode(repo.address)); 51 | node.appendChild(address); 52 | 53 | document.getElementById("repos").appendChild(node); 54 | }); 55 | }); 56 | 57 | window.addEventListener("load", () => { 58 | setTitle("My Repos"); 59 | }); -------------------------------------------------------------------------------- /main/dist/profile/css/profile.css: -------------------------------------------------------------------------------- 1 | .profile { 2 | display: none; 3 | } -------------------------------------------------------------------------------- /main/dist/profile/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Profile - Git Center 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 |
Git Center
22 |
23 | 24 |
Repository Index
25 |
26 | 27 |
My Repos
28 |
29 | 30 |
Beginner's Guide
31 |
32 | 33 |
Support
34 |
35 | 36 |
Profile
37 |
38 | 39 |
For devs
40 |
41 |
42 |
43 |

Profile

44 |
45 | 46 |
47 |
48 |
49 | Author email 50 |
51 |
52 | This email is used when committing files via Git Center. 53 |
54 |
55 | 56 |
57 |
58 | 59 |
60 |
61 | Author name 62 |
63 |
64 | 65 |
66 |
67 | 68 |
69 | Save 70 |
71 |
72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /main/dist/profile/js/main.js: -------------------------------------------------------------------------------- 1 | zeroFrame = new ZeroFrame(); 2 | zeroPage = new ZeroPage(zeroFrame); 3 | zeroFS = new ZeroFS(zeroPage); 4 | zeroAuth = new ZeroAuth(zeroPage); 5 | 6 | let loadProfile = address => { 7 | return zeroFS.readFile("data/users/" + address + "/data.json") 8 | .then(profile => JSON.parse(profile), () => ({})); 9 | }; 10 | let saveProfile = (address, profile) => { 11 | return zeroFS.writeFile("data/users/" + address + "/data.json", JSON.stringify(profile, null, "\t")) 12 | .then(() => { 13 | return zeroPage.cmd("siteSign", {inner_path: "data/users/" + address + "/content.json"}); 14 | }) 15 | .then(() => { 16 | return zeroPage.cmd("sitePublish", {inner_path: "data/users/" + address + "/content.json", sign: false}); 17 | }) 18 | .then(res => { 19 | if(res != "ok" && res.error != "Port not opened." && res.error != "Content publish failed.") { 20 | return Promise.reject(res); 21 | } 22 | }); 23 | }; 24 | 25 | let auth; 26 | zeroPage.getSiteInfo() 27 | .then(() => { 28 | return zeroAuth.requestAuth(); 29 | }) 30 | .then(a => { 31 | auth = a; 32 | 33 | return loadProfile(auth.address); 34 | }) 35 | .then(profile => { 36 | document.getElementById("profile").style.display = "block"; 37 | 38 | let commitEmail = document.getElementById("commit_email"); 39 | commitEmail.value = profile.commitEmail || auth.user; 40 | 41 | let commitName = document.getElementById("commit_name"); 42 | commitName.value = profile.commitName || auth.user[0].toUpperCase() + auth.user.substr(1).replace(/@.*/, ""); 43 | 44 | let saveButton = document.getElementById("save"); 45 | saveButton.onclick = () => { 46 | if(saveButton.classList.contains("button-disabled")) { 47 | return; 48 | } 49 | 50 | saveButton.classList.add("button-disabled"); 51 | 52 | saveProfile(auth.address, { 53 | commitEmail: commitEmail.value, 54 | commitName: commitName.value 55 | }) 56 | .then(() => { 57 | saveButton.classList.remove("button-disabled"); 58 | }, e => { 59 | zeroPage.error(e); 60 | saveButton.classList.remove("button-disabled"); 61 | }); 62 | }; 63 | }); 64 | 65 | window.addEventListener("load", () => { 66 | setTitle("Profile"); 67 | }); -------------------------------------------------------------------------------- /main/dist/repo/commit/css/commit.css: -------------------------------------------------------------------------------- 1 | .diffs { 2 | width: 896px; 3 | margin: 0 auto; 4 | } 5 | 6 | .diff-file { 7 | display: block; 8 | width: calc(100% - 2px); 9 | margin-bottom: 16px; 10 | overflow: hidden; 11 | 12 | border: 1px solid #DDD; 13 | border-radius: 2px; 14 | } 15 | 16 | .diff-header { 17 | display: block; 18 | padding: 8px 16px; 19 | background-color: #DDF; 20 | 21 | font-size: 16px; 22 | } 23 | 24 | .credits { 25 | width: 896px; 26 | margin: 0 auto; 27 | 28 | font-size: 16px; 29 | } -------------------------------------------------------------------------------- /main/dist/repo/commit/css/diff.css: -------------------------------------------------------------------------------- 1 | /* 2 | This is part of jsdifflib v1.0. 3 | 4 | Copyright 2007 - 2011 Chas Emerick . All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without modification, are 7 | permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this list of 10 | conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, this list 13 | of conditions and the following disclaimer in the documentation and/or other materials 14 | provided with the distribution. 15 | 16 | THIS SOFTWARE IS PROVIDED BY Chas Emerick ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 | WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 18 | FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Chas Emerick OR 19 | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 22 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 23 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 24 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | 26 | The views and conclusions contained in the software and documentation are those of the 27 | authors and should not be interpreted as representing official policies, either expressed 28 | or implied, of Chas Emerick. 29 | */ 30 | table.diff { 31 | white-space: pre-wrap; 32 | font-size: 16px; 33 | border-spacing: 0; 34 | table-layout: fixed; 35 | width: 100%; 36 | } 37 | table.diff tbody { 38 | font-family: "Consolas", "Courier", monospace; 39 | } 40 | table.diff tbody th { 41 | background:#EED; 42 | font-weight:normal; 43 | color:#886; 44 | padding:.3em .5em .1em 2em; 45 | text-align:right; 46 | vertical-align:top; 47 | width: 40px; 48 | } 49 | table.diff thead { 50 | display: none; 51 | } 52 | table.diff tbody td { 53 | padding:0px .4em; 54 | padding-top:.4em; 55 | vertical-align:top; 56 | } 57 | table.diff .empty { 58 | background-color:#DDD; 59 | } 60 | table.diff .replace { 61 | background-color:#FD8 62 | } 63 | table.diff .delete { 64 | background-color:#FDD; 65 | } 66 | table.diff .skip { 67 | background-color:#EFEFEF; 68 | } 69 | table.diff .insert { 70 | background-color:#DFD 71 | } 72 | table.diff th.author { 73 | display: none; /* Sorry, will add to footer */ 74 | } -------------------------------------------------------------------------------- /main/dist/repo/commit/js/main.js: -------------------------------------------------------------------------------- 1 | if(address == "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6") { 2 | location.href = "../../default/"; 3 | } 4 | 5 | branch = additional; 6 | 7 | repo.addMerger() 8 | .then(() => { 9 | return repo.getContent(); 10 | }) 11 | .then(content => { 12 | if(!content.installed) { 13 | location.href = "../../install/?" + address; 14 | } 15 | 16 | setTitle(branch + " - " + content.title); 17 | 18 | showTitle(content.title); 19 | showHeader(1, content); 20 | showLinks(); 21 | showTabs(1); 22 | 23 | return repo.vcs.readBranchCommit(branch); 24 | }) 25 | .then(commit => { 26 | document.getElementById("commit_title").textContent = commit.content.message; 27 | document.getElementById("commit_description").appendChild(document.createTextNode(repo.parseAuthor(commit.content.committer))); 28 | 29 | return repo.diff(branch); 30 | }) 31 | .then(diff => { 32 | diff.forEach(item => { 33 | let diff = document.createElement("div"); 34 | diff.className = "diff-file"; 35 | 36 | let header = document.createElement("div"); 37 | header.className = "diff-header"; 38 | header.textContent = item.name; 39 | diff.appendChild(header); 40 | 41 | if(item.type == "blob") { 42 | diff.appendChild(item.content); 43 | } else if(item.type == "submodule") { 44 | diff.appendChild(item.content); 45 | } 46 | 47 | document.getElementById("diffs").appendChild(diff); 48 | }); 49 | }); -------------------------------------------------------------------------------- /main/dist/repo/css/comments.css: -------------------------------------------------------------------------------- 1 | .comments { 2 | display: block; 3 | width: 896px; 4 | padding: 0 calc(50% - 448px); 5 | } 6 | 7 | .comment { 8 | display: block; 9 | margin-bottom: 16px; 10 | border: 1px solid #888; 11 | border-radius: 4px; 12 | 13 | position: relative; 14 | } 15 | 16 | .comment-header { 17 | display: block; 18 | padding: 12px 16px; 19 | border-bottom: 1px solid #888; 20 | background-color: #EEE; 21 | border-radius: 4px 4px 0 0; 22 | 23 | font-size: 16px; 24 | } 25 | 26 | .comment-content { 27 | display: block; 28 | padding: 12px 16px; 29 | background-color: #FFF; 30 | 31 | font-size: 16px; 32 | } 33 | .comment-owned .comment-content { 34 | background-color: #FFC; 35 | } 36 | 37 | .comment-content img { 38 | max-width: 100%; 39 | } 40 | 41 | .comment-textarea { 42 | display: block; 43 | width: calc(100% - 32px); 44 | padding: 20px 16px; /* Additional 8px due to

*/ 45 | background-color: #FFF; 46 | resize: none; 47 | border: none; 48 | height: 128px; 49 | 50 | font-size: 16px; 51 | font-family: Helvetica, Arial, sans-serif; 52 | } 53 | 54 | 55 | .comment-title-edit, .comment-content-edit, .comment-info-edit { 56 | display: block; 57 | width: calc(100% - 18px); 58 | padding: 8px; 59 | margin-bottom: 8px; 60 | box-sizing: content-box; 61 | 62 | border: 1px solid #888; 63 | border-radius: 4px; 64 | 65 | font-size: 16px; 66 | font-family: Helvetica, Arial, sans-serif; 67 | } 68 | .comment-title-edit { 69 | height: 16px; 70 | } 71 | .comment-content-edit { 72 | height: 256px; 73 | resize: vertical; 74 | } 75 | .comment-info-edit { 76 | height: 16px; 77 | } 78 | 79 | .comment-submit { 80 | float: right; 81 | } 82 | .comment-submit-close { 83 | display: none; 84 | float: right; 85 | margin-right: 16px; 86 | } 87 | 88 | .comment code { 89 | display: inline; 90 | background-color: #EEE; 91 | border: 8px solid #EEE; 92 | border-top-width: 4px; 93 | border-bottom-width: 4px; 94 | border-radius: 4px; 95 | } 96 | 97 | .comment pre { 98 | display: block; 99 | background-color: #EEE; 100 | border: 16px solid #EEE; 101 | border-top-width: 8px; 102 | border-bottom-width: 8px; 103 | border-radius: 4px; 104 | 105 | overflow: auto; 106 | } 107 | .comment pre code { 108 | display: block; 109 | background: none; 110 | border: none; 111 | border-radius: 0; 112 | } 113 | 114 | 115 | .action { 116 | display: block; 117 | margin-left: 16px; 118 | margin-top: -14px; 119 | margin-bottom: 2px; 120 | padding: 14px 0; 121 | padding-left: 16px; 122 | border-left: 1px solid #888; 123 | 124 | font-size: 16px; 125 | color: #444; 126 | } 127 | 128 | 129 | .comment-edit, .comment-save, .comment-preview, .comment-remove, .comment-cancel { 130 | display: inline-block; 131 | width: 16px; 132 | height: 16px; 133 | float: right; 134 | margin-left: 16px; 135 | cursor: pointer; 136 | 137 | background-repeat: no-repeat; 138 | background-size: contain; 139 | background-position: center; 140 | } 141 | .comment-edit { 142 | background-image: url(../../img/edit.svg); 143 | } 144 | .comment-save { 145 | background-image: url(../../img/tick.svg); 146 | } 147 | .comment-preview { 148 | background-image: url(../../img/preview.svg); 149 | } 150 | .comment-remove { 151 | background-image: url(../../img/remove.svg); 152 | } 153 | .comment-cancel { 154 | background-image: url(../../img/back.svg); 155 | } 156 | 157 | 158 | .comment-footer { 159 | display: block; 160 | padding: 4px 16px; 161 | border-top: 1px solid #888; 162 | background-color: #EEE; 163 | border-radius: 0 0 4px 4px; 164 | 165 | font-size: 16px; 166 | } 167 | 168 | /* Reactions */ 169 | .comment-reaction { 170 | display: inline-block; 171 | margin-right: 16px; 172 | padding: 8px; 173 | padding-bottom: 4px; 174 | border-radius: 4px; 175 | cursor: pointer; 176 | } 177 | .comment-reaction-owned { 178 | background-color: #FFC; 179 | } 180 | .comment-reaction:hover { 181 | background-color: #DDD; 182 | } 183 | .comment-reaction:active { 184 | background-color: #FFF; 185 | } 186 | 187 | .comment-reaction-icon { 188 | display: inline-block; 189 | width: 20px; 190 | height: 20px; 191 | 192 | background-size: contain; 193 | background-repeat: no-repeat; 194 | background-position: center; 195 | } 196 | .comment-reaction-icon-thumbs-up { 197 | background-image: url(../../img/reactions/thumbs-up.svg); 198 | } 199 | .comment-reaction-icon-thumbs-down { 200 | background-image: url(../../img/reactions/thumbs-down.svg); 201 | } 202 | .comment-reaction-icon-smile { 203 | background-image: url(../../img/reactions/smile.svg); 204 | } 205 | .comment-reaction-icon-heart { 206 | background-image: url(../../img/reactions/heart.svg); 207 | } 208 | 209 | .comment-reaction-count { 210 | display: inline-block; 211 | margin-top: 2px; 212 | margin-left: 4px; 213 | vertical-align: top; 214 | 215 | font-size: 16px; 216 | } -------------------------------------------------------------------------------- /main/dist/repo/css/files.css: -------------------------------------------------------------------------------- 1 | .files { 2 | width: 896px; 3 | margin: 0 auto; 4 | border-spacing: 0; 5 | 6 | border: 1px solid #DDF; 7 | border-radius: 4px; 8 | } 9 | 10 | .files td { 11 | width: auto; 12 | margin: 0; 13 | padding: 8px; 14 | font-family: Helvetica, Arial, sans-serif; 15 | font-size: 16px; 16 | } 17 | .files tr { 18 | cursor: pointer; 19 | } 20 | .files tr:hover { 21 | background-color: #EEF; 22 | } 23 | 24 | .files tr td { 25 | border-top: 1px solid #DDF; 26 | } 27 | .files tr:first-child td { 28 | border-top: none; 29 | } 30 | 31 | .files-header { 32 | cursor: default !important; 33 | background-color: #DDF !important; 34 | } 35 | .files-header a { 36 | color: #008; 37 | } 38 | 39 | .file-icon { 40 | height: auto; 41 | width: 16px; 42 | margin-right: 8px; 43 | vertical-align: top; 44 | } 45 | 46 | .new-file { 47 | display: none; 48 | } 49 | 50 | /* readme */ 51 | 52 | .readme { 53 | width: 880px; 54 | margin: 16px auto; 55 | padding: 8px; 56 | background-color: #DDF; 57 | border: 1px solid #AAF; 58 | border-radius: 4px; 59 | 60 | font-size: 16px; 61 | } 62 | 63 | .readme img { 64 | max-width: 100%; 65 | } -------------------------------------------------------------------------------- /main/dist/repo/css/info.css: -------------------------------------------------------------------------------- 1 | .branches { 2 | width: 128px; 3 | } 4 | 5 | .branch { 6 | display: block; 7 | width: 96px; 8 | padding: 8px 16px; 9 | background-color: #EEE; 10 | cursor: pointer; 11 | 12 | font-size: 16px; 13 | line-height: 14px; 14 | } 15 | .branch:hover { 16 | background-color: #DDF; 17 | } 18 | 19 | .branch-active { 20 | background-color: #DDF; 21 | } 22 | 23 | .tag { 24 | background-color: #EDD; 25 | } 26 | .tag:hover { 27 | background-color: #FBB; 28 | } 29 | .tag.branch-active { 30 | background-color: #FBB; 31 | } -------------------------------------------------------------------------------- /main/dist/repo/css/tabs.css: -------------------------------------------------------------------------------- 1 | .tab { 2 | display: inline-block; 3 | padding: 8px 16px; 4 | cursor: pointer; 5 | 6 | color: #666; 7 | font-size: 16px; 8 | text-decoration: none; 9 | } 10 | 11 | .tab-current { 12 | margin-bottom: -1px; 13 | 14 | border: 1px solid #888; 15 | border-top: 3px solid #007FF8; 16 | border-bottom: 1px solid transparent; 17 | border-radius: 4px 4px 0 0; 18 | 19 | color: #000; 20 | background-color: #FFF; 21 | } 22 | 23 | .tab > img { 24 | vertical-align: bottom; 25 | } 26 | 27 | .settings-link { 28 | display: none; 29 | } -------------------------------------------------------------------------------- /main/dist/repo/css/tags.css: -------------------------------------------------------------------------------- 1 | .tags { 2 | display: inline; 3 | } 4 | 5 | .tag { 6 | display: inline-block; 7 | margin-bottom: 2px; 8 | margin-left: 8px; 9 | padding: 4px 8px; 10 | border-radius: 4px; 11 | vertical-align: middle; 12 | font-size: 16px; 13 | text-decoration: none; 14 | } 15 | 16 | .tag-remove, .tag-add { 17 | display: inline-block; 18 | height: 12px; 19 | vertical-align: middle; 20 | margin-left: 8px; 21 | cursor: pointer; 22 | 23 | font-size: 24px; 24 | line-height: 12px; 25 | } -------------------------------------------------------------------------------- /main/dist/repo/edit/css/file.css: -------------------------------------------------------------------------------- 1 | .files { 2 | table-layout: auto; 3 | width: 896px; 4 | margin: 0 auto; 5 | border-spacing: 0; 6 | 7 | border: 1px solid #DDF; 8 | border-radius: 4px; 9 | } 10 | 11 | .files td { 12 | width: auto; 13 | margin: 0; 14 | padding: 8px; 15 | font-size: 16px; 16 | } 17 | 18 | .files tr td { 19 | border-top: 1px solid #DDF; 20 | } 21 | .files tr:first-child td { 22 | border-top: none; 23 | } 24 | 25 | .files-header { 26 | background-color: #DDF; 27 | font-family: Helvetica, Arial, sans-serif; 28 | } 29 | .files-header a { 30 | color: #008; 31 | } 32 | 33 | .file-content, .commit-message { 34 | padding: 0 !important; 35 | } 36 | .file-content-text { 37 | display: block; 38 | width: calc(100% - 16px); 39 | height: 496px; 40 | padding: 8px; 41 | margin: 0; 42 | border: 0; 43 | 44 | font-family: Consolas, "Courier New", monospace; 45 | resize: none; 46 | } 47 | .commit-message-input { 48 | display: block; 49 | width: 100%; 50 | margin: 0; 51 | border: 0; 52 | border-radius: 0 0 0 4px; 53 | } 54 | 55 | .commit-node { 56 | width: 0 !important; 57 | padding: 0 !important; 58 | border: 0 !important; 59 | } 60 | .commit-button { 61 | border-radius: 0 0 4px 0; 62 | } -------------------------------------------------------------------------------- /main/dist/repo/edit/js/main.js: -------------------------------------------------------------------------------- 1 | if(address == "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6") { 2 | location.href = "../../default/"; 3 | } 4 | 5 | repo.addMerger() 6 | .then(() => { 7 | return repo.getContent(); 8 | }) 9 | .then(content => { 10 | if(!content.installed) { 11 | location.href = "../../install/?" + address; 12 | } 13 | 14 | setTitle("Edit " + path + " - " + content.title); 15 | 16 | showTitle(content.title); 17 | showHeader(1, content); 18 | showBranches(); 19 | showPath(true); 20 | showTabs(1); 21 | 22 | document.getElementById("view").href = "../file/?" + address + "/" + path.replace(/@/g, "@@") + "@" + branch.replace(/@/g, "@@"); 23 | 24 | return repo.getFiles(branch, ""); 25 | }) 26 | .then(() => { 27 | // Tree exists 28 | return repo.getFile(branch, path) 29 | .then(blob => { 30 | let fileContent = document.getElementById("file_content"); 31 | fileContent.value = repo.vcs.decodeUTF8(blob); 32 | 33 | let saveButton = document.getElementById("save"); 34 | let commitMessage = document.getElementById("commit_message"); 35 | saveButton.onclick = () => { 36 | if(saveButton.classList.contains("button-disabled")) { 37 | return; 38 | } 39 | if(commitMessage.value == "") { 40 | return; 41 | } 42 | 43 | saveButton.classList.add("button-disabled"); 44 | 45 | repo.saveFile(path, repo.vcs.encodeUTF8(fileContent.value), branch, commitMessage.value) 46 | .then(commit => { 47 | saveButton.classList.remove("button-disabled"); 48 | commitMessage.value = ""; 49 | }); 50 | }; 51 | }, () => { 52 | // Blob doesn't exist 53 | let fileContent = document.getElementById("file_content"); 54 | fileContent.value = "File " + path + " does not exist on branch " + branch; 55 | document.getElementById("save").classList.add("button-disabled"); 56 | }); 57 | }, () => { 58 | // Tree doesn't exist 59 | let fileContent = document.getElementById("file_content"); 60 | fileContent.textContent = "Unknown branch " + branch; 61 | document.getElementById("save").classList.add("button-disabled"); 62 | }); -------------------------------------------------------------------------------- /main/dist/repo/file/css/file.css: -------------------------------------------------------------------------------- 1 | .files { 2 | table-layout: fixed; 3 | width: 896px; 4 | margin: 0 auto; 5 | border-spacing: 0; 6 | 7 | border: 1px solid #DDF; 8 | border-radius: 4px; 9 | } 10 | 11 | .files td { 12 | width: auto; 13 | margin: 0; 14 | padding: 8px; 15 | font-size: 16px; 16 | } 17 | 18 | .files tr td { 19 | border-top: 1px solid #DDF; 20 | } 21 | .files tr:first-child td { 22 | border-top: none; 23 | } 24 | 25 | .files-header { 26 | background-color: #DDF; 27 | font-family: Helvetica, Arial, sans-serif; 28 | } 29 | .files-header a { 30 | color: #008; 31 | } 32 | 33 | .file-content { 34 | font-family: Consolas, "Courier New", monospace; 35 | white-space: pre; 36 | overflow: auto; 37 | } 38 | .file-content.markdown { 39 | font-family: Arial; 40 | white-space: normal; 41 | } 42 | 43 | .edit { 44 | display: none; 45 | } 46 | 47 | /* Line numbers */ 48 | .line { 49 | display: inline-block; 50 | width: 100%; 51 | } 52 | .line-number { 53 | display: inline-block; 54 | width: 50px; 55 | padding-right: 8px; 56 | border-right: 1px solid #888; 57 | margin-right: 8px; 58 | cursor: pointer; 59 | 60 | text-align: right; 61 | } 62 | .line-selected { 63 | background-color: #FFD; 64 | } -------------------------------------------------------------------------------- /main/dist/repo/file/js/main.js: -------------------------------------------------------------------------------- 1 | if(address == "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6") { 2 | location.href = "../../default/"; 3 | } 4 | 5 | let head; 6 | 7 | repo.addMerger() 8 | .then(() => { 9 | return repo.getContent(); 10 | }) 11 | .then(content => { 12 | if(!content.installed) { 13 | location.href = "../../install/?" + address; 14 | } 15 | 16 | setTitle("View " + path + " - " + content.title); 17 | 18 | showTitle(content.title); 19 | showHeader(1, content); 20 | showBranches(); 21 | showPath(true); 22 | showLinks(); 23 | showTabs(1); 24 | 25 | repo.isSignable() 26 | .then(signable => { 27 | if(signable) { 28 | document.getElementById("edit").style.display = "inline-block"; 29 | document.getElementById("edit").href = "../edit/?" + address + "/" + path.replace(/@/g, "@@") + "@" + branch.replace(/@/g, "@@"); 30 | } 31 | }); 32 | 33 | return branch || repo.vcs.getHead(); 34 | }) 35 | .then(h => { 36 | head = h; 37 | return repo.vcs.readBranchCommit(head); 38 | }) 39 | .then(commit => { 40 | document.getElementById("commit_title").textContent = commit.content.message; 41 | 42 | repo.vcs.getBranchCommit(head) 43 | .then(c => { 44 | let diff = document.createElement("a"); 45 | diff.textContent = "[diff]"; 46 | diff.href = "commit/?" + address + "/" + c; 47 | document.getElementById("commit_description").appendChild(diff); 48 | 49 | document.getElementById("commit_description").appendChild(document.createElement("br")); 50 | document.getElementById("commit_description").appendChild(document.createTextNode(repo.parseAuthor(commit.content.committer))); 51 | }); 52 | 53 | return repo.getFiles(head, ""); 54 | }) 55 | .then(() => { 56 | // Tree exists 57 | return repo.getFile(head, path) 58 | .then(blob => { 59 | let fileContent = document.getElementById("file_content"); 60 | 61 | // Maybe this is a markdown file? 62 | if(path.endsWith(".md") || path.endsWith(".markdown")) { 63 | fileContent.classList.add("markdown"); 64 | fileContent.innerHTML = repo.renderMarked(repo.vcs.decodeUTF8(blob)); 65 | return; 66 | } 67 | 68 | 69 | fileContent.textContent = repo.vcs.decodeUTF8(blob); 70 | hljs.highlightBlock(fileContent); 71 | 72 | let lines = fileContent.innerHTML.split("\n"); 73 | lines = lines.map((line, id) => { 74 | return "" + (id + 1) + "" + line + ""; 75 | }); 76 | fileContent.innerHTML = lines.join("\n"); 77 | 78 | let lineNumbers = Array.from(document.getElementsByClassName("line-number")); 79 | lineNumbers.forEach(lineNumber => { 80 | lineNumber.onclick = () => { 81 | zeroPage.cmd("wrapperReplaceState", [null, "", "#L" + parseInt(lineNumber.innerHTML)]); 82 | location.hash = "#L" + parseInt(lineNumber.innerHTML); 83 | }; 84 | }); 85 | 86 | document.getElementById("download").onclick = () => { 87 | repo.download(path.split("/").slice(-1)[0], blob); 88 | }; 89 | 90 | window.onhashchange = () => { 91 | let hash = location.hash.replace("#", ""); 92 | if(hash[0] == "L" && !isNaN(hash.substr(1))) { 93 | let line = parseInt(hash.substr(1)); 94 | let node = document.getElementById("line_" + line); 95 | node.scrollIntoView(); 96 | 97 | let selected = Array.from(document.getElementsByClassName("line-selected")); 98 | selected.forEach(line => { 99 | line.classList.remove("line-selected"); 100 | }); 101 | node.classList.add("line-selected"); 102 | } 103 | }; 104 | return zeroPage.cmd("wrapperInnerLoaded"); 105 | }, () => { 106 | // Blob doesn't exist 107 | let fileContent = document.getElementById("file_content"); 108 | fileContent.textContent = "File " + path + " does not exist on branch " + head; 109 | }); 110 | }, () => { 111 | // Tree doesn't exist 112 | let fileContent = document.getElementById("file_content"); 113 | fileContent.textContent = "Unknown branch " + head; 114 | }); -------------------------------------------------------------------------------- /main/dist/repo/filter/css/filter.css: -------------------------------------------------------------------------------- 1 | .objects { 2 | width: 896px; 3 | margin: 0 auto 16px; 4 | border-spacing: 0; 5 | 6 | border: 1px solid #DDF; 7 | border-radius: 4px; 8 | } 9 | 10 | .objects td { 11 | width: auto; 12 | margin: 0; 13 | padding: 8px; 14 | vertical-align: top; 15 | font-family: Helvetica, Arial, sans-serif; 16 | font-size: 16px; 17 | } 18 | .objects tr { 19 | cursor: pointer; 20 | } 21 | .objects tr:hover { 22 | background-color: #EEF; 23 | } 24 | 25 | .objects tr td { 26 | border-top: 1px solid #DDF; 27 | } 28 | .objects tr:first-child td { 29 | border-top: none; 30 | } 31 | 32 | .objects-bottom { 33 | display: block; 34 | color: #888; 35 | font-size: 14px; 36 | } 37 | 38 | .objects-right { 39 | width: 256px !important; 40 | max-width: 256px; 41 | word-wrap: break-word; 42 | } 43 | 44 | .object-icon { 45 | display: inline-block; 46 | width: 16px; 47 | height: 16px; 48 | margin-right: 8px; 49 | vertical-align: middle; 50 | margin-top: -2px; 51 | border-radius: 50%; 52 | } 53 | .object-status-open { 54 | background-color: #2B3; 55 | } 56 | .object-status-closed { 57 | background-color: #B23; 58 | } 59 | .object-status-reopened { 60 | background-color: #B2E; 61 | } 62 | .object-status-opened { 63 | background-color: #2B3; 64 | } 65 | .object-status-merged { 66 | background-color: #B2E; 67 | } 68 | 69 | .object-title { 70 | display: inline; 71 | } 72 | 73 | .object-comments { 74 | display: inline-block; 75 | background-color: #DDD; 76 | padding: 4px 8px; 77 | border-radius: 4px; 78 | margin-left: 8px; 79 | 80 | font-size: 16px; 81 | } 82 | 83 | 84 | .navigation { 85 | width: 896px; 86 | margin: 16px auto; 87 | } 88 | .navigation > * { 89 | margin-left: 8px; 90 | } 91 | .navigation > *:first-child { 92 | margin-left: 0; 93 | } -------------------------------------------------------------------------------- /main/dist/repo/filter/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Issues - Git Center 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |

21 | 22 | 23 |
Git Center
24 |
25 | 26 |
Repository Index
27 |
28 | 29 |
My Repos
30 |
31 | 32 |
Beginner's Guide
33 |
34 | 35 |
Support
36 |
37 | 38 |
Profile
39 |
40 | 41 |
For devs
42 |
43 |
44 |
45 |

46 |
47 | Star 48 | Clone 49 | Fork 50 | Sign & Publish changes 51 |
52 | 53 | 54 | 55 | Code 56 | 57 | 58 | 59 | Issues 60 | 61 | 62 | 63 | Pull requests 64 | 65 | 66 | 67 | Log 68 | 69 | 70 | 71 | Releases 72 | 73 | 74 | 75 | Settings 76 | 77 |
78 | 79 |
80 | 81 |
82 | 83 |
84 | 85 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /main/dist/repo/filter/js/main.js: -------------------------------------------------------------------------------- 1 | if(address == "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6") { 2 | location.href = "../../default/"; 3 | } 4 | 5 | additional = additional.split("/"); 6 | 7 | let currentPage = Number.isSafeInteger(+additional[1]) ? +additional[1] : 0; 8 | let filter = additional[0]; 9 | filter = { 10 | type: filter.substr(0, filter.indexOf(":")), 11 | value: filter.substr(filter.indexOf(":") + 1) 12 | }; 13 | 14 | let query; 15 | 16 | function sqlEscape(str) { 17 | return str 18 | .replace(/\^/g, "^") 19 | .replace(/[%_]/g, "^$0") 20 | .replace(/'/g, "$0$0"); 21 | } 22 | 23 | if(filter.type == "tag") { 24 | let tag = filter.value; 25 | 26 | query = "\ 27 | (tags LIKE '%," + sqlEscape(tag) + ",%' ESCAPE '^') OR\ 28 | (tags LIKE '" + sqlEscape(tag) + ",%' ESCAPE '^') OR\ 29 | (tags LIKE '%," + sqlEscape(tag) + "' ESCAPE '^') OR\ 30 | (tags LIKE '" + sqlEscape(tag) + "' ESCAPE '^')\ 31 | "; 32 | 33 | let color = repo.tagToColor(tag); 34 | let map = { 35 | "&": "&", 36 | "<": "<", 37 | ">": ">", 38 | "\"": """, 39 | "'": "'" 40 | }; 41 | let tagHTML = tag.replace(/[&<>"']/g, m => map[m]); 42 | 43 | document.getElementById("filter").innerHTML = "\ 44 | You are searching issues and pull requests for tag\ 45 |
" + tagHTML + "
\ 49 | "; 50 | } 51 | 52 | repo.addMerger() 53 | .then(() => { 54 | return repo.getContent(); 55 | }) 56 | .then(content => { 57 | if(!content.installed) { 58 | location.href = "../../install/?" + address; 59 | } 60 | 61 | setTitle("Filter " + additional[0] + " - " + content.title); 62 | 63 | showTitle(content.title); 64 | showHeader(1, content); 65 | showTabs(1); 66 | 67 | return repo.issues.filterObjects(currentPage, query); 68 | }) 69 | .then(objects => { 70 | showObjects("object", objects); 71 | showNavigation("object", objects, currentPage, additional[0]); 72 | }); -------------------------------------------------------------------------------- /main/dist/repo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Repository - Git Center 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 |
Git Center
24 |
25 | 26 |
Repository Index
27 |
28 | 29 |
My Repos
30 |
31 | 32 |
Beginner's Guide
33 |
34 | 35 |
Support
36 |
37 | 38 |
Profile
39 |
40 | 41 |
For devs
42 |
43 |
44 |
45 |

46 |
47 | Star 48 | Clone 49 | Fork 50 | Sign & Publish changes 51 |
52 | 53 | 54 | 55 | Code 56 | 57 | 58 | 59 | Issues 60 | 61 | 62 | 63 | Pull requests 64 | 65 | 66 | 67 | Log 68 | 69 | 70 | 71 | Releases 72 | 73 | 74 | 75 | Settings 76 | 77 |
78 | 79 | 82 | 83 |
84 |
85 |
86 | 89 |
90 |
91 | 92 | 93 | 94 | 97 | 98 | 99 | 102 | 103 |
95 | Root 96 |
100 | Back 101 |
104 | 105 |
106 | New file 107 |
108 | 109 |
110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | -------------------------------------------------------------------------------- /main/dist/repo/issues/css/issues.css: -------------------------------------------------------------------------------- 1 | .issues { 2 | width: 896px; 3 | margin: 0 auto 16px; 4 | border-spacing: 0; 5 | 6 | border: 1px solid #DDF; 7 | border-radius: 4px; 8 | } 9 | 10 | .issues td { 11 | width: auto; 12 | margin: 0; 13 | padding: 8px; 14 | vertical-align: top; 15 | font-family: Helvetica, Arial, sans-serif; 16 | font-size: 16px; 17 | } 18 | .issues tr { 19 | cursor: pointer; 20 | } 21 | .issues tr:hover { 22 | background-color: #EEF; 23 | } 24 | 25 | .issues tr td { 26 | border-top: 1px solid #DDF; 27 | } 28 | .issues tr:first-child td { 29 | border-top: none; 30 | } 31 | 32 | .issues-bottom { 33 | display: block; 34 | color: #888; 35 | font-size: 14px; 36 | } 37 | 38 | .issues-right { 39 | width: 256px !important; 40 | max-width: 256px; 41 | word-wrap: break-word; 42 | } 43 | 44 | .issue-icon { 45 | display: inline-block; 46 | width: 16px; 47 | height: 16px; 48 | margin-right: 8px; 49 | vertical-align: middle; 50 | margin-top: -2px; 51 | border-radius: 50%; 52 | } 53 | .issue-status-open { 54 | background-color: #2B3; 55 | } 56 | .issue-status-closed { 57 | background-color: #B23; 58 | } 59 | .issue-status-reopened { 60 | background-color: #B2E; 61 | } 62 | 63 | .issue-title { 64 | display: inline; 65 | } 66 | 67 | .issue-comments { 68 | display: inline-block; 69 | background-color: #DDD; 70 | padding: 4px 8px; 71 | border-radius: 4px; 72 | margin-left: 8px; 73 | 74 | font-size: 16px; 75 | } 76 | 77 | 78 | .navigation { 79 | width: 896px; 80 | margin: 16px auto; 81 | } 82 | .navigation > * { 83 | margin-left: 8px; 84 | } 85 | .navigation > *:first-child { 86 | margin-left: 0; 87 | } -------------------------------------------------------------------------------- /main/dist/repo/issues/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Issues - Git Center 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 |
Git Center
24 |
25 | 26 |
Repository Index
27 |
28 | 29 |
My Repos
30 |
31 | 32 |
Beginner's Guide
33 |
34 | 35 |
Support
36 |
37 | 38 |
Profile
39 |
40 | 41 |
For devs
42 |
43 |
44 |
45 |

46 |
47 | Star 48 | Clone 49 | Fork 50 | Sign & Publish changes 51 |
52 | 53 | 54 | 55 | Code 56 | 57 | 58 | 59 | Issues 60 | 61 | 62 | 63 | Pull requests 64 | 65 | 66 | 67 | Log 68 | 69 | 70 | 71 | Releases 72 | 73 | 74 | 75 | Settings 76 | 77 |
78 | 79 |
80 | New issue 81 | 82 |
83 | 84 | 85 | 86 | 96 | 97 | 98 | 99 | 100 |
87 | 88 | 89 | Open 90 | 91 | 92 | 93 | Closed 94 | 95 |
Nothing here yet :(
101 | 102 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /main/dist/repo/issues/js/main.js: -------------------------------------------------------------------------------- 1 | if(address == "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6") { 2 | location.href = "../../default/"; 3 | } 4 | 5 | let currentPage, status; 6 | 7 | additional = additional.split("/"); 8 | if(additional.length == 1) { 9 | if(Number.isSafeInteger(+additional[0])) { 10 | currentPage = +additional[0]; 11 | status = "open"; 12 | } else { 13 | currentPage = 0; 14 | status = additional[0]; 15 | } 16 | } else { 17 | currentPage = Number.isSafeInteger(+additional[1]) ? +additional[1] : 0; 18 | status = additional[0]; 19 | } 20 | 21 | repo.addMerger() 22 | .then(() => { 23 | return repo.getContent(); 24 | }) 25 | .then(content => { 26 | if(!content.installed) { 27 | location.href = "../../install/?" + address; 28 | } 29 | 30 | setTitle("Issues - " + content.title); 31 | 32 | showTitle(content.title); 33 | showHeader(1, content); 34 | showTabs(1); 35 | document.getElementById("new_issue").href = "new/?" + address; 36 | 37 | loadObjects("issue", currentPage, status); 38 | }); -------------------------------------------------------------------------------- /main/dist/repo/issues/new/css/issue.css: -------------------------------------------------------------------------------- 1 | .issue { 2 | width: 768px; 3 | padding-right: 128px; 4 | margin: 16px auto; 5 | } -------------------------------------------------------------------------------- /main/dist/repo/issues/new/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | New issue - Git Center 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 |
Git Center
24 |
25 | 26 |
Repository Index
27 |
28 | 29 |
My Repos
30 |
31 | 32 |
Beginner's Guide
33 |
34 | 35 |
Support
36 |
37 | 38 |
Profile
39 |
40 | 41 |
For devs
42 |
43 |
44 |
45 |

46 |
47 | Star 48 | Clone 49 | Fork 50 | Sign & Publish changes 51 |
52 | 53 | 54 | 55 | Code 56 | 57 | 58 | 59 | Issues 60 | 61 | 62 | 63 | Pull requests 64 | 65 | 66 | 67 | Log 68 | 69 | 70 | 71 | Releases 72 | 73 | 74 | 75 | Settings 76 | 77 |
78 | 79 |
80 | 81 | 82 | 83 | Submit new issue 84 |
85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /main/dist/repo/issues/new/js/main.js: -------------------------------------------------------------------------------- 1 | if(address == "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6") { 2 | location.href = "../../../default/"; 3 | } 4 | 5 | repo.addMerger() 6 | .then(() => { 7 | return repo.getContent(); 8 | }) 9 | .then(content => { 10 | if(!content.installed) { 11 | location.href = "../../../install/?" + address; 12 | } 13 | 14 | setTitle("New issue - " + content.title); 15 | 16 | showTitle(content.title); 17 | showHeader(2, content); 18 | showTabs(2); 19 | 20 | document.getElementById("submit").onclick = () => { 21 | let tags = document.getElementById("tags").value 22 | .split(",") 23 | .map(tag => tag.trim()) 24 | .filter(tag => tag.length > 0) 25 | .filter((tag, i, arr) => arr.indexOf(tag) == i); 26 | 27 | repo.addIssue(document.getElementById("title").value, document.getElementById("content").value, tags) 28 | .then(issue => { 29 | location.href = "../view/?" + address + "/" + issue.id + "@" + issue.json.replace("data/users/", ""); 30 | }); 31 | }; 32 | }); -------------------------------------------------------------------------------- /main/dist/repo/issues/view/css/issue.css: -------------------------------------------------------------------------------- 1 | .issue-title { 2 | display: inline-block; 3 | margin-bottom: 8px; 4 | 5 | font-size: 32px; 6 | } 7 | 8 | .issue-id { 9 | display: inline-block; 10 | vertical-align: middle; 11 | 12 | color: #888; 13 | font-size: 16px; 14 | } 15 | .issue-id span { 16 | display: inline-block; 17 | margin: 0 1px; 18 | vertical-align: middle; 19 | 20 | font-size: 24px; 21 | } 22 | 23 | .issue-status { 24 | display: inline-block; 25 | margin-top: 4px; 26 | margin-right: 16px; 27 | padding: 4px 8px; 28 | border-radius: 4px; 29 | vertical-align: top; 30 | 31 | font-size: 16px; 32 | color: #FFF; 33 | } 34 | .issue-status-open { 35 | background-color: #2B3; 36 | } 37 | .issue-status-closed { 38 | background-color: #B23; 39 | } 40 | .issue-status-reopened { 41 | background-color: #B2E; 42 | } 43 | 44 | .issue-status img { 45 | display: inline-block; 46 | height: 16px; 47 | margin-right: 4px; 48 | vertical-align: middle; 49 | } 50 | 51 | .tags { 52 | display: block; 53 | } 54 | .tags .tag:first-child { 55 | margin-left: 0; 56 | } -------------------------------------------------------------------------------- /main/dist/repo/issues/view/js/main.js: -------------------------------------------------------------------------------- 1 | if(address == "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6") { 2 | location.href = "../../../default/"; 3 | } 4 | 5 | if(additional.indexOf("@") == -1) { 6 | location.href = "../?" + address; 7 | } 8 | 9 | let id = parseInt(additional.substr(0, additional.indexOf("@"))); 10 | let json = "data/users/" + additional.substr(additional.indexOf("@") + 1); 11 | 12 | if(isNaN(id) || json == "data/users/") { 13 | location.href = "../?" + address; 14 | } 15 | 16 | 17 | let issue, content; 18 | repo.addMerger() 19 | .then(() => { 20 | return repo.getContent(); 21 | }) 22 | .then(c => { 23 | content = c; 24 | 25 | if(!content.installed) { 26 | location.href = "../../../install/?" + address; 27 | } 28 | 29 | setTitle("Issue - " + content.title); 30 | 31 | showTitle(content.title); 32 | showHeader(2, content); 33 | showTabs(2); 34 | 35 | return repo.getIssue(id, json); 36 | }) 37 | .then(i => { 38 | issue = i; 39 | 40 | document.getElementById("issue_title").textContent = issue.title; 41 | document.getElementById("issue_id").textContent = id; 42 | document.getElementById("issue_json_id").textContent = json.replace("data/users/", ""); 43 | 44 | setTitle(issue.title + " - " + content.title); 45 | 46 | showTags("issue", issue); 47 | drawObjectStatus("issue", issue.open ? (issue.reopened ? "reopened" : "open") : "closed", issue.open ? "close issue" : "reopen issue"); 48 | showCommentButtons("issue", issue, id, json, () => { 49 | if(issue.open) { 50 | issue.open = false; 51 | } else { 52 | issue.open = true; 53 | issue.reopened = true; 54 | } 55 | 56 | drawObjectStatus("issue", issue.open ? (issue.reopened ? "reopened" : "open") : "closed", issue.open ? "close issue" : "reopen issue"); 57 | 58 | return repo.issues.changeIssueStatus(id, json, issue.open); 59 | }); 60 | 61 | return showActions("issue", id, json); 62 | }); -------------------------------------------------------------------------------- /main/dist/repo/js/main.js: -------------------------------------------------------------------------------- 1 | if(address == "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6") { 2 | location.href = "../default/"; 3 | } 4 | 5 | let content, head; 6 | 7 | repo.addMerger() 8 | .then(() => { 9 | return repo.getContent(); 10 | }) 11 | .then(c => { 12 | content = c; 13 | 14 | if(!content.installed) { 15 | location.href = "../install/?" + address; 16 | } 17 | 18 | setTitle(content.title); 19 | 20 | showTitle(content.title); 21 | showHeader(0, content); 22 | showBranches(); 23 | showPath(false); 24 | showLinks(); 25 | showTabs(0); 26 | 27 | repo.isSignable() 28 | .then(signable => { 29 | if(signable) { 30 | document.getElementById("new_file").style.display = "inline-block"; 31 | document.getElementById("new_file").href = "newfile/?" + address + "/" + path.replace(/@/g, "@@") + "@" + branch.replace(/@/g, "@@"); 32 | } 33 | }); 34 | 35 | return branch || repo.vcs.getHead(); 36 | }) 37 | .then(h => { 38 | head = h; 39 | return repo.vcs.readBranchCommit(head); 40 | }) 41 | .then(commit => { 42 | document.getElementById("commit_title").textContent = commit.content.message; 43 | 44 | repo.vcs.getBranchCommit(head) 45 | .then(c => { 46 | let diff = document.createElement("a"); 47 | diff.textContent = "[diff]"; 48 | diff.href = "commit/?" + address + "/" + c; 49 | document.getElementById("commit_description").appendChild(diff); 50 | 51 | document.getElementById("commit_description").appendChild(document.createElement("br")); 52 | document.getElementById("commit_description").appendChild(document.createTextNode(repo.parseAuthor(commit.content.committer))); 53 | }); 54 | 55 | return repo.getFiles(head, path); 56 | }) 57 | .then(files => { 58 | let types = ["submodule", "directory", "file"]; 59 | 60 | let table = document.getElementById("files"); 61 | files 62 | .sort((a, b) => { 63 | let pos = types.indexOf(a.type) - types.indexOf(b.type); 64 | if(pos != 0) { 65 | return pos; 66 | } 67 | 68 | return a.name.localeCompare(b.name); 69 | }) 70 | .forEach(file => { 71 | let tr = document.createElement("tr"); 72 | tr.onclick = () => { 73 | if(file.type == "unknown") { 74 | return; 75 | } 76 | 77 | if(file.type == "submodule") { 78 | let url = file.submodule.url.match(/(1[A-Za-z0-9]{25,34})/); 79 | if(url) { 80 | // Likely Git Center URL 81 | location.href = "?" + url[1]; 82 | } else if(/^git@.*:.*$/.test(file.submodule.url)) { 83 | // SSH 84 | 85 | // git@hosting:author/repository.git 86 | // -> 87 | // hosting/author/repository 88 | 89 | let match = file.submodule.url.match(/^git@(.*):(.*)\/(.*)$/); 90 | parent.location.href = "http://" + match[1] + "/" + match[2] + "/" + match[3].replace(/\.git$/, ""); 91 | } else if(/^(.*)@[^:]*$/.test(file.submodule.url)) { 92 | // SSH 93 | 94 | // author@hosting/repository.git 95 | // -> 96 | // hosting/author/repository 97 | 98 | let match = file.submodule.url.match(/^(.*)@(.*)\/(.*)$/); 99 | parent.location.href = "http://" + match[2] + "/" + match[1] + "/" + match[3].replace(/\.git$/, ""); 100 | } else { 101 | // HTTP/HTTPS URL 102 | parent.location.href = file.submodule.url.replace(/\.git$/, ""); 103 | } 104 | } else { 105 | location.href = ( 106 | (file.type == "file" ? "file/" : "") + 107 | "?" + address + 108 | "/" + ((path ? path + "/" : "") + file.name).replace(/@/g, "@@") + 109 | "@" + branch.replace(/@/g, "@@") 110 | ); 111 | } 112 | }; 113 | 114 | let name = document.createElement("td"); 115 | name.textContent = file.name; 116 | tr.appendChild(name); 117 | 118 | let icon = document.createElement("img"); 119 | icon.className = "file-icon"; 120 | icon.src = "../img/" + file.type + ".svg"; 121 | name.insertBefore(icon, name.firstChild); 122 | 123 | table.appendChild(tr); 124 | }); 125 | 126 | let filesBack = document.getElementById("files_back"); 127 | if(path == "" || path == "/") { 128 | filesBack.style.display = "none"; 129 | } else { 130 | filesBack.onclick = () => { 131 | let parts = path.split("/").filter(part => part.length); 132 | parts.pop(); 133 | location.href = "?" + address + "/" + parts.join("/").replace(/@/g, "@@") + "@" + branch.replace(/@/g, "@@"); 134 | }; 135 | } 136 | 137 | let readme = files.find(file => file.name.toLowerCase() == "readme" || file.name.toLowerCase() == "readme.md"); 138 | if(readme && readme.type == "file") { 139 | return repo.getFile(head, (path ? path + "/" : "") + readme.name) 140 | .then(readme => { 141 | readme = repo.vcs.decodeUTF8(readme); 142 | document.getElementById("readme").innerHTML = repo.renderMarked(readme); 143 | }); 144 | } else { 145 | let root = path == "/" ? "" : path; 146 | document.getElementById("readme").innerHTML = repo.renderMarked("# " + content.title + "\n" + content.description, root); 147 | } 148 | }); 149 | -------------------------------------------------------------------------------- /main/dist/repo/js/objects.js: -------------------------------------------------------------------------------- 1 | function loadObjects(context, page, status) { 2 | let query = { 3 | issue: "{object}s.open = " + (status == "open" ? 1 : 0), 4 | pull_request: "{object}s.merged = " + (status == "open" ? 0 : 1) 5 | }[context]; 6 | 7 | return repo.issues.getObjects(context, page, query) 8 | .then(objects => { 9 | showObjects(context, objects); 10 | showNavigation(context, objects, page, status); 11 | showFollowing(); 12 | }); 13 | } 14 | 15 | 16 | function showObjects(context, objects) { 17 | if(objects.objects.length == 0) { 18 | document.getElementById("nothing_here_yet").style.display = "unset"; 19 | } 20 | 21 | objects.objects.forEach(object => { 22 | let curContext = context == "object" ? object.context : context; 23 | 24 | let status = { 25 | issue: (object.open ? (object.reopened ? "reopened" : "open") : "closed"), 26 | pull_request: object.merged ? "merged" : "opened" 27 | }[curContext]; 28 | let cssContext = repo.issues.contexts[context].css; 29 | 30 | let tr = document.createElement("tr"); 31 | tr.onclick = () => { 32 | location.href = "../" + repo.issues.contexts[curContext].css + "s/view/?" + address + "/" + object.id + "@" + object.json.replace("data/users/", ""); 33 | }; 34 | 35 | let content = document.createElement("td"); 36 | 37 | let icon = document.createElement("div"); 38 | icon.className = cssContext + "-icon " + cssContext + "-status-" + status; 39 | content.appendChild(icon); 40 | 41 | let title = document.createElement("div"); 42 | title.className = cssContext + "-title"; 43 | title.textContent = object.title; 44 | content.appendChild(title); 45 | 46 | let comments = document.createElement("div"); 47 | comments.className = cssContext + "-comments"; 48 | comments.innerHTML = ( 49 | object.comments == 0 ? "No comments" : 50 | object.comments == 1 ? "1 comment" : 51 | object.comments + " comments" 52 | ); 53 | content.appendChild(comments); 54 | 55 | let tags = document.createElement("div"); 56 | tags.className = "tags"; 57 | object.tags.forEach(tag => { 58 | let color = repo.tagToColor(tag); 59 | 60 | let node = document.createElement("a"); 61 | node.className = "tag"; 62 | node.textContent = tag; 63 | node.style.setProperty("background-color", color.background, "important"); 64 | node.style.setProperty("color", color.foreground, "important"); 65 | node.href = "../filter/?" + address + "/tag:" + tag; 66 | tags.appendChild(node); 67 | }); 68 | content.appendChild(tags); 69 | 70 | let info = document.createElement("div"); 71 | let char = curContext == "pull_request" ? "P" : ""; 72 | info.textContent = "#" + char + object.id + "@" + object.json.replace("data/users/", "") + " opened " + repo.translateDate(object.date_added) + " by " + object.cert_user_id; 73 | info.className = cssContext + "s-bottom"; 74 | content.appendChild(info); 75 | 76 | tr.appendChild(content); 77 | document.getElementById(context + "s").appendChild(tr); 78 | }); 79 | } 80 | 81 | function showNavigation(context, objects, currentPage, status) { 82 | if(currentPage > 0) { 83 | let button = document.getElementById("navigation_back"); 84 | button.classList.remove("button-disabled"); 85 | button.href = "?" + address + "/" + status + "/" + + (currentPage - 1); 86 | } 87 | 88 | if(objects.nextPage) { 89 | let button = document.getElementById("navigation_next"); 90 | button.classList.remove("button-disabled"); 91 | button.href = "?" + address + "/" + status + "/" + (currentPage + 1); 92 | } 93 | 94 | let node = document.getElementById(context + "s_" + status); 95 | if(node) { 96 | node.classList.add("current"); 97 | 98 | document.getElementById(context + "s_open").href = "?" + address + "/open"; 99 | document.getElementById(context + "s_closed").href = "?" + address + "/closed"; 100 | } 101 | } 102 | 103 | function showFollowing() { 104 | function updateFollowing(isFollowing) { 105 | document.getElementById("follow").innerHTML = isFollowing ? "Stop following" : "Follow issues and pull requests in newsfeed"; 106 | } 107 | 108 | return repo.isFollowing() 109 | .then(isFollowing => { 110 | let followButton = document.getElementById("follow"); 111 | updateFollowing(isFollowing); 112 | followButton.onclick = () => { 113 | if(isFollowing) { 114 | repo.unfollow() 115 | .then(() => { 116 | isFollowing = false; 117 | updateFollowing(isFollowing); 118 | }); 119 | } else { 120 | repo.follow() 121 | .then(() => { 122 | isFollowing = true; 123 | updateFollowing(isFollowing); 124 | }); 125 | } 126 | }; 127 | }); 128 | } -------------------------------------------------------------------------------- /main/dist/repo/js/path_common.js: -------------------------------------------------------------------------------- 1 | zeroFrame = new ZeroFrame(); 2 | zeroPage = new ZeroPage(zeroFrame); 3 | zeroAuth = new ZeroAuth(zeroPage); 4 | 5 | let address = location.search.replace(/[?&]wrapper_nonce=.*/, "").replace("?", ""); 6 | if(!address) { 7 | location.href = ".."; 8 | } 9 | 10 | let path = ""; 11 | if(address.indexOf("/") > -1) { 12 | path = decodeURIComponent(address.substr(address.indexOf("/") + 1)); 13 | address = address.substr(0, address.indexOf("/")); 14 | } else if(address.indexOf("@") > -1) { 15 | path = decodeURIComponent(address.substr(address.indexOf("@"))); 16 | address = address.substr(0, address.indexOf("@")); 17 | } 18 | 19 | let branch = ""; 20 | if(path.indexOf("@") > -1) { 21 | let tempPath = path.replace(/@@/g, "\0"); // @ is escaped 22 | path = tempPath.substr(0, tempPath.indexOf("@")).replace(/\0/g, "@"); 23 | branch = tempPath.substr(tempPath.indexOf("@") + 1).replace(/\0/g, "@"); 24 | } else { 25 | path = path.replace(/@@/g, "@"); 26 | } 27 | 28 | repo = new Repository(address, zeroPage); -------------------------------------------------------------------------------- /main/dist/repo/js/user_common.js: -------------------------------------------------------------------------------- 1 | zeroFrame = new ZeroFrame(); 2 | zeroPage = new ZeroPage(zeroFrame); 3 | zeroAuth = new ZeroAuth(zeroPage); 4 | 5 | let address = location.search.replace(/[?&]wrapper_nonce=.*/, "").replace("?", ""); 6 | if(!address) { 7 | location.href = ".."; 8 | } 9 | 10 | let additional = ""; 11 | if(address.indexOf("/") > -1) { 12 | additional = decodeURIComponent(address.substr(address.indexOf("/") + 1)); 13 | address = address.substr(0, address.indexOf("/")); 14 | } else if(address.indexOf("@") > -1) { 15 | additional = decodeURIComponent(address.substr(address.indexOf("@"))); 16 | address = address.substr(0, address.indexOf("@")); 17 | } 18 | 19 | repo = new Repository(address, zeroPage); -------------------------------------------------------------------------------- /main/dist/repo/log/css/network.css: -------------------------------------------------------------------------------- 1 | .commits { 2 | display: block; 3 | width: 896px; 4 | padding: 0 calc(50% - 448px); 5 | margin: 16px 0; 6 | } 7 | 8 | .commit { 9 | display: block; 10 | margin-top: 16px; 11 | padding: 3px 10px 3px 8px; 12 | border: 1px solid #D5D5D5; 13 | border-radius: 4px; 14 | 15 | background-color: #FCFCFC; 16 | background-repeat: no-repeat; 17 | 18 | font-size: 16px; 19 | line-height: 24px; 20 | text-decoration: none; 21 | 22 | transition: all .1s; 23 | } 24 | .commit:hover { 25 | background-color: #DDF; 26 | } 27 | 28 | .commit-title { 29 | font-size: 24px; 30 | line-height: 32px; 31 | } 32 | 33 | .commit-description { 34 | color: #888; 35 | } 36 | 37 | 38 | .note { 39 | display: block; 40 | margin-top: 16px; 41 | 42 | font-size: 16px; 43 | line-height: 24px; 44 | color: #888; 45 | } -------------------------------------------------------------------------------- /main/dist/repo/log/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Log - Git Center 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 |
Git Center
24 |
25 | 26 |
Repository Index
27 |
28 | 29 |
My Repos
30 |
31 | 32 |
Beginner's Guide
33 |
34 | 35 |
Support
36 |
37 | 38 |
Profile
39 |
40 | 41 |
For devs
42 |
43 |
44 |
45 |

46 |
47 | Star 48 | Clone 49 | Fork 50 | Sign & Publish changes 51 |
52 | 53 | 54 | 55 | Code 56 | 57 | 58 | 59 | Issues 60 | 61 | 62 | 63 | Pull requests 64 | 65 | 66 | 67 | Log 68 | 69 | 70 | 71 | Releases 72 | 73 | 74 | 75 | Settings 76 | 77 |
78 | 79 | 82 | 83 |
84 | Commits to show: 85 | 86 | OK 87 |
88 | 89 |
90 |
Loading latest info, just for you...
91 |
92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /main/dist/repo/log/js/main.js: -------------------------------------------------------------------------------- 1 | if(address == "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6") { 2 | location.href = "../../default/"; 3 | } 4 | 5 | count = isNaN(parseInt(path)) ? 10 : parseInt(path); 6 | 7 | let content; 8 | repo.addMerger() 9 | .then(() => { 10 | return repo.getContent(); 11 | }) 12 | .then(c => { 13 | content = c; 14 | 15 | if(!content.installed) { 16 | location.href = "../../install/?" + address; 17 | } 18 | 19 | if(!branch) { 20 | return repo.vcs.getHead() 21 | .then(head => branch = head); 22 | } 23 | }) 24 | .then(() => { 25 | setTitle("Log - " + content.title); 26 | 27 | showTitle(content.title); 28 | showHeader(1, content); 29 | showTabs(1); 30 | showBranches(); 31 | 32 | /* 33 | let template = { 34 | colors: ["#5EC4CD", "#9A6AD6", "#FFB800", "#FF9A40"], 35 | branch: { 36 | lineWidth: 8, 37 | lineDash: ["dotted"], 38 | spacingX: 32, 39 | labelRotation: 0, 40 | showLabel: true, 41 | mergeStyle: "bezier", 42 | labelFont: "normal 12px Verdana" 43 | }, 44 | commit: { 45 | spacingY: -48, 46 | dot: { 47 | size: 8 48 | }, 49 | tag: { 50 | font: "normal 12px Verdana" 51 | }, 52 | message: { 53 | displayAuthor: true, 54 | displayBranch: false, 55 | displayHash: true, 56 | font: "normal 16px Verdana" 57 | }, 58 | tooltipHTMLFormatter: commit => { 59 | return "[" + commit.sha1 + "] " + commit.message; 60 | } 61 | } 62 | }; 63 | 64 | let graph = new GitGraph({ 65 | template: new GitGraph.Template(template), 66 | orientation: "vertical-reverse", 67 | mode: "extended", 68 | elementId: "network" 69 | }); 70 | */ 71 | 72 | document.getElementById("commit_count").value = count; 73 | document.getElementById("commit_count").onkeypress = e => { 74 | if(e.keyCode == 13) { 75 | location.href = "?" + address + "/" + document.getElementById("commit_count").value + "@" + branch.replace(/@/g, "@@"); 76 | } 77 | }; 78 | document.getElementById("commit_load").onclick = () => { 79 | location.href = "?" + address + "/" + document.getElementById("commit_count").value + "@" + branch.replace(/@/g, "@@"); 80 | }; 81 | 82 | return repo.getCommits(branch, count); 83 | }) 84 | .then(commits => { 85 | document.getElementById("commits").innerHTML = ""; 86 | 87 | commits.forEach(commit => { 88 | let node = document.createElement("div"); 89 | node.className = "commit"; 90 | 91 | let title = document.createElement("div"); 92 | title.className = "commit-title"; 93 | title.textContent = commit.content.message; 94 | node.appendChild(title); 95 | 96 | let description = document.createElement("div"); 97 | description.className = "commit-description"; 98 | 99 | let commitLink = document.createElement("a"); 100 | commitLink.href = "../?" + address + "/@" + commit.id; 101 | commitLink.textContent = commit.id; 102 | description.appendChild(commitLink); 103 | 104 | description.appendChild(document.createTextNode(" ")); 105 | 106 | let diffLink = document.createElement("a"); 107 | diffLink.innerHTML = "[diff]"; 108 | diffLink.href = "../commit/?" + address + "/" + commit.id; 109 | description.appendChild(diffLink); 110 | 111 | description.appendChild(document.createElement("br")); 112 | 113 | description.appendChild(document.createTextNode(repo.parseAuthor(commit.content.committer))); 114 | 115 | node.appendChild(description); 116 | 117 | document.getElementById("commits").appendChild(node); 118 | 119 | if(commit.content.parents.length > 1) { 120 | let note = document.createElement("div"); 121 | note.className = "note"; 122 | note.innerHTML = "Commits " + commit.content.parents.map(commit => commit.id).join(", ") + " were merged into " + commit.id; 123 | document.getElementById("commits").appendChild(note); 124 | } 125 | 126 | if(commit.content.delivered) { 127 | let note = document.createElement("div"); 128 | note.className = "note"; 129 | note.innerHTML = "Commit " + commit.id + " was likely delivered from " + commit.content.delivered.map(commit => commit.id).join(", "); 130 | document.getElementById("commits").appendChild(note); 131 | } 132 | }); 133 | }); -------------------------------------------------------------------------------- /main/dist/repo/newfile/css/file.css: -------------------------------------------------------------------------------- 1 | .files { 2 | table-layout: auto; 3 | width: 896px; 4 | margin: 0 auto; 5 | border-spacing: 0; 6 | 7 | border: 1px solid #DDF; 8 | border-radius: 4px; 9 | } 10 | 11 | .files td { 12 | margin: 0; 13 | padding: 8px; 14 | font-size: 16px; 15 | } 16 | 17 | .files tr td { 18 | border-top: 1px solid #DDF; 19 | } 20 | .files tr:first-child td { 21 | border-top: none; 22 | } 23 | 24 | .files-header { 25 | background-color: #DDF; 26 | font-family: Helvetica, Arial, sans-serif; 27 | } 28 | .files-header a { 29 | color: #008; 30 | } 31 | 32 | .file-content, .commit-message { 33 | padding: 0 !important; 34 | } 35 | .file-content-text { 36 | display: block; 37 | width: calc(100% - 16px); 38 | height: 496px; 39 | padding: 8px; 40 | margin: 0; 41 | border: 0; 42 | 43 | font-family: Consolas, "Courier New", monospace; 44 | resize: none; 45 | } 46 | .commit-message-input { 47 | display: block; 48 | width: calc(100% - 16px); 49 | margin: 0; 50 | border: 0; 51 | border-radius: 0 0 0 4px; 52 | } 53 | 54 | .commit-node { 55 | padding: 0 !important; 56 | border: 0 !important; 57 | width: 250px; 58 | text-align: right; 59 | } 60 | .upload-button { 61 | border-radius: 0; 62 | margin: 0; 63 | } 64 | .commit-button { 65 | border-radius: 0 0 4px 0; 66 | margin: 0; 67 | } -------------------------------------------------------------------------------- /main/dist/repo/newfile/js/main.js: -------------------------------------------------------------------------------- 1 | if(address == "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6") { 2 | location.href = "../../default/"; 3 | } 4 | 5 | repo.addMerger() 6 | .then(() => { 7 | return repo.getContent(); 8 | }) 9 | .then(content => { 10 | if(!content.installed) { 11 | location.href = "../../install/?" + address; 12 | } 13 | 14 | setTitle("New file - " + content.title); 15 | 16 | showTitle(content.title); 17 | showHeader(1, content); 18 | showBranches(); 19 | showPath(true, true); 20 | showTabs(1); 21 | 22 | document.getElementById("cancel").href = "../?" + address + "/" + path.replace(/@/g, "@@") + "@" + branch.replace(/@/g, "@@"); 23 | 24 | let fileContent = document.getElementById("file_content"); 25 | let fileName = document.getElementById("file_name"); 26 | let saveButton = document.getElementById("save"); 27 | let commitMessage = document.getElementById("commit_message"); 28 | saveButton.onclick = () => { 29 | if(saveButton.classList.contains("button-disabled")) { 30 | return; 31 | } 32 | if(commitMessage.value == "" || fileName.value == "") { 33 | return; 34 | } 35 | 36 | saveButton.classList.add("button-disabled"); 37 | 38 | repo.saveFile((path ? path + "/" : "") + fileName.value, repo.vcs.encodeUTF8(fileContent.value), branch, commitMessage.value) 39 | .then(commit => { 40 | location.href = "../?" + address + "/" + path.replace(/@/g, "@@") + "@" + (repo.vcs.isSha(branch) ? commit : branch).replace(/@/g, "@@"); 41 | }); 42 | }; 43 | 44 | let uploadButton = document.getElementById("upload"); 45 | uploadButton.onclick = () => { 46 | if(commitMessage.value == "" || fileName.value == "") { 47 | zeroPage.alert("Please fill commit message and file name in"); 48 | return; 49 | } 50 | 51 | repo.uploadFile((path ? path + "/" : "") + fileName.value, branch, commitMessage.value) 52 | .then(commit => { 53 | location.href = "../?" + address + "/" + path.replace(/@/g, "@@") + "@" + (repo.vcs.isSha(branch) ? commit : branch).replace(/@/g, "@@"); 54 | }); 55 | }; 56 | }); -------------------------------------------------------------------------------- /main/dist/repo/pull-requests/css/pull-requests.css: -------------------------------------------------------------------------------- 1 | .pull-requests { 2 | width: 896px; 3 | margin: 0 auto 16px; 4 | border-spacing: 0; 5 | 6 | border: 1px solid #DDF; 7 | border-radius: 4px; 8 | } 9 | 10 | .pull-requests td { 11 | width: auto; 12 | margin: 0; 13 | padding: 8px; 14 | vertical-align: top; 15 | font-family: Helvetica, Arial, sans-serif; 16 | font-size: 16px; 17 | } 18 | .pull-requests tr { 19 | cursor: pointer; 20 | } 21 | .pull-requests tr:hover { 22 | background-color: #EEF; 23 | } 24 | 25 | .pull-requests tr td { 26 | border-top: 1px solid #DDF; 27 | } 28 | .pull-requests tr:first-child td { 29 | border-top: none; 30 | } 31 | 32 | .pull-requests-bottom { 33 | display: block; 34 | color: #888; 35 | font-size: 14px; 36 | } 37 | 38 | .pull-request-icon { 39 | display: inline-block; 40 | width: 16px; 41 | height: 16px; 42 | margin-right: 8px; 43 | vertical-align: middle; 44 | margin-top: -2px; 45 | border-radius: 50%; 46 | } 47 | .pull-request-status-opened { 48 | background-color: #2B3; 49 | } 50 | .pull-request-status-merged { 51 | background-color: #B2E; 52 | } 53 | 54 | .pull-request-title { 55 | display: inline; 56 | } 57 | 58 | .pull-request-comments { 59 | display: inline-block; 60 | background-color: #DDD; 61 | padding: 4px 8px; 62 | border-radius: 4px; 63 | margin-left: 8px; 64 | 65 | font-size: 16px; 66 | } 67 | 68 | 69 | .navigation { 70 | width: 896px; 71 | margin: 16px auto; 72 | } 73 | .navigation > * { 74 | margin-left: 8px; 75 | } 76 | .navigation > *:first-child { 77 | margin-left: 0; 78 | } -------------------------------------------------------------------------------- /main/dist/repo/pull-requests/js/main.js: -------------------------------------------------------------------------------- 1 | if(address == "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6") { 2 | location.href = "../../default/"; 3 | } 4 | 5 | let currentPage, status; 6 | 7 | additional = additional.split("/"); 8 | if(additional.length == 1) { 9 | if(Number.isSafeInteger(+additional[0])) { 10 | currentPage = +additional[0]; 11 | status = "open"; 12 | } else { 13 | currentPage = 0; 14 | status = additional[0]; 15 | } 16 | } else { 17 | currentPage = Number.isSafeInteger(+additional[1]) ? +additional[1] : 0; 18 | status = additional[0]; 19 | } 20 | 21 | repo.addMerger() 22 | .then(() => { 23 | return repo.getContent(); 24 | }) 25 | .then(content => { 26 | if(!content.installed) { 27 | location.href = "../../install/?" + address; 28 | } 29 | 30 | setTitle("Pull requests - " + content.title); 31 | 32 | showTitle(content.title); 33 | showHeader(1, content); 34 | showTabs(1); 35 | document.getElementById("new_pull_request").href = "new/?" + address; 36 | 37 | loadObjects("pull_request", currentPage, status); 38 | }); -------------------------------------------------------------------------------- /main/dist/repo/pull-requests/new/css/pull_request.css: -------------------------------------------------------------------------------- 1 | .pull-request { 2 | width: 768px; 3 | padding-right: 128px; 4 | margin: 16px auto; 5 | } -------------------------------------------------------------------------------- /main/dist/repo/pull-requests/new/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | New pull request - Git Center 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 |
Git Center
24 |
25 | 26 |
Repository Index
27 |
28 | 29 |
My Repos
30 |
31 | 32 |
Beginner's Guide
33 |
34 | 35 |
Support
36 |
37 | 38 |
Profile
39 |
40 | 41 |
For devs
42 |
43 |
44 |
45 |

46 |
47 | Star 48 | Clone 49 | Fork 50 | Sign & Publish changes 51 |
52 | 53 | 54 | 55 | Code 56 | 57 | 58 | 59 | Issues 60 | 61 | 62 | 63 | Pull requests 64 | 65 | 66 | 67 | Log 68 | 69 | 70 | 71 | Releases 72 | 73 | 74 | 75 | Settings 76 | 77 |
78 | 79 |
80 | 81 | 82 | 83 | 84 | 85 | Submit new pull request 86 |
87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /main/dist/repo/pull-requests/new/js/main.js: -------------------------------------------------------------------------------- 1 | if(address == "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6") { 2 | location.href = "../../../default/"; 3 | } 4 | 5 | repo.addMerger() 6 | .then(() => { 7 | return repo.getContent(); 8 | }) 9 | .then(content => { 10 | if(!content.installed) { 11 | location.href = "../../../install/?" + address; 12 | } 13 | 14 | setTitle("New pull request - " + content.title); 15 | 16 | showTitle(content.title); 17 | showHeader(2, content); 18 | showTabs(2); 19 | 20 | document.getElementById("submit").onclick = () => { 21 | let tags = document.getElementById("tags").value 22 | .split(",") 23 | .map(tag => tag.trim()) 24 | .filter(tag => tag.length > 0) 25 | .filter((tag, i, arr) => arr.indexOf(tag) == i); 26 | 27 | repo.addPullRequest(document.getElementById("title").value, document.getElementById("content").value, document.getElementById("fork_address").value, document.getElementById("fork_branch").value, tags) 28 | .then(pullRequest => { 29 | location.href = "../view/?" + address + "/" + pullRequest.id + "@" + pullRequest.json.replace("data/users/", ""); 30 | }); 31 | }; 32 | }); -------------------------------------------------------------------------------- /main/dist/repo/pull-requests/view/css/pull_request.css: -------------------------------------------------------------------------------- 1 | .pull-request-title { 2 | display: inline-block; 3 | margin-bottom: 8px; 4 | 5 | font-size: 32px; 6 | } 7 | 8 | .pull-request-id { 9 | display: inline-block; 10 | vertical-align: middle; 11 | 12 | color: #888; 13 | font-size: 16px; 14 | } 15 | .pull-request-id span { 16 | display: inline-block; 17 | margin: 0 1px; 18 | vertical-align: middle; 19 | 20 | font-size: 24px; 21 | } 22 | 23 | .pull-request-status { 24 | display: inline-block; 25 | margin-top: 4px; 26 | margin-right: 16px; 27 | padding: 4px 8px; 28 | border-radius: 4px; 29 | vertical-align: top; 30 | 31 | font-size: 16px; 32 | color: #FFF; 33 | } 34 | .pull-request-status-opened { 35 | background-color: #2B3; 36 | } 37 | .pull-request-status-merged { 38 | background-color: #B2E; 39 | } 40 | 41 | .pull-request-status img { 42 | display: inline-block; 43 | height: 16px; 44 | margin-right: 4px; 45 | vertical-align: middle; 46 | } 47 | 48 | .pull-request-fork { 49 | display: block; 50 | font-size: 16px; 51 | color: #888; 52 | } 53 | 54 | .tags { 55 | display: block; 56 | } 57 | .tags .tag:first-child { 58 | margin-left: 0; 59 | } -------------------------------------------------------------------------------- /main/dist/repo/pull-requests/view/js/main.js: -------------------------------------------------------------------------------- 1 | if(address == "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6") { 2 | location.href = "../../../default/"; 3 | } 4 | 5 | if(additional.indexOf("@") == -1) { 6 | location.href = "../?" + address; 7 | } 8 | 9 | let id = parseInt(additional.substr(0, additional.indexOf("@"))); 10 | let json = "data/users/" + additional.substr(additional.indexOf("@") + 1); 11 | 12 | if(isNaN(id) || json == "data/users/") { 13 | location.href = "../?" + address; 14 | } 15 | 16 | 17 | let pullRequest, content; 18 | repo.addMerger() 19 | .then(() => { 20 | return repo.getContent(); 21 | }) 22 | .then(c => { 23 | content = c; 24 | 25 | if(!content.installed) { 26 | location.href = "../../../install/?" + address; 27 | } 28 | 29 | setTitle("Pull request - " + content.title); 30 | 31 | showTitle(content.title); 32 | showHeader(2, content); 33 | showTabs(2); 34 | 35 | return repo.getPullRequest(id, json); 36 | }) 37 | .then(i => { 38 | pullRequest = i; 39 | 40 | document.getElementById("pull_request_title").textContent = pullRequest.title; 41 | document.getElementById("pull_request_id").textContent = id; 42 | document.getElementById("pull_request_json_id").textContent = json.replace("data/users/", ""); 43 | document.getElementById("pull_request_fork_address").textContent = pullRequest.fork_address; 44 | document.getElementById("pull_request_fork_branch").textContent = pullRequest.fork_branch; 45 | 46 | setTitle(pullRequest.title + " - " + content.title); 47 | 48 | showTags("pull_request", pullRequest); 49 | drawObjectStatus("pull_request", pullRequest.merged ? "merged" : "opened", pullRequest.merged ? "reopen pull request" : "mark pull request as merged"); 50 | showCommentButtons("pull_request", pullRequest, id, json, () => { 51 | pullRequest.merged = !pullRequest.merged; 52 | drawObjectStatus("pull_request", pullRequest.merged ? "merged" : "opened", pullRequest.merged ? "reopen pull request" : "mark pull request as merged"); 53 | 54 | return repo.issues.changePullRequestStatus(id, json, pullRequest.merged); 55 | }); 56 | 57 | return showActions("pull_request", id, json); 58 | }) 59 | .then(() => { 60 | if(pullRequest.owned) { 61 | let commentImport = document.getElementById("comment_import"); 62 | commentImport.style.display = "inline-block"; 63 | commentImport.title = "Import branch " + pullRequest.fork_address + "/" + pullRequest.fork_branch + " as " + address + "/pr-" + id + "-" + json; 64 | commentImport.onclick = () => { 65 | if(commentImport.classList.contains("button-disabled")) { 66 | return; 67 | } 68 | commentImport.classList.add("button-disabled"); 69 | 70 | repo.importPullRequest(pullRequest) 71 | .then(() => { 72 | zeroPage.alert("Branch pr-" + id + "-" + pullRequest.cert_user_id.replace(/@.*/, "") + " was imported to your repository. Run git fetch to download and merge it."); 73 | commentImport.classList.remove("button-disabled"); 74 | }, e => { 75 | zeroPage.error(e); 76 | commentImport.classList.remove("button-disabled"); 77 | }); 78 | }; 79 | } 80 | }); -------------------------------------------------------------------------------- /main/dist/repo/releases/css/releases.css: -------------------------------------------------------------------------------- 1 | .releases { 2 | width: 896px; 3 | margin: 16px auto; 4 | } 5 | 6 | .release { 7 | display: block; 8 | } 9 | 10 | .release-title { 11 | display: inline-block; 12 | margin-bottom: 8px; 13 | 14 | font-size: 32px; 15 | } 16 | .release-tag { 17 | display: inline-block; 18 | margin-left: 16px; 19 | 20 | font-size: 16px; 21 | color: #888; 22 | } 23 | .release-not-release { 24 | margin-left: 16px; 25 | } 26 | .release-description { 27 | display: block; 28 | 29 | padding-bottom: 16px; 30 | border-bottom: 1px solid #888; 31 | margin-bottom: 16px; 32 | 33 | font-size: 16px; 34 | white-space: pre; 35 | } -------------------------------------------------------------------------------- /main/dist/repo/releases/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Settings - Git Center 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 |
Git Center
23 |
24 | 25 |
Repository Index
26 |
27 | 28 |
My Repos
29 |
30 | 31 |
Beginner's Guide
32 |
33 | 34 |
Support
35 |
36 | 37 |
Profile
38 |
39 | 40 |
For devs
41 |
42 |
43 |
44 |

45 |
46 | Star 47 | Clone 48 | Fork 49 | Sign & Publish changes 50 |
51 | 52 | 53 | 54 | Code 55 | 56 | 57 | 58 | Issues 59 | 60 | 61 | 62 | Pull requests 63 | 64 | 65 | 66 | Log 67 | 68 | 69 | 70 | Releases 71 | 72 | 73 | 74 | Settings 75 | 76 |
77 | 78 |
79 | 80 |
81 | 82 |
83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /main/dist/repo/releases/js/main.js: -------------------------------------------------------------------------------- 1 | if(address == "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6") { 2 | location.href = "../../default/"; 3 | } 4 | 5 | let isSignable; 6 | 7 | repo.addMerger() 8 | .then(() => { 9 | return repo.getContent(); 10 | }) 11 | .then(content => { 12 | if(!content.installed) { 13 | location.href = "../../install/?" + address; 14 | } 15 | 16 | setTitle("Releases - " + content.title); 17 | 18 | showTitle(content.title); 19 | showHeader(1, content); 20 | showTabs(1); 21 | 22 | return repo.isSignable(); 23 | }) 24 | .then(s => { 25 | isSignable = s; 26 | 27 | return repo.getReleases(); 28 | }) 29 | .then(releases => { 30 | releases.forEach(release => { 31 | let node = document.createElement("div"); 32 | node.className = "release"; 33 | 34 | let title = document.createElement("a"); 35 | title.className = "release-title"; 36 | title.textContent = release.title; 37 | title.href = "../?" + address + "/@" + release.tag; 38 | node.appendChild(title); 39 | 40 | let tag = document.createElement("div"); 41 | tag.className = "release-tag"; 42 | tag.textContent = release.tag; 43 | node.appendChild(tag); 44 | 45 | if(isSignable) { 46 | let button = document.createElement("a"); 47 | button.className = "button release-not-release"; 48 | button.innerHTML = "This is not a release"; 49 | button.onclick = () => { 50 | button.classList.add("button-disabled"); 51 | 52 | return repo.removeRelease(release.tag) 53 | .then(() => { 54 | location.href = "?" + address; 55 | }); 56 | }; 57 | node.appendChild(button); 58 | } 59 | 60 | let description = document.createElement("div"); 61 | description.className = "release-description"; 62 | description.textContent = "Tagged " + release.dateString + "\n" + release.description; 63 | node.appendChild(description); 64 | 65 | document.getElementById("releases").appendChild(node); 66 | }); 67 | }); -------------------------------------------------------------------------------- /main/dist/repo/settings/css/settings.css: -------------------------------------------------------------------------------- 1 | .entry { 2 | width: 896px; 3 | margin: 16px auto; 4 | } 5 | 6 | .entry-title { 7 | display: block; 8 | 9 | font-size: 24px; 10 | } 11 | 12 | .entry-description { 13 | display: block; 14 | 15 | font-size: 16px; 16 | color: #888; 17 | } 18 | 19 | .entry-value { 20 | display: block; 21 | margin-top: 8px; 22 | } 23 | .entry-value-margin { 24 | margin-left: 16px; 25 | } 26 | .entry-value-separator { 27 | display: inline-block; 28 | width: 1px; 29 | height: 32px; 30 | margin: 0 16px; 31 | vertical-align: top; 32 | 33 | background-color: #888; 34 | } 35 | 36 | .entry-value .input { 37 | width: 300px; 38 | } 39 | 40 | 41 | .mute-select { 42 | display: block; 43 | width: 300px; 44 | margin-bottom: 4px; 45 | } -------------------------------------------------------------------------------- /main/dist/repo/settings/js/main.js: -------------------------------------------------------------------------------- 1 | if(address == "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6") { 2 | location.href = "../../default/"; 3 | } 4 | 5 | let indexation; 6 | function showIndexation() { 7 | let index = document.getElementById("indexation_index"); 8 | 9 | document.getElementById("description").classList.toggle("input-disabled", indexation); 10 | document.getElementById("description_save").classList.toggle("button-disabled", indexation); 11 | 12 | index.classList.toggle("button-disabled", indexation & 2); 13 | index.innerHTML = indexation & 2 ? "The repository was published to Repository Index" : "Publish to Repository Index"; 14 | } 15 | 16 | repo.addMerger() 17 | .then(() => { 18 | return repo.getContent(); 19 | }) 20 | .then(content => { 21 | if(!content.installed) { 22 | location.href = "../../install/?" + address; 23 | } 24 | 25 | setTitle("Settings - " + content.title); 26 | 27 | showTitle(content.title); 28 | showHeader(1, content); 29 | showTabs(1); 30 | 31 | // Hooks 32 | let hooksSelect = document.getElementById("hooks_select"); 33 | hooksSelect.value = content.hooks ? "enabled" : "disabled"; 34 | 35 | hooksSelect.onchange = () => { 36 | if(hooksSelect.classList.contains("select-disabled")) { 37 | return; 38 | } 39 | hooksSelect.classList.add("select-disabled"); 40 | 41 | repo.changeHooks(hooksSelect.value == "enabled") 42 | .then(() => { 43 | hooksSelect.classList.remove("select-disabled"); 44 | }, e => { 45 | zeroPage.error(e); 46 | hooksSelect.classList.remove("select-disabled"); 47 | }); 48 | }; 49 | 50 | // Description 51 | let input = document.getElementById("description"); 52 | let button = document.getElementById("description_save"); 53 | 54 | input.value = content.description; 55 | button.onclick = () => { 56 | if(button.classList.contains("button-disabled")) { 57 | return; 58 | } 59 | 60 | button.classList.add("button-disabled"); 61 | repo.changeDescription(input.value) 62 | .then(() => { 63 | button.classList.remove("button-disabled"); 64 | }, () => { 65 | button.classList.remove("button-disabled"); 66 | }); 67 | }; 68 | 69 | // Load indexation 70 | return repo.isInIndex(); 71 | }) 72 | .then(i => { 73 | indexation = i; 74 | showIndexation(); 75 | 76 | let index = document.getElementById("indexation_index"); 77 | index.onclick = () => { 78 | if(index.classList.contains("button-disabled")) { 79 | return; 80 | } 81 | 82 | if(!(indexation & 2)) { 83 | index.classList.add("button-disabled"); 84 | 85 | repo.addToIndex() 86 | .then(() => { 87 | indexation |= 2; 88 | showIndexation(); 89 | }); 90 | } 91 | }; 92 | 93 | // Mute 94 | return repo.getMuted(); 95 | }) 96 | .then(muted => { 97 | muted.forEach(muted => { 98 | let option = document.createElement("option"); 99 | option.textContent = muted; 100 | document.getElementById("mute_select").appendChild(option); 101 | }); 102 | document.getElementById("mute_select").onfocus = () => { 103 | muteRemove.classList.remove("button-disabled"); 104 | }; 105 | 106 | let muteRemove = document.getElementById("mute_remove"); 107 | muteRemove.onclick = () => { 108 | if(muteRemove.classList.contains("button-disabled") || !document.getElementById("mute_select").value) { 109 | return; 110 | } 111 | 112 | muteRemove.classList.add("button-disabled"); 113 | 114 | let addr = document.getElementById("mute_select").value; 115 | repo.unmute(addr) 116 | .then(() => { 117 | muteRemove.classList.remove("button-disabled"); 118 | let option = Array.prototype.slice.call(document.getElementById("mute_select").options).find(option => { 119 | return option.value == addr; 120 | }); 121 | option.parentNode.removeChild(option); 122 | }, e => { 123 | zeroPage.error(e); 124 | muteRemove.classList.remove("button-disabled"); 125 | }); 126 | }; 127 | 128 | let muteAdd = document.getElementById("mute_add"); 129 | muteAdd.onclick = () => { 130 | if(muteAdd.classList.contains("button-disabled")) { 131 | return; 132 | } 133 | 134 | muteAdd.classList.add("button-disabled"); 135 | 136 | let addr; 137 | zeroPage.prompt("ZeroID:") 138 | .then(a => { 139 | addr = a; 140 | return repo.mute(addr.replace("@zeroid.bit", "") + "@zeroid.bit"); 141 | }) 142 | .then(() => { 143 | muteAdd.classList.remove("button-disabled"); 144 | 145 | let option = document.createElement("option"); 146 | option.textContent = addr.replace("@zeroid.bit", "") + "@zeroid.bit"; 147 | document.getElementById("mute_select").appendChild(option); 148 | }, e => { 149 | zeroPage.error(e); 150 | muteAdd.classList.remove("button-disabled"); 151 | }); 152 | }; 153 | }); -------------------------------------------------------------------------------- /main/dist/support/css/support.css: -------------------------------------------------------------------------------- 1 | .support-item { 2 | display: inline-block; 3 | width: 32%; 4 | height: 72px; 5 | padding: 8px; 6 | margin-bottom: 8px; 7 | box-sizing: border-box; 8 | vertical-align: top; 9 | 10 | border: 1px solid #D5D5D5; 11 | border-radius: 4px; 12 | 13 | background-image: linear-gradient(to bottom, #FCFCFC 0%, #EEE 100%); 14 | background-repeat: no-repeat; 15 | 16 | color: #FFF; 17 | text-decoration: none; 18 | 19 | transition: all .1s; 20 | } 21 | 22 | .support-item-margin { 23 | margin-right: 1%; 24 | } 25 | 26 | .support-icon { 27 | display: inline-block; 28 | width: 64px; 29 | float: left; 30 | margin-right: 16px; 31 | } 32 | 33 | .support-info { 34 | display: block; 35 | font-size: 16px; 36 | } 37 | 38 | .support-item-zerome { 39 | background-image: linear-gradient(to bottom, #F8A520 0%, #E7257D 100%); 40 | } 41 | .support-item-zeromail { 42 | background-image: linear-gradient(to bottom, #FF5E3B 0%, #DB3207 100%); 43 | } 44 | .support-item-zerotalk { 45 | background-image: linear-gradient(to bottom, #FF5E3B 0%, #DB3207 100%); 46 | } -------------------------------------------------------------------------------- /main/dist/support/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Support - Git Center 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 |
Git Center
21 |
22 | 23 |
Repository Index
24 |
25 | 26 |
My Repos
27 |
28 | 29 |
Beginner's Guide
30 |
31 | 32 |
Support
33 |
34 | 35 |
Profile
36 |
37 | 38 |
For devs
39 |
40 |
41 | 42 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /main/dist/support/js/main.js: -------------------------------------------------------------------------------- 1 | window.addEventListener("load", () => { 2 | setTitle("Support"); 3 | }); -------------------------------------------------------------------------------- /main/dist/user/css/user.css: -------------------------------------------------------------------------------- 1 | .user-left { 2 | display: block; 3 | width: 192px; 4 | padding-right: 16px; 5 | border-right: 1px solid #888; 6 | 7 | float: left; 8 | } 9 | 10 | .user-avatar { 11 | display: block; 12 | width: 192px; 13 | } 14 | .user-name { 15 | display: block; 16 | 17 | font-size: 28px; 18 | font-weight: bold; 19 | } 20 | .user-cert { 21 | display: block; 22 | 23 | font-size: 22px; 24 | color: #888; 25 | } 26 | 27 | .user-right { 28 | display: block; 29 | width: calc(100% - 225px); 30 | padding-left: 16px; 31 | border-left: 1px solid #888; 32 | margin-left: -1px; 33 | 34 | float: left; 35 | } -------------------------------------------------------------------------------- /main/dist/user/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | User - Git Center 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 |
Git Center
23 |
24 | 25 |
Repository Index
26 |
27 | 28 |
My Repos
29 |
30 | 31 |
Beginner's Guide
32 |
33 | 34 |
Support
35 |
36 | 37 |
Profile
38 |
39 | 40 |
For devs
41 |
42 |
43 | 44 |
45 | 50 | 51 |
52 |

Repositories

53 | 54 |
55 |
56 |
57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /main/dist/user/js/main.js: -------------------------------------------------------------------------------- 1 | zeroFrame = new ZeroFrame(); 2 | zeroPage = new ZeroPage(zeroFrame); 3 | zeroFS = new ZeroFS(zeroPage); 4 | zeroAuth = new ZeroAuth(zeroPage); 5 | zeroDB = new ZeroDB(zeroPage); 6 | zeroID = new ZeroID(zeroPage); 7 | 8 | let loadProfile = address => { 9 | return zeroFS.readFile("data/users/" + address + "/data.json") 10 | .then(profile => JSON.parse(profile), () => ({})); 11 | }; 12 | 13 | let user = location.search.replace(/[?&]wrapper_nonce=.*/, "").replace("?", ""); 14 | 15 | let downloaded; 16 | Repository.getDownloadedRepos(zeroPage) 17 | .then(d => { 18 | downloaded = d; 19 | 20 | return loadProfile(user); 21 | }) 22 | .then(profile => { 23 | if(profile.commitName) { 24 | return profile.commitName; 25 | } 26 | 27 | return zeroID.findUserById(user) 28 | .then(res => res.name); 29 | }) 30 | .then(userName => { 31 | document.getElementById("user_name").textContent = userName; 32 | 33 | return zeroID.findUserById(user) 34 | .then(res => res.name); 35 | }) 36 | .then(userCert => { 37 | document.getElementById("user_cert").textContent = userCert + "@zeroid.bit"; 38 | 39 | return zeroDB.query("\ 40 | SELECT\ 41 | repo_index.*,\ 42 | json.cert_user_id,\ 43 | COUNT(repo_stars.address) AS stars\ 44 | FROM\ 45 | repo_index,\ 46 | json\ 47 | \ 48 | LEFT JOIN\ 49 | repo_stars\ 50 | ON\ 51 | repo_stars.address = repo_index.address AND\ 52 | repo_stars.star = 1\ 53 | \ 54 | WHERE\ 55 | repo_index.json_id = json.json_id AND\ 56 | json.directory = :json\ 57 | GROUP BY\ 58 | repo_index.address\ 59 | ORDER BY\ 60 | stars DESC\ 61 | ", { 62 | json: "data/users/" + user 63 | }); 64 | }) 65 | .then(repos => { 66 | repos.forEach(repo => { 67 | let node = document.createElement("a"); 68 | node.className = "repo"; 69 | node.href = "/" + repo.address; 70 | 71 | let stars = document.createElement("div"); 72 | stars.className = "repo-stars"; 73 | stars.innerHTML = repo.stars; 74 | node.appendChild(stars); 75 | 76 | if(downloaded.indexOf(repo.address) > -1) { 77 | let downloaded = document.createElement("div"); 78 | downloaded.className = "repo-downloaded"; 79 | node.appendChild(downloaded); 80 | } 81 | 82 | let title = document.createElement("div"); 83 | title.className = "repo-title"; 84 | title.textContent = repo.title; 85 | node.appendChild(title); 86 | 87 | let address = document.createElement("div"); 88 | address.className = "repo-address"; 89 | address.textContent = repo.description; 90 | address.appendChild(document.createElement("br")); 91 | address.appendChild(document.createTextNode(repo.address)); 92 | node.appendChild(address); 93 | 94 | document.getElementById("repos").appendChild(node); 95 | }); 96 | }); -------------------------------------------------------------------------------- /repo/content.json: -------------------------------------------------------------------------------- 1 | { 2 | "address": "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6", 3 | "address_index": 80074647, 4 | "background-color": "#FFF", 5 | "clone_root": "template-new", 6 | "cloneable": true, 7 | "cloned_from": "1HeLLo4uzjaLetFx6NH3PMwFP3qbRbTf3D", 8 | "description": "Default Git Center Repo", 9 | "favicon": "img/logo-red.svg", 10 | "files": { 11 | "content.json-default": { 12 | "sha512": "1caf2792c8ac57b4f1ef9c5a74f16349b0fb58214ca771f91558dfec45a5cab5", 13 | "size": 1347 14 | }, 15 | "data-default/users/content.json-default": { 16 | "sha512": "091029acc8d6ba0f1c8c19dbb0df97ec810b454d690668bbb844c334fae396c4", 17 | "size": 541 18 | }, 19 | "img/logo-red.svg": { 20 | "sha512": "9f5481798d939ab8018a4e8a8baebf094e070eebd41b3ec5dd305e55430df5e3", 21 | "size": 888 22 | }, 23 | "index.html": { 24 | "sha512": "f05f08df94e7bd7f1638cbdd5cdc5e56a4f769a38e88fb599e519cf29ac4ff9c", 25 | "size": 1064 26 | }, 27 | "js/ZeroFrame.js": { 28 | "sha512": "672291eadcac614188b41e2df665cacf0c3b1b1d775cbf8291abab2d9e669f9d", 29 | "size": 2502 30 | } 31 | }, 32 | "ignore": "", 33 | "inner_path": "content.json", 34 | "merged_type": "GitCenter", 35 | "modified": 1506978316, 36 | "postmessage_nonce_security": true, 37 | "signers_sign": "HIbkXHjK35NbjH6FiPXQ6yWz6FagbYVIRVKKA+XdtHUwbgSErgTMH5KoEiJSm3UbygccjfySXI/qIH6C4I+xLAc=", 38 | "signs": { 39 | "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6": "G5RLdd/FqOQ2zyWdkQmRzSqOaC/UzALDcMRXerw7ZMd5RYeuAcVY1JbXIm0moCK8QMZHXxXvEuKfDa0BI9YWuks=" 40 | }, 41 | "signs_required": 1, 42 | "title": "Default Git Center Repo", 43 | "translate": ["js/all.js"], 44 | "zeronet_version": "0.5.7" 45 | } -------------------------------------------------------------------------------- /repo/content.json-default: -------------------------------------------------------------------------------- 1 | { 2 | "address": "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6", 3 | "address_index": 80074647, 4 | "background-color": "#FFF", 5 | "clone_root": "template-new", 6 | "cloneable": true, 7 | "cloned_from": "1HeLLo4uzjaLetFx6NH3PMwFP3qbRbTf3D", 8 | "description": "My new Git Center repository", 9 | "favicon": "img/logo-red.svg", 10 | "files": { 11 | "img/logo-red.svg": { 12 | "sha512": "9f5481798d939ab8018a4e8a8baebf094e070eebd41b3ec5dd305e55430df5e3", 13 | "size": 888 14 | }, 15 | "index.html": { 16 | "sha512": "f05f08df94e7bd7f1638cbdd5cdc5e56a4f769a38e88fb599e519cf29ac4ff9c", 17 | "size": 1064 18 | }, 19 | "js/ZeroFrame.js": { 20 | "sha512": "672291eadcac614188b41e2df665cacf0c3b1b1d775cbf8291abab2d9e669f9d", 21 | "size": 2502 22 | } 23 | }, 24 | "ignore": "data/.*", 25 | "includes": { 26 | "data/users/content.json": { 27 | "signers": [], 28 | "signers_required": 1 29 | } 30 | }, 31 | "inner_path": "content.json", 32 | "merged_type": "GitCenter", 33 | "modified": 1505931588, 34 | "postmessage_nonce_security": true, 35 | "signers_sign": "HIbkXHjK35NbjH6FiPXQ6yWz6FagbYVIRVKKA+XdtHUwbgSErgTMH5KoEiJSm3UbygccjfySXI/qIH6C4I+xLAc=", 36 | "signs": { 37 | "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6": "HKCaPyof2vlzqlC6uCvkdF4rQOwvoip2Pvj2keAgQ9jBI5ejFrS4OgQS0rYz4uQP80YzQaGCn85L+tcAaUN9LxQ=" 38 | }, 39 | "installed": false, 40 | "signs_required": 1, 41 | "title": " new repository", 42 | "translate": ["js/all.js"], 43 | "zeronet_version": "0.5.7" 44 | } -------------------------------------------------------------------------------- /repo/data-default/users/content.json-default: -------------------------------------------------------------------------------- 1 | { 2 | "address": "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6", 3 | "files": {}, 4 | "ignore": ".*", 5 | "inner_path": "data/users/content.json", 6 | "modified": 1505395365, 7 | "signs": { 8 | "1RepoXU8bQE9m7ssNwL4nnxBnZVejHCc6": "G0OU2QLq7Xmnyi0DXBC0fr24RrMmFzfXW769eePkb4dtO5IsGiDzWbkYAjrI0B4v0LCoWmzKeQ2/mM8qPPyvkrc=" 9 | }, 10 | "user_contents": { 11 | "cert_signers": { 12 | "zeroid.bit": ["1iD5ZQJMNXu43w1qLB8sfdHVKppVMduGz"] 13 | }, 14 | "permission_rules": { 15 | ".*": { 16 | "files_allowed": "data.json", 17 | "max_size": 50000 18 | } 19 | }, 20 | "permissions": {} 21 | } 22 | } -------------------------------------------------------------------------------- /repo/img/logo-red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purplesyringa/gitcenter/d0d35f10e60e520ea8ab0541ba94931a7eaf3dac/repo/img/logo-red.png -------------------------------------------------------------------------------- /repo/img/logo-red.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /repo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Git Center Repo 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 28 | 29 | -------------------------------------------------------------------------------- /repo/js/ZeroFrame.js: -------------------------------------------------------------------------------- 1 | const CMD_INNER_READY = 'innerReady' 2 | const CMD_RESPONSE = 'response' 3 | const CMD_WRAPPER_READY = 'wrapperReady' 4 | const CMD_PING = 'ping' 5 | const CMD_PONG = 'pong' 6 | const CMD_WRAPPER_OPENED_WEBSOCKET = 'wrapperOpenedWebsocket' 7 | const CMD_WRAPPER_CLOSE_WEBSOCKET = 'wrapperClosedWebsocket' 8 | 9 | class ZeroFrame { 10 | constructor(url) { 11 | this.url = url 12 | this.waiting_cb = {} 13 | this.wrapper_nonce = document.location.href.replace(/.*wrapper_nonce=([A-Za-z0-9]+).*/, "$1") 14 | this.connect() 15 | this.next_message_id = 1 16 | this.init() 17 | } 18 | 19 | init() { 20 | return this 21 | } 22 | 23 | connect() { 24 | this.target = window.parent 25 | window.addEventListener('message', e => this.onMessage(e), false) 26 | this.cmd(CMD_INNER_READY) 27 | } 28 | 29 | onMessage(e) { 30 | let message = e.data 31 | let cmd = message.cmd 32 | if (cmd === CMD_RESPONSE) { 33 | if (this.waiting_cb[message.to] !== undefined) { 34 | this.waiting_cb[message.to](message.result) 35 | } 36 | else { 37 | this.log("Websocket callback not found:", message) 38 | } 39 | } else if (cmd === CMD_WRAPPER_READY) { 40 | this.cmd(CMD_INNER_READY) 41 | } else if (cmd === CMD_PING) { 42 | this.response(message.id, CMD_PONG) 43 | } else if (cmd === CMD_WRAPPER_OPENED_WEBSOCKET) { 44 | this.onOpenWebsocket() 45 | } else if (cmd === CMD_WRAPPER_CLOSE_WEBSOCKET) { 46 | this.onCloseWebsocket() 47 | } else { 48 | this.onRequest(cmd, message) 49 | } 50 | } 51 | 52 | onRequest(cmd, message) { 53 | this.log("Unknown request", message) 54 | } 55 | 56 | response(to, result) { 57 | this.send({ 58 | cmd: CMD_RESPONSE, 59 | to: to, 60 | result: result 61 | }) 62 | } 63 | 64 | cmd(cmd, params={}, cb=null) { 65 | this.send({ 66 | cmd: cmd, 67 | params: params 68 | }, cb) 69 | } 70 | 71 | send(message, cb=null) { 72 | message.wrapper_nonce = this.wrapper_nonce 73 | message.id = this.next_message_id 74 | this.next_message_id++ 75 | this.target.postMessage(message, '*') 76 | if (cb) { 77 | this.waiting_cb[message.id] = cb 78 | } 79 | } 80 | 81 | log(...args) { 82 | console.log.apply(console, ['[ZeroFrame]'].concat(args)) 83 | } 84 | 85 | onOpenWebsocket() { 86 | this.log('Websocket open') 87 | } 88 | 89 | onCloseWebsocket() { 90 | this.log('Websocket close') 91 | } 92 | } 93 | 94 | -------------------------------------------------------------------------------- /status/content.json: -------------------------------------------------------------------------------- 1 | { 2 | "address": "1sTatuSy3fQXUFjYmXZXE4tW62EQzScAP", 3 | "address_index": 80074647, 4 | "background-color": "#FFF", 5 | "clone_root": "template-new", 6 | "cloned_from": "1HeLLo4uzjaLetFx6NH3PMwFP3qbRbTf3D", 7 | "description": "", 8 | "favicon": "img/logo-green.png", 9 | "files": { 10 | "css/buttons.css": { 11 | "sha512": "3e1fef45aacc6aa79952351a73fb66996107809f1dcbe974620228650b87c369", 12 | "size": 1670 13 | }, 14 | "css/content.css": { 15 | "sha512": "430422777c614aa46e6e974b120f739ca0f5a4a2375be85dc336b8e9db5ed35c", 16 | "size": 748 17 | }, 18 | "css/header.css": { 19 | "sha512": "f05e44aa38434013d6f57c8c2845b8049455a0ed92d0e5caa826d29ef3ae283a", 20 | "size": 812 21 | }, 22 | "css/history.css": { 23 | "sha512": "9269055e858030c623e789b5c59312dc9bee72abb59bb30afd8e53220a945f50", 24 | "size": 287 25 | }, 26 | "css/main.css": { 27 | "sha512": "655b8c3b04526d93e193ae3df1df211b83a23d412dbaa2c235bbb01318643dc5", 28 | "size": 121 29 | }, 30 | "img/logo-green.svg": { 31 | "sha512": "e390644d9e39cc159927a7ab9a264b134ebdd3818afa2a9469786fe8860f67f9", 32 | "size": 900 33 | }, 34 | "img/logo-white.svg": { 35 | "sha512": "71bfe4e341a9e58340b37de8cc4ea2299098b20fa4a77f8ac14917c19364d4ec", 36 | "size": 900 37 | }, 38 | "index.html": { 39 | "sha512": "57302114e1caa65dd2bfc30aadc883315fbf223022f4444d0756c4423c1303f8", 40 | "size": 1340 41 | } 42 | }, 43 | "ignore": "", 44 | "inner_path": "content.json", 45 | "modified": 1506487922, 46 | "postmessage_nonce_security": true, 47 | "signers_sign": "G5Aj/87p8XL4m9DYQeeDTaDWVF6Z6KovmaMz/uIFx7S9QpMX5+KZAtnlpkoULyRkD13b+J6TU+5c5989FSPIhCw=", 48 | "signs": { 49 | "1sTatuSy3fQXUFjYmXZXE4tW62EQzScAP": "Gy3pFcze+5+oQDJjOPftXUoCBjNSZdde5TZajOlp5IMiedvuEgtNbU80sueHd1QqPXBxv54n+XoA8shoyaMf5nE=" 50 | }, 51 | "signs_required": 1, 52 | "title": "Git Center Status", 53 | "translate": ["js/all.js"], 54 | "zeronet_version": "0.5.7" 55 | } -------------------------------------------------------------------------------- /status/css/buttons.css: -------------------------------------------------------------------------------- 1 | .button, .select { 2 | display: inline-block; 3 | padding: 3px 10px 3px 8px; 4 | border: 1px solid #D5D5D5; 5 | border-radius: 4px; 6 | cursor: pointer; 7 | 8 | background-image: linear-gradient(to bottom, #FCFCFC 0%, #EEE 100%); 9 | background-repeat: no-repeat; 10 | 11 | font-weight: bold; 12 | white-space: nowrap; 13 | color: #333; 14 | font-size: 16px; 15 | line-height: 22px; 16 | text-decoration: none; 17 | text-shadow: 0 1px 0 #FFF; 18 | } 19 | .button:active, .select:active { 20 | background-image: linear-gradient(to top, #FCFCFC 0%, #EEE 100%); 21 | } 22 | 23 | .button-disabled, .button-disabled:active { 24 | cursor: not-allowed; 25 | background-image: linear-gradient(to bottom, #888 0%, #666 100%); 26 | } 27 | 28 | .button-blue { 29 | border-color: #2967A4; 30 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); 31 | 32 | background-color: #3072B3; 33 | background-repeat: repeat-x; 34 | background-image: linear-gradient(to bottom, #599BDC 0%, #3072B3 100%); 35 | 36 | color: #FFF; 37 | text-shadow: 0 -1px 0 rgba(0, 0, 0, .5); 38 | } 39 | .button-blue:active { 40 | background-image: linear-gradient(to top, #599BDC 0%, #3072B3 100%); 41 | } 42 | 43 | .button-blue.button-disabled, .button-blue.button-disabled:active { 44 | cursor: not-allowed; 45 | background-image: linear-gradient(to bottom, #005283 0%, #236EB4 100%); 46 | } 47 | 48 | .button-big { 49 | padding: 4.5px 15px 4.5px 12px; 50 | border-radius: 6px; 51 | 52 | font-size: 24px; 53 | line-height: 33px; 54 | } 55 | 56 | 57 | .input { 58 | display: inline-block; 59 | padding: 3px 10px 3px 8px; 60 | border: 1px solid #D5D5D5; 61 | border-radius: 4px; 62 | 63 | background-image: linear-gradient(to bottom, #EEE 0%, #FCFCFC 100%); 64 | background-repeat: no-repeat; 65 | 66 | color: #000; 67 | font-size: 16px; 68 | line-height: 22px; 69 | text-decoration: none; 70 | text-shadow: 0 1px 0 #FFF; 71 | } -------------------------------------------------------------------------------- /status/css/content.css: -------------------------------------------------------------------------------- 1 | .content { 2 | display: block; 3 | width: 896px; 4 | padding: 0 calc(50% - 448px); 5 | margin: 16px 0; 6 | } 7 | 8 | .middle { 9 | display: block; 10 | width: 896px; 11 | padding: 16px calc(50% - 448px) 0; 12 | background-color: #EEE; 13 | border-bottom: 1px solid #888; 14 | } 15 | .middle-buttons { 16 | float: right; 17 | vertical-align: top; 18 | margin-top: -40px; 19 | } 20 | .middle-button-margin { 21 | margin-left: 16px; 22 | } 23 | .publish { 24 | display: none; 25 | } 26 | 27 | h1 { 28 | margin: 8px 0; 29 | font-size: 32px; 30 | } 31 | h2 { 32 | margin: 6px 0; 33 | font-size: 24px; 34 | } 35 | 36 | p, ul, ol { 37 | margin: 8px 0; 38 | font-size: 16px; 39 | } 40 | 41 | .center { 42 | text-align: center; 43 | } 44 | 45 | .info { 46 | display: block; 47 | width: 896px; 48 | padding: 0 calc(50% - 448px); 49 | margin: 16px 0; 50 | } 51 | .info-link { 52 | margin-left: 16px; 53 | font-size: 16px; 54 | } -------------------------------------------------------------------------------- /status/css/header.css: -------------------------------------------------------------------------------- 1 | .header { 2 | display: block; 3 | width: 896px; 4 | height: 64px; 5 | padding: 0 calc(50% - 448px); 6 | background-color: #222; 7 | } 8 | 9 | .header-logo { 10 | display: inline-block; 11 | width: 32px; 12 | height: 32px; 13 | margin: 16px 0; 14 | margin-right: 16px; 15 | } 16 | 17 | .header-name { 18 | display: inline-block; 19 | width: auto; 20 | height: 32px; 21 | margin: 16px 8px 16px 0; 22 | vertical-align: top; 23 | 24 | font-family: Verdana, Arial, sans-serif; 25 | font-size: 24px; 26 | line-height: 32px; 27 | color: #FFF; 28 | } 29 | 30 | .header-item { 31 | display: inline-block; 32 | width: auto; 33 | height: 24px; 34 | margin: 0 10px; 35 | padding: 20px 0; 36 | vertical-align: top; 37 | 38 | font-family: Verdana, Arial, sans-serif; 39 | font-size: 16px; 40 | line-height: 24px; 41 | color: #888; 42 | } 43 | .header-item:hover { 44 | color: #DDD; 45 | } 46 | .header-item-active, .header-item-active:hover { 47 | color: #FFF; 48 | } -------------------------------------------------------------------------------- /status/css/main.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | margin: 0; 3 | padding: 0; 4 | height: 100%; 5 | 6 | font-family: Helvetica, Arial, sans-serif; 7 | font-size: 0; 8 | } -------------------------------------------------------------------------------- /status/img/logo-green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purplesyringa/gitcenter/d0d35f10e60e520ea8ab0541ba94931a7eaf3dac/status/img/logo-green.png -------------------------------------------------------------------------------- /status/img/logo-green.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /status/img/logo-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /status/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purplesyringa/gitcenter/d0d35f10e60e520ea8ab0541ba94931a7eaf3dac/status/img/logo.png -------------------------------------------------------------------------------- /status/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Git Center Status 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 |
Git Center Status
20 |
21 | 22 |
Main site
23 |
24 |
25 |
26 |

27 | Git Center Status was removed. From now, you can use ZeroMe or ZeroTalk to ask a question. 28 |

29 |
30 | 31 | --------------------------------------------------------------------------------