mirror of
https://github.com/taigrr/mg.git
synced 2026-04-02 03:28:42 -07:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cacdbf673f | |||
|
|
991985ab4e | ||
| 417cf943fa | |||
| 1030a8f3a9 |
@@ -4,6 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
git "github.com/go-git/go-git/v5"
|
git "github.com/go-git/go-git/v5"
|
||||||
@@ -37,34 +38,26 @@ var (
|
|||||||
mutex := sync.Mutex{}
|
mutex := sync.Mutex{}
|
||||||
wg := sync.WaitGroup{}
|
wg := sync.WaitGroup{}
|
||||||
wg.Add(len(conf.Repos))
|
wg.Add(len(conf.Repos))
|
||||||
for i := 0; i < jobs; i++ {
|
cloneFunc := func() {
|
||||||
go func() {
|
for repo := range repoChan {
|
||||||
for repo := range repoChan {
|
_, err := git.PlainOpenWithOptions(repo.Path, &(git.PlainOpenOptions{DetectDotGit: true}))
|
||||||
_, err := git.PlainOpenWithOptions(repo.Path, &(git.PlainOpenOptions{DetectDotGit: true}))
|
if err == nil {
|
||||||
if err == nil {
|
log.Printf("already cloned: %s\n", repo.Path)
|
||||||
log.Printf("already cloned: %s\n", repo.Path)
|
mutex.Lock()
|
||||||
mutex.Lock()
|
alreadyCloned++
|
||||||
alreadyCloned++
|
mutex.Unlock()
|
||||||
mutex.Unlock()
|
wg.Done()
|
||||||
wg.Done()
|
continue
|
||||||
continue
|
} else if err == git.ErrRepositoryNotExists {
|
||||||
} else if err == git.ErrRepositoryNotExists {
|
log.Printf("attempting clone: %s\n", repo.Path)
|
||||||
log.Printf("attempting clone: %s\n", repo.Path)
|
parentPath := filepath.Dir(repo.Path)
|
||||||
_, err = git.PlainClone(repo.Path, false, &git.CloneOptions{
|
if _, err := os.Stat(parentPath); err != nil {
|
||||||
URL: repo.Remote,
|
os.MkdirAll(parentPath, os.ModeDir|os.ModePerm)
|
||||||
})
|
}
|
||||||
if err != nil {
|
_, err = git.PlainClone(repo.Path, false, &git.CloneOptions{
|
||||||
mutex.Lock()
|
URL: repo.Remote,
|
||||||
errs = append(errs, RepoError{Error: err, Repo: repo.Path})
|
})
|
||||||
mutex.Unlock()
|
if err != nil {
|
||||||
log.Printf("clone failed for %s: %v\n", repo.Path, err)
|
|
||||||
wg.Done()
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
fmt.Printf("successfully cloned %s\n", repo.Path)
|
|
||||||
wg.Done()
|
|
||||||
continue
|
|
||||||
} else {
|
|
||||||
mutex.Lock()
|
mutex.Lock()
|
||||||
errs = append(errs, RepoError{Error: err, Repo: repo.Path})
|
errs = append(errs, RepoError{Error: err, Repo: repo.Path})
|
||||||
mutex.Unlock()
|
mutex.Unlock()
|
||||||
@@ -72,8 +65,21 @@ var (
|
|||||||
wg.Done()
|
wg.Done()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
fmt.Printf("successfully cloned %s\n", repo.Path)
|
||||||
|
wg.Done()
|
||||||
|
continue
|
||||||
|
} else {
|
||||||
|
mutex.Lock()
|
||||||
|
errs = append(errs, RepoError{Error: err, Repo: repo.Path})
|
||||||
|
mutex.Unlock()
|
||||||
|
log.Printf("clone failed for %s: %v\n", repo.Path, err)
|
||||||
|
wg.Done()
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
}()
|
}
|
||||||
|
}
|
||||||
|
for i := 0; i < jobs; i++ {
|
||||||
|
go cloneFunc()
|
||||||
}
|
}
|
||||||
fmt.Println(len(conf.Repos))
|
fmt.Println(len(conf.Repos))
|
||||||
for _, repo := range conf.Repos {
|
for _, repo := range conf.Repos {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package cmd
|
|||||||
import (
|
import (
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/taigrr/mg/parse"
|
"github.com/taigrr/mg/parse"
|
||||||
)
|
)
|
||||||
@@ -27,5 +28,11 @@ func GetConfig() parse.MGConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
homeDir, _ := os.UserHomeDir()
|
||||||
|
for i, repo := range conf.Repos {
|
||||||
|
if strings.HasPrefix(repo.Path, "$HOME") {
|
||||||
|
conf.Repos[i].Path = strings.Replace(repo.Path, "$HOME", homeDir, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
return conf
|
return conf
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ var (
|
|||||||
jobs int
|
jobs int
|
||||||
pullCmd = &cobra.Command{
|
pullCmd = &cobra.Command{
|
||||||
Use: "pull",
|
Use: "pull",
|
||||||
Short: "add current path to list of repos",
|
Short: "update all git repos specified in config",
|
||||||
Run: func(_ *cobra.Command, args []string) {
|
Run: func(_ *cobra.Command, args []string) {
|
||||||
type RepoError struct {
|
type RepoError struct {
|
||||||
Error error
|
Error error
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
git "github.com/go-git/go-git/v5"
|
git "github.com/go-git/go-git/v5"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@@ -52,6 +53,16 @@ var registerCmd = &cobra.Command{
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
path = newPath.Filesystem.Root()
|
path = newPath.Filesystem.Root()
|
||||||
|
|
||||||
|
homeDir, err := os.UserHomeDir()
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Unable to get home directory")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
if strings.HasPrefix(path, homeDir) {
|
||||||
|
path = "$HOME" + path[len(homeDir):]
|
||||||
|
}
|
||||||
|
|
||||||
for _, v := range conf.Repos {
|
for _, v := range conf.Repos {
|
||||||
if v.Path == path {
|
if v.Path == path {
|
||||||
fmt.Printf("repo %s already registered\n", path)
|
fmt.Printf("repo %s already registered\n", path)
|
||||||
|
|||||||
2
go.mod
2
go.mod
@@ -1,6 +1,6 @@
|
|||||||
module github.com/taigrr/mg
|
module github.com/taigrr/mg
|
||||||
|
|
||||||
go 1.21
|
go 1.23.1
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/go-git/go-git/v5 v5.11.0
|
github.com/go-git/go-git/v5 v5.11.0
|
||||||
|
|||||||
@@ -32,9 +32,9 @@ func (m MRConfig) ToMGConfig() MGConfig {
|
|||||||
mgconf := MGConfig(m)
|
mgconf := MGConfig(m)
|
||||||
for i, repo := range mgconf.Repos {
|
for i, repo := range mgconf.Repos {
|
||||||
checkout := repo.Remote
|
checkout := repo.Remote
|
||||||
if strings.HasPrefix(checkout, "git clone '") {
|
if after, ok := strings.CutPrefix(checkout, "git clone '"); ok {
|
||||||
// git clone 'git@bitbucket.org:taigrr/mg.git' 'mg'
|
// git clone 'git@bitbucket.org:taigrr/mg.git' 'mg'
|
||||||
remote := strings.TrimPrefix(checkout, "git clone '")
|
remote := after
|
||||||
sp := strings.Split(remote, "' '")
|
sp := strings.Split(remote, "' '")
|
||||||
remote = sp[0]
|
remote = sp[0]
|
||||||
mgconf.Repos[i].Remote = remote
|
mgconf.Repos[i].Remote = remote
|
||||||
|
|||||||
Reference in New Issue
Block a user