Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
* text=auto eol=lf
*.go text eol=lf
go.mod text eol=lf
go.sum text eol=lf
3 changes: 3 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,6 @@ jobs:
go-version: ${{ matrix.go-version }}

- run: make build

- name: Validate
run: make validate
41 changes: 41 additions & 0 deletions .golangci.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
version: "2"
run:
concurrency: 3
linters:
default: all
disable:
- depguard
- gochecknoglobals
- exhaustruct
- err113
- gochecknoinits
- ireturn
- forbidigo
- mnd
- varnamelen
- godoclint
- noctx
- noinlineerr
- nestif
- gosec
- funlen
- cyclop
- gocritic
- revive
- wrapcheck
- wsl
exclusions:
generated: lax
presets:
- comments
- common-false-positives
- legacy
- std-error-handling
formatters:
enable:
- gci
- gofmt
- gofumpt
- goimports
exclusions:
generated: lax
23 changes: 23 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,3 +1,26 @@
# renovate: datasource=github-tags depName=golangci/golangci-lint
GOLANGCI_VERSION ?= v2.6.1
TOOLS_BIN := $(shell mkdir -p build/tools && realpath build/tools)

GOLANGCI = $(TOOLS_BIN)/golangci-lint-$(GOLANGCI_VERSION)
$(GOLANGCI):
rm -f $(TOOLS_BIN)/golangci-lint*
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/$(GOLANGCI_VERSION)/install.sh | sh -s -- -b $(TOOLS_BIN) $(GOLANGCI_VERSION)
mv $(TOOLS_BIN)/golangci-lint $(TOOLS_BIN)/golangci-lint-$(GOLANGCI_VERSION)

.PHONY: build
build:
go build -o build/ ./...

validate: validate-lint validate-dirty

validate-lint: $(GOLANGCI)
$(GOLANGCI) run

validate-dirty:
ifneq ($(shell git status --porcelain --untracked-files=no),)
@echo worktree is dirty
@git --no-pager status
@git --no-pager diff
@exit 1
endif
4 changes: 3 additions & 1 deletion cmd/gogit-http-server/logging.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,19 @@ import (

type logWriter struct {
http.ResponseWriter

code, bytes int
}

func (r *logWriter) Write(p []byte) (int, error) {
written, err := r.ResponseWriter.Write(p)
r.bytes += written

return written, err
}

// Note this is generally only called when sending an HTTP error, so it's
// important to set the `code` value to 200 as a default
// important to set the `code` value to 200 as a default.
func (r *logWriter) WriteHeader(code int) {
r.code = code
r.ResponseWriter.WriteHeader(code)
Expand Down
4 changes: 3 additions & 1 deletion cmd/gogit-http-server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,14 @@ var rootCmd = &cobra.Command{
if err := http.ListenAndServe(addr, handler); !errors.Is(err, http.ErrServerClosed) {
return err
}

return nil
},
}

func main() {
if err := rootCmd.Execute(); err != nil {
err := rootCmd.Execute()
if err != nil {
log.Fatal(err)
}
}
3 changes: 2 additions & 1 deletion cmd/gogit/clone.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,10 @@ var cloneCmd = &cobra.Command{
opts.Progress = cmd.OutOrStdout()
}

fmt.Fprintf(cmd.ErrOrStderr(), "Cloning into '%s'...\n", dir) //nolint:errcheck
fmt.Fprintf(cmd.ErrOrStderr(), "Cloning into '%s'...\n", dir)

_, err = git.PlainClone(dir, &opts)

return err
},
DisableFlagsInUseLine: true,
Expand Down
12 changes: 9 additions & 3 deletions cmd/gogit/daemon.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ var daemonCmd = &cobra.Command{
}

log.Printf("Starting Git daemon on %q", addr)

return srv.ListenAndServe()
},
}
Expand All @@ -62,17 +63,20 @@ var _ transport.Loader = (*dirsLoader)(nil)

