Compare commits

..

17 Commits
devel ... main

Author SHA1 Message Date
stupidcomputer e26b3cdfbc add a vanity page of sorts 2024-10-09 10:46:22 -05:00
stupidcomputer 1dc13010e5 housekeeping things (license, readme) 2024-10-09 08:43:34 -05:00
stupidcomputer 5544c8c83d make the mirror message appear on github issue creation, too 2024-10-09 08:32:04 -05:00
stupidcomputer 879cf0a8d6 fix issue closing issues 2024-10-09 08:26:13 -05:00
stupidcomputer 5c56b2ca29 factor out the generation of footers into function 2024-10-09 07:36:53 -05:00
stupidcomputer 3e68945bfc some more minor little changes 2024-10-09 07:36:46 -05:00
stupidcomputer 14680c1746 make webhooks active 2024-10-09 07:02:11 -05:00
stupidcomputer 82ce1c7f6d enable deletion of repos as well 2024-10-09 07:02:11 -05:00
stupidcomputer 67314c71cf remove spurious uses of variables 2024-10-09 06:34:52 -05:00
stupidcomputer 13475a8531 fix small bugs in production 2024-10-09 06:28:56 -05:00
stupidcomputer c974e278c9 fix some tiny typos that caused errors in prod 2024-10-09 05:19:29 -05:00
stupidcomputer e9f1d2b00d handle the rest of the gitea issue webhook cases 2024-10-09 03:42:12 -05:00
stupidcomputer 4804488943 clean up the code a fair bit 2024-10-09 03:42:12 -05:00
stupidcomputer 6e8a193f8f when a gitea issue is created, create the cooresponding github one 2024-10-09 03:42:12 -05:00
stupidcomputer 486d0565d4 add all the other webhook data and testing materials 2024-10-09 03:42:12 -05:00
stupidcomputer 16cc41a5bc create a handler for when a repo is created 2024-10-09 03:42:12 -05:00
stupidcomputer 7bbc6ae562 just some boilerplate for the project 2024-10-09 03:42:06 -05:00
34 changed files with 2646 additions and 46 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
__pycache__/
testing_configuration.cfg

3
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"nixEnvSelector.nixFile": "${workspaceFolder}/shell.nix"
}

23
LICENSE
View File

@ -210,26 +210,3 @@ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY C
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
gitea-github-sync
Copyright (C) 2024 rndusr
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements.
You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see <http://www.gnu.org/licenses/>.

View File

