Compare commits
2 commits
7a091c5b93
...
6dcfa7dc02
Author | SHA1 | Date | |
---|---|---|---|
6dcfa7dc02 | |||
024482d4e8 |
5 changed files with 4 additions and 437 deletions
|
@ -16,7 +16,7 @@ page. Donations of any size are greatly appreciated.
|
||||||
An important way to get involved is to just report issues you find with
|
An important way to get involved is to just report issues you find with
|
||||||
Telodendria during experimentation or normal use. To report an issue,
|
Telodendria during experimentation or normal use. To report an issue,
|
||||||
go to [Issues](/Telodendria/telodendria/issues) →
|
go to [Issues](/Telodendria/telodendria/issues) →
|
||||||
[New Issue](/Telodendria/telodendria/issues/new) and follow the
|
[New Issue](/Telodendria/telodendria/issues/new/choose) and follow the
|
||||||
instructions.
|
instructions.
|
||||||
|
|
||||||
> **Note:** GitHub issues are not accepted. Issues may only be
|
> **Note:** GitHub issues are not accepted. Issues may only be
|
||||||
|
@ -106,7 +106,8 @@ as many as were in `td`.
|
||||||
Telodendria follows the standard pull request procedures. Once you have
|
Telodendria follows the standard pull request procedures. Once you have
|
||||||
made your changes, committed them, and pushed to your fork, you should
|
made your changes, committed them, and pushed to your fork, you should
|
||||||
be able to open a pull request on the main repository. When you do, you
|
be able to open a pull request on the main repository. When you do, you
|
||||||
will be prompted to write a description
|
will be prompted to write a description. Be sure to include the
|
||||||
|
related issue that you are closing in your description.
|
||||||
|
|
||||||
### Code Style
|
### Code Style
|
||||||
|
|
||||||
|
@ -159,3 +160,4 @@ comments to the appropriate header.
|
||||||
|
|
||||||
If your pull request does not also include proper documentation, it
|
If your pull request does not also include proper documentation, it
|
||||||
will likely be rejected.
|
will likely be rejected.
|
||||||
|
|
||||||
|
|
|
@ -1,57 +0,0 @@
|
||||||
.Dd $Mdocdate: April 29 2023 $
|
|
||||||
.Dt SEND-PATCH 1
|
|
||||||
.Os Telodendria Project
|
|
||||||
.Sh NAME
|
|
||||||
.Nm send-patch
|
|
||||||
.Nd Submit a patch file to the Telodendria Patches Matrix room
|
|
||||||
.Sh SYNOPSIS
|
|
||||||
.Nm
|
|
||||||
.Op patch
|
|
||||||
.Sh DESCRIPTION
|
|
||||||
.Nm
|
|
||||||
is a simple shell script for submitting patch files to Telodendria's patch
|
|
||||||
room for review.
|
|
||||||
.Pp
|
|
||||||
.Nm
|
|
||||||
takes a single argument, a patch file. It also reads a number of environment
|
|
||||||
variables, as described in the following section. This script is designed to be
|
|
||||||
simple; it only pushes files into a hard-coded Matrix room. Thus, as far as
|
|
||||||
Matrix clients go, this one is a rather minimal one, and that is by design.
|
|
||||||
.Pp
|
|
||||||
This script exists so that users who are working on a machine that doesn't have
|
|
||||||
a Matrix client installed can still submit work to the Telodendria project. The
|
|
||||||
goal is to make development as accessible as possible.
|
|
||||||
.Pp
|
|
||||||
This script only supports password login, so if your homeserver does not
|
|
||||||
support password login, it will not work.
|
|
||||||
.Sh ENVIRONMENT
|
|
||||||
.Pp
|
|
||||||
.Nm
|
|
||||||
utilizes the following environment variables:
|
|
||||||
.Bl -tag -width Ds
|
|
||||||
.It Ev MXID
|
|
||||||
Your Matrix ID in the standard format. This is used to connect to your
|
|
||||||
homeserver to send the message.
|
|
||||||
.It Ev MXPW
|
|
||||||
Your Matrix account's password. If not set, you will be prompted for your
|
|
||||||
password by the script, unless
|
|
||||||
.Ev ACCESS_TOKEN
|
|
||||||
is set.
|
|
||||||
.It Ev ACCESS_TOKEN
|
|
||||||
If you already have an access token for your account, such as one from an
|
|
||||||
existing session, then you can set this environment variable to bypass the
|
|
||||||
password authentication flow.
|
|
||||||
.El
|
|
||||||
.Sh FILES
|
|
||||||
.Pp
|
|
||||||
.Nm
|
|
||||||
does utilize the
|
|
||||||
.Pa .env
|
|
||||||
file, just like
|
|
||||||
.Xr td 1 .
|
|
||||||
Consult that page for the specifics of the
|
|
||||||
.Pa .env
|
|
||||||
file.
|
|
||||||
.Sh SEE ALSO
|
|
||||||
.Xr td 1
|
|
||||||
|
|
|
@ -1,63 +0,0 @@
|
||||||
.Dd $Mdocdate: April 29 2023 $
|
|
||||||
.Dt TP 1
|
|
||||||
.Os Telodendria Project
|
|
||||||
.Sh NAME
|
|
||||||
.Nm tp
|
|
||||||
.Nd Manage the official patch queue.
|
|
||||||
.Sh SYNOPSIS
|
|
||||||
.Np
|
|
||||||
.Op action
|
|
||||||
.Op patch
|
|
||||||
.Sh DESCRIPTION
|
|
||||||
.Pp
|
|
||||||
This script is probably not going to be very useful for anyone other
|
|
||||||
than the official project managers, but for completeness, this page
|
|
||||||
documents it.
|
|
||||||
.Pp
|
|
||||||
.Nm
|
|
||||||
is a simple script that is used to manage the patch queue. It offers a
|
|
||||||
simple way to fetch patches from the patch Matrix room and queue them
|
|
||||||
in a patch directory, which is then updated as patches are handled.
|
|
||||||
Contributions to Telodendria are entirely patch-based, so this script
|
|
||||||
makes dealing with patch files much more convenient.
|
|
||||||
.Pp
|
|
||||||
.Nm
|
|
||||||
doesn't implement a complex command line interface. It simply takes an
|
|
||||||
action as the first argument, and a patch file ID as the second
|
|
||||||
argument to some actions. The actions are as follows:
|
|
||||||
.Bl -tag -width Ds
|
|
||||||
.It ingress
|
|
||||||
Download all new patches from the patches room. This action is intended
|
|
||||||
to be called periodically from
|
|
||||||
.Xr cron 8
|
|
||||||
to fetch new patches.
|
|
||||||
.It queue
|
|
||||||
List all the patches in the queue, printing the first three lines of
|
|
||||||
each one so they can be easily identified.
|
|
||||||
.It view
|
|
||||||
View the specified patch. Note that the specified patch must be in
|
|
||||||
the queue. Once it is applied or rejected, this script offers no
|
|
||||||
facility for viewing it.
|
|
||||||
.It apply
|
|
||||||
Apply the specified patch to the current working directory.
|
|
||||||
.It reverse
|
|
||||||
Reverse the specified patch on the current working directory.
|
|
||||||
.It accept|reject
|
|
||||||
Accept or reject the specified patch by moving it to the appropriate
|
|
||||||
directory. These actions also prompt for a message, into which it is
|
|
||||||
expected that an explanation for why the patch was accepted or rejected
|
|
||||||
will be placed.
|
|
||||||
.El
|
|
||||||
.Sh ENVIRONMENT
|
|
||||||
.Pp
|
|
||||||
The following environment variables are read by the
|
|
||||||
.Nm
|
|
||||||
script:
|
|
||||||
.Bl -tag -width Ds
|
|
||||||
.It Ev TELODENDRIA_PUB
|
|
||||||
The base directory inside which the patch directory relies.
|
|
||||||
.It Ev HOMESERVER
|
|
||||||
The Matrix homeserver to contact for receiving patches.
|
|
||||||
.It Ev ACCESS_TOKEN
|
|
||||||
The access token to use to authenticate with the Matrix homeserver.
|
|
||||||
.El
|
|
|
@ -1,167 +0,0 @@
|
||||||
#!/usr/bin/env sh
|
|
||||||
#
|
|
||||||
# send-patch: "The Telodendria Patch Sender"
|
|
||||||
#
|
|
||||||
# This is a simple script for posting patch files to
|
|
||||||
# a single room(generally the Telodendria patch room.)
|
|
||||||
|
|
||||||
. "$(pwd)/tools/lib/common.sh"
|
|
||||||
|
|
||||||
# Path to the patch to send.
|
|
||||||
PATCHFILE="$1"
|
|
||||||
|
|
||||||
# Tries to decompose the name and the HS from an MXID using
|
|
||||||
# sed.
|
|
||||||
UR_NAME="$(echo "$MXID" | sed "s/\@\(.*\)\:\(.*\)/\1/")"
|
|
||||||
HS_NAME="$(echo "$MXID" | sed "s/\@\(.*\)\:\(.*\)/\2/")"
|
|
||||||
|
|
||||||
# Prompts the user for a password, while disabling echo-ing.
|
|
||||||
readpwd() {
|
|
||||||
printf "$1"
|
|
||||||
stty -echo -ctlecho
|
|
||||||
read -r "$2"
|
|
||||||
echo
|
|
||||||
stty echo ctlecho
|
|
||||||
}
|
|
||||||
|
|
||||||
# Makes an HTTP request, setting the RETURN variable for the
|
|
||||||
# actual reply from the server and the ERROR_CODE variable
|
|
||||||
# for a HTTP error code.
|
|
||||||
request() {
|
|
||||||
RETURN=$(http -i "$@" 2>/dev/null)
|
|
||||||
ERROR_CODE=$(echo "$RETURN" | head -n1 | awk '{print $2}')
|
|
||||||
RETURN=$(echo "$RETURN" | sed '1,/^[[:space:]]*$/d')
|
|
||||||
}
|
|
||||||
|
|
||||||
# Prompts user to login and gives out an access token to use
|
|
||||||
# in the ACCESS_TOKEN variable
|
|
||||||
matrix_login() {
|
|
||||||
# Check authentication methods
|
|
||||||
echo "Checking authentication methods..."
|
|
||||||
request "$HS_BASE/_matrix/client/v3/login"
|
|
||||||
AUTH_METHODS=$RETURN
|
|
||||||
if [ $ERROR_CODE -ne 200 ]; then
|
|
||||||
echo "Homeserver does not support login."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if ! echo "$AUTH_METHODS" | grep "m.login.password" >/dev/null; then
|
|
||||||
echo "Homeserver does not support password authentication."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# Homeserver does support password authentication, so request
|
|
||||||
# them one.
|
|
||||||
if [ -z "$MXPW" ]; then
|
|
||||||
readpwd "Enter your Matrix password: " MXPW
|
|
||||||
fi
|
|
||||||
# Tries to login using the "Telodendria Patch Script" device
|
|
||||||
# name
|
|
||||||
JSON=$(
|
|
||||||
printf '{'
|
|
||||||
printf ' "identifier": {'
|
|
||||||
printf ' "type": "m.id.user",'
|
|
||||||
printf ' "user": %s' "$(json -e $UR_NAME)"
|
|
||||||
printf ' },'
|
|
||||||
printf ' "initial_device_display_name": "Telodendria Patch Script",'
|
|
||||||
printf ' "type": "m.login.password",'
|
|
||||||
printf ' "password": %s' "$(json -e "$MXPW")"
|
|
||||||
printf '}'
|
|
||||||
)
|
|
||||||
request -X POST -d "$JSON" $HS_BASE/_matrix/client/v3/login
|
|
||||||
LOGIN="$RETURN"
|
|
||||||
if [ $ERROR_CODE -ne 200 ]; then
|
|
||||||
echo "Login failed."
|
|
||||||
echo "$RETURN"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
ACCESS_TOKEN=$(echo "$LOGIN" | json -s "access_token->@decode")
|
|
||||||
}
|
|
||||||
|
|
||||||
# Logs out of Matrix using the ACFESS_TOKEN environment variable
|
|
||||||
matrix_logout() {
|
|
||||||
if [ -z "$ACCESS_TOKEN" ]; then
|
|
||||||
echo "No access token"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
request -X POST -H "Authorization: Bearer $ACCESS_TOKEN" "$HS_BASE/_matrix/client/v3/logout"
|
|
||||||
LOGOUT=$RETURN
|
|
||||||
if [ $ERROR_CODE -ne 200 ]; then
|
|
||||||
echo "Logout failed."
|
|
||||||
echo "$RETURN"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "Logged out."
|
|
||||||
}
|
|
||||||
|
|
||||||
send_patch() {
|
|
||||||
if [ -z "$ACCESS_TOKEN" ]; then
|
|
||||||
matrix_login
|
|
||||||
DO_LOGOUT=1
|
|
||||||
fi
|
|
||||||
# We are sucessfully logged in as our user, now let's
|
|
||||||
# try to upload and post our patch
|
|
||||||
echo "$PATCHFILE"
|
|
||||||
request -X POST \
|
|
||||||
-H "Content-Type: text/x-patch" \
|
|
||||||
-H "Authorization: Bearer $ACCESS_TOKEN" \
|
|
||||||
-d "@$PATCHFILE" \
|
|
||||||
"$HS_BASE/_matrix/media/v3/upload"
|
|
||||||
MXCID=$RETURN
|
|
||||||
if [ $ERROR_CODE -ne 200 ]; then
|
|
||||||
echo "Upload failed."
|
|
||||||
echo "$RETURN"
|
|
||||||
matrix_logout
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
MXCID=$(echo "$MXCID" | json -s "content_uri->@decode")
|
|
||||||
echo "MXC ID: $MXCID"
|
|
||||||
JSON=$(
|
|
||||||
base=$(basename "$PATCHFILE")
|
|
||||||
printf '{'
|
|
||||||
printf ' "body": %s,' "$(json -e $base)"
|
|
||||||
printf ' "filename": %s,' "$(json -e $base)"
|
|
||||||
printf ' "info": {'
|
|
||||||
printf ' "mimetype": "text/x-patch",'
|
|
||||||
printf ' "size": %d' $(wc -c "$PATCHFILE" | awk '{print $1}')
|
|
||||||
printf ' },'
|
|
||||||
printf ' "msgtype": "m.file",'
|
|
||||||
printf ' "url": %s' "$(json -e $MXCID)"
|
|
||||||
printf '}'
|
|
||||||
)
|
|
||||||
http -X PUT -d "$JSON" -H "Authorization: Bearer $ACCESS_TOKEN" \
|
|
||||||
"$HS_BASE/_matrix/client/v3/rooms/$PATCHES_ROOM/send/m.room.message/$(date +%s)" \
|
|
||||||
2>/dev/null >/dev/null && echo "Patch sent."
|
|
||||||
|
|
||||||
# Log out if we generated an access token
|
|
||||||
if [ "$DO_LOGOUT" -eq "1" ]; then
|
|
||||||
matrix_logout
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check if the patch file is valid.
|
|
||||||
if [ "$(basename "$PATCHFILE" .patch)" = "$PATCHFILE" ] || [ ! -f "$PATCHFILE" ]; then
|
|
||||||
echo "Format: $0 file.patch"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "Sending file '$PATCHFILE'"
|
|
||||||
echo "Checking homeserver's real address using .well-known..."
|
|
||||||
request "https://$HS_NAME/.well-known/matrix/client"
|
|
||||||
case "$ERROR_CODE" in
|
|
||||||
"200")
|
|
||||||
WELL_KNOWN=$RETURN
|
|
||||||
if [ -z "$WELL_KNOWN" ]; then
|
|
||||||
echo "well-known test returned 200 but no correct input was given."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# well-known entry is correct, we can now store our base endpoint
|
|
||||||
HS_BASE=$(printf "$WELL_KNOWN" | json -s "m.homeserver->base_url->@decode") && send_patch
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "$ERROR_CODE"
|
|
||||||
|
|
||||||
echo "well-known test failed."
|
|
||||||
printf "Please enter your homeserver base URL: "
|
|
||||||
read -r HS_BASE
|
|
||||||
echo
|
|
||||||
send_patch
|
|
||||||
;;
|
|
||||||
esac
|
|
148
tools/bin/tp
148
tools/bin/tp
|
@ -1,148 +0,0 @@
|
||||||
#!/usr/bin/env sh
|
|
||||||
#
|
|
||||||
# tp: "Telodendria Patch"
|
|
||||||
#
|
|
||||||
# This script is used to manage the patch queue.
|
|
||||||
|
|
||||||
. "$(pwd)/tools/lib/common.sh"
|
|
||||||
|
|
||||||
if [ -z "$TELODENDRIA_PUB" ]; then
|
|
||||||
echo "TELODENDRIA_PUB not set."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
TP_DIR="$TELODENDRIA_PUB/patches"
|
|
||||||
|
|
||||||
if [ ! -d "$TP_DIR" ]; then
|
|
||||||
echo "$TP_DIR does not exist."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
matrix_send() {
|
|
||||||
msg="$1"
|
|
||||||
if [ ! -z "$msg" ]; then
|
|
||||||
(
|
|
||||||
printf '{'
|
|
||||||
printf '"body":'
|
|
||||||
json -e "$msg"
|
|
||||||
printf ',"formatted_body":'
|
|
||||||
json -e "$msg"
|
|
||||||
printf ',"format":"org.matrix.custom.html",'
|
|
||||||
printf '"msgtype":"m.text"'
|
|
||||||
printf '}'
|
|
||||||
) > /tmp/tp-$$
|
|
||||||
http -X PUT -d @/tmp/tp-$$ "$HOMESERVER/client/v3/rooms/$PATCHES_ROOM/send/m.room.message/$(date +%s)?access_token=$ACCESS_TOKEN"
|
|
||||||
rm /tmp/tp-$$
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
"ingress")
|
|
||||||
timeline="/tmp/timeline.json"
|
|
||||||
http "$HOMESERVER/client/v3/sync?access_token=$ACCESS_TOKEN" |
|
|
||||||
json -s "rooms->join->${PATCHES_ROOM}->timeline" >"$timeline"
|
|
||||||
|
|
||||||
length=$(cat "$timeline" | json -s "events->@length")
|
|
||||||
|
|
||||||
i=0
|
|
||||||
while [ $i -lt $length ]; do
|
|
||||||
content=$(cat "$timeline" | json -s "events[$i]->content->^body->^formatted_body")
|
|
||||||
i=$((i + 1))
|
|
||||||
|
|
||||||
type=$(echo "$content" | json -s "msgtype->@decode")
|
|
||||||
if [ "$type" != "m.file" ]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
size=$(echo "$content" | json -s "info->size")
|
|
||||||
if [ "$size" -gt "$MAX_SIZE" ]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
file=$(echo "$content" | json -s "filename->@decode")
|
|
||||||
ext=$(echo "$file" | rev | cut -d '.' -f 1 | rev)
|
|
||||||
if [ "$ext" != "patch" ]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
url=$(echo "$content" | json -s "url->@decode")
|
|
||||||
id=$(echo "$url" | cut -d '/' -f 4)
|
|
||||||
|
|
||||||
if [ -f "$TP_DIR/ingress/$id.patch" ]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
server=$(echo "$url" | cut -d '/' -f 3)
|
|
||||||
|
|
||||||
if ! http "$HOMESERVER/media/v3/download/$server/$id" > "$TP_DIR/ingress/$id.patch"; then
|
|
||||||
rm "$TP_DIR/ingress/$id.patch"
|
|
||||||
echo "Failed to fetch mxc://$server/$id."
|
|
||||||
echo "Will try again next time."
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
count=$(cat "$TP_DIR/count.txt")
|
|
||||||
count=$((count + 1))
|
|
||||||
cp "$TP_DIR/ingress/$id.patch" "$TP_DIR/p/$count.patch"
|
|
||||||
(
|
|
||||||
cd "$TP_DIR/queued"
|
|
||||||
ln -s "../p/$count.patch" "$count.patch"
|
|
||||||
)
|
|
||||||
|
|
||||||
echo "$count" >"$TP_DIR/count.txt"
|
|
||||||
|
|
||||||
matrix_send "Queued <code>$file</code> as <a href=\"https://telodendria.io/patches/p/$count.patch\">#$count</a>" >/dev/null
|
|
||||||
done
|
|
||||||
;;
|
|
||||||
"queue")
|
|
||||||
find "$TP_DIR/queued" -name '*.patch' | while IFS= read -r patch; do
|
|
||||||
n=$(basename "$patch" .patch)
|
|
||||||
echo "Patch #$n:"
|
|
||||||
head -n3 "$patch"
|
|
||||||
echo
|
|
||||||
done
|
|
||||||
;;
|
|
||||||
"view")
|
|
||||||
if [ -f "$TP_DIR/queued/$2.patch" ]; then
|
|
||||||
less "$TP_DIR/queued/$2.patch"
|
|
||||||
else
|
|
||||||
echo "Patch #$2 doesn't exist in the queue."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
"apply")
|
|
||||||
if [ -f "$TP_DIR/queued/$2.patch" ]; then
|
|
||||||
patch <"$TP_DIR/queued/$2.patch"
|
|
||||||
else
|
|
||||||
echo "Patch #$2 doesn't exist in the queue."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
"reverse")
|
|
||||||
if [ -f "$TP_DIR/queued/$2.patch" ]; then
|
|
||||||
patch -R <"$TP_DIR/queued/$2.patch"
|
|
||||||
else
|
|
||||||
echo "Patch #$2 doesn't exist in the queue."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
"accept" | "reject")
|
|
||||||
if [ -f "$TP_DIR/queued/$2.patch" ]; then
|
|
||||||
mv "$TP_DIR/queued/$2.patch" "$TP_DIR/${1}ed/$2.patch"
|
|
||||||
msg="Patch <a href=\"https://telodendria.io/patches/p/$2.patch\">#$2</a> was marked as ${1}ed."
|
|
||||||
msgFile="/tmp/patchmsg-$(date +%s).txt"
|
|
||||||
$EDITOR "$msgFile"
|
|
||||||
if [ -f "$msgFile" ]; then
|
|
||||||
msg="$msg<br><blockquote>$(cat $msgFile)<br>—$DISPLAY_NAME ($MXID)</blockquote>"
|
|
||||||
fi
|
|
||||||
matrix_send "$msg"
|
|
||||||
else
|
|
||||||
echo "Patch #$2 doesn't exist in the queue."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "No action specified."
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
Loading…
Reference in a new issue