Skip to content

Commit 11fe343

Browse files
committed
chore: merge branch 'main' into v2-exp
2 parents 41c4f31 + d299f52 commit 11fe343

File tree

9 files changed

+31
-177
lines changed

9 files changed

+31
-177
lines changed

README.md

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -158,32 +158,6 @@ ssh:
158158
# This is the address that will be used to clone repositories.
159159
public_url: "ssh://localhost:23231"
160160

161-
# The cross-origin request security options
162-
cors:
163-
# The allowed cross-origin headers
164-
allowed_headers:
165-
- Accept
166-
- Accept-Language
167-
- Content-Language
168-
- Origin
169-
# - Content-Type
170-
# - X-Requested-With
171-
# - User-Agent
172-
# - Authorization
173-
# - Access-Control-Request-Method
174-
175-
# The allowed cross-origin URLs
176-
# allowed_origins:
177-
# - *
178-
179-
# The allowed cross-origin methods
180-
allowed_methods:
181-
- GET
182-
- HEAD
183-
- POST
184-
# - PUT
185-
# - OPTIONS
186-
187161
# The path to the SSH server's private key.
188162
key_path: "ssh/soft_serve_host"
189163

cmd/soft/hook/hook.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ var (
6565
// This is set in the server before invoking git-receive-pack/git-upload-pack
6666
repoName := os.Getenv("SOFT_SERVE_REPO_NAME")
6767

68+
logger := log.FromContext(ctx).With("repo", repoName)
69+
6870
stdin := cmd.InOrStdin()
6971
stdout := cmd.OutOrStdout()
7072
stderr := cmd.ErrOrStderr()
@@ -80,9 +82,11 @@ var (
8082
scanner := bufio.NewScanner(stdin)
8183
for scanner.Scan() {
8284
buf.Write(scanner.Bytes())
85+
buf.WriteByte('\n')
8386
fields := strings.Fields(scanner.Text())
8487
if len(fields) != 3 {
85-
return fmt.Errorf("invalid hook input: %s", scanner.Text())
88+
logger.Error(fmt.Sprintf("invalid %s hook input", cmdName), "input", scanner.Text())
89+
continue
8690
}
8791
opts = append(opts, hooks.HookArg{
8892
OldSha: fields[0],
@@ -99,7 +103,8 @@ var (
99103
}
100104
case hooks.UpdateHook:
101105
if len(args) != 3 {
102-
return fmt.Errorf("invalid update hook input: %s", args)
106+
logger.Error("invalid update hook input", "input", args)
107+
break
103108
}
104109

105110
hks.Update(ctx, stdout, stderr, repoName, hooks.HookArg{
@@ -115,7 +120,7 @@ var (
115120
if stat, err := os.Stat(customHookPath); err == nil && !stat.IsDir() && stat.Mode()&0o111 != 0 {
116121
// If the custom hook is executable, run it
117122
if err := runCommand(ctx, &buf, stdout, stderr, customHookPath, args...); err != nil {
118-
return fmt.Errorf("failed to run custom hook: %w", err)
123+
logger.Error("failed to run custom hook", "err", err)
119124
}
120125
}
121126

go.mod

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.23.0
44

55
require (
66
github.com/charmbracelet/glamour v0.9.1
7+
github.com/charmbracelet/lipgloss v1.1.0 // indirect
78
github.com/dustin/go-humanize v1.0.1
89
github.com/go-git/go-git/v5 v5.14.0
910
github.com/matryer/is v1.4.1
@@ -22,15 +23,15 @@ require (
2223
github.com/charmbracelet/bubbletea/v2 v2.0.0-alpha.2.0.20250318133619-2ce107c85fed
2324
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc
2425
github.com/charmbracelet/git-lfs-transfer v0.1.1-0.20240708204110-bacbfdb68d92
25-
github.com/charmbracelet/keygen v0.5.1
26+
github.com/charmbracelet/keygen v0.5.3
2627
github.com/charmbracelet/lipgloss/v2 v2.0.0-alpha.2.0.20250313133401-58331b1fff40
27-
github.com/charmbracelet/log v0.4.1-0.20241101171137-e66b83d34ed9
28+
github.com/charmbracelet/log v0.4.1
2829
github.com/charmbracelet/ssh v0.0.0-20250128164007-98fd5ae11894
2930
github.com/charmbracelet/wish/v2 v2.0.0-20250319172925-3ae4bfe9c24e
3031
github.com/charmbracelet/x/ansi v0.8.0
3132
github.com/go-jose/go-jose/v3 v3.0.3
3233
github.com/gobwas/glob v0.2.3
33-
github.com/golang-jwt/jwt/v5 v5.2.1
34+
github.com/golang-jwt/jwt/v5 v5.2.2
3435
github.com/google/go-querystring v1.1.0
3536
github.com/google/uuid v1.6.0
3637
github.com/gorilla/handlers v1.5.2
@@ -45,7 +46,7 @@ require (
4546
github.com/rogpeppe/go-internal v1.14.1
4647
github.com/spf13/cobra v1.9.1
4748
go.uber.org/automaxprocs v1.6.0
48-
golang.org/x/crypto v0.35.0
49+
golang.org/x/crypto v0.36.0
4950
golang.org/x/sync v0.12.0
5051
gopkg.in/yaml.v3 v3.0.1
5152
modernc.org/sqlite v1.36.1
@@ -58,7 +59,6 @@ require (
5859
github.com/aymerick/douceur v0.2.0 // indirect
5960
github.com/beorn7/perks v1.0.1 // indirect
6061
github.com/cespare/xxhash/v2 v2.3.0 // indirect
61-
github.com/charmbracelet/lipgloss v1.1.0 // indirect
6262
github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706 // indirect
6363
github.com/charmbracelet/x/cellbuf v0.0.13 // indirect
6464
github.com/charmbracelet/x/conpty v0.1.0 // indirect
@@ -97,7 +97,7 @@ require (
9797
github.com/yuin/goldmark v1.7.8 // indirect
9898
github.com/yuin/goldmark-emoji v1.0.5 // indirect
9999
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
100-
golang.org/x/net v0.35.0 // indirect
100+
golang.org/x/net v0.36.0 // indirect
101101
golang.org/x/sys v0.31.0 // indirect
102102
golang.org/x/term v0.30.0 // indirect
103103
golang.org/x/text v0.23.0 // indirect

go.sum

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,14 @@ github.com/charmbracelet/git-lfs-transfer v0.1.1-0.20240708204110-bacbfdb68d92 h
3838
github.com/charmbracelet/git-lfs-transfer v0.1.1-0.20240708204110-bacbfdb68d92/go.mod h1:UrXUCm3xLQkq15fu7qlXHUMlrhdlXHoi13KH2Dfiits=
3939
github.com/charmbracelet/glamour v0.9.1 h1:Q7PdJLOx8EoepsXUvW6Puz5WQ3YUElIGQdYKrIpiGLA=
4040
github.com/charmbracelet/glamour v0.9.1/go.mod h1:+SHvIS8qnwhgTpVMiXwn7OfGomSqff1cHBCI8jLOetk=
41-
github.com/charmbracelet/keygen v0.5.1 h1:zBkkYPtmKDVTw+cwUyY6ZwGDhRxXkEp0Oxs9sqMLqxI=
42-
github.com/charmbracelet/keygen v0.5.1/go.mod h1:zznJVmK/GWB6dAtjluqn2qsttiCBhA5MZSiwb80fcHw=
41+
github.com/charmbracelet/keygen v0.5.3 h1:2MSDC62OUbDy6VmjIE2jM24LuXUvKywLCmaJDmr/Z/4=
42+
github.com/charmbracelet/keygen v0.5.3/go.mod h1:TcpNoMAO5GSmhx3SgcEMqCrtn8BahKhB8AlwnLjRUpk=
4343
github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
4444
github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
4545
github.com/charmbracelet/lipgloss/v2 v2.0.0-alpha.2.0.20250313133401-58331b1fff40 h1:9IxBdCOOJoJ1PYXgxWXJCk3Fkl7h2n+b7VtY+5BbIuQ=
4646
github.com/charmbracelet/lipgloss/v2 v2.0.0-alpha.2.0.20250313133401-58331b1fff40/go.mod h1:XhU7tcZRWVGzkjWQ6XYRH7tIVqYuWLx6XLjVqAz+7FU=
47-
github.com/charmbracelet/log v0.4.1-0.20241101171137-e66b83d34ed9 h1:m72jc7WwobapT4NLVVAjejNsz26f2UQ2Mz74uTq/Tro=
48-
github.com/charmbracelet/log v0.4.1-0.20241101171137-e66b83d34ed9/go.mod h1:soIjG88SDQxYFpbhYXbrDTPbd/07bfo66OjADdnY5HE=
47+
github.com/charmbracelet/log v0.4.1 h1:6AYnoHKADkghm/vt4neaNEXkxcXLSV2g1rdyFDOpTyk=
48+
github.com/charmbracelet/log v0.4.1/go.mod h1:pXgyTsqsVu4N9hGdHmQ0xEA4RsXof402LX9ZgiITn2I=
4949
github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706 h1:WkwO6Ks3mSIGnGuSdKl9qDSyfbYK50z2wc2gGMggegE=
5050
github.com/charmbracelet/log/v2 v2.0.0-20250226163916-c379e29ff706/go.mod h1:mjJGp00cxcfvD5xdCa+bso251Jt4owrQvuimJtVmEmM=
5151
github.com/charmbracelet/ssh v0.0.0-20250128164007-98fd5ae11894 h1:Ffon9TbltLGBsT6XE//YvNuu4OAaThXioqalhH11xEw=
@@ -96,8 +96,8 @@ github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpv
9696
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
9797
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
9898
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
99-
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
100-
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
99+
github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8=
100+
github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
101101
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
102102
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
103103
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
@@ -226,8 +226,8 @@ go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwE
226226
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
227227
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
228228
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
229-
golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
230-
golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
229+
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
230+
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
231231
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
232232
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
233233
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
@@ -239,8 +239,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
239239
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
240240
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
241241
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
242-
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
243-
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
242+
golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA=
243+
golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I=
244244
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
245245
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
246246
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=

pkg/config/config.go

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,6 @@ type GitConfig struct {
6161
MaxConnections int `env:"MAX_CONNECTIONS" yaml:"max_connections"`
6262
}
6363

64-
// CORSConfig is the CORS configuration for the server.
65-
type CORSConfig struct {
66-
AllowedHeaders []string `env:"ALLOWED_HEADERS" yaml:"allowed_headers"`
67-
68-
AllowedOrigins []string `env:"ALLOWED_ORIGINS" yaml:"allowed_origins"`
69-
70-
AllowedMethods []string `env:"ALLOWED_METHODS" yaml:"allowed_methods"`
71-
}
72-
7364
// HTTPConfig is the HTTP configuration for the server.
7465
type HTTPConfig struct {
7566
// Enabled toggles the HTTP server on/off
@@ -86,9 +77,6 @@ type HTTPConfig struct {
8677

8778
// PublicURL is the public URL of the HTTP server.
8879
PublicURL string `env:"PUBLIC_URL" yaml:"public_url"`
89-
90-
// HTTP is the configuration for the HTTP server.
91-
CORS CORSConfig `envPrefix:"CORS_" yaml:"cors"`
9280
}
9381

9482
// StatsConfig is the configuration for the stats server.
@@ -208,9 +196,6 @@ func (c *Config) Environ() []string {
208196
fmt.Sprintf("SOFT_SERVE_HTTP_TLS_KEY_PATH=%s", c.HTTP.TLSKeyPath),
209197
fmt.Sprintf("SOFT_SERVE_HTTP_TLS_CERT_PATH=%s", c.HTTP.TLSCertPath),
210198
fmt.Sprintf("SOFT_SERVE_HTTP_PUBLIC_URL=%s", c.HTTP.PublicURL),
211-
fmt.Sprintf("SOFT_SERVE_HTTP_CORS_ALLOWED_HEADERS=%s", strings.Join(c.HTTP.CORS.AllowedHeaders, ",")),
212-
fmt.Sprintf("SOFT_SERVE_HTTP_CORS_ALLOWED_ORIGINS=%s", strings.Join(c.HTTP.CORS.AllowedOrigins, ",")),
213-
fmt.Sprintf("SOFT_SERVE_HTTP_CORS_ALLOWED_METHODS=%s", strings.Join(c.HTTP.CORS.AllowedMethods, ",")),
214199
fmt.Sprintf("SOFT_SERVE_STATS_ENABLED=%t", c.Stats.Enabled),
215200
fmt.Sprintf("SOFT_SERVE_STATS_LISTEN_ADDR=%s", c.Stats.ListenAddr),
216201
fmt.Sprintf("SOFT_SERVE_LOG_FORMAT=%s", c.Log.Format),

pkg/config/config_test.go

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -79,47 +79,3 @@ func TestCustomConfigLocation(t *testing.T) {
7979
cfg = DefaultConfig()
8080
is.Equal(cfg.Name, "Soft Serve")
8181
}
82-
83-
func TestParseMultipleHeaders(t *testing.T) {
84-
is := is.New(t)
85-
is.NoErr(os.Setenv("SOFT_SERVE_HTTP_CORS_ALLOWED_HEADERS", "Accept,Accept-Language,User-Agent"))
86-
t.Cleanup(func() {
87-
is.NoErr(os.Unsetenv("SOFT_SERVE_HTTP_CORS_ALLOWED_HEADERS"))
88-
})
89-
cfg := DefaultConfig()
90-
is.NoErr(cfg.ParseEnv())
91-
is.Equal(cfg.HTTP.CORS.AllowedHeaders, []string{
92-
"Accept",
93-
"Accept-Language",
94-
"User-Agent",
95-
})
96-
}
97-
98-
func TestParseMultipleOrigins(t *testing.T) {
99-
is := is.New(t)
100-
is.NoErr(os.Setenv("SOFT_SERVE_HTTP_CORS_ALLOWED_ORIGINS", "https://foo.example,https://foo.example2"))
101-
t.Cleanup(func() {
102-
is.NoErr(os.Unsetenv("SOFT_SERVE_HTTP_CORS_ALLOWED_ORIGINS"))
103-
})
104-
cfg := DefaultConfig()
105-
is.NoErr(cfg.ParseEnv())
106-
is.Equal(cfg.HTTP.CORS.AllowedOrigins, []string{
107-
"https://foo.example",
108-
"https://foo.example2",
109-
})
110-
}
111-
112-
func TestParseMultipleMethods(t *testing.T) {
113-
is := is.New(t)
114-
is.NoErr(os.Setenv("SOFT_SERVE_HTTP_CORS_ALLOWED_METHODS", "GET,POST,PUT"))
115-
t.Cleanup(func() {
116-
is.NoErr(os.Unsetenv("SOFT_SERVE_HTTP_CORS_ALLOWED_METHODS"))
117-
})
118-
cfg := DefaultConfig()
119-
is.NoErr(cfg.ParseEnv())
120-
is.Equal(cfg.HTTP.CORS.AllowedMethods, []string{
121-
"GET",
122-
"POST",
123-
"PUT",
124-
})
125-
}

pkg/web/server.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"net/http"
66

77
"github.com/charmbracelet/log"
8-
"github.com/charmbracelet/soft-serve/pkg/config"
98
"github.com/gorilla/handlers"
109
"github.com/gorilla/mux"
1110
)
@@ -27,12 +26,5 @@ func NewRouter(ctx context.Context) http.Handler {
2726
h = handlers.CompressHandler(h)
2827
h = handlers.RecoveryHandler()(h)
2928

30-
cfg := config.FromContext(ctx)
31-
32-
h = handlers.CORS(handlers.AllowedHeaders(cfg.HTTP.CORS.AllowedHeaders),
33-
handlers.AllowedOrigins(cfg.HTTP.CORS.AllowedOrigins),
34-
handlers.AllowedMethods(cfg.HTTP.CORS.AllowedMethods),
35-
)(h)
36-
3729
return h
3830
}

testscript/testdata/http-cors.txtar

Lines changed: 0 additions & 64 deletions
This file was deleted.

testscript/testdata/repo-push.txtar

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,14 @@ soft repo create repo-empty -d 'description' -H -p -n 'repo-empty'
1111
# clone repo
1212
git clone ssh://localhost:$SSH_PORT/repo-empty repo-empty
1313

14-
# push repo
14+
# push repo without any commits
1515
! git -C repo-empty push origin HEAD
1616

17+
# push repo with a commit
18+
mkfile ./repo-empty/README.md '# Hello\n\nwelcome'
19+
git -C repo-empty add README.md
20+
git -C repo-empty commit -m 'first'
21+
git -C repo-empty push origin HEAD
22+
1723
# stop the server
1824
[windows] stopserver

0 commit comments

Comments
 (0)