@ -1,18 +1,11 @@
# gitea-github-sync
synchronize git repos, and associated issues, prs, and other repo metadata
Automatically mirror from a private code forge to Github, and bidirectionally synchronize issues between two repos
## things to do
- [ ] write a nix derivation for [giteapy](https://github.com/dblueai/giteapy)
- [ ] integrate it into the shell.nix
- [ ] define configuration
- [ ] do the main thing
- [ ] standardize the issue, pr, and other event objects
- [ ] write a 'diff' function to return the delta between two objects
- [ ] return a series of api calls to reconcile the problems
- [ ] handle race conditions?
- [ ] write documentation
## Implementation notes
## license
licensed agpl. see LICENSE for more details.
gitea-github-sync is copyright rndusr, randomuser, stupidcomputer, et. al. 2024
- The implementation matches up issue numbers, instead of coorelating them with a database or something. This is fine because we're only using this software on repos that have no issues (e.g. are brand new) and so therefore all the issue numbers will line up. For two mirrors with different issues, you'll have to pick one side to keep and another to purge.
## License
Licensed under the GNU Affero v3 license. (c) 2024 randomuser, stupidcomputer, etc.

332
bridge/__init__.py Normal file
View File

@ -0,0 +1,332 @@
from flask import Flask, request, redirect, abort, render_template
import requests
from .webgit import Gitea, Github
from .utils import issue_sentinel, generate_sentinel, create_signature
app = Flask(
__name__,
static_url_path="/bridge/static",
static_folder="./static"
)
app.config.from_envvar('GIT_BRIDGE_SETTINGS')
@app.route("/bridge")
def index():
gitea = Gitea(
api_token=app.config["GITEA_ACCESS_TOKEN"],
instance_name=app.config["GITEA_INSTANCE_DOMAIN"],
)
repos = gitea.get_user_repos().json()
output = []
for repo in repos:
if not repo["private"]:
output.append({
"name": repo["name"],
"desc": repo["description"],
"url": repo["html_url"],
})
return render_template("index.html", repos=output)
@app.route("/bridge/endpoints/gitea/repo", methods=["POST"])
def gitea_handle_repo_action():
"""
Our plan of action for handling these events:
- ignore deleting repositories -- this is a potentially destructive operation
that *only* *the* *user* *should* *do*
- create a cooresponding repo on github
- create a push mirror to github so pushes to gitea get to github
- create webhooks for issues (and in the future, pull requests) on both
Gitea and Github ends
"""
gitea = Gitea(
api_token=app.config["GITEA_ACCESS_TOKEN"],
instance_name=app.config["GITEA_INSTANCE_DOMAIN"]
)
github = Github(app.config["GITHUB_ACCESS_TOKEN"])
data = request.json
try:
repository = data["repository"]
repo_action = data["action"]
repo_id = repository["id"]
repo_owner = repository["owner"]["login"]
repo_name = repository["name"]
repo_description = repository["description"]
except KeyError:
abort(400) # the data isn't formatted correctly
if repo_action == "created":
new_repo = github.create_repo(
repo_name, repo_description
)
new_repo_url = new_repo.json()["html_url"]
gitea.add_push_target(
repo_owner, repo_name, new_repo_url, repo_owner,
app.config["GITHUB_ACCESS_TOKEN"]
)
gitea.force_push_target(
repo_owner,
repo_name
)
github.create_webhook(
repo_owner,
repo_name,
"https://{}/bridge/endpoints/github/issue".format(
app.config["GITEA_INSTANCE_DOMAIN"]
),
["issues", "issue_comment"]
)
gitea.create_webhook(
repo_owner,
repo_name,
"https://{}/bridge/endpoints/gitea/issue".format(
app.config["GITEA_INSTANCE_DOMAIN"]
),
["issues", "issue_comment"]
)
elif repo_action == "deleted":
github.delete_repo(repo_owner, repo_name)
return ''
@app.route("/bridge/endpoints/gitea/issue", methods=["POST"])
def gitea_handle_issue_action():
"""
firstly, check if the sentinal is in the issue body
- if it is, then stop processing the event
(we don't want infinite loops)
if we've opened an issue:
- create a new one on the Github side
- make it relate to the Gitea one
- make the Gitea one related to the Github one
if we've commented:
- add a comment to the cooresponding Github issue
if we've closed:
- add a cooresponding comment and close the Github issue
"""
gitea = Gitea(
api_token=app.config["GITEA_ACCESS_TOKEN"],
instance_name=app.config["GITEA_INSTANCE_DOMAIN"]
)
github = Github(app.config["GITHUB_ACCESS_TOKEN"])
data = request.json
try:
event_type = data["action"]
repo_owner = data["repository"]["owner"]["login"]
repo_name = data["repository"]["name"]
issue_user = data["issue"]["user"]["login"]
issue_user_url = "https://{}/{}".format(
app.config["GITEA_INSTANCE_DOMAIN"],
issue_user,
)
issue_number = data["issue"]["number"]
if event_type == "opened": # new issue created
event_title = data["issue"]["title"]
event_body = data["issue"]["body"]
elif event_type == "created": # new comment on that issue
event_title = None
event_body = data["comment"]["body"]
elif event_type == "closed": # issue closed
event_title = None
event_body = data["issue"]["body"]
event_url = data["issue"]["url"]
except KeyError as e:
print(e, type(e))
abort(400) # the data isn't formatted correctly
issue_sentinel_present = issue_sentinel in event_body
if event_type == "opened" and not issue_sentinel_present:
issue_footer = create_signature(
issue_user,
issue_user_url,
app.config["GITEA_INSTANCE_DOMAIN"],
event_url,
)
issue_body = "\n\n".join([
event_body,
issue_footer
])
new_issue = github.create_issue(
repo_owner,
repo_name,
event_title,
issue_body,
)
returned_data = new_issue.json()
issue_comment_body = create_signature(
"mirrored",
returned_data["html_url"],
app.config["GITEA_INSTANCE_DOMAIN"],
returned_data["url"],
)
gitea.leave_comment_on_issue_by_number(
repo_owner,
repo_name,
issue_number,
issue_comment_body,
)
elif event_type == "created" and not issue_sentinel_present:
comment_user = data["comment"]["user"]["login"]
comment_user_url = "https://{}/{}".format(
app.config["GITEA_INSTANCE_DOMAIN"],
comment_user,
)
comment_footer = create_signature(
comment_user,
comment_user_url,
app.config["GITEA_INSTANCE_DOMAIN"],
event_url,
)
comment_body = "\n\n".join([
event_body,
comment_footer,
])
github.leave_comment_on_issue_by_number(
repo_owner,
repo_name,
issue_number,
comment_body,
)
elif event_type == "closed":
github.close_issue_by_number(
repo_owner,
repo_name,
issue_number,
)
return ''
@app.route("/bridge/endpoints/github/issue", methods=["POST"])
def github_handle_issue_action():
gitea = Gitea(
api_token=app.config["GITEA_ACCESS_TOKEN"],
instance_name=app.config["GITEA_INSTANCE_DOMAIN"]
)
github = Github(app.config["GITHUB_ACCESS_TOKEN"])
data = request.json
try:
event_type = data["action"]
repo_owner = data["repository"]["owner"]["login"]
repo_name = data["repository"]["name"]
issue_user = data["issue"]["user"]["login"]
issue_user_url = "https://github.com/{}".format(
issue_user,
)
issue_number = data["issue"]["number"]
if event_type == "opened": # new issue created
event_title = data["issue"]["title"]
event_body = data["issue"]["body"]
elif event_type == "created": # new comment on that issue
event_title = None
event_body = data["comment"]["body"]
elif event_type == "closed": # issue closed
event_title = None
event_body = data["issue"]["body"]
if not event_body: event_body = ""
event_url = data["issue"]["url"]
except KeyError as e:
print(e, type(e))
abort(400) # the data isn't formatted correctly
issue_sentinel_present = issue_sentinel in event_body
if event_type == "opened" and not issue_sentinel_present:
issue_footer = create_signature(
issue_user,
issue_user_url,
app.config["GITEA_INSTANCE_DOMAIN"],
event_url,
)
issue_body = "\n\n".join([
event_body,
issue_footer
])
new_issue = gitea.create_issue(
repo_owner,
repo_name,
event_title,
issue_body
)
returned_data = new_issue.json()
issue_comment_body = create_signature(
"mirrored",
returned_data["html_url"],
app.config["GITEA_INSTANCE_DOMAIN"],
returned_data["url"],
)
github.leave_comment_on_issue_by_number(
repo_owner,
repo_name,
issue_number,
issue_comment_body,
)
elif event_type == "created" and not issue_sentinel_present:
comment_user = data["comment"]["user"]["login"]
comment_user_url = "https://github.com/{}".format(
comment_user,
)
comment_footer = create_signature(
comment_user,
comment_user_url,
app.config["GITEA_INSTANCE_DOMAIN"],
event_url,
)
comment_body = "\n\n".join([
event_body,
comment_footer,
])
gitea.leave_comment_on_issue_by_number(
repo_owner,
repo_name,
issue_number,
comment_body
)
elif event_type == "closed":
gitea.close_issue_by_number(
repo_owner,
repo_name,
issue_number,
)
return ''

151
bridge/static/logo.svg Normal file
View File

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="100mm"
height="100mm"
viewBox="0 0 100 100"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
sodipodi:docname="logo.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="0.92381453"
inkscape:cx="361.0032"
inkscape:cy="323.65804"
inkscape:window-width="1920"
inkscape:window-height="1080"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" /><defs
id="defs1"><pattern
inkscape:collect="always"
xlink:href="#pattern2853"
id="pattern2864"
patternTransform="translate(42.23939,37.38575)" /><pattern
inkscape:collect="always"
xlink:href="#pattern2838"
id="pattern2845"
patternTransform="translate(44.04167,18.04166)" /><linearGradient
id="linearGradient2826"><stop
style="stop-color:#dfb585;stop-opacity:1;"
offset="0"
id="stop2828" /><stop
style="stop-color:black;stop-opacity:1;"
offset="1"
id="stop2830" /></linearGradient><linearGradient
id="linearGradient2791"><stop
style="stop-color:#4d95ee;stop-opacity:1;"
offset="0"
id="stop2793" /><stop
style="stop-color:black;stop-opacity:1;"
offset="1"
id="stop2795" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2791"
id="linearGradient2797"
x1="213.11461"
y1="113.20445"
x2="213.11461"
y2="351.95709"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(0,6)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2826"
id="linearGradient2832"
x1="193.60881"
y1="116.54642"
x2="193.60881"
y2="345.21436"
gradientUnits="userSpaceOnUse" /><pattern
patternUnits="userSpaceOnUse"
width="31.916666"
height="9.916667"
patternTransform="translate(19.375,-47.29167)"
id="pattern2838"><rect
y="0.625"
x="0.625"
height="8.666667"
width="30.666666"
id="rect2836"
style="opacity:1;fill:#7b6c52;fill-opacity:1;fill-rule:nonzero;stroke:#2d271e;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /></pattern><pattern
patternUnits="userSpaceOnUse"
width="34.958335"
height="9.916667"
patternTransform="translate(44.04167,18.04167)"
id="pattern2853"><g
id="g2849"
transform="translate(-44.04167,-18.04167)"><rect
style="fill:url(#pattern2845);stroke:none"
width="31.916666"
height="9.916667"
x="44.041668"
y="18.041666"
id="rect2841" /><rect
style="opacity:0;fill:#00cd0f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect2847"
width="9.166667"
height="2.5833333"
x="69.833336"
y="21.916666" /></g></pattern></defs><g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"><g
id="g4"
transform="matrix(0.15875,0,0,0.15875,-3.8018304,-0.36145313)"> <path
id="teabag"
style="fill:#ffffff"
d="M 395.9,484.2 269,423.2 c -12.5,-6 -17.9,-21.2 -11.8,-33.8 l 61,-126.9 c 6,-12.5 21.2,-17.9 33.8,-11.8 17.2,8.3 27.1,13 27.1,13 l -0.1,-109.2 16.7,-0.1 0.1,117.1 c 0,0 57.4,24.2 83.1,40.1 3.7,2.3 10.2,6.8 12.9,14.4 2.1,6.1 2,13.1 -1,19.3 l -61,126.9 c -6.2,12.7 -21.4,18.1 -33.9,12 z" /> <g
id="g3"
transform="translate(-3.8,-19.6)"> <g
id="g2"> <path
style="fill:#609926"
d="m 622.7,149.8 c -4.1,-4.1 -9.6,-4 -9.6,-4 0,0 -117.2,6.6 -177.9,8 -13.3,0.3 -26.5,0.6 -39.6,0.7 0,39.1 0,78.2 0,117.2 -5.5,-2.6 -11.1,-5.3 -16.6,-7.9 0,-36.4 -0.1,-109.2 -0.1,-109.2 -29,0.4 -89.2,-2.2 -89.2,-2.2 0,0 -141.4,-7.1 -156.8,-8.5 -9.8,-0.6 -22.5,-2.1 -39,1.5 -8.7,1.8 -33.5,7.4 -53.8,26.9 -45,40.1 -33.5,103.9 -32.1,113.5 1.7,11.7 6.9,44.2 31.7,72.5 45.8,56.1 144.4,54.8 144.4,54.8 0,0 12.1,28.9 30.6,55.5 25,33.1 50.7,58.9 75.7,62 63,0 188.9,-0.1 188.9,-0.1 0,0 12,0.1 28.3,-10.3 14,-8.5 26.5,-23.4 26.5,-23.4 0,0 12.9,-13.8 30.9,-45.3 5.5,-9.7 10.1,-19.1 14.1,-28 0,0 55.2,-117.1 55.2,-231.1 -1.1,-34.5 -9.6,-40.6 -11.6,-42.6 z M 125.6,353.9 c -25.9,-8.5 -36.9,-18.7 -36.9,-18.7 0,0 -19.1,-13.4 -28.7,-39.8 -16.5,-44.2 -1.4,-71.2 -1.4,-71.2 0,0 8.4,-22.5 38.5,-30 13.8,-3.7 31,-3.1 31,-3.1 0,0 7.1,59.4 15.7,94.2 7.2,29.2 24.8,77.7 24.8,77.7 0,0 -26.1,-3.1 -43,-9.1 z m 300.3,107.6 c 0,0 -6.1,14.5 -19.6,15.4 -5.8,0.4 -10.3,-1.2 -10.3,-1.2 0,0 -0.3,-0.1 -5.3,-2.1 l -112.9,-55 c 0,0 -10.9,-5.7 -12.8,-15.6 -2.2,-8.1 2.7,-18.1 2.7,-18.1 L 322,273 c 0,0 4.8,-9.7 12.2,-13 0.6,-0.3 2.3,-1 4.5,-1.5 8.1,-2.1 18,2.8 18,2.8 L 467.4,315 c 0,0 12.6,5.7 15.3,16.2 1.9,7.4 -0.5,14 -1.8,17.2 -6.3,15.4 -55,113.1 -55,113.1 z"
id="path1" /> <path
style="fill:#609926"
d="m 326.8,380.1 c -8.2,0.1 -15.4,5.8 -17.3,13.8 -1.9,8 2,16.3 9.1,20 7.7,4 17.5,1.8 22.7,-5.4 5.1,-7.1 4.3,-16.9 -1.8,-23.1 l 24,-49.1 c 1.5,0.1 3.7,0.2 6.2,-0.5 4.1,-0.9 7.1,-3.6 7.1,-3.6 4.2,1.8 8.6,3.8 13.2,6.1 4.8,2.4 9.3,4.9 13.4,7.3 0.9,0.5 1.8,1.1 2.8,1.9 1.6,1.3 3.4,3.1 4.7,5.5 1.9,5.5 -1.9,14.9 -1.9,14.9 -2.3,7.6 -18.4,40.6 -18.4,40.6 -8.1,-0.2 -15.3,5 -17.7,12.5 -2.6,8.1 1.1,17.3 8.9,21.3 7.8,4 17.4,1.7 22.5,-5.3 5,-6.8 4.6,-16.3 -1.1,-22.6 1.9,-3.7 3.7,-7.4 5.6,-11.3 5,-10.4 13.5,-30.4 13.5,-30.4 0.9,-1.7 5.7,-10.3 2.7,-21.3 -2.5,-11.4 -12.6,-16.7 -12.6,-16.7 -12.2,-7.9 -29.2,-15.2 -29.2,-15.2 0,0 0,-4.1 -1.1,-7.1 -1.1,-3.1 -2.8,-5.1 -3.9,-6.3 4.7,-9.7 9.4,-19.3 14.1,-29 -4.1,-2 -8.1,-4 -12.2,-6.1 -4.8,9.8 -9.7,19.7 -14.5,29.5 -6.7,-0.1 -12.9,3.5 -16.1,9.4 -3.4,6.3 -2.7,14.1 1.9,19.8 -8.2,16.8 -16.4,33.6 -24.6,50.4 z"
id="path2" /> </g> </g> </g><g
id="g1"
transform="matrix(0.50182484,0,0,0.35249319,-51.630035,18.972095)"><path
id="path2799"
style="fill:#7b6c52;fill-opacity:1;fill-rule:nonzero;stroke:#2d271e;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
d="m 341.66665,225.23539 c 0,-12.89512 0,-90.69934 0,-105.23535 0,-29.072012 23.59467,-52.666688 52.66669,-52.666688 29.07201,0 52.66668,23.594676 52.66668,52.666688 L 418.05691,30.666667 H -18.056812 L -47.00002,120.00004 c 0,-29.072012 23.594674,-52.666688 52.666691,-52.666688 29.07201,0 52.66668,23.594676 52.66668,52.666688 0,14.53601 0,92.94011 0,105.23535 m 24.222179,0 c 0,-12.89512 0,-90.69934 0,-105.23535 0,-29.072012 23.59467,-52.666688 52.66669,-52.666688 29.07201,0 52.66668,23.594676 52.66668,52.666688 0,14.53601 0,92.94011 0,105.23535 m 24.22219,0 c 0,-12.89512 0,-90.69934 0,-105.23535 0,-29.072012 23.59467,-52.666688 52.66669,-52.666688 29.07201,0 52.66668,23.594676 52.66668,52.666688 0,14.53601 0,92.94011 0,105.23535"
sodipodi:nodetypes="cssccccssccsssccsssc" /><path
style="opacity:0.7;fill:url(#linearGradient2797);fill-opacity:1;fill-rule:evenodd;stroke:#447cc1;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -6.6627813,217.65413 c 0,-28.37004 -13.1115797,-86.58823 0.4458511,-86.32344 84.6560832,1.65344 142.3439102,8.5 158.4814802,9.29365 32.27513,1.5873 58.20106,-4.23281 97.8836,-6.34921 39.68254,-2.1164 74.60317,3.70371 107.93651,3.17461 33.33333,-0.52911 37.43386,-3.96826 49.73545,-2.64551 24.08055,2.58931 3.8201,42.09524 3.8201,86.01059"
id="path1884"
sodipodi:nodetypes="csssssc" /><path
style="fill:url(#linearGradient2832);fill-opacity:1;fill-rule:evenodd;stroke:#784e1f;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 421.31443,97.523845 c 0,45.301975 0.5609,104.044905 0.5609,134.045145 -16.37801,0 -353.393449,-0.38532 -443.099849,-0.38532 0,-56.46314 2.984043,-109.38808 2.984043,-131.793769 18.28607177,11.882619 77.988729,47.037439 100.205554,47.891979 20.738622,0.25077 67.905562,22.79584 87.636022,28.15857 27.56341,2.34862 53.84138,-12.31897 81.50416,-8.10339 24.90771,1.58959 53.62348,2.5399 72.71854,-17.45229 15.32619,-12.89213 35.5339,-14.37299 53.87064,-18.56564 13.90946,-6.12504 36.38842,-20.82213 43.61999,-33.795285 z"
id="path1875"
sodipodi:nodetypes="cccccccccc" /><rect
style="opacity:1;fill:url(#pattern2864);fill-opacity:1;fill-rule:nonzero;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect2834"
width="445.33334"
height="10"
x="-24.468958"
y="17.34409" /></g></g><metadata
id="metadata1"><rdf:RDF><cc:Work
rdf:about=""><cc:license
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" /></cc:Work><cc:License
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/"><cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /></cc:License></rdf:RDF></metadata></svg>

After

Width:  |  Height:  |  Size: 10 KiB

130
bridge/static/main.css Normal file
View File

@ -0,0 +1,130 @@
:root { /* stolen from gitea */
--bg-color: rgb(32, 36, 48);
--lighter-bg: rgb(48, 51, 64);
--top-bar: rgb(35, 40, 52);
--reg-text: rgb(203, 208, 218);
--links: rgb(135, 171, 99);
--border-color: rgb(82, 87, 103);
--fonts-regular: -apple-system, "Segoe UI", system-ui, Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", "Twemoji Mozilla"
}
div#navbar {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
background-color: var(--top-bar);
border-style: solid;
border-width: 0px 0px 0.9px 0px;
border-bottom-color: var(--border-color);
gap: 0.5em;
padding-left: 0.5em;
}
div#container {
display: flex;
flex-direction: column;
margin-left: 0.5em;
margin-right: 0.5em;
margin-bottom: 0.5em;
padding: 0.25em;
gap: 0.5em;
}
img {
height: 3em;
}
.navelem {
margin: 0.4em;
display: flex;
justify-content: center;
align-items: center;
}
body {
background-color: var(--bg-color);
color: var(--reg-text);
font-family: var(--fonts-regular);
margin: 0px;
display: flex;
flex-direction: column;
}
a {
color: var(--links);
text-decoration: none;
}
a:hover {
text-decoration: underline dotted;
}
.repodisplay {
display: flex;
flex-direction: row;
background-color: var(--lighter-bg);
padding: 0.5em;
border: 0.9px;
border-style: solid;
border-radius: 5px;
border-color: var(--border-color);
gap: 2px;
}
div.navelem {
padding-left: 0.5em;
padding-right: 0.5em;
border-radius: 5px;
}
div.navelem > a {
color: var(--reg-text);
}
div.navelem > a:hover {
text-decoration: none;
}
div.navelem:hover {
color: var(--reg-text);
background-color: rgba(255, 255, 255, 0.55);
}
#title {
font-size: 4em;
font-weight: 400;
text-align: center;
}
#small {
vertical-align: top;
}
#titlespan {
width: 100%;
padding-top: 0.5em;
}
.reponame {
font-size: 2em;
}
.mainrepoinfo {
display: flex;
flex-direction: column;
}
.repostatusarea {
margin-left: auto;
display: flex;
flex-direction: column;
}

