pico
created pr with
23.1
added 23.2
1: 5f908b4 = 1: 5f908b4 feat(imgs): pubsub
-: ------- > 2: a8dfc59 chore: comment local dev since i keep forgetting how to do it
changed status to
open
changed status to
accepted
cmds
checkout latest patchset:
ssh pr.pico.sh print 23 | git am -3checkout any patchset in a patch request:
ssh pr.pico.sh print 23.[rev] | git am -3add changes to patch request:
git format-patch main --stdout | ssh pr.pico.sh pr add 23set PR to open (enables RSS notifications):
ssh pr.pico.sh pr open 23set PR to draft (stops RSS notifications):
ssh pr.pico.sh pr draft 23
Patchset
23.1
feat(imgs): pubsub
Eric Bower
2024-08-31T03:03:08ZSemantic diff summary
3 added,
6 modified,
1 signature changed,
0 removed
across 2 analyzed files
(2 files skipped: unsupported file type)
+20
-17
go.mod
#
| ... | ... | @@ -8,6 +8,8 @@ go 1.22 | |
| 8 | 8 | ||
| 9 | 9 | // replace github.com/picosh/pobj => ../pobj | |
| 10 | 10 | ||
| 11 | + | // replace github.com/picosh/pubsub => ../pubsub | |
| 12 | + | ||
| 11 | 13 | replace git.sr.ht/~delthas/senpai => github.com/picosh/senpai v0.0.0-20240503200611-af89e73973b0 | |
| 12 | 14 | ||
| 13 | 15 | replace github.com/gdamore/tcell/v2 => github.com/delthas/tcell/v2 v2.4.1-0.20230710100648-1489e78d90fb |
| ... | ... | @@ -17,22 +19,24 @@ require ( | |
| 17 | 19 | github.com/alecthomas/chroma/v2 v2.14.0 | |
| 18 | 20 | github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de | |
| 19 | 21 | github.com/charmbracelet/bubbles v0.18.0 | |
| 20 | - | github.com/charmbracelet/bubbletea v0.26.4 | |
| 22 | + | github.com/charmbracelet/bubbletea v0.27.0 | |
| 21 | 23 | github.com/charmbracelet/glamour v0.7.0 | |
| 22 | - | github.com/charmbracelet/lipgloss v0.11.0 | |
| 24 | + | github.com/charmbracelet/lipgloss v0.12.1 | |
| 23 | 25 | github.com/charmbracelet/promwish v0.7.0 | |
| 24 | - | github.com/charmbracelet/ssh v0.0.0-20240531200420-04041eb117c7 | |
| 25 | - | github.com/charmbracelet/wish v1.4.0 | |
| 26 | + | github.com/charmbracelet/ssh v0.0.0-20240725163421-eb71b85b27aa | |
| 27 | + | github.com/charmbracelet/wish v1.4.2 | |
| 26 | 28 | github.com/google/go-cmp v0.6.0 | |
| 29 | + | github.com/google/uuid v1.6.0 | |
| 27 | 30 | github.com/gorilla/feeds v1.1.2 | |
| 28 | 31 | github.com/lib/pq v1.10.9 | |
| 29 | 32 | github.com/microcosm-cc/bluemonday v1.0.26 | |
| 30 | 33 | github.com/minio/minio-go/v7 v7.0.70 | |
| 31 | 34 | github.com/mmcdole/gofeed v1.3.0 | |
| 32 | 35 | github.com/muesli/reflow v0.3.0 | |
| 33 | - | github.com/muesli/termenv v0.15.2 | |
| 36 | + | github.com/muesli/termenv v0.15.3-0.20240509142007-81b8f94111d5 | |
| 34 | 37 | github.com/neurosnap/go-exif-remove v0.0.0-20221010134343-50d1e3c35577 | |
| 35 | 38 | github.com/picosh/pobj v0.0.0-20240709135546-27097077b26a | |
| 39 | + | github.com/picosh/pubsub v0.0.0-20240831030146-b59a4c387b79 | |
| 36 | 40 | github.com/picosh/send v0.0.0-20240820031602-5d3b1a4494cc | |
| 37 | 41 | github.com/picosh/tunkit v0.0.0-20240709033345-8315d4f3cd0e | |
| 38 | 42 | github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 |
| ... | ... | @@ -61,12 +65,12 @@ require ( | |
| 61 | 65 | github.com/aymerick/douceur v0.2.0 // indirect | |
| 62 | 66 | github.com/beorn7/perks v1.0.1 // indirect | |
| 63 | 67 | github.com/cespare/xxhash/v2 v2.3.0 // indirect | |
| 64 | - | github.com/charmbracelet/keygen v0.5.0 // indirect | |
| 68 | + | github.com/charmbracelet/keygen v0.5.1 // indirect | |
| 65 | 69 | github.com/charmbracelet/log v0.4.0 // indirect | |
| 66 | - | github.com/charmbracelet/x/ansi v0.1.2 // indirect | |
| 70 | + | github.com/charmbracelet/x/ansi v0.1.4 // indirect | |
| 71 | + | github.com/charmbracelet/x/conpty v0.1.0 // indirect | |
| 67 | 72 | github.com/charmbracelet/x/errors v0.0.0-20240603171354-f37319acd141 // indirect | |
| 68 | - | github.com/charmbracelet/x/exp/term v0.0.0-20240603171354-f37319acd141 // indirect | |
| 69 | - | github.com/charmbracelet/x/input v0.1.2 // indirect | |
| 73 | + | github.com/charmbracelet/x/input v0.1.3 // indirect | |
| 70 | 74 | github.com/charmbracelet/x/term v0.1.1 // indirect | |
| 71 | 75 | github.com/charmbracelet/x/termios v0.1.0 // indirect | |
| 72 | 76 | github.com/charmbracelet/x/windows v0.1.2 // indirect |
| ... | ... | @@ -96,7 +100,6 @@ require ( | |
| 96 | 100 | github.com/golang/geo v0.0.0-20230421003525-6adc56603217 // indirect | |
| 97 | 101 | github.com/golang/protobuf v1.5.4 // indirect | |
| 98 | 102 | github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect | |
| 99 | - | github.com/google/uuid v1.6.0 // indirect | |
| 100 | 103 | github.com/gorilla/css v1.0.1 // indirect | |
| 101 | 104 | github.com/json-iterator/go v1.1.12 // indirect | |
| 102 | 105 | github.com/klauspost/compress v1.17.8 // indirect |
| ... | ... | @@ -143,11 +146,11 @@ require ( | |
| 143 | 146 | github.com/yusufpapurcu/wmi v1.2.4 // indirect | |
| 144 | 147 | golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc // indirect | |
| 145 | 148 | golang.org/x/net v0.25.0 // indirect | |
| 146 | - | golang.org/x/sync v0.7.0 // indirect | |
| 147 | - | golang.org/x/sys v0.20.0 // indirect | |
| 148 | - | golang.org/x/term v0.20.0 // indirect | |
| 149 | - | golang.org/x/text v0.15.0 // indirect | |
| 150 | - | golang.org/x/time v0.5.0 // indirect | |
| 149 | + | golang.org/x/sync v0.8.0 // indirect | |
| 150 | + | golang.org/x/sys v0.24.0 // indirect | |
| 151 | + | golang.org/x/term v0.23.0 // indirect | |
| 152 | + | golang.org/x/text v0.17.0 // indirect | |
| 153 | + | golang.org/x/time v0.6.0 // indirect | |
| 151 | 154 | google.golang.org/protobuf v1.34.1 // indirect | |
| 152 | 155 | gopkg.in/ini.v1 v1.67.0 // indirect | |
| 153 | 156 | mvdan.cc/xurls/v2 v2.5.0 // indirect |
+32
-30
go.sum
#
| ... | ... | @@ -31,30 +31,30 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF | |
| 31 | 31 | github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | |
| 32 | 32 | github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0= | |
| 33 | 33 | github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= | |
| 34 | - | github.com/charmbracelet/bubbletea v0.26.4 h1:2gDkkzLZaTjMl/dQBpNVtnvcCxsh/FCkimep7FC9c40= | |
| 35 | - | github.com/charmbracelet/bubbletea v0.26.4/go.mod h1:P+r+RRA5qtI1DOHNFn0otoNwB4rn+zNAzSj/EXz6xU0= | |
| 34 | + | github.com/charmbracelet/bubbletea v0.27.0 h1:Mznj+vvYuYagD9Pn2mY7fuelGvP0HAXtZYGgRBCbHvU= | |
| 35 | + | github.com/charmbracelet/bubbletea v0.27.0/go.mod h1:5MdP9XH6MbQkgGhnlxUqCNmBXf9I74KRQ8HIidRxV1Y= | |
| 36 | 36 | github.com/charmbracelet/glamour v0.7.0 h1:2BtKGZ4iVJCDfMF229EzbeR1QRKLWztO9dMtjmqZSng= | |
| 37 | 37 | github.com/charmbracelet/glamour v0.7.0/go.mod h1:jUMh5MeihljJPQbJ/wf4ldw2+yBP59+ctV36jASy7ps= | |
| 38 | - | github.com/charmbracelet/keygen v0.5.0 h1:XY0fsoYiCSM9axkrU+2ziE6u6YjJulo/b9Dghnw6MZc= | |
| 39 | - | github.com/charmbracelet/keygen v0.5.0/go.mod h1:DfvCgLHxZ9rJxdK0DGw3C/LkV4SgdGbnliHcObV3L+8= | |
| 40 | - | github.com/charmbracelet/lipgloss v0.11.0 h1:UoAcbQ6Qml8hDwSWs0Y1cB5TEQuZkDPH/ZqwWWYTG4g= | |
| 41 | - | github.com/charmbracelet/lipgloss v0.11.0/go.mod h1:1UdRTH9gYgpcdNN5oBtjbu/IzNKtzVtb7sqN1t9LNn8= | |
| 38 | + | github.com/charmbracelet/keygen v0.5.1 h1:zBkkYPtmKDVTw+cwUyY6ZwGDhRxXkEp0Oxs9sqMLqxI= | |
| 39 | + | github.com/charmbracelet/keygen v0.5.1/go.mod h1:zznJVmK/GWB6dAtjluqn2qsttiCBhA5MZSiwb80fcHw= | |
| 40 | + | github.com/charmbracelet/lipgloss v0.12.1 h1:/gmzszl+pedQpjCOH+wFkZr/N90Snz40J/NR7A0zQcs= | |
| 41 | + | github.com/charmbracelet/lipgloss v0.12.1/go.mod h1:V2CiwIuhx9S1S1ZlADfOj9HmxeMAORuz5izHb0zGbB8= | |
| 42 | 42 | github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8ZM= | |
| 43 | 43 | github.com/charmbracelet/log v0.4.0/go.mod h1:63bXt/djrizTec0l11H20t8FDSvA4CRZJ1KH22MdptM= | |
| 44 | 44 | github.com/charmbracelet/promwish v0.7.0 h1:oaMH+ey6W4DDIv1xucS8jL1ik/Q46qxjNXlh6XxEm+s= | |
| 45 | 45 | github.com/charmbracelet/promwish v0.7.0/go.mod h1:WbRJN9irg8LmsBU8G2rFF8md9O3rSg63qrnqquP/+cs= | |
| 46 | - | github.com/charmbracelet/ssh v0.0.0-20240531200420-04041eb117c7 h1:BTAPOJlz5Q9TUl3HxAc2g04KS9DzSUtKapvXg7pRhwE= | |
| 47 | - | github.com/charmbracelet/ssh v0.0.0-20240531200420-04041eb117c7/go.mod h1:yDZEh+wUCh2sszpTfFQ494YHQpHaJQ0zsIy4BTr1gVw= | |
| 48 | - | github.com/charmbracelet/wish v1.4.0 h1:pL1uVP/YuYgJheHEj98teZ/n6pMYnmlZq/fcHvomrfc= | |
| 49 | - | github.com/charmbracelet/wish v1.4.0/go.mod h1:ew4/MjJVfW/akEO9KmrQHQv1F7bQRGscRMrA+KtovTk= | |
| 50 | - | github.com/charmbracelet/x/ansi v0.1.2 h1:6+LR39uG8DE6zAmbu023YlqjJHkYXDF1z36ZwzO4xZY= | |
| 51 | - | github.com/charmbracelet/x/ansi v0.1.2/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= | |
| 46 | + | github.com/charmbracelet/ssh v0.0.0-20240725163421-eb71b85b27aa h1:6rePgmsJguB6Z7Y55stsEVDlWFJoUpQvOX4mdnBjgx4= | |
| 47 | + | github.com/charmbracelet/ssh v0.0.0-20240725163421-eb71b85b27aa/go.mod h1:LmMZag2g7ILMmWtDmU7dIlctUopwmb73KpPzj0ip1uk= | |
| 48 | + | github.com/charmbracelet/wish v1.4.2 h1:H2BKXewugK9Al75wST9h0hpQ95h981RZ5rtimDpygPQ= | |
| 49 | + | github.com/charmbracelet/wish v1.4.2/go.mod h1:3Bzq7qMU2LTvdaM61KrCnhrzGP92D/Ru7CasrpyZmzY= | |
| 50 | + | github.com/charmbracelet/x/ansi v0.1.4 h1:IEU3D6+dWwPSgZ6HBH+v6oUuZ/nVawMiWj5831KfiLM= | |
| 51 | + | github.com/charmbracelet/x/ansi v0.1.4/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= | |
| 52 | + | github.com/charmbracelet/x/conpty v0.1.0 h1:4zc8KaIcbiL4mghEON8D72agYtSeIgq8FSThSPQIb+U= | |
| 53 | + | github.com/charmbracelet/x/conpty v0.1.0/go.mod h1:rMFsDJoDwVmiYM10aD4bH2XiRgwI7NYJtQgl5yskjEQ= | |
| 52 | 54 | github.com/charmbracelet/x/errors v0.0.0-20240603171354-f37319acd141 h1:9S0jGt7wdFksixTHjDn30qWOUu6LPmPidnO42roe+Ek= | |
| 53 | 55 | github.com/charmbracelet/x/errors v0.0.0-20240603171354-f37319acd141/go.mod h1:2P0UgXMEa6TsToMSuFqKFQR+fZTO9CNGUNokkPatT/0= | |
| 54 | - | github.com/charmbracelet/x/exp/term v0.0.0-20240603171354-f37319acd141 h1:/uoDqgv4S+M5XVUrkSxSq5rARNAbSXVRmRqnwXzIKlQ= | |
| 55 | - | github.com/charmbracelet/x/exp/term v0.0.0-20240603171354-f37319acd141/go.mod h1:YBotIGhfoWhHDlnUpJMkjebGV2pdGRCn1Y4/Nk/vVcU= | |
| 56 | - | github.com/charmbracelet/x/input v0.1.2 h1:QJAZr33eOhDowkkEQ24rsJy4Llxlm+fRDf/cQrmqJa0= | |
| 57 | - | github.com/charmbracelet/x/input v0.1.2/go.mod h1:LGBim0maUY4Pitjn/4fHnuXb4KirU3DODsyuHuXdOyA= | |
| 56 | + | github.com/charmbracelet/x/input v0.1.3 h1:oy4TMhyGQsYs/WWJwu1ELUMFnjiUAXwtDf048fHbCkg= | |
| 57 | + | github.com/charmbracelet/x/input v0.1.3/go.mod h1:1gaCOyw1KI9e2j00j/BBZ4ErzRZqa05w0Ghn83yIhKU= | |
| 58 | 58 | github.com/charmbracelet/x/term v0.1.1 h1:3cosVAiPOig+EV4X9U+3LDgtwwAoEzJjNdwbXDjF6yI= | |
| 59 | 59 | github.com/charmbracelet/x/term v0.1.1/go.mod h1:wB1fHt5ECsu3mXYusyzcngVWWlu1KKUmmLhfgr/Flxw= | |
| 60 | 60 | github.com/charmbracelet/x/termios v0.1.0 h1:y4rjAHeFksBAfGbkRDmVinMg7x7DELIGAFbdNvxg97k= |
| ... | ... | @@ -210,8 +210,8 @@ github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELU | |
| 210 | 210 | github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= | |
| 211 | 211 | github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= | |
| 212 | 212 | github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= | |
| 213 | - | github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= | |
| 214 | - | github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= | |
| 213 | + | github.com/muesli/termenv v0.15.3-0.20240509142007-81b8f94111d5 h1:NiONcKK0EV5gUZcnCiPMORaZA0eBDc+Fgepl9xl4lZ8= | |
| 214 | + | github.com/muesli/termenv v0.15.3-0.20240509142007-81b8f94111d5/go.mod h1:hxSnBBYLK21Vtq/PHd0S2FYCxBXzBua8ov5s1RobyRQ= | |
| 215 | 215 | github.com/neurosnap/go-exif-remove v0.0.0-20221010134343-50d1e3c35577 h1:hVmVNttSLNloGsbFKVXAUHonXTd8KKrv30U/8UkloKI= | |
| 216 | 216 | github.com/neurosnap/go-exif-remove v0.0.0-20221010134343-50d1e3c35577/go.mod h1:G3Cu1AW+dmRLDFpOi8eUAfc3cGoRHUjTkGjeRcndgl4= | |
| 217 | 217 | github.com/neurosnap/go-jpeg-image-structure v0.0.0-20221010133817-70b1c1ff679e h1:76Dng5ms0fR+26doKZAvNqhi2UPfnLxGfPIDEr+BBlM= |
| ... | ... | @@ -224,6 +224,8 @@ github.com/picosh/go-rsync-receiver v0.0.0-20240709135253-1daf4b12a9fc h1:bvcsoO | |
| 224 | 224 | github.com/picosh/go-rsync-receiver v0.0.0-20240709135253-1daf4b12a9fc/go.mod h1:i0iR3W4GSm1PuvVxB9OH32E5jP+CYkVb2NQSe0JCtlo= | |
| 225 | 225 | github.com/picosh/pobj v0.0.0-20240709135546-27097077b26a h1:Cr1xODiyd/SjjBRtYA9VX6Do3D+w+DansQzkb4NGeyA= | |
| 226 | 226 | github.com/picosh/pobj v0.0.0-20240709135546-27097077b26a/go.mod h1:VIkR1MZBvxSK2OO47jikxikAO/sKb/vTmXX5ZuYTIvo= | |
| 227 | + | github.com/picosh/pubsub v0.0.0-20240831030146-b59a4c387b79 h1:QqOtaebSRNXS0FA74bRJUHEESMM4KTmOZ3otXjS+Pss= | |
| 228 | + | github.com/picosh/pubsub v0.0.0-20240831030146-b59a4c387b79/go.mod h1:FKC8uot+40iXmuDzTfbxYDG5PIc3ghwkmP2iItBKH0I= | |
| 227 | 229 | github.com/picosh/send v0.0.0-20240820031602-5d3b1a4494cc h1:IIsJuAFG2ju3cygKVKTIsYYZf21q5S3Dr1H4fGbfgJg= | |
| 228 | 230 | github.com/picosh/send v0.0.0-20240820031602-5d3b1a4494cc/go.mod h1:RAgLDK3LrDK6pNeXtU9tjo28obl5DxShcTUk2nm/KCM= | |
| 229 | 231 | github.com/picosh/senpai v0.0.0-20240503200611-af89e73973b0 h1:pBRIbiCj7K6rGELijb//dYhyCo8A3fvxW5dijrJVtjs= |
| ... | ... | @@ -322,8 +324,8 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh | |
| 322 | 324 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | |
| 323 | 325 | golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= | |
| 324 | 326 | golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= | |
| 325 | - | golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= | |
| 326 | - | golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= | |
| 327 | + | golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= | |
| 328 | + | golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= | |
| 327 | 329 | golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc h1:O9NuF4s+E/PvMIy+9IUZB9znFwUIXEWSstNjek6VpVg= | |
| 328 | 330 | golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= | |
| 329 | 331 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= |
| ... | ... | @@ -349,8 +351,8 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ | |
| 349 | 351 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |
| 350 | 352 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |
| 351 | 353 | golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | |
| 352 | - | golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= | |
| 353 | - | golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= | |
| 354 | + | golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= | |
| 355 | + | golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= | |
| 354 | 356 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | |
| 355 | 357 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |
| 356 | 358 | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= |
| ... | ... | @@ -368,8 +370,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |
| 368 | 370 | golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |
| 369 | 371 | golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | |
| 370 | 372 | golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | |
| 371 | - | golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= | |
| 372 | - | golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | |
| 373 | + | golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= | |
| 374 | + | golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | |
| 373 | 375 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | |
| 374 | 376 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | |
| 375 | 377 | golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= |
| ... | ... | @@ -377,8 +379,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= | |
| 377 | 379 | golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= | |
| 378 | 380 | golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= | |
| 379 | 381 | golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= | |
| 380 | - | golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= | |
| 381 | - | golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= | |
| 382 | + | golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= | |
| 383 | + | golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= | |
| 382 | 384 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | |
| 383 | 385 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | |
| 384 | 386 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= |
| ... | ... | @@ -386,11 +388,11 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= | |
| 386 | 388 | golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= | |
| 387 | 389 | golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= | |
| 388 | 390 | golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= | |
| 389 | - | golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= | |
| 390 | - | golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= | |
| 391 | + | golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= | |
| 392 | + | golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= | |
| 391 | 393 | golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= | |
| 392 | - | golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= | |
| 393 | - | golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= | |
| 394 | + | golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= | |
| 395 | + | golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= | |
| 394 | 396 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | |
| 395 | 397 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | |
| 396 | 398 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= |
+11
-0
imgs/cli.go
#
| ... | ... | @@ -12,11 +12,13 @@ import ( | |
| 12 | 12 | ||
| 13 | 13 | "github.com/charmbracelet/ssh" | |
| 14 | 14 | "github.com/charmbracelet/wish" | |
| 15 | + | "github.com/google/uuid" | |
| 15 | 16 | "github.com/picosh/pico/db" | |
| 16 | 17 | "github.com/picosh/pico/shared" | |
| 17 | 18 | "github.com/picosh/pico/shared/storage" | |
| 18 | 19 | "github.com/picosh/pico/tui/common" | |
| 19 | 20 | sst "github.com/picosh/pobj/storage" | |
| 21 | + | psub "github.com/picosh/pubsub" | |
| 20 | 22 | "github.com/picosh/send/send/utils" | |
| 21 | 23 | ) | |
| 22 | 24 |
| ... | ... | @@ -186,12 +188,14 @@ type CliHandler struct { | |
| 186 | 188 | Logger *slog.Logger | |
| 187 | 189 | Storage storage.StorageServe | |
| 188 | 190 | RegistryUrl string | |
| 191 | + | PubSub *psub.Cfg | |
| 189 | 192 | } | |
| 190 | 193 | ||
| 191 | 194 | func WishMiddleware(handler *CliHandler) wish.Middleware { | |
| 192 | 195 | dbpool := handler.DBPool | |
| 193 | 196 | log := handler.Logger | |
| 194 | 197 | st := handler.Storage | |
| 198 | + | pubsub := handler.PubSub | |
| 195 | 199 | ||
| 196 | 200 | return func(next ssh.Handler) ssh.Handler { | |
| 197 | 201 | return func(sesh ssh.Session) { |
| ... | ... | @@ -254,6 +258,13 @@ func WishMiddleware(handler *CliHandler) wish.Middleware { | |
| 254 | 258 | opts.notice() | |
| 255 | 259 | opts.bail(err) | |
| 256 | 260 | return | |
| 261 | + | } else if cmd == "sub" { | |
| 262 | + | pubsub.PubSub.Sub(&psub.Subscriber{ | |
| 263 | + | ID: uuid.NewString(), | |
| 264 | + | Name: fmt.Sprintf("%s@%s", user.Name, repoName), | |
| 265 | + | Session: sesh, | |
| 266 | + | Chan: make(chan error), | |
| 267 | + | }) | |
| 257 | 268 | } else { | |
| 258 | 269 | next(sesh) | |
| 259 | 270 | return |
+44
-43
imgs/ssh.go
#
| ... | ... | @@ -40,6 +41,19 @@ func setUserCtx(ctx ssh.Context, user *db.User) { | |
| 40 | 41 | ctx.SetValue(ctxUserKey{}, user) | |
| 41 | 42 | } | |
| 42 | 43 | ||
| 44 | + | type ctxPubkeyKey struct{} | |
| 45 | + | ||
| 46 | + | func getPubkeyCtx(ctx ssh.Context) (*ssh.PublicKey, error) { | |
| 47 | + | user, ok := ctx.Value(ctxUserKey{}).(*ssh.PublicKey) | |
| 48 | + | if user == nil || !ok { | |
| 49 | + | return user, fmt.Errorf("pubkey not set on `ssh.Context()` for connection") | |
| 50 | + | } | |
| 51 | + | return user, nil | |
| 52 | + | } | |
| 53 | + | func setPubkeyCtx(ctx ssh.Context, pk *ssh.PublicKey) { | |
| 54 | + | ctx.SetValue(ctxPubkeyKey{}, pk) | |
| 55 | + | } | |
| 56 | + | ||
| 43 | 57 | func AuthHandler(dbh db.DB, log *slog.Logger) func(ssh.Context, ssh.PublicKey) bool { | |
| 44 | 58 | return func(ctx ssh.Context, key ssh.PublicKey) bool { | |
| 45 | 59 | kk, err := shared.KeyForKeyText(key) |
| ... | ... | @@ -79,7 +95,7 @@ func (e *ErrorHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |
| 79 | 95 | http.Error(w, e.Err.Error(), http.StatusInternalServerError) | |
| 80 | 96 | } | |
| 81 | 97 | ||
| 82 | - | func createServeMux(handler *CliHandler, pubsub *tunkit.PubSubHandler) func(ctx ssh.Context) http.Handler { | |
| 98 | + | func createServeMux(handler *CliHandler, pubsub *psub.Cfg) func(ctx ssh.Context) http.Handler { | |
| 83 | 99 | return func(ctx ssh.Context) http.Handler { | |
| 84 | 100 | router := http.NewServeMux() | |
| 85 | 101 |
| ... | ... | @@ -89,12 +105,6 @@ func createServeMux(handler *CliHandler, pubsub *tunkit.PubSubHandler) func(ctx | |
| 89 | 105 | slug = user.Name | |
| 90 | 106 | } | |
| 91 | 107 | ||
| 92 | - | pubkeys, err := handler.DBPool.FindKeysForUser(user) | |
| 93 | - | if err != nil { | |
| 94 | - | handler.Logger.Error("cant get pubkeys for user", "err", err) | |
| 95 | - | return router | |
| 96 | - | } | |
| 97 | - | ||
| 98 | 108 | proxy := httputil.NewSingleHostReverseProxy(&url.URL{ | |
| 99 | 109 | Scheme: "http", | |
| 100 | 110 | Host: handler.RegistryUrl, |
| ... | ... | @@ -221,41 +231,26 @@ func createServeMux(handler *CliHandler, pubsub *tunkit.PubSubHandler) func(ctx | |
| 221 | 231 | ||
| 222 | 232 | if r.Request.Method == http.MethodPut && strings.Contains(r.Request.URL.Path, "/manifests/") { | |
| 223 | 233 | digest := r.Header.Get("Docker-Content-Digest") | |
| 224 | - | forwards := pubsub.GetForwards() | |
| 225 | - | for _, rf := range forwards { | |
| 226 | - | ck, err := shared.KeyForKeyText(rf.Pubkey) | |
| 227 | - | if err != nil { | |
| 228 | - | continue | |
| 229 | - | } | |
| 230 | - | found := false | |
| 231 | - | for _, pk := range pubkeys { | |
| 232 | - | if pk.Key == ck { | |
| 233 | - | found = true | |
| 234 | - | } | |
| 235 | - | } | |
| 236 | - | // event corresponds to a different user, skip | |
| 237 | - | if !found { | |
| 238 | - | continue | |
| 239 | - | } | |
| 234 | + | // [ ]/v2/erock/alpine/manifests/latest | |
| 235 | + | splitPath := strings.Split(r.Request.URL.Path, "/") | |
| 236 | + | img := splitPath[3] | |
| 237 | + | tag := splitPath[5] | |
| 238 | + | ||
| 239 | + | furl := fmt.Sprintf( | |
| 240 | + | "digest=%s&image=%s&tag=%s", | |
| 241 | + | url.QueryEscape(digest), | |
| 242 | + | img, | |
| 243 | + | tag, | |
| 244 | + | ) | |
| 245 | + | handler.Logger.Info("sending event", "url", furl) | |
| 246 | + | ||
| 247 | + | err := pubsub.PubSub.Pub(&psub.Msg{ | |
| 248 | + | Name: fmt.Sprintf("%s@%s:%s", user.Name, img, tag), | |
| 249 | + | Reader: strings.NewReader(furl), | |
| 250 | + | }) | |
| 240 | 251 | ||
| 241 | - | // [ ]/v2/erock/alpine/manifests/latest | |
| 242 | - | splitPath := strings.Split(r.Request.URL.Path, "/") | |
| 243 | - | img := splitPath[3] | |
| 244 | - | tag := splitPath[5] | |
| 245 | - | ||
| 246 | - | addr := rf.Listener.Addr() | |
| 247 | - | furl := fmt.Sprintf( | |
| 248 | - | "http://%s?digest=%s&image=%s&tag=%s", | |
| 249 | - | addr.String(), | |
| 250 | - | url.QueryEscape(digest), | |
| 251 | - | img, | |
| 252 | - | tag, | |
| 253 | - | ) | |
| 254 | - | handler.Logger.Info("sending event", "url", furl) | |
| 255 | - | _, err = http.Get(furl) | |
| 256 | - | if err != nil { | |
| 257 | - | handler.Logger.Error("could not make request to pubsub", "err", err) | |
| 258 | - | } | |
| 252 | + | if err != nil { | |
| 253 | + | handler.Logger.Error("pub error", "err", err) | |
| 259 | 254 | } | |
| 260 | 255 | } | |
| 261 | 256 |
| ... | ... | @@ -296,14 +291,21 @@ func StartSshServer() { | |
| 296 | 291 | panic(err) | |
| 297 | 292 | } | |
| 298 | 293 | ||
| 294 | + | pubsub := &psub.Cfg{ | |
| 295 | + | Logger: logger, | |
| 296 | + | PubSub: &psub.PubSubMulticast{ | |
| 297 | + | Logger: logger, | |
| 298 | + | }, | |
| 299 | + | } | |
| 300 | + | ||
| 299 | 301 | handler := &CliHandler{ | |
| 300 | 302 | Logger: logger, | |
| 301 | 303 | DBPool: dbh, | |
| 302 | 304 | Storage: st, | |
| 303 | 305 | RegistryUrl: registryUrl, | |
| 306 | + | PubSub: pubsub, | |
| 304 | 307 | } | |
| 305 | 308 | ||
| 306 | - | pubsub := tunkit.NewPubSubHandler(logger) | |
| 307 | 309 | s, err := wish.NewServer( | |
| 308 | 310 | wish.WithAddress(fmt.Sprintf("%s:%s", host, port)), | |
| 309 | 311 | wish.WithHostKeyPath("ssh_data/term_info_ed25519"), |