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.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..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,10 +24,13 @@ 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) - assert.EqualError(t, err, git.ErrRepositoryAlreadyExists.Error()) + assert.Error(t, git.ErrRepositoryAlreadyExists, err) } func TestGitPull(t *testing.T) { @@ -37,10 +41,73 @@ 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) + + 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.DirExists(t, test_folder) + 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) + assert.NoError(t, err) + + 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) + + ref, err = r.Head() + assert.NoError(t, err) + assert.Equal(t, head, ref.Hash().String()) +} + +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/main_test.go b/main_test.go index 9c8f99e..9b8cf6d 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 64120ca..d9809bf 100644 --- a/restrouter.go +++ b/restrouter.go @@ -389,7 +389,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 cb1d299..c3d7443 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" @@ -52,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:" @@ -88,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"