View File

@ -0,0 +1,24 @@
<!DOCTYPE html>
<html>
<head>
<title>gitweb bridge</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta charset="UTF-8" />
<link rel="stylesheet" href="{{ url_for('static', filename='main.css') }}">
</head>
<body>
<div id="navbar">
<div class="navelem">
<a href="/bridge">
<img src="{{ url_for('static', filename='logo.svg') }}" />
</a>
</div>
<div class="navelem">
<a href="/">Back to Gitea</a>
</div>
</div>
<div id="container">
{% block content %}{% endblock %}
</div>
</body>
</html>

View File

@ -0,0 +1,26 @@
{% extends 'base.html' %}
{% block content %}
<div id="titlespan">
<span id="title">bridge</span> <span id="small"><a href="https://git.beepboop.systems/stupidcomputer/gitea-github-sync"><i>[what is this?]</i></a></span>
</div>
{% for repo in repos %}
<div class="repodisplay">
<div class="mainrepoinfo">
<a href="{{ repo.url }}"><span class="reponame">{{ repo.name }}</span></a>
<span class="repodescription"><i>{{ repo.desc }}</i></span>
</div>
<div class="repostatusarea">
<span class="repostatus">active</span>
<a href="/bridge/{{ repo.name }}">[status]</a>
</div>
</div>
{% endfor %}
{% endblock %}

40
bridge/utils.py Normal file
View File

@ -0,0 +1,40 @@
import base64
def to_base64(s: str) -> str:
return base64.b64encode(
s.encode("utf-8")
).decode("utf-8")
def from_base64(s: str) -> str:
return base64.b64decode(
s.encode("utf-8")
).decode("utf-8")
issue_sentinel = "GITEA_GITHUB_ISSUE_SYNC_SENTINEL"
def generate_sentinel(url: str) -> str:
return ' '.join([issue_sentinel, to_base64(url)])
def create_signature(
username: str,
username_url: str,
domain_base: str,
url_to_encode: str,
):
return """
---
[{}]({}) via [gitea-github-sync](https://{}/bridge/about)
<details>
<summary>Internal information</summary>
{}
</details>
""".format(
username,
username_url,
domain_base,
generate_sentinel(url_to_encode),
)

201
bridge/webgit.py Normal file
View File

@ -0,0 +1,201 @@
from typing import Any
from dataclasses import dataclass, field
import requests
from requests import Request, Session
from requests.exceptions import HTTPError
from flask import abort
@dataclass
class WebgitClient:
"""
A quite thin wrapper around various code forges' REST APIs.
Designed to be subclassed.
"""
api_token: str
headers: Any = field(init=False)
api_prefix: str = field(init=False)
def _post_request(self, request_obj):
try:
request_obj.raise_for_status()
except HTTPError as e:
print("An exception occured: {}({})".format(
type(e).__name__, e
))
abort(500)
def _request_wrapper(self, method, *args, **kwargs):
s = Session()
r = Request(method, *args, **kwargs, headers=self.headers)
prepped = s.prepare_request(r)
settings = s.merge_environment_settings(prepped.url, {}, None, None, None)
r = s.send(prepped, **settings)
self._post_request(r)
return r
def get(self, *args, **kwargs):
return self._request_wrapper("GET", *args, **kwargs)
def post(self, *args, **kwargs):
return self._request_wrapper("POST", *args, **kwargs)
def patch(self, *args, **kwargs):
return self._request_wrapper("PATCH", *args, **kwargs)
def delete(self, *args, **kwargs):
return self._request_wrapper("DELETE", *args, **kwargs)
def create_repo(self, name, description):
return self.post(
self.api_prefix + "/user/repos",
json={
"name": name,
"description": description,
},
)
def create_issue(self, owner, repo_name, title, body):
return self.post(
self.api_prefix + "/repos/{}/{}/issues".format(
owner,
repo_name,
),
json={
"title": title,
"body": body,
},
)
def leave_comment_on_issue_by_number(self, owner, repo_name, issue_number, body):
return self.post(
self.api_prefix + "/repos/{}/{}/issues/{}/comments".format(
owner,
repo_name,
issue_number,
),
json={
"body": body,
},
)
def leave_comment_on_issue_by_url(self, url, body):
return self.post(
url + "/comments",
json={
"body": body,
},
)
def close_issue_by_number(self, owner, repo_name, issue_number):
return self.patch(
self.api_prefix + "/repos/{}/{}/issues/{}".format(
owner,
repo_name,
issue_number,
),
json={
"state": "closed",
},
)
def close_issue_by_url(self, url):
return self.patch(
url,
json={
"state": "closed",
},
)
def delete_repo(self, owner, repo_name):
return self.delete(
self.api_prefix + "/repos/{}/{}".format(owner, repo_name)
)
@dataclass
class Github(WebgitClient):
"""
A quite thin wrapper around Github's REST API.
"""
def __post_init__(self):
self.headers = {
"Accept": "application/vnd.github+json",
"Authorization": "token " + self.api_token,
"X-GitHub-Api-Version": "2022-11-28",
}
self.api_prefix = "https://api.github.com"
def create_webhook(self, owner, repo_name, http_endpoint, events: list[str]):
return self.post(
self.api_prefix + "/repos/{}/{}/hooks".format(
owner,
repo_name,
),
json={
"name": "web",
"config": {
"url": http_endpoint,
"content_type": "json",
},
"events": events,
},
)
@dataclass
class Gitea(WebgitClient):
"""
A quite thin wrapper around Gitea's REST API.
"""
instance_name: str
def __post_init__(self):
self.headers = {
"Authorization": "token " + self.api_token,
}
self.api_prefix = "https://{}/api/v1".format(self.instance_name)
def add_push_target(self, owner, repo_name, address, username, password):
return self.post(
self.api_prefix + "/repos/{}/{}/push_mirrors".format(
owner, repo_name
),
json={
"interval": "8h0m0s",
"remote_address": address,
"remote_password": password,
"remote_username": username,
"sync_on_commit": True,
},
)
def force_push_target(self, owner, repo_name):
return self.post(
self.api_prefix + "/repos/{}/{}/push_mirrors-sync".format(
owner,
repo_name
),
)
def create_webhook(self, owner, repo_name, http_endpoint, events: list[str]):
return self.post(
self.api_prefix + "/repos/{}/{}/hooks".format(
owner,
repo_name,
),
json={
"active": True,
"config": {
"url": http_endpoint,
"content_type": "json",
},
"events": events,
"type": "gitea",
},
)
def get_user_repos(self):
return self.get(
self.api_prefix + "/user/repos"
)

4
contrib/sample.cfg Normal file
View File

@ -0,0 +1,4 @@
SECRET_KEY="replace_me"
GITHUB_ACCESS_TOKEN="replace_me"
GITEA_ACCESS_TOKEN="replace_me"
GITEA_INSTANCE_DOMAIN="git.beepboop.systems"

19
contrib/service.nix Normal file
View File

@ -0,0 +1,19 @@
{ lib, pkgs, config, ... }:
let
cfg = config.services.gitea-github-bridge;
appEnv = pkgs.python3.withPackages (p: with p; [ waitress (callPackage ./bridge/default.nix {}) ]);
in {
options.services.gitea-github-bridge = {
enable = lib.mkEnableOption "Enable the Gitea-Github bridge";
};
config = lib.mkIf cfg.enable {
systemd.services.gitea-github-bridge = {
wantedBy = [ "multi-user.target" ];
serviceConfig = {
ExecStart = "${appEnv}/bin/waitress-serve --port=8041 bridge:app";
StandardOutput = "journal";
};
};
};
}

20
default.nix Normal file
View File

@ -0,0 +1,20 @@
{ pkgs, pythonPackages ? (import <nixpkgs> {}).python3Packages }:
pythonPackages.buildPythonPackage {
name = "gitea-github-bridge";
src = ./bridge;
propagatedBuildInputs = [ pythonPackages.flask pythonPackages.requests ];
installPhase = ''
runHook preInstall
mkdir -p $out/${pythonPackages.python.sitePackages}
cp -r . $out/${pythonPackages.python.sitePackages}/bridge
runHook postInstall
'';
shellHook = "export FLASK_APP=bridge";
format = "other";
}

167
icon/Bridge_drawing.svg Normal file
View File

