pupirka
/
git.go
230 строк · 5.3 Кб
1package main2
3import (4"fmt"5"gopkg.in/src-d/go-git.v4"6"gopkg.in/src-d/go-git.v4/plumbing"7"gopkg.in/src-d/go-git.v4/plumbing/object"8"gopkg.in/src-d/go-git.v4/plumbing/transport/http"9"time"10)
11
12type GitClient struct {13Folder string14Repo string15Token string16NeedPush bool17RepoUrl string18Auth http.BasicAuth19Branch plumbing.ReferenceName20Repository *git.Repository21}
22
23var gitClient GitClient24
25func RunGlobalPreStart() error {26
27gitClient.Folder = ConfigV.GetString("path.backup")28gitClient.RepoUrl = ConfigV.GetString("git.remote")29if gitClient.CheckRepo() == false {30return nil31}32if gitClient.RepoUrl == "" {33rep, err := git.PlainOpen(gitClient.Folder)34if err != nil {35return err36}37gitClient.Repository = rep38return nil39}40gitClient.Auth = struct{ Username, Password string }{Username: ConfigV.GetString("git.user"), Password: ConfigV.GetString("git.password")}41rep, err := git.PlainClone(gitClient.Folder, false, &git.CloneOptions{42URL: gitClient.RepoUrl,43Auth: &gitClient.Auth,44ReferenceName: plumbing.NewBranchReferenceName(ConfigV.GetString("git.branch")),45SingleBranch: true,46})47if err == git.ErrRepositoryAlreadyExists {48rep, err := git.PlainOpen(gitClient.Folder)49if err != nil {50return err51}52gitClient.Repository = rep53return nil54}55if err != nil {56return err57}58gitClient.Repository = rep59
60return nil61}
62
63func (c *GitClient) AddFile(filename string) error {64if c.CheckRepo() == false {65return nil66}67LogConsole.Infof("Adding File %s to repo", filename)68w, err := c.Repository.Worktree()69if err != nil {70LogConsole.Errorf("Error git get WorkTree: %s", err.Error())71return err72}73_, err = w.Status()74if err != nil {75LogConsole.Errorf("Error git get WorkTree Status: %s", err.Error())76return err77}78if len(filename) > len(c.Folder) {79if filename[:len(c.Folder)] == c.Folder {80filename = filename[len(c.Folder)+1:]81}82}83_, err = w.Add(filename)84if err != nil {85LogConsole.Errorf("Error git WorkTree add file: %s %s", err.Error(), filename)86return err87}88
89commitName := fmt.Sprintf("Added File Automated %s", filename)90commit, err := w.Commit(commitName, &git.CommitOptions{91Author: &object.Signature{92Name: ConfigV.GetString("git.name"),93Email: ConfigV.GetString("git.user"),94When: time.Now(),95},96})97_, err = c.Repository.CommitObject(commit)98if err != nil {99LogConsole.Infof("Error git Commit name:%s", commitName)100return err101}102if c.RepoUrl != "" {103c.NeedPush = true104}105return nil106}
107func (c *GitClient) RemoveFile(filename string) error {108if c.CheckRepo() == false {109return nil110}111LogConsole.Infof("Remove File %s to repo", filename)112w, err := c.Repository.Worktree()113if err != nil {114LogConsole.Errorf("Error git get WorkTree: %s", err.Error())115return err116}117_, err = w.Status()118if err != nil {119LogConsole.Errorf("Error git get WorkTree Status: %s", err.Error())120return err121}122if len(filename) > len(c.Folder) {123if filename[:len(c.Folder)] == c.Folder {124filename = filename[len(c.Folder)+1:]125}126}127_, err = w.Remove(filename)128if err != nil {129LogConsole.Errorf("Error git WorkTree add file: %s %s", err.Error(), filename)130return err131}132commitName := fmt.Sprintf("Remove File Automated %s", filename)133commit, err := w.Commit(commitName, &git.CommitOptions{134Author: &object.Signature{135Name: "Pupirka",136Email: ConfigV.GetString("git.user"),137When: time.Now(),138},139})140_, err = c.Repository.CommitObject(commit)141if err != nil {142LogConsole.Infof("Error git Commit name:%s", commitName)143return err144}145if c.RepoUrl != "" {146c.NeedPush = true147}148
149return nil150}
151
152func (c *GitClient) CheckPush() error {153if c.CheckRepo() == false {154return nil155}156if c.NeedPush {157return c.Push()158}159return nil160}
161
162func (c *GitClient) Push() error {163if c.CheckRepo() == false {164return nil165}166
167err := c.Repository.Push(&git.PushOptions{168Auth: &c.Auth,169})170if err == git.NoErrAlreadyUpToDate {171return nil172}173if err != nil {174LogConsole.Warn(err.Error())175return err176}177LogConsole.Infof("git Push remote: %s", c.RepoUrl)178c.NeedPush = false179return nil180}
181
182func (c *GitClient) SetCommit(filename string) error {183if c.CheckRepo() == false {184return nil185}186LogConsole.Infof("Change File %s to repo", filename)187w, err := c.Repository.Worktree()188if err != nil {189LogConsole.Error(fmt.Sprintf("Error git get WorkTree: %s", err.Error()))190return err191}192
193_, err = w.Status()194if err != nil {195LogConsole.Error(fmt.Sprintf("Error git get WorkTree Status: %s", err.Error()))196return err197}198if len(filename) > len(c.Folder) {199if filename[:len(c.Folder)] == c.Folder {200filename = filename[len(c.Folder)+1:]201}202}203_, err = w.Add(filename)204if err != nil {205LogConsole.Error(fmt.Sprintf("Error git WorkTree add file: %s %s", err.Error(), filename))206return err207}208commitName := fmt.Sprintf("Change File %s", filename)209commit, err := w.Commit(commitName, &git.CommitOptions{210Author: &object.Signature{211Name: ConfigV.GetString("git.user"),212Email: ConfigV.GetString("git.email"),213When: time.Now(),214},215})216_, err = c.Repository.CommitObject(commit)217if err != nil {218LogConsole.Error(fmt.Sprintf("Error git Commit name:%s", commitName))219return err220}221c.NeedPush = true222return nil223}
224
225func (c *GitClient) CheckRepo() bool {226if c.RepoUrl == "" {227return false228}229return true230}
231