Tests / Test (push) Skipped
Tests / OCR (tesseract fixture) (push) Skipped
Tests / Release (semver) (push) Skipped
stdlib flag dropped --hop after the query. One wrapper in internal/cli, source <(./bin/cli/complete.go bash). Gitea #34.
101 lines
2.4 KiB
Go
Executable File
101 lines
2.4 KiB
Go
Executable File
//usr/bin/env go run "$0" "$@"; exit
|
|
//
|
|
// bin/git/import.go - read git history with go-git (no git binary).
|
|
//
|
|
// ./bin/git/import.go [REPO]
|
|
// ./bin/git/import.go --json
|
|
// ./bin/git/import.go --limit 100 --since 2026-01-01
|
|
// ./bin/git/import.go --root DIR
|
|
//
|
|
// Conversion only: prints commit leafs. Brain write is bin/brain/index.go.
|
|
// NOTE: never run `gofmt -w` on this file — it breaks the shebang.
|
|
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
cliparse "github.com/eSlider/2dph/internal/cli"
|
|
"github.com/eSlider/2dph/internal/cmdbin"
|
|
"github.com/eSlider/2dph/internal/gitlog"
|
|
)
|
|
|
|
func main() {
|
|
os.Exit(run(os.Args[1:]))
|
|
}
|
|
|
|
func run(args []string) int {
|
|
c, err := gitlog.ParseArgs(args)
|
|
if err != nil {
|
|
return cliparse.Fail(err)
|
|
}
|
|
repo, root, since, limit, jsonOut := c.Repo, c.Root, c.Since, c.Limit, c.JSONOut
|
|
|
|
sinceT, err := gitlog.ParseSince(since)
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "git/import: %v\n", err)
|
|
return 2
|
|
}
|
|
|
|
repos := []string{}
|
|
if repo != "" {
|
|
repos = []string{repo}
|
|
} else if root != "" {
|
|
entries, err := os.ReadDir(root)
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "git/import: %v\n", err)
|
|
return 1
|
|
}
|
|
for _, e := range entries {
|
|
p := filepath.Join(root, e.Name())
|
|
if _, err := os.Stat(filepath.Join(p, ".git")); err == nil {
|
|
repos = append(repos, p)
|
|
}
|
|
}
|
|
} else {
|
|
repos = []string{cmdbin.Root()}
|
|
}
|
|
|
|
opt := gitlog.Options{Limit: limit, Since: sinceT}
|
|
type row struct {
|
|
Repo string `json:"repo"`
|
|
Path string `json:"path"`
|
|
Commits int `json:"commits"`
|
|
Leafs []gitlog.Leaf `json:"leafs,omitempty"`
|
|
}
|
|
var rows []row
|
|
for _, p := range repos {
|
|
name, err := gitlog.RepoName(p)
|
|
if err != nil && name == "" {
|
|
fmt.Fprintf(os.Stderr, "git/import: %s: %v\n", p, err)
|
|
continue
|
|
}
|
|
cs, err := gitlog.Log(p, opt)
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "git/import: %s: %v\n", p, err)
|
|
return 1
|
|
}
|
|
leafs := make([]gitlog.Leaf, 0, len(cs))
|
|
for _, c := range cs {
|
|
leafs = append(leafs, gitlog.ToLeaf(c, name))
|
|
}
|
|
rows = append(rows, row{Repo: name, Path: p, Commits: len(cs), Leafs: leafs})
|
|
}
|
|
|
|
if jsonOut {
|
|
enc := json.NewEncoder(os.Stdout)
|
|
enc.SetIndent("", " ")
|
|
enc.SetEscapeHTML(false)
|
|
if err := enc.Encode(rows); err != nil {
|
|
return 1
|
|
}
|
|
return 0
|
|
}
|
|
for _, r := range rows {
|
|
fmt.Printf("%-24s %5d commits %s\n", r.Repo, r.Commits, r.Path)
|
|
}
|
|
return 0
|
|
}
|