···
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/config"
-
func Fork(repoPath, source string) error {
-
cloneCmd := exec.Command("git", "clone", "--bare", source, repoPath)
if err := cloneCmd.Run(); err != nil {
return fmt.Errorf("failed to bare clone repository: %w", err)
···
func (g *GitRepo) Sync() error {
···
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/config"
+
knotconfig "tangled.org/core/knotserver/config"
+
func Fork(repoPath, source string, cfg *knotconfig.Config) error {
+
u, err := url.Parse(source)
+
return fmt.Errorf("failed to parse source URL: %w", err)
+
if o := optimizeClone(u, cfg); o != nil {
+
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)
···
+
func optimizeClone(u *url.URL, cfg *knotconfig.Config) *url.URL {
+
// only optimize if it's the same host
+
if u.Host != cfg.Server.Hostname {
+
local := filepath.Join(cfg.Repo.ScanPath, u.Path)
+
// sanity check: is there a git repo there?
+
if _, err := PlainOpen(local); err != nil {
+
// create optimized file:// URL
+
slog.Debug("performing local clone", "url", optimized.String())
func (g *GitRepo) Sync() error {