├── 1970
├──
├──
├── README.md
├── a.md
└── breadcrumb-glitches.png
├── "
├── ";alert("xss");"
├── #
├── '
├── ';alert("xss");'
├── -
├── --
├── -start-with-slash
├── .*
├── ...
├── .bzrignore
├── .drone.yml
├── .github
├── ISSUE_TEMPLATE
│ ├── template0.md
│ └── template1.md
└── workflows
│ └── issue.yml
├── .gitignore
├── :
├── ;
├── ;alert("xss");
├── ;alert('xss');
├──
306 |
307 | `
a
`:
308 |
309 | a
310 |
311 | ``:
312 |
313 |
314 |
315 | ### Entities
316 |
317 | `#`: #
318 |
319 | `Ӓ`: Ӓ
320 |
321 | `Ϡ`: Ϡ
322 |
323 | ``:
324 |
325 | ## XSS
326 |
327 |
328 |
329 | For compilers that treat `h1` magically (e.g. add to a TOC):
330 |
331 | #
332 |
333 | ## LaTeX
334 |
335 | https://docs.gitlab.com/ee/user/markdown.html#math
336 |
337 | This math is inline $`a^2+b^2=c^2`$.
338 |
339 | This is on a separate line:
340 |
341 | ```math
342 | a^2+b^2=c^2
343 | ```
344 |
--------------------------------------------------------------------------------
/mirrors.md:
--------------------------------------------------------------------------------
1 | # Mirrors
2 |
3 | This repository is mirrored at:
4 |
5 | - . Runs on [Girocco](http://repo.or.cz/w/girocco.git). TODO get working.
6 | -
7 | - Company called Wildbit. builtwith.com and job offerings say Rails.
8 | - . By Microsoft. Rejects this repo because of the future-max commit, so I made placeholder to squat the project name.
9 | - . Unable to use it for now:
10 | -
11 | -
12 | -
13 | - (500 initially )
14 | -
15 | -
16 |
17 | Mirrors without public view:
18 |
19 | -
20 | -
21 |
22 | Mirrors without repository browsing:
23 |
24 | -
25 |
26 | Mirrors for which I can't create projects:
27 |
28 | -
29 |
30 | Discontinued:
31 |
32 | - (to be closed)
33 | - , bough by GitLab. Will remain read only.
34 |
35 | Web interfaces without public hosting service that I know of. Huge list: Some interesting ones:
36 |
37 | - Gitweb. Distributed with Git. The Perl one.
38 | - cgit. Official self-host: , GitHub mirror: . Used by GNU Savannah. Written in C.
39 | - Gerrit. The Java one. ,
40 | - GitList. The PHP one.
41 | - WebGitNet. The .Net one.
42 | - Gogs. The Go one. Modified version at:
43 |
44 | The SSH of those repos can be found at: [remotes.sh](remotes.sh), including other repos which don't have public view like Atlas.
45 |
--------------------------------------------------------------------------------
/new-name-same-email:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cirosantilli/test-git-web-interface/088ce51c95f2184e27fef839e1e78ab62124e294/new-name-same-email
--------------------------------------------------------------------------------
/no-preview:
--------------------------------------------------------------------------------
1 | a b
--------------------------------------------------------------------------------
/noext:
--------------------------------------------------------------------------------
1 | def a
2 | return 1 + 1
3 | end
4 |
--------------------------------------------------------------------------------
/objects/17/3a852893f2dac5b79dd5862e5a032777477567:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cirosantilli/test-git-web-interface/088ce51c95f2184e27fef839e1e78ab62124e294/objects/17/3a852893f2dac5b79dd5862e5a032777477567
--------------------------------------------------------------------------------
/objects/49/6d6428b9cf92981dc9495211e6e1120fb6f2ba:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cirosantilli/test-git-web-interface/088ce51c95f2184e27fef839e1e78ab62124e294/objects/49/6d6428b9cf92981dc9495211e6e1120fb6f2ba
--------------------------------------------------------------------------------
/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cirosantilli/test-git-web-interface/088ce51c95f2184e27fef839e1e78ab62124e294/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391
--------------------------------------------------------------------------------
/ordered-list-with-list-bug.md:
--------------------------------------------------------------------------------
1 | 1. 1
2 |
3 | - inner par list
4 |
5 | 2. 2
6 |
7 | nested list without paragraphs:
8 |
9 | 1. 1
10 | - list without par
11 | 2. 2
12 |
13 | nested paragraph:
14 |
15 | 1. 1
16 |
17 | par
18 |
19 | 2. 2
20 |
21 | nested code block:
22 |
23 | 1. 1
24 |
25 | code block
26 |
27 | 2. 2
28 |
29 | nested ordered list:
30 |
31 | 1. 1
32 |
33 | 1. 1
34 |
35 | 2. 2
36 |
37 |
--------------------------------------------------------------------------------
/other-cms.md:
--------------------------------------------------------------------------------
1 | # Other CMS
2 |
3 | - `bzr`: cannot handle the path with a single backslash \.
4 |
--------------------------------------------------------------------------------
/other-test-repos/.gitignore:
--------------------------------------------------------------------------------
1 | *.pyc
2 | /tmp/
3 | /*.tmp/
4 | __pycache__/
5 |
--------------------------------------------------------------------------------
/other-test-repos/README.md:
--------------------------------------------------------------------------------
1 | # Other test repositories
2 |
3 | Scripts in this directory can be used to generate the more complex test repositories.
4 |
5 | Tests that are very large will not be included here to keep this repository small:
6 |
7 | -
8 | -
9 | -
10 | -
11 | - [many-commits.py](many-commits-fast-import.py) superior
12 | - [many-commits.py](many-commits.py) inferior
13 | -
14 | -
15 | -
16 |
17 | There are also some tests that could not be included here conveniently:
18 |
19 | - ANSI art in the author field, too disruptive to the `git log`, even for this repo!
20 | -
21 | -
22 | -
23 | -
24 | - : [partial-clone.sh](partial-clone.sh) | https://stackoverflow.com/questions/600079/how-do-i-clone-a-subdirectory-only-of-a-git-repository/52269934#52269934
25 | - : [filter-repo.sh](filter-repo.sh)
26 | -
27 | -
28 | -
29 | -
30 | -
31 | -
32 | -
33 | - , , [streak.py](streak.py),
34 | -
35 | -
36 | -
37 | -
38 | -
39 | - (fails on GitHub)
40 | -
41 | -
42 |
43 | Other similar repos from other people:
44 |
45 | -
46 |
47 | Other useful things:
48 |
49 | - . May contain some extra semi-internal information.
50 |
51 | -
52 | - GitHub is hosted on Carpathia
53 | - GitHub uses Mac?
54 |
--------------------------------------------------------------------------------
/other-test-repos/commit-meta.bashrc:
--------------------------------------------------------------------------------
1 | # Fixed commit metadata.
2 | date='2000-01-01T00:00:00+0000'
3 | email='a@a.com'
4 | name='a'
5 | export GIT_AUTHOR_DATE="$date"
6 | export GIT_AUTHOR_EMAIL="$email"
7 | export GIT_AUTHOR_NAME="$name"
8 | export GIT_COMMITTER_DATE="$date"
9 | export GIT_COMMITTER_EMAIL="$email"
10 | export GIT_COMMITTER_NAME="$name"
11 |
--------------------------------------------------------------------------------
/other-test-repos/duplicate-parent-lowlevel.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | """
4 | Git does not let a commit have twice the same parent, but GitHub does, and normally shows it.
5 | But as of 2016-05-17 they didn't page this edge case, and it 502's the commit for large numbers of links.
6 |
7 | If you increase the value a lot, when you clone and cd into the repo. your computer may bog down
8 | if you show a git status on the bash, because Git memory explodes trying to parse that.
9 | Actual compressed size is very small though, since gzip compresses all that repeated data very efficiently.
10 |
11 | push would require an obscene ammount of memory (malloc fails on `ulimit -Sv`), so I couldn't test it.
12 | """
13 |
14 | import itertools
15 |
16 | import util
17 |
18 | util.init()
19 |
20 | tree = util.create_tree_with_one_file()
21 | commit, _, _ = util.save_commit_object(tree, author_name=b'a')
22 | commit, _, _ = util.save_commit_object(tree, itertools.repeat(commit, 10000000), author_name=b'b')
23 |
24 | # Finish.
25 | util.create_master(commit)
26 | util.clone()
27 |
--------------------------------------------------------------------------------
/other-test-repos/duplicate-parent.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | set -e
4 |
5 | # Try to create a commit with two times it's parent with git-commit-tree
6 | # Outcome on Git 2.7: commit fails. Will try again with raw object creation from Python later on.
7 |
8 | . commit-meta.bashrc
9 | . init.bashrc
10 |
11 | # Directory parameters.
12 | blob_content=''
13 | blob_name='a'
14 | blob_mode='100644'
15 | dir_name='directory'
16 |
17 | # Blob.
18 | blob_sha="$(printf "$blob_content" | git hash-object --stdin -w)"
19 |
20 | # Tree.
21 | tree_sha="$(printf "\
22 | $blob_mode blob $blob_sha\t$blob_name
23 | " | git mktree)"
24 |
25 | # Commit 1.
26 | commit_sha="$( \
27 | git commit-tree -m 0 "$tree_sha")"
28 | git branch master "$commit_sha"
29 |
30 | # Commit 2 that has the duplicate parent.
31 | commit_sha="$(git commit-tree -m 1 -p "$commit_sha" -p "$commit_sha" "$tree_sha")"
32 | git update-ref master "$commit_sha"
33 |
--------------------------------------------------------------------------------
/other-test-repos/filter-repo.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | # https://stackoverflow.com/questions/64160917/how-to-use-git-filter-repo-as-a-library-with-the-python-module-interface/64160918#64160918
4 |
5 | import git_filter_repo
6 |
7 | def blob_callback(blob, callback_metadata):
8 | blob.data = blob.data.replace(b'd1', b'asdf')
9 |
10 | # Args deduced from:
11 | # print(git_filter_repo.FilteringOptions.parse_args(['--refs', 'HEAD', '--force'], error_on_empty=False))
12 | args = git_filter_repo.FilteringOptions.default_options()
13 | args.force = True
14 | args.partial = True
15 | args.refs = ['HEAD~..HEAD']
16 | args.repack=False
17 | args.replace_refs='update-no-add'
18 |
19 | git_filter_repo.RepoFilter(
20 | args,
21 | blob_callback=blob_callback
22 | ).run()
23 |
--------------------------------------------------------------------------------
/other-test-repos/filter-repo.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | set -eu
3 |
4 | # Reproducibility.
5 | export GIT_COMMITTER_NAME='a'
6 | export GIT_COMMITTER_EMAIL='a'
7 | export GIT_AUTHOR_NAME='a'
8 | export GIT_AUTHOR_EMAIL='a'
9 | export GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000'
10 | export GIT_AUTHOR_DATE='2000-01-01T00:00:00+0000'
11 |
12 | # https://stackoverflow.com/questions/600079/how-do-i-clone-a-subdirectory-only-of-a-git-repository/52269934#52269934
13 | rm -rf filter-repo.tmp
14 | mkdir -p filter-repo.tmp
15 | cd filter-repo.tmp
16 | git init
17 |
18 | # Create repo.
19 | git init --quiet
20 |
21 | # First commit.
22 | # Directories present in all branches.
23 | mkdir d1 d2
24 | printf 'd1/a' > ./d1/a
25 | printf 'd1/b' > ./d1/b
26 | printf 'd2/a' > ./d2/a
27 | printf 'd2/b' > ./d2/b
28 | # Present only in root.
29 | mkdir 'root'
30 | printf 'root' > ./root/root
31 | git add .
32 | git commit -m 'root' --quiet
33 | root_commmit_sha="$(git log -1 --format="%H")"
34 |
35 | # Second commit only on master.
36 | git rm --quiet -r ./root
37 | mkdir 'master'
38 | printf 'master' > ./master/master
39 | printf 'd1/a' > ./d1/a2
40 | git add .
41 | git commit -m 'master commit' --quiet
42 |
43 | # Third commit only on master.
44 | printf 'd1/b' > ./d1/b2
45 | git add .
46 | git commit -m 'master commit' --quiet
47 |
48 | # Second commit only on mybranch.
49 | git checkout -b mybranch --quiet "$root_commmit_sha"
50 | git rm --quiet -r ./root
51 | mkdir 'mybranch'
52 | printf 'mybranch' > ./mybranch/mybranch
53 | git add .
54 | git commit -m 'mybranch commit' --quiet
55 |
56 | # Restore master.
57 | git checkout --quiet master
58 |
59 | # To easily compare with the original repo.
60 | git remote add origin https://github.com/cirosantilli/test-git-filter-repository
61 | git fetch
62 |
--------------------------------------------------------------------------------
/other-test-repos/finish-bare.bashrc:
--------------------------------------------------------------------------------
1 | git clone -q repo.tmp clone.tmp
2 |
--------------------------------------------------------------------------------
/other-test-repos/imagine-all-the-people.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | """
4 | TODO: remove invalid emails, at the very least those that contain newlines or <>,
5 | which make fsck fail. Those must have been pushed on a previous version of GitHub.
6 |
7 | A repository with one commit per commit email:
8 | https://github.com/cirosantilli/all-github-commit-emails
9 |
10 | As of 2015-12-31 , the generated repo is just under 1Gb,
11 | so under GitHub's soft max repo size limit.
12 |
13 | remote='git@github.com:cirosantilli/imagine-all-the-people.git'
14 | for i in `seq 10 10 100`; do
15 | git --git-dir=repo.tmp/.git push -f "$remote" "$i:master"
16 | done
17 | # TODO for some reason I needed this afterwards.
18 | git --git-dir=tmp/repo.tmp/.git push "$remote" 'master'
19 | """
20 |
21 | import datetime
22 | import subprocess
23 | import time
24 | import os
25 |
26 | import util
27 |
28 | # data_dir_path = '/path/to/all-github-commit-emails/emails'
29 | data_dir_path = '/home/ciro/bak/git/all-github-commit-emails/emails'
30 |
31 | name = b'a'
32 |
33 | util.init()
34 |
35 | tree = util.create_tree_with_one_file()
36 | commit = None
37 | n = 1000000
38 | percent = (n / 100)
39 | p = 0
40 | i = 0
41 |
42 | data_paths = sorted(os.listdir(data_dir_path))
43 | for data_path in data_paths:
44 | data_path = os.path.join(data_dir_path, data_path)
45 | with open(data_path, 'rb') as f:
46 | for line in f:
47 | email = line.rstrip()[:255]
48 | commit, _, _ = util.save_commit_object(
49 | tree,
50 | (commit,),
51 | author_email=email,
52 | committer_email=email,
53 | )
54 | if i % percent == 0:
55 | print(p)
56 | print(email)
57 | print(datetime.datetime.now())
58 | p += 1
59 |
60 | # Lose objects are too large and blow up the tmpfs.
61 |
62 | # Does clean packets, but the calculation takes more and more memory,
63 | # and slows down and blows up at the end. TODO which subcommand blows up eactly?.
64 | #subprocess.check_output(['git', 'gc'])
65 |
66 | subprocess.check_output(['git', 'repack'])
67 | subprocess.check_output(['git', 'prune-packed'])
68 |
69 | subprocess.check_output(['git', 'tag', str(p), commit])
70 | i += 1
71 | if i == 100000:
72 | util.create_master(commit)
73 |
--------------------------------------------------------------------------------
/other-test-repos/init.bashrc:
--------------------------------------------------------------------------------
1 | rm -rf repo.tmp clone.tmp
2 | mkdir -p repo.tmp
3 | cd repo.tmp
4 | git init -q
5 |
--------------------------------------------------------------------------------
/other-test-repos/manual-sha-calculation.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | """
4 | Create objects very manually to try and be faster than Git to generate large repos.
5 | """
6 |
7 | import util
8 |
9 | util.init()
10 |
11 | # Directory parameters.
12 | blob_content = b'a'
13 | blob_basename = b'a'
14 | blob_mode = b'100644'
15 |
16 | # Commit parameters.
17 | name = b'a'
18 | email = b'a@a.com'
19 | # 2000-01-01T00:00:00+0000
20 | date = b'946684800 +0000'
21 | author_date = date
22 | author_email = email
23 | author_name = name
24 | committer_date = date
25 | committer_email = email
26 | committer_name = name
27 | message = b'a'
28 | # ASCII hex of parents.
29 | parents = ()
30 |
31 | # Blob.
32 | blob_sha_ascii, blob_sha = util.save_object(b'blob', blob_content)
33 | # Check sha matches Git.
34 | blob_sha_git = util.get_git_hash_object(b'blob', blob_content)
35 | assert blob_sha_ascii == blob_sha_git
36 |
37 | # Tree.
38 | tree_sha_ascii, tree_sha, tree_content = util.save_tree_object(blob_mode, blob_basename, blob_sha)
39 | # Check sha matches Git.
40 | tree_sha_git = util.get_git_hash_object(b'tree', tree_content)
41 | assert tree_sha_ascii == tree_sha_git
42 |
43 | # Commit.
44 | commit_sha_ascii, commit_sha, commit_content = util.save_commit_object(
45 | tree_sha_ascii, parents,
46 | author_name, author_email, author_date,
47 | committer_name, committer_email, committer_date,
48 | message)
49 | commit_sha_git = util.get_git_hash_object(b'commit', commit_content)
50 | assert commit_sha_ascii == commit_sha_git
51 |
52 | # Finish.
53 | util.create_master(commit_sha_ascii)
54 | util.clone()
55 |
--------------------------------------------------------------------------------
/other-test-repos/manual-sha-calculation.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | set -e
4 |
5 | # This was an attempt to calculate SHAs manually.
6 | # It stopped halfway because Bash cannot store NUL characters in variables,
7 | # so we had to move to Python.
8 |
9 | . commit-meta.bashrc
10 | . init.bashrc
11 |
12 | # Directory parameters.
13 | blob_content='blob content'
14 | blob_name='file'
15 | blob_mode='100644'
16 | dir_name='directory'
17 |
18 | strlen() {
19 | printf "$1" | wc -c
20 | }
21 |
22 | sha_calc() {
23 | type="$1"
24 | content="$2"
25 | printf "${type} $(strlen "$content")\0${content}" | sha1sum
26 | }
27 |
28 | # Blob.
29 | blob_sha="$(printf "$blob_content" | git hash-object --stdin -w)"
30 | echo "$blob_sha"
31 | echo "$(sha_calc "blob" "$blob_content")"
32 | echo
33 |
34 | # Tree 1.
35 | sub_tree_sha="$(printf "\
36 | $blob_mode blob $blob_sha\t$blob_name
37 | " | git mktree)"
38 | echo "$sub_tree_sha"
39 | # TODO the problem here is the null character
40 | # which is impossible for bash to put into a variable.
41 | echo "$(sha_calc "tree" "${blob_mode} ${blob_name}\0${blob_sha}")"
42 | echo
43 |
44 | # Tree 2.
45 | root_tree="$(printf "\
46 | 040000 tree $sub_tree_sha\t$dir_name
47 | 100644 blob $blob_sha\t$blob_name
48 | " | git mktree)"
49 |
50 | commit="$(git commit-tree -m 0 "$root_tree")"
51 | git branch master "$commit"
52 |
53 | # Modify the master branch
54 | root_tree="$((
55 | git ls-tree HEAD:./
56 | printf "\
57 | 100644 blob $blob_sha\tb
58 | ") | git mktree)"
59 |
60 | commit="$(git commit-tree -m 1 -p "$(git rev-parse HEAD)" "$root_tree")"
61 | # Bare
62 | git update-ref master "$commit"
63 |
--------------------------------------------------------------------------------
/other-test-repos/many-commits-fast-import.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | '''
4 | This is a superior and simpler alternative to many-commits.py.
5 |
6 | Usage:
7 |
8 | rm -rf many-commits.tmp
9 | mkdir -p many-commits.tmp
10 | cd many-commits.tmp
11 | git init
12 | ../many-commits-fast-import.py [ncommits=10] | git fast-import
13 |
14 | Lenovo ThinkPad P51 SSD generation time for 2M commits: 33s. Disk usage: 270.2 MiB. Push size is smaller for some reason.
15 | '''
16 |
17 | import sys
18 |
19 | print('''blob
20 | mark :1
21 | data 1
22 | a
23 | reset refs/heads/master
24 | commit refs/heads/master
25 | mark :2
26 | author <> 0 +0000
27 | committer <> 0 +0000
28 | data 1
29 |
30 | M 100644 :1 a
31 | ''')
32 |
33 | if len(sys.argv) > 1:
34 | n = int(sys.argv[1])
35 | else:
36 | n = 10
37 | for i in range(2, n + 1):
38 | print('''commit refs/heads/master
39 | mark :{}
40 | author <> 0 +0000
41 | committer <> 0 +0000
42 | data 1
43 |
44 | from :{}
45 | '''.format(i + 1, i))
46 |
--------------------------------------------------------------------------------
/other-test-repos/many-commits-octopus-fast-import.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | '''
4 | This is a superior and simpler alternative to many-commits.py.
5 |
6 | Usage:
7 |
8 | rm -rf many-commits.tmp
9 | mkdir -p many-commits.tmp
10 | cd many-commits.tmp
11 | git init
12 | ../many-commits-fast-import.py [ncommits=10] | git fast-import
13 |
14 | Lenovo ThinkPad P51 SSD generation time for 2M commits: 33s. Disk usage: 270.2 MiB. Push size is smaller for some reason.
15 | '''
16 |
17 | import sys
18 |
19 | print('''blob
20 | mark :1
21 | data 1
22 | a
23 | reset refs/heads/master
24 | commit refs/heads/master
25 | mark :2
26 | author <> 0 +0000
27 | committer <> 0 +0000
28 | data 1
29 |
30 | M 100644 :1 a
31 | ''')
32 |
33 | if len(sys.argv) > 1:
34 | n = int(sys.argv[1])
35 | else:
36 | n = 10
37 | for i in range(2, n + 2):
38 | print('''commit refs/heads/master
39 | mark :{}
40 | author <> {} +0000
41 | committer <> 0 +0000
42 | data 1
43 |
44 | from :2
45 | '''.format(i + 1, i - 2))
46 | print('''commit refs/heads/master
47 | mark :{}
48 | author <> 0 +0000
49 | committer <> 0 +0000
50 | data 1
51 |
52 | from :3'''.format(n + 3)
53 | )
54 | for i in range(4, n + 3):
55 | print('merge :{}'.format(i))
56 |
--------------------------------------------------------------------------------
/other-test-repos/many-commits-octopus.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | """
4 | 100k:
5 |
6 | - generates in seconds
7 | - size after script: 4Gb
8 | - git gc time: 1h30 min on https://github.com/cirosantilli/linux-kernel-module-cheat/tree/83b36867cf06ffdca3ce04296a8568d4f37ea13b#p51
9 | - size afte git gc: 78Mb
10 | """
11 |
12 | import datetime
13 | import subprocess
14 | import time
15 | import sys
16 |
17 | import util
18 |
19 | email = b'a@a.com'
20 | name = b''
21 |
22 | util.init()
23 |
24 | tree = util.create_tree_with_one_file()
25 | commit = None
26 | if len(sys.argv) > 1:
27 | n = int(sys.argv[1])
28 | else:
29 | n = 1000
30 | base_commit, _, _ = util.save_commit_object(
31 | tree,
32 | (commit,),
33 | author_date_s=0,
34 | author_email=email,
35 | author_name=name,
36 | committer_date_s=0,
37 | committer_email=email,
38 | committer_name=name,
39 | message=b'',
40 | )
41 | parents = []
42 | for i in range(n):
43 | now = int(time.time())
44 | commit, _, _ = util.save_commit_object(
45 | tree,
46 | (base_commit,),
47 | author_date_s=i,
48 | author_email=email,
49 | author_name=name,
50 | committer_date_s=0,
51 | committer_email=email,
52 | committer_name=name,
53 | message=b'',
54 | )
55 | parents.append(commit)
56 | if i % 100000 == 0:
57 | print(i)
58 | print(datetime.datetime.now())
59 | subprocess.check_output(['git', 'repack'])
60 | subprocess.check_output(['git', 'prune-packed'])
61 | subprocess.check_output(['git', 'tag', str(i), commit])
62 | final_commit, _, _ = util.save_commit_object(
63 | tree,
64 | parents,
65 | author_date_s=0,
66 | author_email=email,
67 | author_name=name,
68 | committer_date_s=0,
69 | committer_email=email,
70 | committer_name=name,
71 | message=b'',
72 | )
73 | util.create_master(final_commit)
74 |
--------------------------------------------------------------------------------
/other-test-repos/many-commits.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | """
4 | many-commits-fast-import.py, is a simpler and better alternative to this, just use that!!!
5 |
6 | Packing is important, or else deleting and pushing the generated repository could take a **huge** ammount of time.
7 |
8 | This method gets slower as it goes. 1M are fast to generate, but 10M require running for 24h nonstop.
9 |
10 | For extra safety, use a tmpfs or ramfs:
11 |
12 | ```
13 | ulimit -Sv 500000
14 | mkdir -p tmp
15 | sudo umount tmp
16 | sudo mount -t tmpfs -o size=3g tmpfs tmp
17 | sudo chown $USER:$USER tmp
18 | cd tmp
19 | ../many-commits.py
20 | ```
21 |
22 | The tags can be used to push by parts to GitHub, which does not accept 1M at once:
23 |
24 | ```
25 | remote='git@github.com:cirosantilli/test-many-commits-1m.git'
26 | for i in `seq 10 10 100`; do
27 | git --git-dir=tmp/repo.tmp/.git push -f "$remote" "$i:master"
28 | done
29 | # TODO for some reason I needed this afterwards.
30 | git --git-dir=tmp/repo.tmp/.git push "$remote" 'master'
31 | ```
32 | """
33 |
34 | import datetime
35 | import subprocess
36 | import time
37 | import sys
38 |
39 | import util
40 |
41 | email = b''
42 | name = b''
43 |
44 | util.init()
45 |
46 | # https://stackoverflow.com/questions/9905257/git-push-fatal-unable-to-create-thread-resource-temporarily-unavailable
47 | subprocess.run(['git', 'config', '--local', 'pack.windowMemory', '50m'])
48 | subprocess.run(['git', 'config', '--local', 'pack.packSizeLimit', '50m'])
49 | subprocess.run(['git', 'config', '--local', 'pack.threads', '1'])
50 |
51 | tree = util.create_tree_with_one_file()
52 | commit = None
53 | if len(sys.argv) > 1:
54 | n = int(sys.argv[1])
55 | else:
56 | n = 1000
57 | for i in range(n):
58 | now = int(time.time())
59 | commit, _, _ = util.save_commit_object(
60 | tree,
61 | (commit,),
62 | author_date_s=0,
63 | author_email=email,
64 | author_name=name,
65 | committer_date_s=0,
66 | committer_email=email,
67 | committer_name=name,
68 | message=b'',
69 | )
70 | if i % 100000 == 0:
71 | print(i)
72 | print(datetime.datetime.now())
73 | # Lose objects are too large and blow up the tmpfs.
74 | # Does clean packets, but the calculation takes more and more memory,
75 | # and slows down and blows up at the end. TODO which subcommand blows up exactly?.
76 | #subprocess.check_output(['git', 'gc'])
77 | subprocess.check_output(['git', 'repack'])
78 | subprocess.check_output(['git', 'prune-packed'])
79 | subprocess.check_output(['git', 'tag', str(i), commit])
80 | util.create_master(commit)
81 |
--------------------------------------------------------------------------------
/other-test-repos/partial-clone.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | set -eu
3 |
4 | # https://stackoverflow.com/questions/600079/how-do-i-clone-a-subdirectory-only-of-a-git-repository/52269934#52269934
5 | rm -rf partial-clone.tmp
6 | mkdir -p partial-clone.tmp
7 | cd partial-clone.tmp
8 |
9 | list-objects() (
10 | git rev-list --all --objects
11 | echo "master commit SHA: $(git log -1 --format="%H")"
12 | echo "mybranch commit SHA: $(git log -1 --format="%H")"
13 | git ls-tree master
14 | git ls-tree mybranch | grep mybranch
15 | git ls-tree master~ | grep root
16 | )
17 |
18 | # Reproducibility.
19 | export GIT_COMMITTER_NAME='a'
20 | export GIT_COMMITTER_EMAIL='a'
21 | export GIT_AUTHOR_NAME='a'
22 | export GIT_AUTHOR_EMAIL='a'
23 | export GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000'
24 | export GIT_AUTHOR_DATE='2000-01-01T00:00:00+0000'
25 |
26 | rm -rf server_repo local_repo
27 | mkdir server_repo
28 | cd server_repo
29 |
30 | # Create repo.
31 | git init --quiet
32 | git config --local uploadpack.allowfilter 1
33 | git config --local uploadpack.allowanysha1inwant 1
34 |
35 | # First commit.
36 | # Directories present in all branches.
37 | mkdir asdf d2
38 | printf 'asdf/a' > ./asdf/a
39 | printf 'asdf/b' > ./asdf/b
40 | printf 'd2/a' > ./d2/a
41 | printf 'd2/b' > ./d2/b
42 | # Present only in root.
43 | mkdir 'root'
44 | printf 'root' > ./root/root
45 | git add .
46 | git commit -m 'root' --quiet
47 |
48 | # Second commit only on master.
49 | git rm --quiet -r ./root
50 | mkdir 'master'
51 | printf 'master' > ./master/master
52 | git add .
53 | git commit -m 'master commit' --quiet
54 |
55 | # Second commit only on mybranch.
56 | git checkout -b mybranch --quiet master~
57 | git rm --quiet -r ./root
58 | mkdir 'mybranch'
59 | printf 'mybranch' > ./mybranch/mybranch
60 | git add .
61 | git commit -m 'mybranch commit' --quiet
62 |
63 | echo "# List and identify all objects"
64 | list-objects
65 | echo
66 |
67 | # Restore master.
68 | git checkout --quiet master
69 | cd ..
70 |
71 | # Clone. Don't checkout for now, only .git/ dir.
72 | # file:// shenanigans:
73 | # https://stackoverflow.com/questions/47307578/how-to-shallow-clone-a-local-git-repository-with-a-relative-path
74 | git clone --depth 1 --quiet --no-checkout --filter=blob:none "file://$(pwd)/server_repo" local_repo
75 | cd local_repo
76 |
77 | # List missing objects from master.
78 | echo "# Missing objects after --no-checkout"
79 | git rev-list --all --quiet --objects --missing=print
80 | echo
81 |
82 | echo "# Git checkout fails without internet"
83 | mv ../server_repo ../server_repo.off
84 | ! git checkout master
85 | echo
86 |
87 | echo "# Git checkout fetches the missing directory from internet"
88 | mv ../server_repo.off ../server_repo
89 | git checkout master -- asdf/
90 | echo
91 |
92 | echo "# Missing objects after checking out asdf"
93 | git rev-list --all --quiet --objects --missing=print
94 |
--------------------------------------------------------------------------------
/other-test-repos/streak.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | import datetime
4 | import os
5 | import shutil
6 | import subprocess
7 |
8 | import util
9 |
10 | util.init()
11 |
12 | name = 'a'
13 | email = 'a@a.com'
14 | os.environ['GIT_AUTHOR_EMAIL'] = email
15 | os.environ['GIT_AUTHOR_NAME'] = name
16 | os.environ['GIT_COMMITTER_EMAIL'] = email
17 | os.environ['GIT_COMMITTER_NAME'] = name
18 |
19 | date0 = datetime.date(2000, 1, 1)
20 | datef = datetime.date(2100, 1, 1)
21 | date = date0
22 | while date < datef:
23 | s = date.strftime('%Y-%m-%dT01:00:00')
24 | print(s)
25 | os.environ['GIT_AUTHOR_DATE'] = s
26 | os.environ['GIT_COMMITTER_DATE'] = s
27 | cmd = ['git', 'commit', '-q', '--allow-empty', '--allow-empty-message', '-m', '']
28 | subprocess.check_output(cmd)
29 | date += datetime.timedelta(days=1)
30 |
--------------------------------------------------------------------------------
/other-test-repos/tag-test.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | """
4 | https://stackoverflow.com/questions/10986615/what-is-the-format-of-a-git-tag-object-and-how-to-calculate-its-sha/52193441#52193441
5 | """
6 |
7 | import datetime
8 | import subprocess
9 | import time
10 | import sys
11 |
12 | import util
13 |
14 | email = b'a@a.com'
15 | name = b''
16 |
17 | util.init()
18 | tree = util.create_tree_with_one_file()
19 | commit, _, _ = util.save_commit_object(
20 | tree,
21 | (None,),
22 | author_date_s=0,
23 | author_email=email,
24 | author_name=name,
25 | committer_date_s=0,
26 | committer_email=email,
27 | committer_name=name,
28 | message=b'',
29 | )
30 | tag_sha, _, _ = util.save_tag_object(
31 | commit,
32 | b'mytag',
33 | object_type=b'commit',
34 | user_name=name,
35 | user_email=email,
36 | date_s=0,
37 | message=b'abc'
38 | )
39 | util.create_master(commit)
40 |
--------------------------------------------------------------------------------
/other-test-repos/util.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | """
4 | TODO packfile operations instead of just object. Could be more efficient.
5 | But also harder to implement that format.
6 | """
7 |
8 | import hashlib
9 | import os
10 | import shutil
11 | import subprocess
12 | import zlib
13 |
14 | repo_dir = 'repo.tmp'
15 | git_dir = b'.git'
16 | objects_dir = os.path.join(git_dir, b'objects')
17 | refs_dir = os.path.join(git_dir, b'refs')
18 | tags_dir = os.path.join(refs_dir, b'tags')
19 |
20 | # Tree parameters.
21 | default_blob_basename = b'a'
22 | default_blob_content = b'a'
23 | default_blob_mode = b'100644'
24 |
25 | # Commit parameters.
26 | default_name = b'a'
27 | default_email = b'a@a.com'
28 | # 2000-01-01T00:00:00+0000
29 | default_date_s = 946684800
30 | default_tz = b'+0000'
31 | default_author_date_s = default_date_s
32 | default_author_date_tz = default_tz
33 | default_author_email = default_email
34 | default_author_name = default_name
35 | default_committer_date_s = default_date_s
36 | default_committer_date_tz = default_tz
37 | default_committer_email = default_email
38 | default_committer_name = default_name
39 | default_message = b'a'
40 | # ASCII hex of parents.
41 | default_parents = ()
42 |
43 | def init():
44 | for d in (repo_dir, 'clone.tmp'):
45 | shutil.rmtree(d, ignore_errors=True)
46 | os.mkdir(repo_dir)
47 | os.chdir(repo_dir)
48 | subprocess.check_output(['git', 'init', '-q'])
49 |
50 | def get_object_and_sha(obj_type, content):
51 | obj = b'%s %s\0%s' % (obj_type, str(len(content)).encode('ascii'), content)
52 | hash = hashlib.sha1(obj)
53 | return (obj, hash.hexdigest().encode('ascii'), hash.digest())
54 |
55 | def save_object(obj_type, content):
56 | obj, sha_ascii, sha = get_object_and_sha(obj_type, content)
57 | obj_dir = os.path.join(objects_dir, sha_ascii[:2])
58 | obj_path = os.path.join(obj_dir, sha_ascii[2:])
59 | os.makedirs(obj_dir, exist_ok=True)
60 | with open(obj_path, 'wb') as f:
61 | f.write(zlib.compress(obj))
62 | return sha_ascii, sha
63 |
64 | # TODO multiple children object.
65 | def save_tree_object(mode, basename, sha):
66 | tree_content = b'%s %s\0%s' % (mode, basename, sha)
67 | return save_object(b'tree', tree_content) + (tree_content,)
68 |
69 | def save_commit_object(
70 | tree_sha_ascii,
71 | parents=default_parents,
72 | author_name=default_author_name,
73 | author_email=default_author_email,
74 | author_date_s=default_author_date_s,
75 | author_date_tz=default_author_date_tz,
76 | committer_name=default_committer_name,
77 | committer_email=default_committer_email,
78 | committer_date_s=default_committer_date_s,
79 | committer_date_tz=default_committer_date_tz,
80 | message=default_message):
81 | if parents and parents[0]:
82 | parents_bytes = b''
83 | sep = b'\nparent '
84 | parents_bytes = sep + sep.join(parents) + b'\n'
85 | else:
86 | parents_bytes = b'\n'
87 | commit_content = b'tree %s%sauthor %s <%s> %s %s\ncommitter %s <%s> %s %s\n\n%s\n' % (
88 | tree_sha_ascii, parents_bytes,
89 | author_name, author_email, str(author_date_s).encode('ascii'), author_date_tz,
90 | committer_name, committer_email, str(committer_date_s).encode('ascii'), committer_date_tz,
91 | message)
92 | return save_object(b'commit', commit_content) + (commit_content,)
93 |
94 | def save_tag_object(
95 | object_sha_ascii,
96 | tag_name,
97 | object_type='commit',
98 | user_name=default_author_name,
99 | user_email=default_author_email,
100 | date_s=default_author_date_s,
101 | date_tz=default_author_date_tz,
102 | message=default_message):
103 | content = b'object %s\ntype %s\ntag %s\ntagger %s <%s> %s %s\n\n%s' % \
104 | (object_sha_ascii, object_type, tag_name, user_name, user_email, str(date_s).encode('ascii'), date_tz, message)
105 | tag_sha_ascii, tag_sha = save_object(b'tag', content)
106 | os.makedirs(tags_dir, exist_ok=True)
107 | with open(os.path.join(tags_dir, tag_name), 'w') as tag_file:
108 | tag_file.write(tag_sha_ascii.decode('ascii') + '\n')
109 | return tag_sha_ascii, tag_sha, content
110 |
111 | def get_git_hash_object(obj_type, input):
112 | cmd = [b'git', b'hash-object', b'--stdin', b'-t', obj_type]
113 | return subprocess.check_output(cmd, input=input).rstrip()
114 |
115 | def create_master(commit_sha_ascii):
116 | subprocess.check_output(['git', 'branch', 'master', commit_sha_ascii])
117 |
118 | def clone():
119 | subprocess.check_output(['git', 'clone', '-q', '.', '../clone.tmp'])
120 |
121 | def create_tree_with_one_file(
122 | blob_mode=default_blob_mode,
123 | blob_basename=default_blob_basename,
124 | blob_content=default_blob_content,
125 | ):
126 | blob_sha_ascii, blob_sha = save_object(b'blob', blob_content)
127 | tree_sha_ascii, tree_sha, tree_content = save_tree_object(blob_mode, blob_basename, blob_sha)
128 | return tree_sha_ascii
129 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "bin": {
3 | "china-dictatorship": "china-dictatorship"
4 | },
5 | "dependencies": {},
6 | "description": "2018新疆改造中心,1989六四事件,1999法轮功 ,2019 996.ICU, 2018包子露宪,2015 710律师劫,2015巴拿马文件 邓家贵,2017低端人口,2008西藏骚乱",
7 | "devDependencies": {
8 | "@actions/core": "^1.2.7",
9 | "@actions/github": "^4.0.0"
10 | },
11 | "files": [
12 | "index.js",
13 | "china-dictatorship",
14 | "README.md",
15 | "README.adoc",
16 | "README.html"
17 | ],
18 | "keywords": [
19 | "china",
20 | "dictatorship"
21 | ],
22 | "license": "CC-BY-SA-4.0",
23 | "name": "china-dictatorship",
24 | "repository": "cirosantilli/china-dictatorship",
25 | "scripts": {
26 | "prepublishOnly": "cp README.adoc README.md;make"
27 | },
28 | "version": "0.0.74"
29 | }
30 |
--------------------------------------------------------------------------------
/patch.patch:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cirosantilli/test-git-web-interface/088ce51c95f2184e27fef839e1e78ab62124e294/patch.patch
--------------------------------------------------------------------------------
/pdf.pdf:
--------------------------------------------------------------------------------
1 | %PDF-1.7
2 |
3 | 1 0 obj % entry point
4 | <<
5 | /Type /Catalog
6 | /Pages 2 0 R
7 | >>
8 | endobj
9 |
10 | 2 0 obj
11 | <<
12 | /Type /Pages
13 | /MediaBox [ 0 0 200 200 ]
14 | /Count 1
15 | /Kids [ 3 0 R ]
16 | >>
17 | endobj
18 |
19 | 3 0 obj
20 | <<
21 | /Type /Page
22 | /Parent 2 0 R
23 | /Resources <<
24 | /Font <<
25 | /F1 4 0 R
26 | >>
27 | >>
28 | /Contents 5 0 R
29 | >>
30 | endobj
31 |
32 | 4 0 obj
33 | <<
34 | /Type /Font
35 | /Subtype /Type1
36 | /BaseFont /Times-Roman
37 | >>
38 | endobj
39 |
40 | 5 0 obj % page content
41 | <<
42 | /Length 44
43 | >>
44 | stream
45 | BT
46 | 70 50 TD
47 | /F1 12 Tf
48 | (Hello, world!) Tj
49 | ET
50 | endstream
51 | endobj
52 |
53 | xref
54 | 0 6
55 | 0000000000 65535 f
56 | 0000000010 00000 n
57 | 0000000079 00000 n
58 | 0000000173 00000 n
59 | 0000000301 00000 n
60 | 0000000380 00000 n
61 | trailer
62 | <<
63 | /Size 6
64 | /Root 1 0 R
65 | >>
66 | startxref
67 | 492
68 | %%EOF
--------------------------------------------------------------------------------
/png-noext:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cirosantilli/test-git-web-interface/088ce51c95f2184e27fef839e1e78ab62124e294/png-noext
--------------------------------------------------------------------------------
/png.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cirosantilli/test-git-web-interface/088ce51c95f2184e27fef839e1e78ab62124e294/png.png
--------------------------------------------------------------------------------
/rb.rb:
--------------------------------------------------------------------------------
1 | def f(x)
2 | x + 1
3 | end
4 |
5 | def g(x)
6 | x + 1
7 | end
8 |
9 | def h(x)
10 | x + 1
11 | end
12 |
13 | def a
14 | 1
15 | end
16 |
17 | def b
18 | 1
19 | end
20 |
21 | def c
22 | 1
23 | end
24 |
25 | Chaining style:
26 |
27 | a.
28 | b.
29 | c
30 |
31 | a.b.
32 | c
33 |
--------------------------------------------------------------------------------
/rdoc.rdoc:
--------------------------------------------------------------------------------
1 | = h1
2 |
3 | == h2
4 |
--------------------------------------------------------------------------------
/refs.md:
--------------------------------------------------------------------------------
1 | # Refs
2 |
3 | Interesting branches and tags:
4 |
5 | - [`hasslash/a`](../hasslash/a): branch inside sub-directory
6 |
7 | - [`-r`](../-r): branch with forbidden name, and in particular one that may be used for shell injection.
8 |
9 | Create manually with `cp master -- -r` and push with `git push --all`.
10 |
11 | - `` and `a`: XSS attempts
12 |
13 | - `tag-empty-blob`: a tag that points to a blob
14 |
15 | - [`a;{echo,INJECTION};{echo,RULZ};`](a;{echo,INJECTION};{echo,RULZ};): GitHub proposes a shell injection to users on a pull request under "You can also merge branches on the command line".
16 |
17 | - [1970](1970): earliest possible commit with `git commit --date '@0 +0000'`
18 |
19 | - [future](future): commit in the far far future, on some date that does not show as 1970 on `git log`? See also:
20 |
21 | - [future-max](future-max): commit at the latest possible pushable date of `2^63 - 1`. Larger dates up to `2^64 - 2` can be committed, but not pushed.
22 |
23 | As of 2015-04-02, that commits will show as the fist one on the UI commit list no matter its order on the commit tree, making it a good way to drive other people mad and then later make them scold you when they understand.
24 |
25 | - emoji: e.g. [🚿](🚿).
26 |
--------------------------------------------------------------------------------
/refs/heads/master:
--------------------------------------------------------------------------------
1 | 173a852893f2dac5b79dd5862e5a032777477567
2 |
--------------------------------------------------------------------------------
/remotes.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | if [ $# -gt 0 ]; then
4 | REPO="$1"
5 | shift
6 | else
7 | REPO=test
8 | fi
9 |
10 | git remote add at git@atlas-tmp:tmp/${REPO}.git
11 | git remote add as git@git.assembla.com:cirosantilli-${REPO}.git
12 | git remote add bb git@bitbucket.org:cirosantilli/${REPO}.git
13 | git remote add bs https://cirosantilli.git.beanstalkapp.com/test.git
14 | git remote add cp git@codeplane.com:cirosantilli/${REPO}.git
15 | git remote add cx https://git01.codeplex.com/cirosantillitest
16 | git remote add gc https://code.google.com/p/cirosantilli-${REPO}
17 | git remote add go git@gitorious.org:cirosantilli-${REPO}/cirosantilli-${REPO}.git
18 | #git remote add gr ssh://repo.or.cz/cirosantilli-${REPO}.git
19 | git remote add gh git@github.com:cirosantilli/${REPO}.git
20 | git remote add gl git@gitlab.com:cirosantilli/${REPO}.git
21 | # GitLab Local
22 | git remote add gll http://root:5iveL!fe@localhost:3000/gitlab-org/gitlab-${REPO}.git
23 | git remote add ja https://hub.jazz.net/git/cirosantilli/test
24 | git remote add ki ssh://cirosantilli@cirosantilli.kilnhg.com/Repositories/Group/test
25 | git remote add lp git+ssh://git.launchpad.net/cirosantilli-test-git
26 | git remote add nb https://notabug.org/cirosantilli/test-git-web-interface.git
27 | git remote add origin git@github.com:cirosantilli/${REPO}.git
28 | git remote add pf git@www.penflip.com:cirosantilli/${REPO}.git
29 | git remote add sf ssh://cirosantilli@git.code.sf.net/p/cirosantilli-${REPO}/code
30 | # username: email
31 | git remote add vs https://cirosantilli.visualstudio.com/DefaultCollection/_git/test
32 |
--------------------------------------------------------------------------------
/rst.rst:
--------------------------------------------------------------------------------
1 | reStructuredText
2 | ================
3 |
4 | .. contents::
5 |
6 | Headers
7 | -------
8 |
9 | Header 3 1
10 | ----------
11 |
12 | asdf
13 |
14 | Header 3 2
15 | ----------
16 |
17 | qwer
18 |
19 | .. _custom-id:
20 |
21 | Header Custon Id
22 | ----------------
23 |
24 | qwer
25 |
26 | Hyperlink
27 | .........
28 |
29 | `example link `_
30 |
31 | Hyperlink_
32 |
33 | `Header 3 1`_
34 |
35 | `custom-id`_
36 |
37 | `Custom id <#custom-id>`_
38 |
39 | Bibliography
40 | ------------
41 |
42 | - http://docutils.sourceforge.net/docs/user/rst/quickref.html
43 |
--------------------------------------------------------------------------------
/shallow-submodule.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # New better tests:
4 | # https://github.com/cirosantilli/test-shallow-submodule-mod
5 | # https://github.com/cirosantilli/test-shallow-submodule-top-branch-shallow
6 | # https://github.com/cirosantilli/test-shallow-submodule-top-sha
7 |
8 | # Older tests:
9 | # https://github.com/cirosantilli/test-submodule-mod
10 | # https://github.com/cirosantilli/test-submodule-top
11 | # https://github.com/cirosantilli/test-submodule-top-shallow
12 | # https://github.com/cirosantilli/test-submodule-mod-branch
13 | # https://github.com/cirosantilli/test-submodule-top-branch
14 |
15 | set -ex
16 |
17 | rm -rf tmp
18 | mkdir tmp
19 | cd tmp
20 | rm -rf *
21 |
22 | export GIT_AUTHOR_NAME="Ciro Santilli"
23 | export GIT_AUTHOR_EMAIL="ciro.santilli@gmail.com"
24 | export GIT_AUTHOR_DATE='2000-01-01T00:00:00+0000'
25 | export GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"
26 | export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"
27 | export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
28 |
29 | mkdir mod
30 | cd mod
31 | git init
32 | touch base
33 | git add base
34 | git commit -m base
35 | touch master-1
36 | git add master-1
37 | git commit -m master-1
38 | touch master-2
39 | git add master-2
40 | git commit -m master-2
41 | git tag tag-master
42 | touch master-3
43 | git add master-3
44 | git commit -m master-3
45 | git checkout -b mybranch HEAD~3
46 | touch mybranch-1
47 | git add mybranch-1
48 | git commit -m mybranch-1
49 | touch mybranch-2
50 | git add mybranch-2
51 | git commit -m mybranch-2
52 | git tag tag-mybranch
53 | touch mybranch-3
54 | git add mybranch-3
55 | git commit -m mybranch-3
56 | git checkout master
57 | cd ..
58 |
59 | mkdir top
60 | cd top
61 | git init
62 | touch a
63 | git add a
64 | git commit -m 1
65 | touch b
66 | git add b
67 | git commit -m 2
68 | git submodule add ../mod/ mod
69 | git add .gitmodules
70 | git commit -m '.gitmodules'
71 | cd ..
72 |
73 | cp -rv top top-shallow
74 | cd top-shallow
75 | printf '\tshallow = true\n' >> .gitmodules
76 | git add .gitmodules
77 | git commit -m 'shallow'
78 | cd ..
79 |
80 | mkdir top-branch
81 | cd top-branch
82 | git init
83 | touch a
84 | git add a
85 | git commit -m 1
86 | touch b
87 | git add b
88 | git commit -m 2
89 | git submodule add -b mybranch ../mod/ mod
90 | git add .gitmodules
91 | git commit -m '.gitmodules'
92 | cd ..
93 |
94 | cp -rv top-branch top-branch-shallow
95 | cd top-branch-shallow
96 | printf '\tshallow = true\n' >> .gitmodules
97 | git add .gitmodules
98 | git commit -m 'shallow'
99 | cd ..
100 |
101 | mkdir top-tag
102 | cd top-tag
103 | git init
104 | touch a
105 | git add a
106 | git commit -m 1
107 | touch b
108 | git add b
109 | git commit -m 2
110 | git submodule add ../mod/ mod
111 | cd mod
112 | git checkout tag-mybranch
113 | cd ..
114 | git add .
115 | git commit -m '.gitmodules'
116 | cd ..
117 |
118 | mkdir top-sha
119 | cd top-sha
120 | git init
121 | touch a
122 | git add a
123 | git commit -m 1
124 | touch b
125 | git add b
126 | git commit -m 2
127 | git submodule add ../mod/ mod
128 | cd mod
129 | git checkout tag-mybranch~
130 | cd ..
131 | git add .
132 | git commit -m '.gitmodules'
133 | cd ..
134 |
135 | rm -f results
136 |
137 | git clone --depth 1 "file://$(pwd)/mod" mod-clone
138 | git --git-dir mod-clone/.git log --oneline | wc -l >>results
139 | # 1
140 |
141 | git clone --depth 1 "file://$(pwd)/mod" mod-branch-clone
142 | git --git-dir mod-branch-clone/.git log --oneline | wc -l >>results
143 | # 1
144 |
145 | ## gitmodule
146 |
147 | echo 'gitmodule' >>results
148 |
149 | git clone --recurse-submodules "file://$(pwd)/top" top-clone
150 | git --git-dir top-clone/.git/modules/mod log --oneline | wc -l >>results
151 | # many
152 |
153 | git clone --recurse-submodules "file://$(pwd)/top-shallow" top-shallow-clone
154 | git --git-dir top-shallow-clone/.git/modules/mod log --oneline | wc -l >>results
155 | # 1
156 |
157 | git clone --recurse-submodules "file://$(pwd)/top-branch" top-branch-clone
158 | git --git-dir top-branch-clone/.git/modules/mod log --oneline | wc -l >>results
159 | # many
160 |
161 | git clone --recurse-submodules "file://$(pwd)/top-branch-shallow" top-branch-shallow-clone
162 | git --git-dir top-branch-shallow-clone/.git/modules/mod log --oneline | wc -l >>results
163 | # many
164 |
165 | git clone --recurse-submodules "file://$(pwd)/top-tag" top-tag-clone
166 | git --git-dir top-tag-clone/.git/modules/mod log --oneline | wc -l >>results
167 | # many
168 |
169 | git clone --recurse-submodules "file://$(pwd)/top-sha" top-sha-clone
170 | git --git-dir top-sha-clone/.git/modules/mod log --oneline | wc -l >>results
171 | # many
172 |
173 | ## SS
174 |
175 | echo 'ss' >>results
176 |
177 | git clone --recurse-submodules --shallow-submodules "file://$(pwd)/top" top-clone-ss
178 | git --git-dir top-clone-ss/.git/modules/mod log --oneline | wc -l >>results
179 | # 1
180 |
181 | git clone --recurse-submodules --shallow-submodules "file://$(pwd)/top-shallow" top-shallow-clone-ss
182 | git --git-dir top-shallow-clone-ss/.git/modules/mod log --oneline | wc -l >>results
183 | # 1
184 |
185 | git clone --recurse-submodules --shallow-submodules "file://$(pwd)/top-branch" top-branch-clone-ss
186 | git --git-dir top-branch-clone-ss/.git/modules/mod log --oneline | wc -l >>results
187 | # 1
188 |
189 | git clone --recurse-submodules --shallow-submodules "file://$(pwd)/top-branch-shallow" top-branch-shallow-clone-ss
190 | git --git-dir top-branch-shallow-clone-ss/.git/modules/mod log --oneline | wc -l >>results
191 | # 1
192 |
193 | git clone --recurse-submodules --shallow-submodules "file://$(pwd)/top-tag" top-tag-clone-ss
194 | git --git-dir top-tag-clone-ss/.git/modules/mod log --oneline | wc -l >>results
195 | # 1
196 |
197 | #git clone --recurse-submodules --shallow-submodules "file://$(pwd)/top-sha" top-sha-clone-ss
198 | # error: Server does not allow request for unadvertised object
199 | #git --git-dir top-sha-clone-ss/.git/modules/mod log --oneline | wc -l >>results
200 |
201 | cat results
202 |
--------------------------------------------------------------------------------
/svg-foreignObject.svg:
--------------------------------------------------------------------------------
1 |
92 |
--------------------------------------------------------------------------------
/svg.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/sym-abs-fstab:
--------------------------------------------------------------------------------
1 | /etc/fstab
--------------------------------------------------------------------------------
/sym-abs-fstab.md:
--------------------------------------------------------------------------------
1 | /etc/fstab
--------------------------------------------------------------------------------
/sym-dot:
--------------------------------------------------------------------------------
1 | .
--------------------------------------------------------------------------------
/sym-git-config:
--------------------------------------------------------------------------------
1 | .git/config
--------------------------------------------------------------------------------
/sym-readme:
--------------------------------------------------------------------------------
1 | README.md
--------------------------------------------------------------------------------
/sym-up:
--------------------------------------------------------------------------------
1 | ..
--------------------------------------------------------------------------------
/sym-xss:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/txt.txt:
--------------------------------------------------------------------------------
1 | mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
2 |
3 | http://example.com
4 |
5 | email@host.com
6 |
--------------------------------------------------------------------------------
/utf8-中文:
--------------------------------------------------------------------------------
1 | asdfsadf
2 |
--------------------------------------------------------------------------------
/xref-header-infinite-loop.adoc:
--------------------------------------------------------------------------------
1 | = asdf
2 |
3 | [[h2]]
4 | == h2 xref:h3[]
5 |
6 | [[h3]]
7 | === h3 xref:h2[]
8 |
--------------------------------------------------------------------------------
/ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็:
--------------------------------------------------------------------------------
1 | ็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็
--------------------------------------------------------------------------------
/﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽:
--------------------------------------------------------------------------------
1 | ﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽﷽
--------------------------------------------------------------------------------