From c7a940319a850306d5048eab149e11b0aedc7aec Mon Sep 17 00:00:00 2001 From: azak Date: Tue, 3 Nov 2020 17:05:27 +0100 Subject: [PATCH 1/2] GIT: adds git remote to pull options * Adds Create GitRemote method to create separate git remote for pulling with agent * Adds tests for pulling with special remote --- git.go | 25 ++++++++++++++++++++++++- git_test.go | 47 ++++++++++++++++++++++++++++++++++++++++++++--- statics.go | 3 +++ 3 files changed, 71 insertions(+), 4 deletions(-) diff --git a/git.go b/git.go index a7216f2..aa08cda 100644 --- a/git.go +++ b/git.go @@ -6,6 +6,7 @@ import ( "strings" git "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/config" "github.com/go-git/go-git/v5/plumbing/transport/http" ) @@ -45,6 +46,24 @@ func GitClone(repo string, dir string, home string, personal string) error { return nil } +func GitCreateRemote(dir string, home string, repoUrl string) error { + path := strings.ReplaceAll(dir, HOME, home) + r, err := git.PlainOpen(path) + if err != nil { + return err + } + _, err = r.Remote(GIT_REMOTE_NAME) + if err != nil && err == git.ErrRemoteNotFound { + log.Println("Adding remote: ", GIT_REMOTE_NAME) + _, err = r.CreateRemote(&config.RemoteConfig{ + Name: GIT_REMOTE_NAME, + URLs: []string{repoUrl}, + }) + return err + } + return err +} + func GitPull(dir string, home string, personal string) error { path := strings.ReplaceAll(dir, HOME, home) log.Println("Pulling from: ", path) @@ -59,13 +78,17 @@ func GitPull(dir string, home string, personal string) error { return err } - var pullOptions git.PullOptions + pullOptions := git.PullOptions{ + RemoteName: GIT_REMOTE_NAME, + } + if personal != "" { pullOptions.Auth = &http.BasicAuth{ Username: "abc123", // yes, this can be anything except an empty string Password: personal, } } + // Pull the latest changes from the origin remote and merge into the current branch err = w.Pull(&pullOptions) if err != nil && err != git.NoErrAlreadyUpToDate { diff --git a/git_test.go b/git_test.go index 7e69169..b229598 100644 --- a/git_test.go +++ b/git_test.go @@ -26,7 +26,7 @@ func TestGitClone(t *testing.T) { // Second Clone for test if repo exists error is ignored err = GitClone(GIT_TEST_REPO, GIT_TEST_FOLDER, pwd, "test") require.Error(t, err) - assert.EqualError(t, err, git.ErrRepositoryAlreadyExists.Error()) + assert.Error(t, git.ErrRepositoryAlreadyExists, err) } func TestGitPull(t *testing.T) { @@ -37,10 +37,51 @@ func TestGitPull(t *testing.T) { test_folder := strings.ReplaceAll(GIT_TEST_FOLDER, HOME, pwd) require.NoDirExists(t, test_folder) - err = GitClone(GIT_TEST_REPO, GIT_TEST_FOLDER, pwd, "") + r, err := git.PlainClone(test_folder, false, &git.CloneOptions{ + URL: GIT_TEST_REPO, + }) + require.NoError(t, err) + require.DirExists(t, test_folder) + remote, err := r.Remote(GIT_REMOTE_NAME) + assert.Error(t, git.ErrRemoteNotFound, err) + assert.Nil(t, remote) + + err = GitPull(GIT_TEST_FOLDER, pwd, "") + assert.Error(t, git.ErrRemoteNotFound, err) + err = GitCreateRemote(GIT_TEST_FOLDER, pwd, GIT_TEST_REPO) assert.NoError(t, err) - assert.DirExists(t, test_folder) err = GitPull(GIT_TEST_FOLDER, pwd, "") assert.NoError(t, err) + remote, err = r.Remote(GIT_REMOTE_NAME) + assert.NoError(t, err) + assert.NotNil(t, remote) +} + +func TestGitCreateRemote(t *testing.T) { + fmt.Println("running: TestGitCreateRemote") + t.Cleanup(clear) + + t.Cleanup(clear) + pwd, err := os.Getwd() + require.NoError(t, err) + test_folder := strings.ReplaceAll(GIT_TEST_FOLDER, HOME, pwd) + require.NoDirExists(t, test_folder) + + r, err := git.PlainClone(test_folder, false, &git.CloneOptions{ + URL: GIT_TEST_REPO, + }) + require.NoError(t, err) + require.DirExists(t, test_folder) + + remote, err := r.Remote(GIT_REMOTE_NAME) + assert.Error(t, git.ErrRemoteNotFound, err) + assert.Nil(t, remote) + + err = GitCreateRemote(GIT_TEST_FOLDER, pwd, GIT_TEST_REPO) + assert.NoError(t, err) + + remote, err = r.Remote(GIT_REMOTE_NAME) + assert.NoError(t, err) + assert.NotNil(t, remote) } diff --git a/statics.go b/statics.go index cb1d299..980a9e8 100644 --- a/statics.go +++ b/statics.go @@ -7,6 +7,9 @@ const ( RESTIC_ACCESS_KEY = "AWS_ACCESS_KEY_ID=" RESTIC_SECRET_KEY = "AWS_SECRET_ACCESS_KEY=" + // Git Contstatns + GIT_REMOTE_NAME = "agent_remote" + // Store Constants STORE_TOKEN = "token" STORE_TIMESTAMP = "timestamp" From bca194d7bcfa08fd1fc9c8fac9a83d59c9f7d783 Mon Sep 17 00:00:00 2001 From: azak-azkaran Date: Tue, 3 Nov 2020 22:16:47 +0100 Subject: [PATCH 2/2] GIT: adds remote creation in restrouter * Adds remote creation to restrouter to postGit function --- backup_test.go | 1 + git_test.go | 26 ++++++++++++++++++++++++++ main_test.go | 6 +++++- restrouter.go | 7 ++++++- statics.go | 3 +-- 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/backup_test.go b/backup_test.go index 75ac327..0e0ea6b 100644 --- a/backup_test.go +++ b/backup_test.go @@ -191,6 +191,7 @@ func TestBackupForget(t *testing.T) { cmd = ForgetRepoDetail(env, pwd, 1, 1, 1) job = CreateJobFromCommand(cmd, "forget") err = job.RunJob(true) + assert.NoError(t, err) cmd = ListRepo(env, pwd) job = CreateJobFromCommand(cmd, "list") diff --git a/git_test.go b/git_test.go index b229598..82ef31f 100644 --- a/git_test.go +++ b/git_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -23,6 +24,9 @@ func TestGitClone(t *testing.T) { assert.NoError(t, err) assert.DirExists(t, test_folder) + _, err = git.PlainOpen(test_folder) + assert.NoError(t, err) + // Second Clone for test if repo exists error is ignored err = GitClone(GIT_TEST_REPO, GIT_TEST_FOLDER, pwd, "test") require.Error(t, err) @@ -40,12 +44,30 @@ func TestGitPull(t *testing.T) { r, err := git.PlainClone(test_folder, false, &git.CloneOptions{ URL: GIT_TEST_REPO, }) + require.NoError(t, err) require.DirExists(t, test_folder) + + ref, err := r.Head() + require.NoError(t, err) + head := ref.Hash().String() + remote, err := r.Remote(GIT_REMOTE_NAME) assert.Error(t, git.ErrRemoteNotFound, err) assert.Nil(t, remote) + w, err := r.Worktree() + assert.NoError(t, err) + assert.NotNil(t, w) + + err = w.Checkout(&git.CheckoutOptions{ + Hash: plumbing.NewHash(GIT_TEST_COMMIT), + }) + assert.NoError(t, err) + ref, err = r.Head() + assert.NoError(t, err) + assert.Equal(t, GIT_TEST_COMMIT, ref.Hash().String()) + err = GitPull(GIT_TEST_FOLDER, pwd, "") assert.Error(t, git.ErrRemoteNotFound, err) err = GitCreateRemote(GIT_TEST_FOLDER, pwd, GIT_TEST_REPO) @@ -56,6 +78,10 @@ func TestGitPull(t *testing.T) { remote, err = r.Remote(GIT_REMOTE_NAME) assert.NoError(t, err) assert.NotNil(t, remote) + + ref, err = r.Head() + assert.NoError(t, err) + assert.Equal(t, head, ref.Hash().String()) } func TestGitCreateRemote(t *testing.T) { diff --git a/main_test.go b/main_test.go index da10a5e..0f28574 100644 --- a/main_test.go +++ b/main_test.go @@ -271,7 +271,11 @@ func TestMainSendRequest(t *testing.T) { Addr: MAIN_TEST_ADDRESS, Handler: router, } - go server.ListenAndServe() + go func() { + err := server.ListenAndServe() + assert.Equal(t, http.ErrServerClosed, err) + }() + time.Sleep(100 * time.Millisecond) AgentConfiguration.Address = MAIN_TEST_ADDRESS diff --git a/restrouter.go b/restrouter.go index 08db63c..8a84caf 100644 --- a/restrouter.go +++ b/restrouter.go @@ -382,7 +382,12 @@ func postGit(c *gin.Context) { }, msg.Mode+" "+v.Name) case "pull": job = CreateJobFromFunction(func() error { - return GitPull(v.Directory, config.Agent.HomeFolder, v.PersonalToken) + err := GitCreateRemote(v.Directory, config.Agent.HomeFolder, v.Rep) + if err != nil { + return err + } else { + return GitPull(v.Directory, config.Agent.HomeFolder, v.PersonalToken) + } }, msg.Mode+" "+v.Name) default: returnErr(errors.New("Not supported Mode: "+msg.Mode), ERROR_GIT, c) diff --git a/statics.go b/statics.go index 980a9e8..c3d7443 100644 --- a/statics.go +++ b/statics.go @@ -55,13 +55,11 @@ const ( ERROR_MODE = "Backup Mode:" ERROR_GIT = "GIT Mode:" ERROR_STATUS = "GetStatus:" - ERROR_LOG = "GetLogs:" ERROR_ISSEALED = "IsSealed:" ERROR_UNSEAL = "Unseal:" ERROR_SEAL = "Seal:" ERROR_RUNBACKUP = "RunBackupJob:" ERROR_RUNMOUNT = "RunMountJob:" - ERROR_ENQUEUE = "Enqueue:" ERROR_CONFIG = "GetConfigFromVault:" ERROR_BINDING = "BindJSON:" ERROR_PUT_TOKEN = "PutToken:" @@ -91,6 +89,7 @@ const ( GIT_TEST_REPO = "https://github.com/azak-azkaran/reverse-link" GIT_TEST_FOLDER_VIMRC = "~/test/vimrc" GIT_TEST_REPO_VIMRC = "https://github.com/amix/vimrc.git" + GIT_TEST_COMMIT = "dd7e3c0b1ec7bbde6034d8cb2739bcd67f2530a4" VAULT_TEST_PASSWORD = "hallo" VAULT_TEST_TOKEN = "superrandompasswordtoken"