···
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/config"
13
+
knotconfig "tangled.org/core/knotserver/config"
12
-
func Fork(repoPath, source string) error {
13
-
cloneCmd := exec.Command("git", "clone", "--bare", source, repoPath)
16
+
func Fork(repoPath, source string, cfg *knotconfig.Config) error {
17
+
u, err := url.Parse(source)
19
+
return fmt.Errorf("failed to parse source URL: %w", err)
22
+
if o := optimizeClone(u, cfg); o != nil {
26
+
cloneCmd := exec.Command("git", "clone", "--bare", u.String(), repoPath)
if err := cloneCmd.Run(); err != nil {
return fmt.Errorf("failed to bare clone repository: %w", err)
···
39
+
func optimizeClone(u *url.URL, cfg *knotconfig.Config) *url.URL {
40
+
// only optimize if it's the same host
41
+
if u.Host != cfg.Server.Hostname {
45
+
local := filepath.Join(cfg.Repo.ScanPath, u.Path)
47
+
// sanity check: is there a git repo there?
48
+
if _, err := PlainOpen(local); err != nil {
52
+
// create optimized file:// URL
53
+
optimized := &url.URL{
58
+
slog.Debug("performing local clone", "url", optimized.String())
func (g *GitRepo) Sync() error {