summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorIbrahim Serdar Acikgoz <serdaracikgoz86@gmail.com>2018-11-17 01:17:51 +0300
committerIbrahim Serdar Acikgoz <serdaracikgoz86@gmail.com>2018-11-17 01:17:51 +0300
commit52ef4641956f3ce07c7d63bf69648e8dd8d73efe (patch)
tree7c4716a98cff4d9a600b8bef5eb276ce2987d259 /main.go
parentadded command line parser. (diff)
downloadgitbatch-52ef4641956f3ce07c7d63bf69648e8dd8d73efe.tar.gz
imporvement has been done
Diffstat (limited to 'main.go')
-rw-r--r--main.go70
1 files changed, 41 insertions, 29 deletions
diff --git a/main.go b/main.go
index e7ec14a..4f7af83 100644
--- a/main.go
+++ b/main.go
@@ -1,22 +1,27 @@
package main
import (
+ "fmt"
"io/ioutil"
"log"
+ "strings"
"os"
- "os/exec"
- "syscall"
"gopkg.in/alecthomas/kingpin.v2"
+ "gopkg.in/src-d/go-git.v4"
+ "gopkg.in/src-d/go-git.v4/plumbing"
)
var (
currentDir, err = os.Getwd()
dir = kingpin.Flag("directory", "Directory to roam for git repositories.").Default(currentDir).Short('d').String()
+ repoPattern = kingpin.Flag("pattern", "Pattern to filter repositories").Short('p').String()
+ branch = kingpin.Flag("branch", "branch to be pulled").Default("master").Short('b').String()
+ remote = kingpin.Flag("remote", "remote name te be pulled").Default("origin").Short('r').String()
)
func main() {
kingpin.Parse()
- log.Printf("the diretory under investigation is %s", *dir)
+ log.Printf("%s is your repo pattern", *repoPattern)
FindRepos(*dir)
}
@@ -27,39 +32,46 @@ func FindRepos(directory string) []string {
if err != nil {
log.Fatal(err)
}
-
- for _, f := range files {
- if IsRepo((directory + "/" + f.Name())) == true {
- log.Println(f.Name() + " is a git repository")
+ filteredFiles := FilterRepos(files)
+ for _, f := range filteredFiles {
+ repo := directory + "/" + f.Name()
+ r, err := git.PlainOpen(repo)
+ if err !=nil {
+ continue
}
+ // Get the working directory for the repository
+ w, err := r.Worktree()
+ CheckIfError(err)
+
+ ref := plumbing.ReferenceName("refs/heads/" + *branch)
+ err = w.Pull(&git.PullOptions{
+ RemoteName: *remote,
+ Progress: os.Stdout,
+ ReferenceName: ref,
+ })
+ CheckIfError(err)
}
return gitRepositories
}
-func IsRepo(directory string) bool {
-
- argstr := []string{ "-C", directory, "status"}
-
- cmd := exec.Command("git", argstr...)
-
- if err := cmd.Start(); err != nil {
- log.Fatalf("cmd.Start: %v")
- }
-
- if err := cmd.Wait(); err != nil {
- if exiterr, ok := err.(*exec.ExitError); ok {
- // The program has exited with an exit code != 0
-
- // Do nothing
- if status, ok := exiterr.Sys().(syscall.WaitStatus); ok {
- log.Printf(directory + " is not a git repository, git command return code: %d", status.ExitStatus())
- }
+func FilterRepos(files []os.FileInfo) []os.FileInfo {
+ var filteredRepos []os.FileInfo
+ for _, f := range files {
+ if strings.Contains(f.Name(), *repoPattern) {
+ filteredRepos = append(filteredRepos, f)
} else {
- log.Fatalf("cmd.Wait: %v", err)
+ continue
}
- } else {
- return true
}
- return false
+ return filteredRepos
}
+// CheckIfError should be used to naively panics if an error is not nil.
+func CheckIfError(err error) {
+ if err == nil {
+ return
+ }
+
+ fmt.Printf("\x1b[31;1m%s\x1b[0m\n", fmt.Sprintf("error: %s", err))
+ os.Exit(1)
+}