// NewDirsLoader creates a new dirsLoader with the given directories.
func NewDirsLoader(dirs []string, strict, exportAll bool) *dirsLoader {
var loaders []transport.Loader
var fss []billy.Filesystem
loaders := make([]transport.Loader, 0, len(dirs))
fss := make([]billy.Filesystem, 0, len(dirs))

for _, dir := range dirs {
abs, err := filepath.Abs(dir)
if err != nil {
continue
}

fs := osfs.New(abs, osfs.WithBoundOS())
fss = append(fss, fs)
loaders = append(loaders, transport.NewFilesystemLoader(fs, strict))
}

return &dirsLoader{loaders: loaders, fss: fss, exportAll: exportAll}
}

Expand All @@ -87,16 +91,18 @@ func (d *dirsLoader) Load(ep *transport.Endpoint) (storage.Storer, error) {
// repository.
dfs := d.fss[i]
okFile := filepath.Join(ep.Path, "git-daemon-export-ok")

stat, err := dfs.Lstat(okFile)
if err != nil || (stat != nil && !stat.Mode().IsRegular()) {
// If the file does not exist or is a directory,
// we skip this repository.
continue
}

}

return storer, nil
}
}

return nil, transport.ErrRepositoryNotFound
}
2 changes: 1 addition & 1 deletion cmd/gogit/fetch.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ func init() {
var fetchCmd = &cobra.Command{
Use: "fetch [<options>] [--] [<repository> [<refspec>...]]",
Short: "Download objects and refs from another repository",
RunE: func(cmd *cobra.Command, args []string) error {
RunE: func(cmd *cobra.Command, _ []string) error {
r, err := git.PlainOpen(".")
if err != nil {
return err
Expand Down
6 changes: 5 additions & 1 deletion cmd/gogit/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,22 +34,26 @@ var envToTarget = map[string]trace.Target{
func init() {
// Set up tracing
var target trace.Target

for k, v := range envToTarget {
if ok, _ := strconv.ParseBool(os.Getenv(k)); ok {
target |= v
}
}

trace.SetTarget(target)
}

func main() {
if err := rootCmd.Execute(); err != nil {
err := rootCmd.Execute()
if err != nil {
var rerr *transport.RemoteError
if errors.As(err, &rerr) {
fmt.Fprintln(os.Stderr, rerr)
} else {
fmt.Fprintln(os.Stderr, err)
}

os.Exit(1)
}
}
Expand Down
1 change: 1 addition & 0 deletions cmd/gogit/pull.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ var pullCmd = &cobra.Command{
switch {
case errors.Is(err, git.NoErrAlreadyUpToDate):
cmd.Println("Already up-to-date.")

return nil
default:
return err
Expand Down
2 changes: 2 additions & 0 deletions cmd/gogit/push.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ var pushCmd = &cobra.Command{
if args[0] == remote {
remoteName = remote
isRemote = true

break
}
}
Expand Down Expand Up @@ -114,6 +115,7 @@ var pushCmd = &cobra.Command{
err = remote.Push(&opts)
if errors.Is(err, git.NoErrAlreadyUpToDate) {
cmd.PrintErr("Everything up-to-date")

return nil
}

Expand Down
12 changes: 9 additions & 3 deletions cmd/gogit/update-server-info.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package main

import (
"errors"

"github.com/go-git/go-git/v6"
"github.com/go-git/go-git/v6/plumbing/transport"
"github.com/go-git/go-git/v6/storage/filesystem"
Expand All @@ -14,13 +16,17 @@ func init() {
var updateServerInfoCmd = &cobra.Command{
Use: "update-server-info",
Short: "Update the server info file",
RunE: func(cmd *cobra.Command, args []string) error {
RunE: func(cmd *cobra.Command, _ []string) error {
r, err := git.PlainOpen(".")
if err != nil {
return err
}

fs := r.Storer.(*filesystem.Storage).Filesystem()
return transport.UpdateServerInfo(r.Storer, fs)
store, ok := r.Storer.(*filesystem.Storage)
if !ok {
return errors.New("storer does not implement filesystem.Storage")
}

return transport.UpdateServerInfo(r.Storer, store.Filesystem())
},
}
Loading