diff --git a/icons/title.svg b/icon.svg similarity index 100% rename from icons/title.svg rename to icon.svg diff --git a/icons/Logotype.tsx b/icons/Logotype.tsx deleted file mode 100644 index b087a56..0000000 --- a/icons/Logotype.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import React from 'react' -import Svg, {Path, SvgProps, PathProps} from 'react-native-svg' - -import {usePalette} from '#/lib/hooks/usePalette' - -const ratio = 17 / 64 - -export function Logotype({ - fill, - ...rest -}: {fill?: PathProps['fill']} & SvgProps) { - const pal = usePalette('default') - // @ts-ignore it's fiiiiine - const size = parseInt(rest.width || 32) - - return ( - - - - - - - - - - - - ) -} diff --git a/install.zsh b/install.zsh index 89834ea..59eec59 100755 --- a/install.zsh +++ b/install.zsh @@ -1,24 +1,26 @@ #!/bin/zsh -# ./install.zsh $HOST -repos_v='{}' function at-repos-env() { - host=$1 - if [ -z "$1" ];then - host=syu.is - fi + host=syu.is did=did:plc:6qyecktefllvenje24fcxnie - icon=https://git.syui.ai/ai/at/raw/branch/main/icons/Logotype.tsx repos=( - https://github.com/did-method-plc/did-method-plc - https://github.com/bluesky-social/indigo - https://github.com/bluesky-social/atproto - https://github.com/bluesky-social/social-app - https://github.com/bluesky-social/feed-generator - https://github.com/bluesky-social/ozone - https://github.com/bluesky-social/jetstream + "https://github.com/did-method-plc/did-method-plc" + "https://github.com/bluesky-social/indigo" + "https://github.com/bluesky-social/atproto" + "https://github.com/bluesky-social/social-app" + "https://github.com/bluesky-social/feed-generator" + "https://github.com/bluesky-social/ozone" + "https://github.com/bluesky-social/jetstream" + ) + services=( + "bsky" + "plc" + "pds" + "jetstream" + "bgs" + "ozone" + "social-app" ) - services=( bsky plc pds jetstream bgs ozone social-app ) d=${0:a:h} dh=${0:a:h:h} name=${host%%.*} @@ -26,28 +28,24 @@ function at-repos-env() { dport=5000 } -function at-repos-json() { - f=~/.config/atproto/token.json - j="{ \"did\": \"did:plc:6qyecktefllvenje24fcxnie\", \"didDoc\": { \"service\": [ { \"serviceEndpoint\": \"https://syu.is\" } ] }, \"handle\": \"ai.syu.is\", \"accessJwt\": \"xxx\" }" - if [ ! -f "$f" ];then - mkdir -p ~/.config/atproto - echo $j >> $f - fi - echo $f -} +# Arrays for patch management +typeset -a FAILED_PATCHES -function at-repos-token() { - at-repos-json - if [ -z "$host" ] && [ -f $f ];then - host=`cat $f|jq -r ".didDoc.service.[].serviceEndpoint"` - handle=`cat $f|jq -r ".handle"` - did=`cat $f|jq -r ".did"` - token=`cat $f|jq -r ".token"` - host=${host##*/} - fi - name=${host%%.*} - domain=${host##*.} -} +# Patch file lists +typeset -a PATCH_FILES_CURL +PATCH_FILES_CURL=( + "4367-atproto-services-bsky-api.diff:https://raw.githubusercontent.com/bluesky-social/atproto/refs/heads/main/services/bsky/api.js:services/bsky/api.js" + "4367-atproto-services-pds-index.diff:https://raw.githubusercontent.com/bluesky-social/atproto/refs/heads/main/services/pds/index.js:services/pds/index.js" +) + +typeset -a PATCH_FILES +PATCH_FILES=( + "170-pds-oauth-same-site-fix.patch" + "8980-social-app-disable-proxy.diff" + "disable-statsig-sdk.diff" + "140-social-app-yarn-network-timeout.patch" + "130-atproto-ozone-enable-daemon-v2.patch" +) function at-repos-clone() { if [ ! -d $d/repos ];then @@ -90,18 +88,6 @@ function at-repos-pull() { cd $d } -function at-repos-social-app-icon() { - curl -sL https://raw.githubusercontent.com/bluesky-social/social-app/main/src/view/icons/Logotype.tsx -o $d/repos/social-app/src/view/icons/Logotype.tsx - if [ -d $d/icons ];then - mkdir -p $d/icons - fi - cp -rf $d/repos/social-app/src/view/icons/Logotype.tsx $d/icons/ -} - -function at-repos-social-app-icon-origin() { - curl -sL $icon -o $d/icons/Logotype.tsx -} - function at-repos-social-app-avatar-write() { did_admin=did:plc:6qyecktefllvenje24fcxnie dt=$d/repos/social-app/src @@ -128,155 +114,185 @@ function at-repos-social-app-avatar-write() { grep -R $did_admin .|cut -d : -f 1|sort -u|xargs sed -i "s/${did_admin}/${did}/g" } -function at-repos-atproto-service-bsky-api-patch() { - # https://github.com/itaru2622/bluesky-selfhost-env/blob/master/patching/105-atproto-services-for-docker.diff - f=$d/repos/atproto/services/bsky/api.js - curl -sL https://raw.githubusercontent.com/bluesky-social/atproto/refs/heads/main/services/bsky/api.js -o $f - d_=$d/repos/atproto - p_=$d/patching/4367-atproto-services-bsky-api.diff - echo "applying patch: under ${f} for ${p_}" - pushd ${d_} - patch -p1 < ${p_} - popd +# Common patch function with status detection +function apply-patch() { + local patch_name=$1 + local target_dir=$2 + local patch_file=$3 + + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "📝 Patch: ${patch_name}" + echo " Target: ${target_dir}" + echo " File: ${patch_file}" + + pushd ${target_dir} > /dev/null + + # Check if patch is already applied (reverse dry-run succeeds) + if patch --dry-run -p1 -R < ${patch_file} > /dev/null 2>&1; then + echo "✅ Already applied - skipping" + popd > /dev/null + echo "" + return 0 + fi + + # Check if patch can be applied (forward dry-run succeeds) + if patch --dry-run -p1 < ${patch_file} > /dev/null 2>&1; then + echo "🔧 Applying patch..." + if patch -p1 < ${patch_file}; then + echo "✅ Applied successfully" + popd > /dev/null + echo "" + return 0 + else + echo "❌ Failed to apply" + FAILED_PATCHES+=("${patch_name} (${patch_file})") + popd > /dev/null + echo "" + return 1 + fi + else + echo "⚠️ Cannot apply - file may have been modified" + echo " Please check manually" + FAILED_PATCHES+=("${patch_name} (${patch_file}) - file modified") + popd > /dev/null + echo "" + return 1 + fi } -function at-repos-atproto-service-pds-index-patch() { - f=$d/repos/atproto/services/pds/index.js - curl -sL https://raw.githubusercontent.com/bluesky-social/atproto/refs/heads/main/services/pds/index.js -o $f - d_=$d/repos/atproto - p_=$d/patching/4367-atproto-services-pds-index.diff - echo "applying patch: under ${f} for ${p_}" - pushd ${d_} - patch -p1 < ${p_} - popd +# Function to display failed patches summary +function show-failed-patches() { + if [ ${#FAILED_PATCHES[@]} -eq 0 ]; then + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "✅ All patches applied successfully!" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "" + return 0 + fi + + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "⚠️ FAILED PATCHES SUMMARY" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "" + echo "The following patches could not be applied:" + echo "" + for failed_patch in "${FAILED_PATCHES[@]}"; do + echo " ❌ ${failed_patch}" + done + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "" } -function at-repos-atproto-oauth-same-site-patch() { - f=$d/repos/atproto/packages/oauth/oauth-provider/src/router/create-authorization-page-middleware.ts - d_=$d/repos/atproto - p_=$d/patching/170-pds-oauth-same-site-fix.patch - echo "applying patch: under ${f} for ${p_}" - pushd ${d_} - patch -p1 < ${p_} - popd +# Helper function for applying patches +function patch-apply() { + local name=$1 + local target=$2 + local patch_file=$3 + apply-patch "${name}" "$d/repos/${target}" "$d/patching/${patch_file}" } -function at-repos-social-app-agent-patch() { - f=$d/repos/social-app/src/state/session/agent.ts - p_=$d/patching/8980-social-app-disable-proxy.diff - d_=$d/repos/social-app - echo "applying patch: under ${f} for ${p_}" - pushd ${d_} - patch -p1 < ${p_} - popd +# Helper function for patches with curl download +function patch-apply-with-curl() { + local name=$1 + local target=$2 + local patch_file=$3 + local download_url=$4 + local download_target=$5 + + curl -sL "${download_url}" -o "$d/repos/${target}/${download_target}" + apply-patch "${name}" "$d/repos/${target}" "$d/patching/${patch_file}" } -function at-repos-social-app-disable-external-services-patch() { - f=$d/repos/social-app/src/state/geolocation/const.ts - p_=$d/patching/8980-social-app-disable-external-services.diff - d_=$d/repos/social-app - echo "applying patch: under ${f} for ${p_}" - pushd ${d_} - patch -p1 < ${p_} - popd -} +# Auto-apply patches from list +function at-repos-patch-apply-all() { + # Apply curl patches + for patch_info in "${PATCH_FILES_CURL[@]}"; do + local filename="${patch_info%%:*}" + local rest="${patch_info#*:}" + local download_url="${rest%%:*}" + local download_target="${rest#*:}" -function at-repos-social-app-statsig-patch() { - f=$d/repos/social-app/src/lib/statsig/statsig.tsx - p_=$d/patching/disable-statsig-sdk.diff - d_=$d/repos/social-app - echo "applying patch: under ${f} for ${p_}" - pushd ${d_} - patch -p1 < ${p_} - popd -} + local title="${filename%.*}" + local repo="" -function at-repos-social-app-dockerfile-yarn-timeout-patch() { - f=$d/repos/social-app/Dockerfile - p_=$d/patching/140-social-app-yarn-network-timeout.patch - d_=$d/repos/social-app - echo "applying patch: under ${f} for ${p_}" - pushd ${d_} - patch -p1 < ${p_} - popd -} + # Determine repo from filename + if [[ $filename == *"atproto"* ]]; then + repo="atproto" + elif [[ $filename == *"pds"* ]]; then + repo="atproto" + fi -function at-repos-atproto-service-ozone-api-patch() { - f=$d/repos/atproto/services/ozone/api.js - d_=$d/repos/atproto - p_=$d/patching/130-atproto-ozone-enable-daemon-v2.patch - echo "applying patch: under ${f} for ${p_}" - pushd ${d_} - patch -p1 < ${p_} - popd + patch-apply-with-curl "$title" "$repo" "$filename" "$download_url" "$download_target" + done + + # Apply regular patches + for filename in "${PATCH_FILES[@]}"; do + local title="${filename%.*}" + local repo="" + + # Determine repo from filename + if [[ $filename == *"social-app"* || $filename == *"statsig"* ]]; then + repo="social-app" + elif [[ $filename == *"atproto"* ]]; then + repo="atproto" + elif [[ $filename == *"pds"* ]]; then + repo="atproto" + fi + + patch-apply "$title" "$repo" "$filename" + done } function at-repos-ozone-patch() { - #DOMAIN=syu.is cd $d/repos d_=$d/repos/ozone rm -rf ${d_} - p_=$d/patching/120-ozone-runtimeEnvVars.diff git clone https://github.com/bluesky-social/ozone - cd ${d_} - pushd ${d_} - echo "applying patch: under ${d_} for ${p_}" - patch -p1 < ${p_} - popd - p_=$d/patching/122-ozone-enable-daemon.diff - echo "applying patch: under ${d_} for ${p_}" - pushd ${d_} - patch -p1 < ${p_} - popd + apply-patch "Ozone enable daemon" "${d_}" "$d/patching/122-ozone-enable-daemon.diff" - p_=$d/patching/130-ozone-skip-did-check.patch - echo "applying patch: under ${d_} for ${p_}" - pushd ${d_} - patch -p1 < ${p_} - popd + if [ -f "$d/patching/150-ozone-plc-fix.patch" ]; then + apply-patch "Ozone plc fix" "${d_}" "$d/patching/150-ozone-plc-fix.patch" + fi - p_=$d/patching/150-ozone-plc-fix.patch - echo "applying patch: under ${d_} for ${p_}" - pushd ${d_} - patch -p1 < ${p_} - popd + if [ -f "$d/patching/160-ozone-oauth-redirect-fix.patch" ]; then + apply-patch "Ozone oauth redirect fix" "${d_}" "$d/patching/160-ozone-oauth-redirect-fix.patch" + fi - p_=$d/patching/160-ozone-oauth-redirect-fix.patch - echo "applying patch: under ${d_} for ${p_}" - pushd ${d_} - patch -p1 < ${p_} - popd + # Apply constants fix and do additional sed replacements + pushd ${d_} > /dev/null + if [ -f "$d/patching/121-ozone-constants-fix.patch" ]; then + patch -p1 < "$d/patching/121-ozone-constants-fix.patch" 2>/dev/null || true + fi - p_=$d/patching/121-ozone-constants-fix.patch - echo "applying patch: under ${d_} for ${p_}" - pushd ${d_} - patch -p1 < ${p_} || true # Replace process.env with env() - sed -i 's/process\.env\.\(NEXT_PUBLIC_[A-Z_]*\)/env('\''\1'\'')/g' lib/constants.ts - sed -i 's/process\.env\.NODE_ENV/env('\''NODE_ENV'\'')/g' lib/constants.ts + sed -i 's/process\.env\.\(NEXT_PUBLIC_[A-Z_]*\)/env('\''\1'\'')/g' lib/constants.ts 2>/dev/null || true + sed -i 's/process\.env\.NODE_ENV/env('\''NODE_ENV'\'')/g' lib/constants.ts 2>/dev/null || true # Add missing SOCIAL_APP_DOMAIN constant after SOCIAL_APP_URL sed -i '/^export const SOCIAL_APP_URL =/,/^$/{ /^$/a\ export const SOCIAL_APP_DOMAIN =\ env('\''NEXT_PUBLIC_SOCIAL_APP_DOMAIN'\'') || '\''bsky.app'\''\ - }' lib/constants.ts + }' lib/constants.ts 2>/dev/null || true # Fix multiline process.env patterns sed -i '/^export const NEW_ACCOUNT_MARKER_THRESHOLD_IN_DAYS = process\.env$/,/^ : 7$/ { s/^export const NEW_ACCOUNT_MARKER_THRESHOLD_IN_DAYS = process\.env$/export const NEW_ACCOUNT_MARKER_THRESHOLD_IN_DAYS = env('\''NEXT_PUBLIC_NEW_ACCOUNT_MARKER_THRESHOLD_IN_DAYS'\'')/ /^ \.NEXT_PUBLIC_NEW_ACCOUNT_MARKER_THRESHOLD_IN_DAYS$/d - }' lib/constants.ts + }' lib/constants.ts 2>/dev/null || true sed -i '/^export const YOUNG_ACCOUNT_MARKER_THRESHOLD_IN_DAYS = process\.env$/,/^ : 30$/ { s/^export const YOUNG_ACCOUNT_MARKER_THRESHOLD_IN_DAYS = process\.env$/export const YOUNG_ACCOUNT_MARKER_THRESHOLD_IN_DAYS = env('\''NEXT_PUBLIC_YOUNG_ACCOUNT_MARKER_THRESHOLD_IN_DAYS'\'')/ /^ \.NEXT_PUBLIC_YOUNG_ACCOUNT_MARKER_THRESHOLD_IN_DAYS$/d - }' lib/constants.ts + }' lib/constants.ts 2>/dev/null || true sed -i '/^export const HIGH_PROFILE_FOLLOWER_THRESHOLD = process\.env$/,/^ : Infinity$/ { s/^export const HIGH_PROFILE_FOLLOWER_THRESHOLD = process\.env$/export const HIGH_PROFILE_FOLLOWER_THRESHOLD = env('\''NEXT_PUBLIC_HIGH_PROFILE_FOLLOWER_THRESHOLD'\'')/ /^ \.NEXT_PUBLIC_HIGH_PROFILE_FOLLOWER_THRESHOLD$/d - }' lib/constants.ts + }' lib/constants.ts 2>/dev/null || true # Fix parseInt() to handle undefined by adding || '' - sed -i "s/parseInt(env('\([^']*\)'))/parseInt(env('\1') || '0')/g" lib/constants.ts - popd + sed -i "s/parseInt(env('\([^']*\)'))/parseInt(env('\1') || '0')/g" lib/constants.ts 2>/dev/null || true + popd > /dev/null } function at-repos-build-docker-atproto() { @@ -312,6 +328,10 @@ function at-repos-push-docker() { service=${services[$i]} docker tag at-${service}:latest localhost:${dport}/${service}:latest docker push localhost:${dport}/${service}:latest + if [ "$service" == "ozone" ]];then + docker tag at-${service}-web:latest localhost:${dport}/${service}-web:latest + docker push localhost:${dport}/${service}-web:latest + fi done else docker tag at-${1}:latest localhost:${dport}/${1}:latest @@ -326,38 +346,51 @@ function at-repos-pull-docker() { } at-repos-env +case "$1" in + pull) + at-repos-clone + at-repos-pull + exit + ;; + patch) + at-repos-social-app-avatar-write + at-repos-patch-apply-all + at-repos-ozone-patch + show-failed-patches + exit + ;; + build) + at-repos-build-docker-atproto $2 + exit + ;; + push) + at-repos-push-docker $2 + exit + ;; + reset) + at-repos-push-reset + exit + ;; + down) + cd $d;docker compose down + exit + ;; +esac + case "`cat /etc/hostname`" in at) at-repos-pull-docker exit ;; *) - if [ "$1" = "r" ];then - at-repos-push-reset - exit - fi at-repos-clone at-repos-pull - at-repos-social-app-icon - at-repos-social-app-icon-origin at-repos-social-app-avatar-write - at-repos-social-app-agent-patch - at-repos-social-app-disable-external-services-patch - at-repos-social-app-statsig-patch - at-repos-social-app-dockerfile-yarn-timeout-patch - at-repos-atproto-service-bsky-api-patch - at-repos-atproto-service-pds-index-patch - at-repos-atproto-oauth-same-site-patch - at-repos-atproto-service-ozone-api-patch + at-repos-patch-apply-all at-repos-ozone-patch - if [ -n "$1" ];then - at-repos-build-docker-atproto $1 - at-repos-push-docker $1 - exit - fi + show-failed-patches at-repos-build-docker-atproto at-repos-push-docker cd $d; docker compose down ;; esac - diff --git a/patching/180-social-app-logotype.patch b/patching/180-social-app-logotype.patch new file mode 100644 index 0000000..2003855 --- /dev/null +++ b/patching/180-social-app-logotype.patch @@ -0,0 +1,51 @@ +--- src/view/icons/Logotype.tsx 2025-12-03 22:43:39 ++++ /Users/syui/ai/at/patching/Logotype.tsx 2025-12-06 13:05:03 +@@ -1,4 +1,5 @@ +-import Svg, {Path, type PathProps, type SvgProps} from 'react-native-svg' ++import React from 'react' ++import Svg, {Path, SvgProps, PathProps} from 'react-native-svg' + + import {usePalette} from '#/lib/hooks/usePalette' + +@@ -15,14 +16,37 @@ + return ( + +- ++ ++ ++ ++ ++ ++ ++ ++ + + ) + }