summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej Wereski <m.wereski@partner.samsung.com>2017-03-07 13:10:32 +0100
committerMaciej Wereski <m.wereski@partner.samsung.com>2017-08-17 08:53:00 +0200
commit55a6a5107ab60579f94af53ac2844f97add4f5d8 (patch)
treeb2cdea35f352cb9b4336e70657507469f9c78d7f
parent1a7c29ab68d6dd3262d440642cb35df1ad19b016 (diff)
downloadsnapsync-55a6a5107ab60579f94af53ac2844f97add4f5d8.tar.gz
snapsync-55a6a5107ab60579f94af53ac2844f97add4f5d8.tar.bz2
snapsync-55a6a5107ab60579f94af53ac2844f97add4f5d8.zip
Implement "Add Remote" job
Change-Id: Ib2867c3e36bf1acd7783aa0fb955a4b9dcfdb54a Signed-off-by: Maciej Wereski <m.wereski@partner.samsung.com>
-rw-r--r--git/git.go37
1 files changed, 36 insertions, 1 deletions
diff --git a/git/git.go b/git/git.go
index 27a437c..b36c9b0 100644
--- a/git/git.go
+++ b/git/git.go
@@ -17,7 +17,9 @@
package gitManager
import (
+ "fmt"
"log"
+ "strings"
git "gopkg.in/libgit2/git2go.v24"
)
@@ -25,7 +27,40 @@ import (
// gitAddRemote is one of jobs that can be run by workers. It adds remote that
// is described in req in local git repository that can be found under localMirror/req.Repo.
func gitAddRemote(localMirror string, req *GitRepo) error {
- log.Println("Add remote " + req.RemoteName + " in " + localMirror + req.Repo + ".")
+ if req.RemoteName == "" || req.RemoteURL == "" {
+ return fmt.Errorf("%s: URL or remote name empty", req.Repo)
+ }
+
+ repo, err := git.OpenRepository(localMirror + req.Repo)
+ if err != nil {
+ return err
+ }
+ defer repo.Free()
+
+ remote, err := repo.Remotes.Lookup(req.RemoteName)
+ if err != nil {
+ if err.(*git.GitError).Code != git.ErrNotFound {
+ return fmt.Errorf("looking for remote failed: %s", err)
+ }
+ r, err := repo.Remotes.Create(req.RemoteName, req.RemoteURL)
+ if err != nil {
+ return fmt.Errorf("couldn't create remote: %s", err)
+ }
+ r.Free()
+ // remote with requested name already exists
+ } else {
+ defer remote.Free()
+ // in case of different URL generate new name and update req.RemoteName
+ if url := remote.Url(); url != req.RemoteURL {
+ name := req.RemoteName + "." + req.Tag[strings.LastIndex(req.Tag, "/")+1:]
+ r, err := repo.Remotes.Create(name, req.RemoteURL)
+ if err != nil {
+ return fmt.Errorf("couldn't create remote %s: %s", name, err)
+ }
+ r.Free()
+ req.RemoteName = name
+ }
+ }
return nil
}