@ -0,0 +1,167 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2"
sodipodi:version="0.32"
inkscape:version="0.44"
width="400"
height="200"
version="1.0"
sodipodi:docbase="D:\wiki_svg"
sodipodi:docname="Bridgedrawing.png.svg">
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs5">
<pattern
inkscape:collect="always"
xlink:href="#pattern2853"
id="pattern2864"
patternTransform="translate(42.23939,37.38575)" />
<pattern
inkscape:collect="always"
xlink:href="#pattern2838"
id="pattern2845"
patternTransform="translate(44.04167,18.04166)" />
<linearGradient
id="linearGradient2826">
<stop
style="stop-color:#dfb585;stop-opacity:1;"
offset="0"
id="stop2828" />
<stop
style="stop-color:black;stop-opacity:1;"
offset="1"
id="stop2830" />
</linearGradient>
<linearGradient
id="linearGradient2791">
<stop
style="stop-color:#4d95ee;stop-opacity:1;"
offset="0"
id="stop2793" />
<stop
style="stop-color:black;stop-opacity:1;"
offset="1"
id="stop2795" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2791"
id="linearGradient2797"
x1="213.11461"
y1="113.20445"
x2="213.11461"
y2="351.95709"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(0,6)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2826"
id="linearGradient2832"
x1="193.60881"
y1="116.54642"
x2="193.60881"
y2="345.21436"
gradientUnits="userSpaceOnUse" />
<pattern
patternUnits="userSpaceOnUse"
width="31.916666"
height="9.916667"
patternTransform="translate(19.375,-47.29167)"
id="pattern2838">
<rect
y="0.625"
x="0.625"
height="8.666667"
width="30.666666"
id="rect2836"
style="opacity:1;fill:#7b6c52;fill-opacity:1;fill-rule:nonzero;stroke:#2d271e;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</pattern>
<pattern
patternUnits="userSpaceOnUse"
width="34.958335"
height="9.916667"
patternTransform="translate(44.04167,18.04167)"
id="pattern2853">
<g
id="g2849"
transform="translate(-44.04167,-18.04167)">
<rect
style="fill:url(#pattern2845);stroke:none"
width="31.916666"
height="9.916667"
x="44.041668"
y="18.041666"
id="rect2841" />
<rect
style="opacity:0;fill:#00cd0f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect2847"
width="9.166667"
height="2.5833333"
x="69.833336"
y="21.916666" />
</g>
</pattern>
</defs>
<sodipodi:namedview
inkscape:window-height="632"
inkscape:window-width="853"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
guidetolerance="10.0"
gridtolerance="10.0"
objecttolerance="10.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
showborder="true"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:zoom="0.1875"
inkscape:cx="173.32657"
inkscape:cy="364.01333"
inkscape:window-x="3"
inkscape:window-y="60"
inkscape:current-layer="svg2" />
<path
id="path2799"
style="fill:#7b6c52;fill-opacity:1;fill-rule:nonzero;stroke:#2d271e;stroke-width:1.2500006;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
d="M 341.66665,225.23539 C 341.66665,212.34027 341.66665,134.53605 341.66665,120.00004 C 341.66665,90.928028 365.26132,67.333352 394.33334,67.333352 C 423.40535,67.333352 447.00002,90.928028 447.00002,120.00004 L 418.05691,30.666667 L -18.056812,30.666667 L -47.00002,120.00004 C -47.00002,90.928028 -23.405346,67.333352 5.666671,67.333352 C 34.738681,67.333352 58.333351,90.928028 58.333351,120.00004 C 58.333351,134.53605 58.333351,212.94015 58.333351,225.23539 M 82.55553,225.23539 C 82.55553,212.34027 82.55553,134.53605 82.55553,120.00004 C 82.55553,90.928028 106.1502,67.333352 135.22222,67.333352 C 164.29423,67.333352 187.8889,90.928028 187.8889,120.00004 C 187.8889,134.53605 187.8889,212.94015 187.8889,225.23539 M 212.11109,225.23539 C 212.11109,212.34027 212.11109,134.53605 212.11109,120.00004 C 212.11109,90.928028 235.70576,67.333352 264.77778,67.333352 C 293.84979,67.333352 317.44446,90.928028 317.44446,120.00004 C 317.44446,134.53605 317.44446,212.94015 317.44446,225.23539"
sodipodi:nodetypes="cssccccssccsssccsssc" />
<path
style="opacity:0.7;fill:url(#linearGradient2797);fill-opacity:1;fill-rule:evenodd;stroke:#447cc1;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M -6.6627813,217.65413 C -6.6627813,189.28409 -19.774361,131.0659 -6.2169302,131.33069 C 78.439153,132.98413 136.12698,139.83069 152.26455,140.62434 C 184.53968,142.21164 210.46561,136.39153 250.14815,134.27513 C 289.83069,132.15873 324.75132,137.97884 358.08466,137.44974 C 391.41799,136.92063 395.51852,133.48148 407.82011,134.80423 C 431.90066,137.39354 411.64021,176.89947 411.64021,220.81482"
id="path1884"
sodipodi:nodetypes="csssssc" />
<path
style="fill:url(#linearGradient2832);fill-opacity:1.0;fill-rule:evenodd;stroke:#784e1f;stroke-width:1.00000012px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 421.31443,97.523845 C 421.31443,142.82582 421.87533,201.56875 421.87533,231.56899 C 405.49732,231.56899 68.481881,231.18367 -21.224519,231.18367 C -21.224519,174.72053 -18.240476,121.79559 -18.240476,99.389901 C 0.045595773,111.27252 59.748253,146.42734 81.965078,147.28188 C 102.7037,147.53265 149.87064,170.07772 169.6011,175.44045 C 197.16451,177.78907 223.44248,163.12148 251.10526,167.33706 C 276.01297,168.92665 304.72874,169.87696 323.8238,149.88477 C 339.14999,136.99264 359.3577,135.51178 377.69444,131.31913 C 391.6039,125.19409 414.08286,110.497 421.31443,97.523845 z "
id="path1875"
sodipodi:nodetypes="cccccccccc" />
<rect
style="opacity:1;fill:url(#pattern2864);fill-opacity:1;fill-rule:nonzero;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect2834"
width="445.33334"
height="10"
x="-24.468958"
y="17.34409" />
</svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

1
icon/Gitea_Logo.svg Normal file
View File

@ -0,0 +1 @@
<svg version="1.1" id="main_outline" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" style="enable-background:new 0 0 640 640;" xml:space="preserve" viewBox="5.67 143.05 628.65 387.55"> <g> <path id="teabag" style="fill:#FFFFFF" d="M395.9,484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5,21.2-17.9,33.8-11.8 c17.2,8.3,27.1,13,27.1,13l-0.1-109.2l16.7-0.1l0.1,117.1c0,0,57.4,24.2,83.1,40.1c3.7,2.3,10.2,6.8,12.9,14.4 c2.1,6.1,2,13.1-1,19.3l-61,126.9C423.6,484.9,408.4,490.3,395.9,484.2z"></path> <g> <g> <path style="fill:#609926" d="M622.7,149.8c-4.1-4.1-9.6-4-9.6-4s-117.2,6.6-177.9,8c-13.3,0.3-26.5,0.6-39.6,0.7c0,39.1,0,78.2,0,117.2 c-5.5-2.6-11.1-5.3-16.6-7.9c0-36.4-0.1-109.2-0.1-109.2c-29,0.4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5 c-9.8-0.6-22.5-2.1-39,1.5c-8.7,1.8-33.5,7.4-53.8,26.9C-4.9,212.4,6.6,276.2,8,285.8c1.7,11.7,6.9,44.2,31.7,72.5 c45.8,56.1,144.4,54.8,144.4,54.8s12.1,28.9,30.6,55.5c25,33.1,50.7,58.9,75.7,62c63,0,188.9-0.1,188.9-0.1s12,0.1,28.3-10.3 c14-8.5,26.5-23.4,26.5-23.4s12.9-13.8,30.9-45.3c5.5-9.7,10.1-19.1,14.1-28c0,0,55.2-117.1,55.2-231.1 C633.2,157.9,624.7,151.8,622.7,149.8z M125.6,353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6,321.8,60,295.4 c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5,38.5-30c13.8-3.7,31-3.1,31-3.1s7.1,59.4,15.7,94.2c7.2,29.2,24.8,77.7,24.8,77.7 S142.5,359.9,125.6,353.9z M425.9,461.5c0,0-6.1,14.5-19.6,15.4c-5.8,0.4-10.3-1.2-10.3-1.2s-0.3-0.1-5.3-2.1l-112.9-55 c0,0-10.9-5.7-12.8-15.6c-2.2-8.1,2.7-18.1,2.7-18.1L322,273c0,0,4.8-9.7,12.2-13c0.6-0.3,2.3-1,4.5-1.5c8.1-2.1,18,2.8,18,2.8 l110.7,53.7c0,0,12.6,5.7,15.3,16.2c1.9,7.4-0.5,14-1.8,17.2C474.6,363.8,425.9,461.5,425.9,461.5z"></path> <path style="fill:#609926" d="M326.8,380.1c-8.2,0.1-15.4,5.8-17.3,13.8c-1.9,8,2,16.3,9.1,20c7.7,4,17.5,1.8,22.7-5.4 c5.1-7.1,4.3-16.9-1.8-23.1l24-49.1c1.5,0.1,3.7,0.2,6.2-0.5c4.1-0.9,7.1-3.6,7.1-3.6c4.2,1.8,8.6,3.8,13.2,6.1 c4.8,2.4,9.3,4.9,13.4,7.3c0.9,0.5,1.8,1.1,2.8,1.9c1.6,1.3,3.4,3.1,4.7,5.5c1.9,5.5-1.9,14.9-1.9,14.9 c-2.3,7.6-18.4,40.6-18.4,40.6c-8.1-0.2-15.3,5-17.7,12.5c-2.6,8.1,1.1,17.3,8.9,21.3c7.8,4,17.4,1.7,22.5-5.3 c5-6.8,4.6-16.3-1.1-22.6c1.9-3.7,3.7-7.4,5.6-11.3c5-10.4,13.5-30.4,13.5-30.4c0.9-1.7,5.7-10.3,2.7-21.3 c-2.5-11.4-12.6-16.7-12.6-16.7c-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3c4.7-9.7,9.4-19.3,14.1-29 c-4.1-2-8.1-4-12.2-6.1c-4.8,9.8-9.7,19.7-14.5,29.5c-6.7-0.1-12.9,3.5-16.1,9.4c-3.4,6.3-2.7,14.1,1.9,19.8 C343.2,346.5,335,363.3,326.8,380.1z"></path> </g> </g> </g> </svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,8 @@
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" width="560" height="162" fill="none" stroke="#000">
<clipPath id="c"><path d="m20,110q76,0 128-90 130,154 260,0 52,92 128,90"/></clipPath>
<path stroke-width="100" stroke-dasharray="1,9" clip-path="url(#c)"
d="m23,70h120m10,0h250m10,0h120"/>
<path stroke-width="10" d="m148,18v124m260,0V18"/>
<path stroke-width="2" d="m20,110q76,0 128-90 130,154 260,0 52,92 128,90H20m0,2h516"/>
</svg>

After

Width:  |  Height:  |  Size: 448 B

