1# Soft Serve
  2
  3<p>
  4    <img style="width: 451px" src="https://stuff.charm.sh/soft-serve/soft-serve-header.png?0" alt="A nice rendering of some melting ice cream with the words āCharm Soft Serveā next to it"><br>
  5    <a href="https://github.com/charmbracelet/soft-serve/releases"><img src="https://img.shields.io/github/release/charmbracelet/soft-serve.svg" alt="Latest Release"></a>
  6    <a href="https://pkg.go.dev/github.com/charmbracelet/soft-serve?tab=doc"><img src="https://godoc.org/github.com/golang/gddo?status.svg" alt="GoDoc"></a>
  7    <a href="https://github.com/charmbracelet/soft-serve/actions"><img src="https://github.com/charmbracelet/soft-serve/workflows/build/badge.svg" alt="Build Status"></a>
  8    <a href="https://nightly.link/charmbracelet/soft-serve/workflows/nightly/main"><img src="https://shields.io/badge/-Nightly%20Builds-orange?logo=hackthebox&logoColor=fff&style=appveyor"/></a>
  9</p>
 10
 11A tasty, self-hostable Git server for the command line. š¦
 12
 13<picture>
 14  <source media="(max-width: 750px)" srcset="https://github.com/charmbracelet/soft-serve/assets/42545625/c754c746-dc4c-44a6-9c39-28649264cbf2">
 15  <source media="(min-width: 750px)" width="750" srcset="https://github.com/charmbracelet/soft-serve/assets/42545625/c754c746-dc4c-44a6-9c39-28649264cbf2">
 16  <img src="https://github.com/charmbracelet/soft-serve/assets/42545625/c754c746-dc4c-44a6-9c39-28649264cbf2" alt="Soft Serve screencast">
 17</picture>
 18
 19- Easy to navigate TUI available over SSH
 20- Clone repos over SSH, HTTP, or Git protocol
 21- Git LFS support with both HTTP and SSH backends
 22- Manage repos with SSH
 23- Create repos on demand with SSH or `git push`
 24- Browse repos, files and commits with SSH-accessible UI
 25- Print files over SSH with or without syntax highlighting and line numbers
 26- Easy access control
 27  - SSH authentication using public keys
 28  - Allow/disallow anonymous access
 29  - Add collaborators with SSH public keys
 30  - Repos can be public or private
 31  - User access tokens
 32
 33## Where can I see it?
 34
 35Just run `ssh git.charm.sh` for an example. You can also try some of the following commands:
 36
 37```bash
 38# Jump directly to a repo in the TUI
 39ssh git.charm.sh -t soft-serve
 40
 41# Print out a directory tree for a repo
 42ssh git.charm.sh repo tree soft-serve
 43
 44# Print a specific file
 45ssh git.charm.sh repo blob soft-serve cmd/soft/main.go
 46
 47# Print a file with syntax highlighting and line numbers
 48ssh git.charm.sh repo blob soft-serve cmd/soft/main.go -c -l
 49```
 50
 51Or you can use Soft Serve to browse local repositories using `soft browse
 52[directory]` or running `soft` within a Git repository.
 53
 54## Installation
 55
 56Soft Serve is a single binary called `soft`. You can get it from a package
 57manager:
 58
 59```bash
 60# macOS or Linux
 61brew install charmbracelet/tap/soft-serve
 62
 63# Windows (with Winget)
 64winget install charmbracelet.soft-serve
 65
 66# Arch Linux
 67pacman -S soft-serve
 68
 69# Nix
 70nix-env -iA nixpkgs.soft-serve
 71
 72# Debian/Ubuntu
 73sudo mkdir -p /etc/apt/keyrings
 74curl -fsSL https://repo.charm.sh/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/charm.gpg
 75echo "deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *" | sudo tee /etc/apt/sources.list.d/charm.list
 76sudo apt update && sudo apt install soft-serve
 77
 78# Fedora/RHEL
 79echo '[charm]
 80name=Charm
 81baseurl=https://repo.charm.sh/yum/
 82enabled=1
 83gpgcheck=1
 84gpgkey=https://repo.charm.sh/yum/gpg.key' | sudo tee /etc/yum.repos.d/charm.repo
 85sudo yum install soft-serve
 86```
 87
 88You can also download a binary from the [releases][releases] page. Packages are
 89available in Alpine, Debian, and RPM formats. Binaries are available for Linux,
 90macOS, and Windows.
 91
 92[releases]: https://github.com/charmbracelet/soft-serve/releases
 93
 94Or just install it with `go`:
 95
 96```bash
 97go install github.com/charmbracelet/soft-serve/cmd/soft@latest
 98```
 99
