├── .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 |
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 |
40 |
41 |
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 |
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 |
59 | Krixano - contibutor, tester
60 | Binchan - contibutor, tester
61 | ixhb5a7vwvdgimjx - beta-testing
62 | affeali - domain
63 |
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 |
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 |
38 |
39 | Create new repository
40 |
41 |
42 |
43 |
44 | Repository type
45 |
46 |
47 |
48 | Git
49 | Mercurial [BETA]
50 |
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 |
41 |
42 |
43 |
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 |
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 |
44 |
45 |
46 |
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 |
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 |
44 |
45 |
46 |
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 |
91 |
92 |
93 |
98 |
99 |
100 | Back
101 |
102 |
103 |
104 |
105 |
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 |
44 |
45 |
46 |
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 |
83 |
84 |
85 |
97 |
98 | Nothing here yet :(
99 |
100 |
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 |
44 |
45 |
46 |
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 |
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 |
44 |
45 |
46 |
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 |
44 |
45 |
46 |
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 |
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 |
43 |
44 |
45 |
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 |
Add a release by creating an annotated tag.
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 |
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 |
43 |
44 |
45 |
46 |
47 |
48 | Loading...
49 |
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 |
25 |
26 |
27 | Git Center Status was removed. From now, you can use ZeroMe or ZeroTalk to ask a question.
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------