151
icon/logo.svg Normal file
View File

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="100mm"
height="100mm"
viewBox="0 0 100 100"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
sodipodi:docname="logo.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="0.92381453"
inkscape:cx="361.0032"
inkscape:cy="323.65804"
inkscape:window-width="1920"
inkscape:window-height="1080"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" /><defs
id="defs1"><pattern
inkscape:collect="always"
xlink:href="#pattern2853"
id="pattern2864"
patternTransform="translate(42.23939,37.38575)" /><pattern
inkscape:collect="always"
xlink:href="#pattern2838"
id="pattern2845"
patternTransform="translate(44.04167,18.04166)" /><linearGradient
id="linearGradient2826"><stop
style="stop-color:#dfb585;stop-opacity:1;"
offset="0"
id="stop2828" /><stop
style="stop-color:black;stop-opacity:1;"
offset="1"
id="stop2830" /></linearGradient><linearGradient
id="linearGradient2791"><stop
style="stop-color:#4d95ee;stop-opacity:1;"
offset="0"
id="stop2793" /><stop
style="stop-color:black;stop-opacity:1;"
offset="1"
id="stop2795" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2791"
id="linearGradient2797"
x1="213.11461"
y1="113.20445"
x2="213.11461"
y2="351.95709"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(0,6)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2826"
id="linearGradient2832"
x1="193.60881"
y1="116.54642"
x2="193.60881"
y2="345.21436"
gradientUnits="userSpaceOnUse" /><pattern
patternUnits="userSpaceOnUse"
width="31.916666"
height="9.916667"
patternTransform="translate(19.375,-47.29167)"
id="pattern2838"><rect
y="0.625"
x="0.625"
height="8.666667"
width="30.666666"
id="rect2836"
style="opacity:1;fill:#7b6c52;fill-opacity:1;fill-rule:nonzero;stroke:#2d271e;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /></pattern><pattern
patternUnits="userSpaceOnUse"
width="34.958335"
height="9.916667"
patternTransform="translate(44.04167,18.04167)"
id="pattern2853"><g
id="g2849"
transform="translate(-44.04167,-18.04167)"><rect
style="fill:url(#pattern2845);stroke:none"
width="31.916666"
height="9.916667"
x="44.041668"
y="18.041666"
id="rect2841" /><rect
style="opacity:0;fill:#00cd0f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect2847"
width="9.166667"
height="2.5833333"
x="69.833336"
y="21.916666" /></g></pattern></defs><g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"><g
id="g4"
transform="matrix(0.15875,0,0,0.15875,-3.8018304,-0.36145313)"> <path
id="teabag"
style="fill:#ffffff"
d="M 395.9,484.2 269,423.2 c -12.5,-6 -17.9,-21.2 -11.8,-33.8 l 61,-126.9 c 6,-12.5 21.2,-17.9 33.8,-11.8 17.2,8.3 27.1,13 27.1,13 l -0.1,-109.2 16.7,-0.1 0.1,117.1 c 0,0 57.4,24.2 83.1,40.1 3.7,2.3 10.2,6.8 12.9,14.4 2.1,6.1 2,13.1 -1,19.3 l -61,126.9 c -6.2,12.7 -21.4,18.1 -33.9,12 z" /> <g
id="g3"
transform="translate(-3.8,-19.6)"> <g
id="g2"> <path
style="fill:#609926"
d="m 622.7,149.8 c -4.1,-4.1 -9.6,-4 -9.6,-4 0,0 -117.2,6.6 -177.9,8 -13.3,0.3 -26.5,0.6 -39.6,0.7 0,39.1 0,78.2 0,117.2 -5.5,-2.6 -11.1,-5.3 -16.6,-7.9 0,-36.4 -0.1,-109.2 -0.1,-109.2 -29,0.4 -89.2,-2.2 -89.2,-2.2 0,0 -141.4,-7.1 -156.8,-8.5 -9.8,-0.6 -22.5,-2.1 -39,1.5 -8.7,1.8 -33.5,7.4 -53.8,26.9 -45,40.1 -33.5,103.9 -32.1,113.5 1.7,11.7 6.9,44.2 31.7,72.5 45.8,56.1 144.4,54.8 144.4,54.8 0,0 12.1,28.9 30.6,55.5 25,33.1 50.7,58.9 75.7,62 63,0 188.9,-0.1 188.9,-0.1 0,0 12,0.1 28.3,-10.3 14,-8.5 26.5,-23.4 26.5,-23.4 0,0 12.9,-13.8 30.9,-45.3 5.5,-9.7 10.1,-19.1 14.1,-28 0,0 55.2,-117.1 55.2,-231.1 -1.1,-34.5 -9.6,-40.6 -11.6,-42.6 z M 125.6,353.9 c -25.9,-8.5 -36.9,-18.7 -36.9,-18.7 0,0 -19.1,-13.4 -28.7,-39.8 -16.5,-44.2 -1.4,-71.2 -1.4,-71.2 0,0 8.4,-22.5 38.5,-30 13.8,-3.7 31,-3.1 31,-3.1 0,0 7.1,59.4 15.7,94.2 7.2,29.2 24.8,77.7 24.8,77.7 0,0 -26.1,-3.1 -43,-9.1 z m 300.3,107.6 c 0,0 -6.1,14.5 -19.6,15.4 -5.8,0.4 -10.3,-1.2 -10.3,-1.2 0,0 -0.3,-0.1 -5.3,-2.1 l -112.9,-55 c 0,0 -10.9,-5.7 -12.8,-15.6 -2.2,-8.1 2.7,-18.1 2.7,-18.1 L 322,273 c 0,0 4.8,-9.7 12.2,-13 0.6,-0.3 2.3,-1 4.5,-1.5 8.1,-2.1 18,2.8 18,2.8 L 467.4,315 c 0,0 12.6,5.7 15.3,16.2 1.9,7.4 -0.5,14 -1.8,17.2 -6.3,15.4 -55,113.1 -55,113.1 z"
id="path1" /> <path
style="fill:#609926"
d="m 326.8,380.1 c -8.2,0.1 -15.4,5.8 -17.3,13.8 -1.9,8 2,16.3 9.1,20 7.7,4 17.5,1.8 22.7,-5.4 5.1,-7.1 4.3,-16.9 -1.8,-23.1 l 24,-49.1 c 1.5,0.1 3.7,0.2 6.2,-0.5 4.1,-0.9 7.1,-3.6 7.1,-3.6 4.2,1.8 8.6,3.8 13.2,6.1 4.8,2.4 9.3,4.9 13.4,7.3 0.9,0.5 1.8,1.1 2.8,1.9 1.6,1.3 3.4,3.1 4.7,5.5 1.9,5.5 -1.9,14.9 -1.9,14.9 -2.3,7.6 -18.4,40.6 -18.4,40.6 -8.1,-0.2 -15.3,5 -17.7,12.5 -2.6,8.1 1.1,17.3 8.9,21.3 7.8,4 17.4,1.7 22.5,-5.3 5,-6.8 4.6,-16.3 -1.1,-22.6 1.9,-3.7 3.7,-7.4 5.6,-11.3 5,-10.4 13.5,-30.4 13.5,-30.4 0.9,-1.7 5.7,-10.3 2.7,-21.3 -2.5,-11.4 -12.6,-16.7 -12.6,-16.7 -12.2,-7.9 -29.2,-15.2 -29.2,-15.2 0,0 0,-4.1 -1.1,-7.1 -1.1,-3.1 -2.8,-5.1 -3.9,-6.3 4.7,-9.7 9.4,-19.3 14.1,-29 -4.1,-2 -8.1,-4 -12.2,-6.1 -4.8,9.8 -9.7,19.7 -14.5,29.5 -6.7,-0.1 -12.9,3.5 -16.1,9.4 -3.4,6.3 -2.7,14.1 1.9,19.8 -8.2,16.8 -16.4,33.6 -24.6,50.4 z"
id="path2" /> </g> </g> </g><g
id="g1"
transform="matrix(0.50182484,0,0,0.35249319,-51.630035,18.972095)"><path
id="path2799"
style="fill:#7b6c52;fill-opacity:1;fill-rule:nonzero;stroke:#2d271e;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
d="m 341.66665,225.23539 c 0,-12.89512 0,-90.69934 0,-105.23535 0,-29.072012 23.59467,-52.666688 52.66669,-52.666688 29.07201,0 52.66668,23.594676 52.66668,52.666688 L 418.05691,30.666667 H -18.056812 L -47.00002,120.00004 c 0,-29.072012 23.594674,-52.666688 52.666691,-52.666688 29.07201,0 52.66668,23.594676 52.66668,52.666688 0,14.53601 0,92.94011 0,105.23535 m 24.222179,0 c 0,-12.89512 0,-90.69934 0,-105.23535 0,-29.072012 23.59467,-52.666688 52.66669,-52.666688 29.07201,0 52.66668,23.594676 52.66668,52.666688 0,14.53601 0,92.94011 0,105.23535 m 24.22219,0 c 0,-12.89512 0,-90.69934 0,-105.23535 0,-29.072012 23.59467,-52.666688 52.66669,-52.666688 29.07201,0 52.66668,23.594676 52.66668,52.666688 0,14.53601 0,92.94011 0,105.23535"
sodipodi:nodetypes="cssccccssccsssccsssc" /><path
style="opacity:0.7;fill:url(#linearGradient2797);fill-opacity:1;fill-rule:evenodd;stroke:#447cc1;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -6.6627813,217.65413 c 0,-28.37004 -13.1115797,-86.58823 0.4458511,-86.32344 84.6560832,1.65344 142.3439102,8.5 158.4814802,9.29365 32.27513,1.5873 58.20106,-4.23281 97.8836,-6.34921 39.68254,-2.1164 74.60317,3.70371 107.93651,3.17461 33.33333,-0.52911 37.43386,-3.96826 49.73545,-2.64551 24.08055,2.58931 3.8201,42.09524 3.8201,86.01059"
id="path1884"
sodipodi:nodetypes="csssssc" /><path
style="fill:url(#linearGradient2832);fill-opacity:1;fill-rule:evenodd;stroke:#784e1f;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 421.31443,97.523845 c 0,45.301975 0.5609,104.044905 0.5609,134.045145 -16.37801,0 -353.393449,-0.38532 -443.099849,-0.38532 0,-56.46314 2.984043,-109.38808 2.984043,-131.793769 18.28607177,11.882619 77.988729,47.037439 100.205554,47.891979 20.738622,0.25077 67.905562,22.79584 87.636022,28.15857 27.56341,2.34862 53.84138,-12.31897 81.50416,-8.10339 24.90771,1.58959 53.62348,2.5399 72.71854,-17.45229 15.32619,-12.89213 35.5339,-14.37299 53.87064,-18.56564 13.90946,-6.12504 36.38842,-20.82213 43.61999,-33.795285 z"
id="path1875"
sodipodi:nodetypes="cccccccccc" /><rect
style="opacity:1;fill:url(#pattern2864);fill-opacity:1;fill-rule:nonzero;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect2834"
width="445.33334"
height="10"
x="-24.468958"
y="17.34409" /></g></g><metadata
id="metadata1"><rdf:RDF><cc:Work
rdf:about=""><cc:license
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" /></cc:Work><cc:License
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/"><cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /></cc:License></rdf:RDF></metadata></svg>

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -1,9 +1,13 @@
{ pkgs ? import <nixpkgs> {} }:
let
my-python-packages = ps: with ps; [
requests
gitpython
github3_py
{ pkgs ? import (fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-24.05") {} }:
pkgs.mkShell {
packages = [
(pkgs.python3.withPackages (ps: [
ps.flask
ps.requests
]))
pkgs.curl
pkgs.jq
];
my-python = pkgs.python3.withPackages my-python-packages;
in my-python.env
}

3
tests/README.md Normal file
View File

@ -0,0 +1,3 @@
# a ""test"" ""suite"", if it could be called that
This directory contains a bunch of programs for auditing the behavior of the Flask app under different requests from different services. It contains some captured verbatim websockets callbacks so I can develop on them.

View File

@ -0,0 +1,169 @@
{
"action": "closed",
"number": 1,
"issue": {
"id": 42,
"url": "https://git.beepboop.systems/api/v1/repos/stupidcomputer/sadkfjasdf/issues/1",
"html_url": "https://git.beepboop.systems/stupidcomputer/sadkfjasdf/issues/1",
"number": 1,
"user": {
"id": 1,
"login": "stupidcomputer",
"login_name": "",
"full_name": "stupidcomputer",
"email": "stupidcomputer@noreply.git.beepboop.systems",
"avatar_url": "https://secure.gravatar.com/avatar/b642b4217b34b1e8d3bd915fc65c4452?d=identicon",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2023-06-23T22:23:01-05:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "https://beepboop.systems",
"description": "High schooler interested in computers, security, and reproducible systems.\r\n",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "stupidcomputer"
},
"original_author": "",
"original_author_id": 0,
"title": "another testing issue",
"body": "",
"ref": "",
"assets": [],
"labels": [],
"milestone": null,
"assignee": null,
"assignees": null,
"state": "closed",
"is_locked": false,
"comments": 1,
"created_at": "2024-10-09T01:07:19-05:00",
"updated_at": "2024-10-09T01:27:16-05:00",
"closed_at": "2024-10-09T01:27:16-05:00",
"due_date": null,
"pull_request": null,
"repository": {
"id": 73,
"name": "sadkfjasdf",
"owner": "stupidcomputer",
"full_name": "stupidcomputer/sadkfjasdf"
},
"pin_order": 0
},
"repository": {
"id": 73,
"owner": {
"id": 1,
"login": "stupidcomputer",
"login_name": "",
"full_name": "stupidcomputer",
"email": "stupidcomputer@noreply.git.beepboop.systems",
"avatar_url": "https://secure.gravatar.com/avatar/b642b4217b34b1e8d3bd915fc65c4452?d=identicon",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2023-06-23T22:23:01-05:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "https://beepboop.systems",
"description": "High schooler interested in computers, security, and reproducible systems.\r\n",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "stupidcomputer"
},
"name": "sadkfjasdf",
"full_name": "stupidcomputer/sadkfjasdf",
"description": "",
"empty": true,
"private": false,
"fork": false,
"template": false,
"parent": null,
"mirror": false,
"size": 28,
"language": "",
"languages_url": "https://git.beepboop.systems/api/v1/repos/stupidcomputer/sadkfjasdf/languages",
"html_url": "https://git.beepboop.systems/stupidcomputer/sadkfjasdf",
"url": "https://git.beepboop.systems/api/v1/repos/stupidcomputer/sadkfjasdf",
"link": "",
"ssh_url": "gitea@git.beepboop.systems:stupidcomputer/sadkfjasdf.git",
"clone_url": "https://git.beepboop.systems/stupidcomputer/sadkfjasdf.git",
"original_url": "",
"website": "https://github.com/stupidcomputer/sadkfjasdf",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 1,
"open_pr_counter": 0,
"release_counter": 0,
"default_branch": "main",
"archived": false,
"created_at": "2024-10-08T22:47:49-05:00",
"updated_at": "2024-10-09T01:05:10-05:00",
"archived_at": "1969-12-31T18:00:00-06:00",
"permissions": {
"admin": true,
"push": true,
"pull": true
},
"has_issues": true,
"internal_tracker": {
"enable_time_tracker": true,
"allow_only_contributors_to_track_time": true,
"enable_issue_dependencies": true
},
"has_wiki": true,
"has_pull_requests": true,
"has_projects": true,
"has_releases": true,
"has_packages": true,
"has_actions": false,
"ignore_whitespace_conflicts": false,
"allow_merge_commits": true,
"allow_rebase": true,
"allow_rebase_explicit": true,
"allow_squash_merge": true,
"allow_rebase_update": true,
"default_delete_branch_after_merge": false,
"default_merge_style": "merge",
"default_allow_maintainer_edit": false,
"avatar_url": "",
"internal": false,
"mirror_interval": "",
"mirror_updated": "0001-01-01T00:00:00Z",
"repo_transfer": null
},
"sender": {
"id": 1,
"login": "stupidcomputer",
"login_name": "",
"full_name": "stupidcomputer",
"email": "stupidcomputer@noreply.git.beepboop.systems",
"avatar_url": "https://secure.gravatar.com/avatar/b642b4217b34b1e8d3bd915fc65c4452?d=identicon",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2023-06-23T22:23:01-05:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "https://beepboop.systems",
"description": "High schooler interested in computers, security, and reproducible systems.\r\n",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "stupidcomputer"
},
"commit_id": ""
}

View File

@ -0,0 +1,203 @@
{
"action": "created",
"issue": {
"id": 42,
"url": "https://git.beepboop.systems/api/v1/repos/stupidcomputer/sadkfjasdf/issues/1",
"html_url": "https://git.beepboop.systems/stupidcomputer/sadkfjasdf/issues/1",
"number": 1,
"user": {
"id": 1,
"login": "stupidcomputer",
"login_name": "",
"full_name": "stupidcomputer",
"email": "stupidcomputer@noreply.git.beepboop.systems",
"avatar_url": "https://secure.gravatar.com/avatar/b642b4217b34b1e8d3bd915fc65c4452?d=identicon",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2023-06-23T22:23:01-05:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "https://beepboop.systems",
"description": "High schooler interested in computers, security, and reproducible systems.\r\n",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "stupidcomputer"
},
"original_author": "",
"original_author_id": 0,
"title": "another testing issue",
"body": "",
"ref": "",
"assets": [],
"labels": [],
"milestone": null,
"assignee": null,
"assignees": null,
"state": "open",
"is_locked": false,
"comments": 0,
"created_at": "2024-10-09T01:07:19-05:00",
"updated_at": "2024-10-09T01:13:12-05:00",
"closed_at": null,
"due_date": null,
"pull_request": null,
"repository": {
"id": 73,
"name": "sadkfjasdf",
"owner": "stupidcomputer",
"full_name": "stupidcomputer/sadkfjasdf"
},
"pin_order": 0
},
"comment": {
"id": 155,
"html_url": "https://git.beepboop.systems/stupidcomputer/sadkfjasdf/issues/1#issuecomment-155",
"pull_request_url": "",
"issue_url": "https://git.beepboop.systems/stupidcomputer/sadkfjasdf/issues/1",
"user": {
"id": 1,
"login": "stupidcomputer",
"login_name": "",
"full_name": "stupidcomputer",
"email": "stupidcomputer@noreply.git.beepboop.systems",
"avatar_url": "https://secure.gravatar.com/avatar/b642b4217b34b1e8d3bd915fc65c4452?d=identicon",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2023-06-23T22:23:01-05:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "https://beepboop.systems",
"description": "High schooler interested in computers, security, and reproducible systems.\r\n",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "stupidcomputer"
},
"original_author": "",
"original_author_id": 0,
"body": "Here's another additional, helpful comment.",
"assets": [],
"created_at": "2024-10-09T01:13:12-05:00",
"updated_at": "2024-10-09T01:13:12-05:00"
},
"repository": {
"id": 73,
"owner": {
"id": 1,
"login": "stupidcomputer",
"login_name": "",
"full_name": "stupidcomputer",
"email": "stupidcomputer@noreply.git.beepboop.systems",
"avatar_url": "https://secure.gravatar.com/avatar/b642b4217b34b1e8d3bd915fc65c4452?d=identicon",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2023-06-23T22:23:01-05:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "https://beepboop.systems",
"description": "High schooler interested in computers, security, and reproducible systems.\r\n",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "stupidcomputer"
},
"name": "sadkfjasdf",
"full_name": "stupidcomputer/sadkfjasdf",
"description": "",
"empty": true,
"private": false,
"fork": false,
"template": false,
"parent": null,
"mirror": false,
"size": 28,
"language": "",
"languages_url": "https://git.beepboop.systems/api/v1/repos/stupidcomputer/sadkfjasdf/languages",
"html_url": "https://git.beepboop.systems/stupidcomputer/sadkfjasdf",
"url": "https://git.beepboop.systems/api/v1/repos/stupidcomputer/sadkfjasdf",
"link": "",
"ssh_url": "gitea@git.beepboop.systems:stupidcomputer/sadkfjasdf.git",
"clone_url": "https://git.beepboop.systems/stupidcomputer/sadkfjasdf.git",
"original_url": "",
"website": "https://github.com/stupidcomputer/sadkfjasdf",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 1,
"open_pr_counter": 0,
"release_counter": 0,
"default_branch": "main",
"archived": false,
"created_at": "2024-10-08T22:47:49-05:00",
"updated_at": "2024-10-09T01:05:10-05:00",
"archived_at": "1969-12-31T18:00:00-06:00",
"permissions": {
"admin": true,
"push": true,
"pull": true
},
"has_issues": true,
"internal_tracker": {
"enable_time_tracker": true,
"allow_only_contributors_to_track_time": true,
"enable_issue_dependencies": true
},
"has_wiki": true,
"has_pull_requests": true,
"has_projects": true,
"has_releases": true,
"has_packages": true,
"has_actions": false,
"ignore_whitespace_conflicts": false,
"allow_merge_commits": true,
"allow_rebase": true,
"allow_rebase_explicit": true,
"allow_squash_merge": true,
"allow_rebase_update": true,
"default_delete_branch_after_merge": false,
"default_merge_style": "merge",
"default_allow_maintainer_edit": false,
"avatar_url": "",
"internal": false,
"mirror_interval": "",
"mirror_updated": "0001-01-01T00:00:00Z",
"repo_transfer": null
},
"sender": {
"id": 1,
"login": "stupidcomputer",
"login_name": "",
"full_name": "stupidcomputer",
"email": "stupidcomputer@noreply.git.beepboop.systems",
"avatar_url": "https://secure.gravatar.com/avatar/b642b4217b34b1e8d3bd915fc65c4452?d=identicon",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2023-06-23T22:23:01-05:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "https://beepboop.systems",
"description": "High schooler interested in computers, security, and reproducible systems.\r\n",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "stupidcomputer"
},
"is_pull": false
}

View File

@ -0,0 +1,169 @@
{
"action": "opened",
"number": 1,
"issue": {
"id": 42,
"url": "https://git.beepboop.systems/api/v1/repos/stupidcomputer/sadkfjasdf/issues/1",
"html_url": "https://git.beepboop.systems/stupidcomputer/sadkfjasdf/issues/1",
"number": 1,
"user": {
"id": 1,
"login": "stupidcomputer",
"login_name": "",
"full_name": "stupidcomputer",
"email": "stupidcomputer@noreply.git.beepboop.systems",
"avatar_url": "https://secure.gravatar.com/avatar/b642b4217b34b1e8d3bd915fc65c4452?d=identicon",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2023-06-23T22:23:01-05:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "https://beepboop.systems",
"description": "High schooler interested in computers, security, and reproducible systems.\r\n",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "stupidcomputer"
},
"original_author": "",
"original_author_id": 0,
"title": "another testing issue",
"body": "",
"ref": "",
"assets": [],
"labels": [],
"milestone": null,
"assignee": null,
"assignees": null,
"state": "open",
"is_locked": false,
"comments": 0,
"created_at": "2024-10-09T01:07:19-05:00",
"updated_at": "2024-10-09T01:07:19-05:00",
"closed_at": null,
"due_date": null,
"pull_request": null,
"repository": {
"id": 73,
"name": "sadkfjasdf",
"owner": "stupidcomputer",
"full_name": "stupidcomputer/sadkfjasdf"
},
"pin_order": 0
},
"repository": {
"id": 73,
"owner": {
"id": 1,
"login": "stupidcomputer",
"login_name": "",
"full_name": "stupidcomputer",
"email": "stupidcomputer@noreply.git.beepboop.systems",
"avatar_url": "https://secure.gravatar.com/avatar/b642b4217b34b1e8d3bd915fc65c4452?d=identicon",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2023-06-23T22:23:01-05:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "https://beepboop.systems",
"description": "High schooler interested in computers, security, and reproducible systems.\r\n",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "stupidcomputer"
},
"name": "sadkfjasdf",
"full_name": "stupidcomputer/sadkfjasdf",
"description": "",
"empty": true,
"private": false,
"fork": false,
"template": false,
"parent": null,
"mirror": false,
"size": 28,
"language": "",
"languages_url": "https://git.beepboop.systems/api/v1/repos/stupidcomputer/sadkfjasdf/languages",
"html_url": "https://git.beepboop.systems/stupidcomputer/sadkfjasdf",
"url": "https://git.beepboop.systems/api/v1/repos/stupidcomputer/sadkfjasdf",
"link": "",
"ssh_url": "gitea@git.beepboop.systems:stupidcomputer/sadkfjasdf.git",
"clone_url": "https://git.beepboop.systems/stupidcomputer/sadkfjasdf.git",
"original_url": "",
"website": "https://github.com/stupidcomputer/sadkfjasdf",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"open_pr_counter": 0,
"release_counter": 0,
"default_branch": "main",
"archived": false,
"created_at": "2024-10-08T22:47:49-05:00",
"updated_at": "2024-10-09T01:05:10-05:00",
"archived_at": "1969-12-31T18:00:00-06:00",
"permissions": {
"admin": true,
"push": true,
"pull": true
},
"has_issues": true,
"internal_tracker": {
"enable_time_tracker": true,
"allow_only_contributors_to_track_time": true,
"enable_issue_dependencies": true
},
"has_wiki": true,
"has_pull_requests": true,
"has_projects": true,
"has_releases": true,
"has_packages": true,
"has_actions": false,
"ignore_whitespace_conflicts": false,
"allow_merge_commits": true,
"allow_rebase": true,
"allow_rebase_explicit": true,
"allow_squash_merge": true,
"allow_rebase_update": true,
"default_delete_branch_after_merge": false,
"default_merge_style": "merge",
"default_allow_maintainer_edit": false,
"avatar_url": "",
"internal": false,
"mirror_interval": "",
"mirror_updated": "0001-01-01T00:00:00Z",
"repo_transfer": null
},
"sender": {
"id": 1,
"login": "stupidcomputer",
"login_name": "",
"full_name": "stupidcomputer",
"email": "stupidcomputer@noreply.git.beepboop.systems",
"avatar_url": "https://secure.gravatar.com/avatar/b642b4217b34b1e8d3bd915fc65c4452?d=identicon",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2023-06-23T22:23:01-05:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "https://beepboop.systems",
"description": "High schooler interested in computers, security, and reproducible systems.\r\n",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "stupidcomputer"
},
"commit_id": ""
}

View File

@ -0,0 +1,136 @@
{
"action": "created",
"repository": {
"id": 73,
"owner": {
"id": 1,
"login": "stupidcomputer",
"login_name": "",
"full_name": "stupidcomputer",
"email": "stupidcomputer@noreply.git.beepboop.systems",
"avatar_url": "https://secure.gravatar.com/avatar/b642b4217b34b1e8d3bd915fc65c4452?d=identicon",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2023-06-23T22:23:01-05:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "https://beepboop.systems",
"description": "High schooler interested in computers, security, and reproducible systems.\r\n",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "stupidcomputer"
},
"name": "sadkfjasdf",
"full_name": "stupidcomputer/sadkfjasdf",
"description": "",
"empty": true,
"private": false,
"fork": false,
"template": false,
"parent": null,
"mirror": false,
"size": 0,
"language": "",
"languages_url": "https://git.beepboop.systems/api/v1/repos/stupidcomputer/sadkfjasdf/languages",
"html_url": "https://git.beepboop.systems/stupidcomputer/sadkfjasdf",
"url": "https://git.beepboop.systems/api/v1/repos/stupidcomputer/sadkfjasdf",
"link": "",
"ssh_url": "gitea@git.beepboop.systems:stupidcomputer/sadkfjasdf.git",
"clone_url": "https://git.beepboop.systems/stupidcomputer/sadkfjasdf.git",
"original_url": "",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 0,
"open_issues_count": 0,
"open_pr_counter": 0,
"release_counter": 0,
"default_branch": "main",
"archived": false,
"created_at": "2024-10-08T22:47:49-05:00",
"updated_at": "2024-10-08T22:47:49-05:00",
"archived_at": "1969-12-31T18:00:00-06:00",
"permissions": {
"admin": true,
"push": true,
"pull": true
},
"has_issues": true,
"internal_tracker": {
"enable_time_tracker": true,
"allow_only_contributors_to_track_time": true,
"enable_issue_dependencies": true
},
"has_wiki": true,
"has_pull_requests": true,
"has_projects": true,
"has_releases": true,
"has_packages": true,
"has_actions": false,
"ignore_whitespace_conflicts": false,
"allow_merge_commits": true,
"allow_rebase": true,
"allow_rebase_explicit": true,
"allow_squash_merge": true,
"allow_rebase_update": true,
"default_delete_branch_after_merge": false,
"default_merge_style": "merge",
"default_allow_maintainer_edit": false,
"avatar_url": "",
"internal": false,
"mirror_interval": "",
"mirror_updated": "0001-01-01T00:00:00Z",
"repo_transfer": null
},
"organization": {
"id": 1,
"login": "stupidcomputer",
"login_name": "",
"full_name": "stupidcomputer",
"email": "stupidcomputer@noreply.git.beepboop.systems",
"avatar_url": "https://secure.gravatar.com/avatar/b642b4217b34b1e8d3bd915fc65c4452?d=identicon",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2023-06-23T22:23:01-05:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "https://beepboop.systems",
"description": "High schooler interested in computers, security, and reproducible systems.\r\n",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "stupidcomputer"
},
"sender": {
"id": 1,
"login": "stupidcomputer",
"login_name": "",
"full_name": "stupidcomputer",
"email": "stupidcomputer@noreply.git.beepboop.systems",
"avatar_url": "https://secure.gravatar.com/avatar/b642b4217b34b1e8d3bd915fc65c4452?d=identicon",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2023-06-23T22:23:01-05:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "https://beepboop.systems",
"description": "High schooler interested in computers, security, and reproducible systems.\r\n",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "stupidcomputer"
}
}

View File

@ -0,0 +1,189 @@
{
"action": "closed",
"issue": {
"url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1",
"repository_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf",
"labels_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1/labels{/name}",
"comments_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1/comments",
"events_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1/events",
"html_url": "https://github.com/stupidcomputer/sadkfjasdf/issues/1",
"id": 2574858486,
"node_id": "I_kwDOM9nmTM6ZeTj2",
"number": 1,
"title": "this is a test",
"user": {
"login": "stupidcomputer",
"id": 108326967,
"node_id": "U_kgDOBnTwNw",
"avatar_url": "https://avatars.githubusercontent.com/u/108326967?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/stupidcomputer",
"html_url": "https://github.com/stupidcomputer",
"followers_url": "https://api.github.com/users/stupidcomputer/followers",
"following_url": "https://api.github.com/users/stupidcomputer/following{/other_user}",
"gists_url": "https://api.github.com/users/stupidcomputer/gists{/gist_id}",
"starred_url": "https://api.github.com/users/stupidcomputer/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/stupidcomputer/subscriptions",
"organizations_url": "https://api.github.com/users/stupidcomputer/orgs",
"repos_url": "https://api.github.com/users/stupidcomputer/repos",
"events_url": "https://api.github.com/users/stupidcomputer/events{/privacy}",
"received_events_url": "https://api.github.com/users/stupidcomputer/received_events",
"type": "User",
"site_admin": false
},
"labels": [
],
"state": "closed",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 1,
"created_at": "2024-10-09T06:06:39Z",
"updated_at": "2024-10-09T06:24:04Z",
"closed_at": "2024-10-09T06:24:04Z",
"author_association": "OWNER",
"active_lock_reason": null,
"body": null,
"reactions": {
"url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1/reactions",
"total_count": 0,
"+1": 0,
"-1": 0,
"laugh": 0,
"hooray": 0,
"confused": 0,
"heart": 0,
"rocket": 0,
"eyes": 0
},
"timeline_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1/timeline",
"performed_via_github_app": null,
"state_reason": "completed"
},
"repository": {
"id": 869918284,
"node_id": "R_kgDOM9nmTA",
"name": "sadkfjasdf",
"full_name": "stupidcomputer/sadkfjasdf",
"private": false,
"owner": {
"login": "stupidcomputer",
"id": 108326967,
"node_id": "U_kgDOBnTwNw",
"avatar_url": "https://avatars.githubusercontent.com/u/108326967?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/stupidcomputer",
"html_url": "https://github.com/stupidcomputer",
"followers_url": "https://api.github.com/users/stupidcomputer/followers",
"following_url": "https://api.github.com/users/stupidcomputer/following{/other_user}",
"gists_url": "https://api.github.com/users/stupidcomputer/gists{/gist_id}",
"starred_url": "https://api.github.com/users/stupidcomputer/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/stupidcomputer/subscriptions",
"organizations_url": "https://api.github.com/users/stupidcomputer/orgs",
"repos_url": "https://api.github.com/users/stupidcomputer/repos",
"events_url": "https://api.github.com/users/stupidcomputer/events{/privacy}",
"received_events_url": "https://api.github.com/users/stupidcomputer/received_events",
"type": "User",
"site_admin": false
},
"html_url": "https://github.com/stupidcomputer/sadkfjasdf",
"description": null,
"fork": false,
"url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf",
"forks_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/forks",
"keys_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/teams",
"hooks_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/hooks",
"issue_events_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/events{/number}",
"events_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/events",
"assignees_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/assignees{/user}",
"branches_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/branches{/branch}",
"tags_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/tags",
"blobs_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/statuses/{sha}",
"languages_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/languages",
"stargazers_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/stargazers",
"contributors_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/contributors",
"subscribers_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/subscribers",
"subscription_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/subscription",
"commits_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/contents/{+path}",
"compare_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/merges",
"archive_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/downloads",
"issues_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues{/number}",
"pulls_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/pulls{/number}",
"milestones_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/milestones{/number}",
"notifications_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/labels{/name}",
"releases_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/releases{/id}",
"deployments_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/deployments",
"created_at": "2024-10-09T06:05:09Z",
"updated_at": "2024-10-09T06:05:09Z",
"pushed_at": "2024-10-09T06:05:09Z",
"git_url": "git://github.com/stupidcomputer/sadkfjasdf.git",
"ssh_url": "git@github.com:stupidcomputer/sadkfjasdf.git",
"clone_url": "https://github.com/stupidcomputer/sadkfjasdf.git",
"svn_url": "https://github.com/stupidcomputer/sadkfjasdf",
"homepage": "https://git.beepboop.systems/stupidcomputer/sadkfjasdf",
"size": 0,
"stargazers_count": 0,
"watchers_count": 0,
"language": null,
"has_issues": true,
"has_projects": true,
"has_downloads": true,
"has_wiki": true,
"has_pages": false,
"has_discussions": false,
"forks_count": 0,
"mirror_url": null,
"archived": false,
"disabled": false,
"open_issues_count": 0,
"license": null,
"allow_forking": true,
"is_template": false,
"web_commit_signoff_required": false,
"topics": [
],
"visibility": "public",
"forks": 0,
"open_issues": 0,
"watchers": 0,
"default_branch": "main"
},
"sender": {
"login": "stupidcomputer",
"id": 108326967,
"node_id": "U_kgDOBnTwNw",
"avatar_url": "https://avatars.githubusercontent.com/u/108326967?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/stupidcomputer",
"html_url": "https://github.com/stupidcomputer",
"followers_url": "https://api.github.com/users/stupidcomputer/followers",
"following_url": "https://api.github.com/users/stupidcomputer/following{/other_user}",
"gists_url": "https://api.github.com/users/stupidcomputer/gists{/gist_id}",
"starred_url": "https://api.github.com/users/stupidcomputer/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/stupidcomputer/subscriptions",
"organizations_url": "https://api.github.com/users/stupidcomputer/orgs",
"repos_url": "https://api.github.com/users/stupidcomputer/repos",
"events_url": "https://api.github.com/users/stupidcomputer/events{/privacy}",
"received_events_url": "https://api.github.com/users/stupidcomputer/received_events",
"type": "User",
"site_admin": false
}
}

View File

@ -0,0 +1,233 @@
{
"action": "created",
"issue": {
"url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1",
"repository_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf",
"labels_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1/labels{/name}",
"comments_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1/comments",
"events_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1/events",
"html_url": "https://github.com/stupidcomputer/sadkfjasdf/issues/1",
"id": 2574858486,
"node_id": "I_kwDOM9nmTM6ZeTj2",
"number": 1,
"title": "this is a test",
"user": {
"login": "stupidcomputer",
"id": 108326967,
"node_id": "U_kgDOBnTwNw",
"avatar_url": "https://avatars.githubusercontent.com/u/108326967?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/stupidcomputer",
"html_url": "https://github.com/stupidcomputer",
"followers_url": "https://api.github.com/users/stupidcomputer/followers",
"following_url": "https://api.github.com/users/stupidcomputer/following{/other_user}",
"gists_url": "https://api.github.com/users/stupidcomputer/gists{/gist_id}",
"starred_url": "https://api.github.com/users/stupidcomputer/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/stupidcomputer/subscriptions",
"organizations_url": "https://api.github.com/users/stupidcomputer/orgs",
"repos_url": "https://api.github.com/users/stupidcomputer/repos",
"events_url": "https://api.github.com/users/stupidcomputer/events{/privacy}",
"received_events_url": "https://api.github.com/users/stupidcomputer/received_events",
"type": "User",
"site_admin": false
},
"labels": [
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 1,
"created_at": "2024-10-09T06:06:39Z",
"updated_at": "2024-10-09T06:22:06Z",
"closed_at": null,
"author_association": "OWNER",
"active_lock_reason": null,
"body": null,
"reactions": {
"url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1/reactions",
"total_count": 0,
"+1": 0,
"-1": 0,
"laugh": 0,
"hooray": 0,
"confused": 0,
"heart": 0,
"rocket": 0,
"eyes": 0
},
"timeline_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1/timeline",
"performed_via_github_app": null,
"state_reason": null
},
"comment": {
"url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/comments/2401413724",
"html_url": "https://github.com/stupidcomputer/sadkfjasdf/issues/1#issuecomment-2401413724",
"issue_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1",
"id": 2401413724,
"node_id": "IC_kwDOM9nmTM6PIqpc",
"user": {
"login": "stupidcomputer",
"id": 108326967,
"node_id": "U_kgDOBnTwNw",
"avatar_url": "https://avatars.githubusercontent.com/u/108326967?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/stupidcomputer",
"html_url": "https://github.com/stupidcomputer",
"followers_url": "https://api.github.com/users/stupidcomputer/followers",
"following_url": "https://api.github.com/users/stupidcomputer/following{/other_user}",
"gists_url": "https://api.github.com/users/stupidcomputer/gists{/gist_id}",
"starred_url": "https://api.github.com/users/stupidcomputer/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/stupidcomputer/subscriptions",
"organizations_url": "https://api.github.com/users/stupidcomputer/orgs",
"repos_url": "https://api.github.com/users/stupidcomputer/repos",
"events_url": "https://api.github.com/users/stupidcomputer/events{/privacy}",
"received_events_url": "https://api.github.com/users/stupidcomputer/received_events",
"type": "User",
"site_admin": false
},
"created_at": "2024-10-09T06:22:06Z",
"updated_at": "2024-10-09T06:22:06Z",
"author_association": "OWNER",
"body": "here is a helpful, insightful comment",
"reactions": {
"url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/comments/2401413724/reactions",
"total_count": 0,
"+1": 0,
"-1": 0,
"laugh": 0,
"hooray": 0,
"confused": 0,
"heart": 0,
"rocket": 0,
"eyes": 0
},
"performed_via_github_app": null
},
"repository": {
"id": 869918284,
"node_id": "R_kgDOM9nmTA",
"name": "sadkfjasdf",
"full_name": "stupidcomputer/sadkfjasdf",
"private": false,
"owner": {
"login": "stupidcomputer",
"id": 108326967,
"node_id": "U_kgDOBnTwNw",
"avatar_url": "https://avatars.githubusercontent.com/u/108326967?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/stupidcomputer",
"html_url": "https://github.com/stupidcomputer",
"followers_url": "https://api.github.com/users/stupidcomputer/followers",
"following_url": "https://api.github.com/users/stupidcomputer/following{/other_user}",
"gists_url": "https://api.github.com/users/stupidcomputer/gists{/gist_id}",
"starred_url": "https://api.github.com/users/stupidcomputer/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/stupidcomputer/subscriptions",
"organizations_url": "https://api.github.com/users/stupidcomputer/orgs",
"repos_url": "https://api.github.com/users/stupidcomputer/repos",
"events_url": "https://api.github.com/users/stupidcomputer/events{/privacy}",
"received_events_url": "https://api.github.com/users/stupidcomputer/received_events",
"type": "User",
"site_admin": false
},
"html_url": "https://github.com/stupidcomputer/sadkfjasdf",
"description": null,
"fork": false,
"url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf",
"forks_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/forks",
"keys_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/teams",
"hooks_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/hooks",
"issue_events_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/events{/number}",
"events_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/events",
"assignees_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/assignees{/user}",
"branches_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/branches{/branch}",
"tags_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/tags",
"blobs_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/statuses/{sha}",
"languages_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/languages",
"stargazers_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/stargazers",
"contributors_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/contributors",
"subscribers_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/subscribers",
"subscription_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/subscription",
"commits_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/contents/{+path}",
"compare_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/merges",
"archive_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/downloads",
"issues_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues{/number}",
"pulls_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/pulls{/number}",
"milestones_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/milestones{/number}",
"notifications_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/labels{/name}",
"releases_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/releases{/id}",
"deployments_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/deployments",
"created_at": "2024-10-09T06:05:09Z",
"updated_at": "2024-10-09T06:05:09Z",
"pushed_at": "2024-10-09T06:05:09Z",
"git_url": "git://github.com/stupidcomputer/sadkfjasdf.git",
"ssh_url": "git@github.com:stupidcomputer/sadkfjasdf.git",
"clone_url": "https://github.com/stupidcomputer/sadkfjasdf.git",
"svn_url": "https://github.com/stupidcomputer/sadkfjasdf",
"homepage": "https://git.beepboop.systems/stupidcomputer/sadkfjasdf",
"size": 0,
"stargazers_count": 0,
"watchers_count": 0,
"language": null,
"has_issues": true,
"has_projects": true,
"has_downloads": true,
"has_wiki": true,
"has_pages": false,
"has_discussions": false,
"forks_count": 0,
"mirror_url": null,
"archived": false,
"disabled": false,
"open_issues_count": 1,
"license": null,
"allow_forking": true,
"is_template": false,
"web_commit_signoff_required": false,
"topics": [
],
"visibility": "public",
"forks": 0,
"open_issues": 1,
"watchers": 0,
"default_branch": "main"
},
"sender": {
"login": "stupidcomputer",
"id": 108326967,
"node_id": "U_kgDOBnTwNw",
"avatar_url": "https://avatars.githubusercontent.com/u/108326967?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/stupidcomputer",
"html_url": "https://github.com/stupidcomputer",
"followers_url": "https://api.github.com/users/stupidcomputer/followers",
"following_url": "https://api.github.com/users/stupidcomputer/following{/other_user}",
"gists_url": "https://api.github.com/users/stupidcomputer/gists{/gist_id}",
"starred_url": "https://api.github.com/users/stupidcomputer/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/stupidcomputer/subscriptions",
"organizations_url": "https://api.github.com/users/stupidcomputer/orgs",
"repos_url": "https://api.github.com/users/stupidcomputer/repos",
"events_url": "https://api.github.com/users/stupidcomputer/events{/privacy}",
"received_events_url": "https://api.github.com/users/stupidcomputer/received_events",
"type": "User",
"site_admin": false
}
}

View File

@ -0,0 +1,189 @@
{
"action": "opened",
"issue": {
"url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1",
"repository_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf",
"labels_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1/labels{/name}",
"comments_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1/comments",
"events_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1/events",
"html_url": "https://github.com/stupidcomputer/sadkfjasdf/issues/1",
"id": 2574858486,
"node_id": "I_kwDOM9nmTM6ZeTj2",
"number": 1,
"title": "this is a test",
"user": {
"login": "stupidcomputer",
"id": 108326967,
"node_id": "U_kgDOBnTwNw",
"avatar_url": "https://avatars.githubusercontent.com/u/108326967?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/stupidcomputer",
"html_url": "https://github.com/stupidcomputer",
"followers_url": "https://api.github.com/users/stupidcomputer/followers",
"following_url": "https://api.github.com/users/stupidcomputer/following{/other_user}",
"gists_url": "https://api.github.com/users/stupidcomputer/gists{/gist_id}",
"starred_url": "https://api.github.com/users/stupidcomputer/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/stupidcomputer/subscriptions",
"organizations_url": "https://api.github.com/users/stupidcomputer/orgs",
"repos_url": "https://api.github.com/users/stupidcomputer/repos",
"events_url": "https://api.github.com/users/stupidcomputer/events{/privacy}",
"received_events_url": "https://api.github.com/users/stupidcomputer/received_events",
"type": "User",
"site_admin": false
},
"labels": [
],
"state": "open",
"locked": false,
"assignee": null,
"assignees": [
],
"milestone": null,
"comments": 0,
"created_at": "2024-10-09T06:06:39Z",
"updated_at": "2024-10-09T06:06:39Z",
"closed_at": null,
"author_association": "OWNER",
"active_lock_reason": null,
"body": null,
"reactions": {
"url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1/reactions",
"total_count": 0,
"+1": 0,
"-1": 0,
"laugh": 0,
"hooray": 0,
"confused": 0,
"heart": 0,
"rocket": 0,
"eyes": 0
},
"timeline_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/1/timeline",
"performed_via_github_app": null,
"state_reason": null
},
"repository": {
"id": 869918284,
"node_id": "R_kgDOM9nmTA",
"name": "sadkfjasdf",
"full_name": "stupidcomputer/sadkfjasdf",
"private": false,
"owner": {
"login": "stupidcomputer",
"id": 108326967,
"node_id": "U_kgDOBnTwNw",
"avatar_url": "https://avatars.githubusercontent.com/u/108326967?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/stupidcomputer",
"html_url": "https://github.com/stupidcomputer",
"followers_url": "https://api.github.com/users/stupidcomputer/followers",
"following_url": "https://api.github.com/users/stupidcomputer/following{/other_user}",
"gists_url": "https://api.github.com/users/stupidcomputer/gists{/gist_id}",
"starred_url": "https://api.github.com/users/stupidcomputer/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/stupidcomputer/subscriptions",
"organizations_url": "https://api.github.com/users/stupidcomputer/orgs",
"repos_url": "https://api.github.com/users/stupidcomputer/repos",
"events_url": "https://api.github.com/users/stupidcomputer/events{/privacy}",
"received_events_url": "https://api.github.com/users/stupidcomputer/received_events",
"type": "User",
"site_admin": false
},
"html_url": "https://github.com/stupidcomputer/sadkfjasdf",
"description": null,
"fork": false,
"url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf",
"forks_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/forks",
"keys_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/teams",
"hooks_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/hooks",
"issue_events_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/events{/number}",
"events_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/events",
"assignees_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/assignees{/user}",
"branches_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/branches{/branch}",
"tags_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/tags",
"blobs_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/statuses/{sha}",
"languages_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/languages",
"stargazers_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/stargazers",
"contributors_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/contributors",
"subscribers_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/subscribers",
"subscription_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/subscription",
"commits_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/contents/{+path}",
"compare_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/merges",
"archive_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/downloads",
"issues_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/issues{/number}",
"pulls_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/pulls{/number}",
"milestones_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/milestones{/number}",
"notifications_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/labels{/name}",
"releases_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/releases{/id}",
"deployments_url": "https://api.github.com/repos/stupidcomputer/sadkfjasdf/deployments",
"created_at": "2024-10-09T06:05:09Z",
"updated_at": "2024-10-09T06:05:09Z",
"pushed_at": "2024-10-09T06:05:09Z",
"git_url": "git://github.com/stupidcomputer/sadkfjasdf.git",
"ssh_url": "git@github.com:stupidcomputer/sadkfjasdf.git",
"clone_url": "https://github.com/stupidcomputer/sadkfjasdf.git",
"svn_url": "https://github.com/stupidcomputer/sadkfjasdf",
"homepage": "https://git.beepboop.systems/stupidcomputer/sadkfjasdf",
"size": 0,
"stargazers_count": 0,
"watchers_count": 0,
"language": null,
"has_issues": true,
"has_projects": true,
"has_downloads": true,
"has_wiki": true,
"has_pages": false,
"has_discussions": false,
"forks_count": 0,
"mirror_url": null,
"archived": false,
"disabled": false,
"open_issues_count": 1,
"license": null,
"allow_forking": true,
"is_template": false,
"web_commit_signoff_required": false,
"topics": [
],
"visibility": "public",
"forks": 0,
"open_issues": 1,
"watchers": 0,
"default_branch": "main"
},
"sender": {
"login": "stupidcomputer",
"id": 108326967,
"node_id": "U_kgDOBnTwNw",
"avatar_url": "https://avatars.githubusercontent.com/u/108326967?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/stupidcomputer",
"html_url": "https://github.com/stupidcomputer",
"followers_url": "https://api.github.com/users/stupidcomputer/followers",
"following_url": "https://api.github.com/users/stupidcomputer/following{/other_user}",
"gists_url": "https://api.github.com/users/stupidcomputer/gists{/gist_id}",
"starred_url": "https://api.github.com/users/stupidcomputer/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/stupidcomputer/subscriptions",
"organizations_url": "https://api.github.com/users/stupidcomputer/orgs",
"repos_url": "https://api.github.com/users/stupidcomputer/repos",
"events_url": "https://api.github.com/users/stupidcomputer/events{/privacy}",
"received_events_url": "https://api.github.com/users/stupidcomputer/received_events",
"type": "User",
"site_admin": false
}
}

View File

@ -0,0 +1,8 @@
import requests
import json
with open("data/gitea-issue-closed.json", "r") as file:
data = json.loads(file.read())
r = requests.post("http://127.0.0.1:5000/bridge/endpoints/gitea/issue", json=data)
print(r.text)

View File

@ -0,0 +1,8 @@
import requests
import json
with open("data/gitea-issue-comment-created.json", "r") as file:
data = json.loads(file.read())
r = requests.post("http://127.0.0.1:5000/bridge/endpoints/gitea/issue", json=data)
print(r.text)

View File

@ -0,0 +1,8 @@
import requests
import json
with open("data/gitea-issue-created.json", "r") as file:
data = json.loads(file.read())
r = requests.post("http://127.0.0.1:5000/bridge/endpoints/gitea/issue", json=data)
print(r.text)

View File

@ -0,0 +1,8 @@
import requests
import json
with open("data/gitea-repo-created.json", "r") as file:
data = json.loads(file.read())
r = requests.post("http://127.0.0.1:5000/bridge/endpoints/gitea/repo", json=data)
print(r.text)

View File

@ -0,0 +1,8 @@
import requests
import json
with open("data/github-issue-closed.json", "r") as file:
data = json.loads(file.read())
r = requests.post("http://127.0.0.1:5000/bridge/endpoints/github/issue", json=data)
print(r.text)

View File

@ -0,0 +1,8 @@
import requests
import json
with open("data/github-issue-comment-created.json", "r") as file:
data = json.loads(file.read())
r = requests.post("http://127.0.0.1:5000/bridge/endpoints/github/issue", json=data)
print(r.text)

View File

@ -0,0 +1,8 @@
import requests
import json
with open("data/github-issue-created.json", "r") as file:
data = json.loads(file.read())
r = requests.post("http://127.0.0.1:5000/bridge/endpoints/github/issue", json=data)
print(r.text)