100A [Docker image][docker] is also available.
101
102[docker]: https://github.com/charmbracelet/soft-serve/blob/main/docker.md
103
104## Setting up a server
105
106Make sure `git` is installed, then run `soft serve`. Thatās it.
107
108This will create a `data` directory that will store all the repos, ssh keys,
109and database.
110
111By default, program configuration is stored within the `data` directory. But,
112this can be overridden by setting a custom path to a config file with `SOFT_SERVE_CONFIG_LOCATION`
113that is pre-created. If a config file pointed to by `SOFT_SERVE_CONFIG_LOCATION`, 
114the default location within the `data` dir is used for generating a default config.
115
116To change the default data path use `SOFT_SERVE_DATA_PATH` environment variable.
117
118```sh
119SOFT_SERVE_DATA_PATH=/var/lib/soft-serve soft serve
120```
121
122When you run Soft Serve for the first time, make sure you have the
123`SOFT_SERVE_INITIAL_ADMIN_KEYS` environment variable is set to your ssh
124authorized key. Any added key to this variable will be treated as admin with
125full privileges.
126
127Using this environment variable, Soft Serve will create a new `admin` user that
128has full privileges. You can rename and change the user settings later.
129
130Check out [Systemd][systemd] on how to run Soft Serve as a service using
131Systemd. Soft Serve packages in our Apt/Yum repositories come with Systemd
132service units.
133
134[systemd]: https://github.com/charmbracelet/soft-serve/blob/main/systemd.md
135
136### Server Configuration
137
138Once you start the server for the first time, the settings will be in
139`config.yaml` under your data directory. The default `config.yaml` is
140self-explanatory and will look like this:
141
142```yaml
143# Soft Serve Server configurations
144
145# The name of the server.
146# This is the name that will be displayed in the UI.
147name: "Soft Serve"
148
149# Log format to use. Valid values are "json", "logfmt", and "text".
150log_format: "text"
151
152# The SSH server configuration.
153ssh:
154  # The address on which the SSH server will listen.
155  listen_addr: ":23231"
156
157  # The public URL of the SSH server.
158  # This is the address that will be used to clone repositories.
159  public_url: "ssh://localhost:23231"
160
161  # The path to the SSH server's private key.
162  key_path: "ssh/soft_serve_host"
163
164  # The path to the SSH server's client private key.
165  # This key will be used to authenticate the server to make git requests to
166  # ssh remotes.
167  client_key_path: "ssh/soft_serve_client"
168
169  # The maximum number of seconds a connection can take.
170  # A value of 0 means no timeout.
171  max_timeout: 0
172
173  # The number of seconds a connection can be idle before it is closed.
174  idle_timeout: 120
175
176# The Git daemon configuration.
177git:
178  # The address on which the Git daemon will listen.
179  listen_addr: ":9418"
180
181  # The maximum number of seconds a connection can take.
182  # A value of 0 means no timeout.
183  max_timeout: 0
184
185  # The number of seconds a connection can be idle before it is closed.
186  idle_timeout: 3
187
188  # The maximum number of concurrent connections.
189  max_connections: 32
190
191# The HTTP server configuration.
192http:
193  # The address on which the HTTP server will listen.
194  listen_addr: ":23232"
195
196  # The path to the TLS private key.
197  tls_key_path: ""
198
199  # The path to the TLS certificate.
200  tls_cert_path: ""
201
202  # The public URL of the HTTP server.
203  # This is the address that will be used to clone repositories.
204  # Make sure to use https:// if you are using TLS.
205  public_url: "http://localhost:23232"
206
207  # The cross-origin request security options
208  cors:
209    # The allowed cross-origin headers
210    allowed_headers:
211      - "Accept"
212      - "Accept-Language"
213      - "Content-Language"
214      - "Content-Type"
215      - "Origin"
216      - "X-Requested-With"
217      - "User-Agent"
218      - "Authorization"
219      - "Access-Control-Request-Method"
220      - "Access-Control-Allow-Origin"
221
222    # The allowed cross-origin URLs
223    allowed_origins:
224      - "http://localhost:23232" # always allowed
225      # - "https://example.com"
226
227    # The allowed cross-origin methods
228    allowed_methods:
229      - "GET"
230      - "HEAD"
231      - "POST"
232      - "PUT"
233      - "OPTIONS"
234
235# The database configuration.
236db:
237  # The database driver to use.
238  # Valid values are "sqlite" and "postgres".
239  driver: "sqlite"
240  # The database data source name.
241  # This is driver specific and can be a file path or connection string.
242  # Make sure foreign key support is enabled when using SQLite.
243  data_source: "soft-serve.db?_pragma=busy_timeout(5000)&_pragma=foreign_keys(1)"
244
245# Git LFS configuration.
246lfs:
247  # Enable Git LFS.
248  enabled: true
249  # Enable Git SSH transfer.
250  ssh_enabled: false
251
252# Cron job configuration
253jobs:
254  mirror_pull: "@every 10m"
255
256# The stats server configuration.
257stats:
258  # The address on which the stats server will listen.
259  listen_addr: ":23233"
260# Additional admin keys.
261#initial_admin_keys:
262#  - "ssh-rsa AAAAB3NzaC1yc2..."
263```
264
265You can also use environment variables, to override these settings. All server
266settings environment variables start with `SOFT_SERVE_` followed by the setting
267name all in uppercase. Here are some examples:
268
269- `SOFT_SERVE_NAME`: The name of the server that will appear in the TUI
270- `SOFT_SERVE_SSH_LISTEN_ADDR`: SSH listen address
271- `SOFT_SERVE_SSH_KEY_PATH`: SSH host key-pair path
272- `SOFT_SERVE_HTTP_LISTEN_ADDR`: HTTP listen address
273- `SOFT_SERVE_HTTP_PUBLIC_URL`: HTTP public URL used for cloning
274- `SOFT_SERVE_GIT_MAX_CONNECTIONS`: The number of simultaneous connections to git daemon
275
276#### Database Configuration
277
278Soft Serve supports both SQLite and Postgres for its database. Like all other Soft Serve settings, you can change the database _driver_ and _data source_ using either `config.yaml` or environment variables. The default config uses SQLite as the default database driver.
279
280To use Postgres as your database, first create a Soft Serve database:
281
282```sh
283psql -h<hostname> -p<port> -U<user> -c 'CREATE DATABASE soft_serve'
284```
285
286Then set the database _data source_ to point to your Postgres database. For instance, if you're running Postgres locally, using the default user `postgres` and using a database name `soft_serve`, you would have this config in your config file or environment variable:
287
288```
289db:
290  driver: "postgres"
291  data_source: "postgres://postgres@localhost:5432/soft_serve?sslmode=disable"
292```
293
294Environment variables equivalent:
295
296```sh
297SOFT_SERVE_DB_DRIVER=postgres \
298SOFT_SERVE_DB_DATA_SOURCE="postgres://postgres@localhost:5432/soft_serve?sslmode=disable" \
299soft serve
300```
301
302You can specify a database connection password in the _data source_ url. For example, `postgres://myuser:dbpass@localhost:5432/my_soft_serve_db`.
303
304#### LFS Configuration
305
306Soft Serve supports both Git LFS [HTTP](https://github.com/git-lfs/git-lfs/blob/main/docs/api/README.md) and [SSH](https://github.com/git-lfs/git-lfs/blob/main/docs/proposals/ssh_adapter.md) protocols out of the box, there is no need to do any extra set up.
307
308Use the `lfs` config section to customize your Git LFS server.
309
310> **Note**: The pure-SSH transfer is disabled by default.
311
312## Server Access
313
314Soft Serve at its core manages your server authentication and authorization. Authentication verifies the identity of a user, while authorization determines their access rights to a repository.
315
316To manage the server users, access, and repos, you can use the SSH command line interface.
317
318Try `ssh localhost -i ~/.ssh/id_ed25519 -p 23231 help` for more info. Make sure
319you use your key here.
320
321For ease of use, instead of specifying the key, port, and hostname every time
322you SSH into Soft Serve, add your own Soft Serve instance entry to your SSH
323config. For instance, to use `ssh soft` instead of typing `ssh localhost -i
324~/.ssh/id_ed25519 -p 23231`, we can define a `soft` entry in our SSH config
325file `~/.ssh/config`.
326
327```conf
328Host soft
329  HostName localhost
330  Port 23231
331  IdentityFile ~/.ssh/id_ed25519
332```
333
334Now, we can do `ssh soft` to SSH into Soft Serve. Since `git` is also aware of
335this config, you can use `soft` as the hostname for your clone commands.
336
337```sh
338git clone ssh://soft/dotfiles
339# make changes
340# add & commit
341git push origin main
342```
343
344> **Note** The `-i` part will be omitted in the examples below for brevity. You
345> can add your server settings to your sshconfig for quicker access.
346
347### Authentication
348
349Everything that needs authentication is done using SSH. Make sure you have
350added an entry for your Soft Serve instance in your `~/.ssh/config` file.
351
352By default, Soft Serve gives read-only permission to anonymous connections to
353any of the above protocols. This is controlled by two settings `anon-access`
354and `allow-keyless`.
355
356- `anon-access`: Defines the access level for anonymous users. Available
357  options are `no-access`, `read-only`, `read-write`, and `admin-access`.
358  Default is `read-only`.
359- `allow-keyless`: Whether to allow connections that doesn't use keys to pass.
360  Setting this to `false` would disable access to SSH keyboard-interactive,
361  HTTP, and Git protocol connections. Default is `true`.
362
363```sh
364$ ssh -p 23231 localhost settings
365Manage server settings
366
367Usage:
368  ssh -p 23231 localhost settings [command]
369
370Available Commands:
371  allow-keyless Set or get allow keyless access to repositories
372  anon-access   Set or get the default access level for anonymous users
373
374Flags:
375  -h, --help   help for settings
376
377Use "ssh -p 23231 localhost settings [command] --help" for more information about a command.
378```
379
380> **Note** These settings can only be changed by admins.
381
382When `allow-keyless` is disabled, connections that don't use SSH Public Key
383authentication will get denied. This means cloning repos over HTTP(s) or git://
384will get denied.
385
386Meanwhile, `anon-access` controls the access level granted to connections that
387use SSH Public Key authentication but are not registered users. The default
388setting for this is `read-only`. This will grant anonymous connections that use
389SSH Public Key authentication `read-only` access to public repos.
390
391`anon-access` is also used in combination with `allow-keyless` to determine the
392access level for HTTP(s) and git:// clone requests.
393
394#### SSH
395
396Soft Serve doesn't allow duplicate SSH public keys for users. A public key can be associated with one user only. This makes SSH authentication simple and straight forward, add your public key to your Soft Serve user to be able to access Soft Serve.
397
398#### HTTP
399
400You can generate user access tokens through the SSH command line interface. Access tokens can have an optional expiration date. Use your access token as the basic auth user to access your Soft Serve repos through HTTP.
401
402```sh
403# Create a user token
404ssh -p 23231 localhost token create 'my new token'
405ss_1234abc56789012345678901234de246d798fghi
406
407# Or with an expiry date
408ssh -p 23231 localhost token create --expires-in 1y 'my other token'
409ss_98fghi1234abc56789012345678901234de246d7
410```
411
412Now you can access to repos that require `read-write` access.
413
414```sh
415git clone http://ss_98fghi1234abc56789012345678901234de246d7@localhost:23232/my-private-repo.git my-private-repo
416# Make changes and push
417```
418
419### Authorization
420
421Soft Serve offers a simple access control. There are four access levels,
422no-access, read-only, read-write, and admin-access.
423
424`admin-access` has full control of the server and can make changes to users and repos.
425
426`read-write` access gets full control of repos.
427
428`read-only` can read public repos.
429
430`no-access` denies access to all repos.
431
432## User Management
433
434Admins can manage users and their keys using the `user` command. Once a user is
435created and has access to the server, they can manage their own keys and
436settings.
437
438To create a new user simply use `user create`:
439
440```sh
441# Create a new user
442ssh -p 23231 localhost user create beatrice
443
444# Add user keys
445ssh -p 23231 localhost user add-pubkey beatrice ssh-rsa AAAAB3Nz...
446ssh -p 23231 localhost user add-pubkey beatrice ssh-ed25519 AAAA...
447
448# Create another user with public key
449ssh -p 23231 localhost user create frankie '-k "ssh-ed25519 AAAATzN..."'
450
451# Need help?
452ssh -p 23231 localhost user help
453```
454
455Once a user is created, they get `read-only` access to public repositories.
456They can also create new repositories on the server.
457
458Users can manage their keys using the `pubkey` command:
459
460```sh
461# List user keys
462ssh -p 23231 localhost pubkey list
463
464# Add key
465ssh -p 23231 localhost pubkey add ssh-ed25519 AAAA...
466
467# Wanna change your username?
468ssh -p 23231 localhost set-username yolo
469
470# To display user info
471ssh -p 23231 localhost info
472```
473
474## Repositories
475
476You can manage repositories using the `repo` command.
477
478```sh
479# Run repo help
480$ ssh -p 23231 localhost repo help
481Manage repositories
482
483Usage:
484  ssh -p 23231 localhost repo [command]
485
486Aliases:
487  repo, repos, repository, repositories
488
489Available Commands:
490  blob         Print out the contents of file at path
491  branch       Manage repository branches
492  collab       Manage collaborators
493  create       Create a new repository
494  delete       Delete a repository
495  description  Set or get the description for a repository
496  hide         Hide or unhide a repository
497  import       Import a new repository from remote
498  info         Get information about a repository
499  is-mirror    Whether a repository is a mirror
500  list         List repositories
501  private      Set or get a repository private property
502  project-name Set or get the project name for a repository
503  rename       Rename an existing repository
504  tag          Manage repository tags
505  tree         Print repository tree at path
506
507Flags:
508  -h, --help   help for repo
509
510Use "ssh -p 23231 localhost repo [command] --help" for more information about a command.
511```
512
513To use any of the above `repo` commands, a user must be a collaborator in the repository. More on this below.
514
515### Creating Repositories
516
517To create a repository, first make sure you are a registered user. Use the
518`repo create <repo>` command to create a new repository:
519
520```sh
521# Create a new repository
522ssh -p 23231 localhost repo create icecream
523
524# Create a repo with description
525ssh -p 23231 localhost repo create icecream '-d "This is an Ice Cream description"'
526
527# ... and project name
528ssh -p 23231 localhost repo create icecream '-d "This is an Ice Cream description"' '-n "Ice Cream"'
529
530# I need my repository private!
531ssh -p 23231 localhost repo create icecream -p '-d "This is an Ice Cream description"' '-n "Ice Cream"'
532
533# Help?
534ssh -p 23231 localhost repo create -h
535```
536
537Or you can add your Soft Serve server as a remote to any existing repo, given
538you have write access, and push to remote:
539
540```
541git remote add origin ssh://localhost:23231/icecream
542```
543
544After youāve added the remote just go ahead and push. If the repo doesnāt exist
545on the server itāll be created.
546
547```
548git push origin main
549```
550
551### Nested Repositories
552
553Repositories can be nested too:
554
555```sh
556# Create a new nested repository
557ssh -p 23231 localhost repo create charmbracelet/icecream
558
559# Or ...
560git remote add charm ssh://localhost:23231/charmbracelet/icecream
561git push charm main
562```
563
564### Mirrors
565
566You can also *import* repositories from any public remote. Use the `repo import` command.
567
568```sh
569ssh -p 23231 localhost repo import soft-serve https://github.com/charmbracelet/soft-serve
570```
571
572Use `--mirror` or `-m` to mark the repository as a *pull* mirror.
573
574### Deleting Repositories
575
576You can delete repositories using the `repo delete <repo>` command.
577
578```sh
579ssh -p 23231 localhost repo delete icecream
580```
581
582### Renaming Repositories
583
584Use the `repo rename <old> <new>` command to rename existing repositories.
585
586```sh
587ssh -p 23231 localhost repo rename icecream vanilla
588```
589
590### Repository Collaborators
591
592Sometimes you want to restrict write access to certain repositories. This can
593be achieved by adding a collaborator to your repository.
594
595Use the `repo collab <command> <repo>` command to manage repo collaborators.
596
597```sh
598# Add collaborator to soft-serve
599ssh -p 23231 localhost repo collab add soft-serve frankie
600
601# Add collaborator with a specific access level
602ssh -p 23231 localhost repo collab add soft-serve beatrice read-only
603
604# Remove collaborator
605ssh -p 23231 localhost repo collab remove soft-serve beatrice
606
607# List collaborators
608ssh -p 23231 localhost repo collab list soft-serve
609```
610
611### Repository Metadata
612
613You can also change the repo's description, project name, whether it's private,
614etc using the `repo <command>` command.
615
616```sh
617# Set description for repo
618ssh -p 23231 localhost repo description icecream "This is a new description"
619
620# Hide repo from listing
621ssh -p 23231 localhost repo hidden icecream true
622
623# List repository info (branches, tags, description, etc)
624ssh -p 23231 localhost repo icecream info
625```
626
627To make a repository private, use `repo private <repo> [true|false]`. Private
628repos can only be accessed by admins and collaborators.
629
630```sh
631ssh -p 23231 localhost repo private icecream true
632```
633
634### Repository Branches & Tags
635
636Use `repo branch` and `repo tag` to list, and delete branches or tags. You can
637also use `repo branch default` to set or get the repository default branch.
638
639### Repository Tree
640
641To print a file tree for the project, just use the `repo tree` command along with
642the repo name as the SSH command to your Soft Serve server:
643
644```sh
645ssh -p 23231 localhost repo tree soft-serve
646```
647
648You can also specify the sub-path and a specific reference or branch.
649
650```sh
651ssh -p 23231 localhost repo tree soft-serve server/config
652ssh -p 23231 localhost repo tree soft-serve main server/config
653```
654
655From there, you can print individual files using the `repo blob` command:
656
657```sh
658ssh -p 23231 localhost repo blob soft-serve cmd/soft/main.go
659```
660
661You can add the `-c` flag to enable syntax coloring and `-l` to print line
662numbers:
663
664```sh
665ssh -p 23231 localhost repo blob soft-serve cmd/soft/main.go -c -l
666
667```
668
669Use `--raw` to print raw file contents. This is useful for dumping binary data.
670
671### Repository webhooks
672
673Soft Serve supports repository webhooks using the `repo webhook` command. You
674can create and manage webhooks for different repository events such as _push_,
675_collaborators_, and _branch_tag_create_ events.
676
677```
678Manage repository webhooks
679
680Usage:
681  ssh -p 23231 localhost repo webhook [command]
682
683Aliases:
684  webhook, webhooks
685
686Available Commands:
687  create      Create a repository webhook
688  delete      Delete a repository webhook
689  deliveries  Manage webhook deliveries
690  list        List repository webhooks
691  update      Update a repository webhook
692
693Flags:
694  -h, --help   help for webhook
695```
696
697## The Soft Serve TUI
698
699<img src="https://stuff.charm.sh/soft-serve/soft-serve-demo-commit.png" width="750" alt="TUI example showing a diff">
700
701Soft Serve TUI is mainly used to browse repos over SSH. You can also use it to
702browse local repositories with `soft browse` or running `soft` within a Git
703repository.
704
705```sh
706ssh localhost -p 23231
707```
708
709It's also possible to ālinkā to a specific repo:
710
711```sh
712ssh -p 23231 localhost -t soft-serve
713```
714
715You can copy text to your clipboard over SSH. For instance, you can press
716<kbd>c</kbd> on the highlighted repo in the menu to copy the clone command
717[^osc52].
718
719[^osc52]:
720    Copying over SSH depends on your terminal support of OSC52. Refer to
721    [go-osc52](https://github.com/aymanbagabas/go-osc52) for more information.
722
723## Hooks
724
725Soft Serve supports git server-side hooks `pre-receive`, `update`,
726`post-update`, and `post-receive`. This means you can define your own hooks to
727run on repository push events. Hooks can be defined as a per-repository hook,
728and/or global hooks that run for all repositories.
729
730You can find per-repository hooks under the repository `hooks` directory.
731
732Globs hooks can be found in your `SOFT_SERVE_DATA_PATH` directory under
733`hooks`. Defining global hooks is useful if you want to run CI/CD for example.
734
735Here's an example of sending a message after receiving a push event. Create an
736executable file `<data path>/hooks/update`:
737
738```sh
739#!/bin/sh
740#
741# An example hook script to echo information about the push
742# and send it to the client.
743
744refname="$1"
745oldrev="$2"
746newrev="$3"
747
748# Safety check
749if [ -z "$GIT_DIR" ]; then
750        echo "Don't run this script from the command line." >&2
751        echo " (if you want, you could supply GIT_DIR then run" >&2
752        echo "  $0 <ref> <oldrev> <newrev>)" >&2
753        exit 1
754fi
755
756if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
757        echo "usage: $0 <ref> <oldrev> <newrev>" >&2
758        exit 1
759fi
760
761# Check types
762# if $newrev is 0000...0000, it's a commit to delete a ref.
763zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
764if [ "$newrev" = "$zero" ]; then
765        newrev_type=delete
766else
767        newrev_type=$(git cat-file -t $newrev)
768fi
769
770echo "Hi from Soft Serve update hook!"
771echo
772echo "RefName: $refname"
773echo "Change Type: $newrev_type"
774echo "Old SHA1: $oldrev"
775echo "New SHA1: $newrev"
776
777exit 0
778```
779
780Now, you should get a message after pushing changes to any repository.
781
782## A note about RSA keys
783
784Unfortunately, due to a shortcoming in Goās `x/crypto/ssh` package, Soft Serve
785does not currently support access via new SSH RSA keys: only the old SHA-1
786ones will work.
787
788Until we sort this out youāll either need an SHA-1 RSA key or a key with
789another algorithm, e.g. Ed25519. Not sure what type of keys you have?
790You can check with the following:
791
792```sh
793$ find ~/.ssh/id_*.pub -exec ssh-keygen -l -f {} \;
794```
795
796If youāre curious about the inner workings of this problem have a look at:
797
798- https://github.com/golang/go/issues/37278
799- https://go-review.googlesource.com/c/crypto/+/220037
800- https://github.com/golang/crypto/pull/197
801
802## Contributing
803
804See [contributing][contribute].
805
806[contribute]: https://github.com/charmbracelet/soft-serve/contribute
807
808## Feedback
809
810Weād love to hear your thoughts on this project. Feel free to drop us a note!
811
812- [Twitter](https://twitter.com/charmcli)
813- [The Fediverse](https://mastodon.social/@charmcli)
814- [Discord](https://charm.sh/chat)
815
816## License
817
818[MIT](https://github.com/charmbracelet/soft-serve/raw/main/LICENSE)
819
820---
821
822Part of [Charm](https://charm.sh).
823
824<a href="https://charm.sh/"><img alt="The Charm logo" src="https://stuff.charm.sh/charm-badge.jpg" width="400"></a>
825
826Charmēē±å¼ęŗ ⢠Charm loves open source