Semaphore/db_lib/CmdGitClient.go

159 lines
3.8 KiB
Go
Raw Normal View History

2023-09-23 17:12:35 +02:00
package db_lib
2023-02-26 07:22:47 +01:00
import (
"fmt"
"os"
"os/exec"
"strings"
"github.com/semaphoreui/semaphore/db"
"github.com/semaphoreui/semaphore/util"
2023-02-26 07:22:47 +01:00
)
2023-09-23 17:12:35 +02:00
type CmdGitClient struct {
keyInstallation db.AccessKeyInstallation
}
2023-02-26 07:22:47 +01:00
func (c CmdGitClient) makeCmd(r GitRepository, targetDir GitRepositoryDirType, args ...string) *exec.Cmd {
cmd := exec.Command("git") //nolint: gas
cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, fmt.Sprintln("GIT_TERMINAL_PROMPT=0"))
if r.Repository.SSHKey.Type == db.AccessKeySSH {
cmd.Env = append(cmd.Env, fmt.Sprintf("SSH_AUTH_SOCK=%s", c.keyInstallation.SSHAgent.SocketFile))
2023-09-23 17:47:27 +02:00
sshCmd := "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
2023-02-26 07:22:47 +01:00
if util.Config.SshConfigPath != "" {
sshCmd += " -F " + util.Config.SshConfigPath
}
cmd.Env = append(cmd.Env, fmt.Sprintf("GIT_SSH_COMMAND=%s", sshCmd))
}
switch targetDir {
case GitRepositoryTmpPath:
2023-02-26 07:22:47 +01:00
cmd.Dir = util.Config.TmpPath
case GitRepositoryFullPath:
2023-02-26 07:22:47 +01:00
cmd.Dir = r.GetFullPath()
default:
panic("unknown Repository directory type")
}
cmd.Args = append(cmd.Args, args...)
return cmd
}
func (c CmdGitClient) run(r GitRepository, targetDir GitRepositoryDirType, args ...string) error {
2023-09-23 17:12:35 +02:00
var err error
2023-09-23 17:47:27 +02:00
c.keyInstallation, err = r.Repository.SSHKey.Install(db.AccessKeyRoleGit, r.Logger)
2023-09-23 17:12:35 +02:00
2023-02-26 07:22:47 +01:00
if err != nil {
return err
}
2023-09-23 17:12:35 +02:00
defer c.keyInstallation.Destroy() //nolint: errcheck
2023-02-26 07:22:47 +01:00
cmd := c.makeCmd(r, targetDir, args...)
r.Logger.LogCmd(cmd)
return cmd.Run()
}
func (c CmdGitClient) output(r GitRepository, targetDir GitRepositoryDirType, args ...string) (out string, err error) {
2023-09-23 17:47:27 +02:00
c.keyInstallation, err = r.Repository.SSHKey.Install(db.AccessKeyRoleGit, r.Logger)
2023-02-26 07:22:47 +01:00
if err != nil {
return
}
2023-09-23 17:12:35 +02:00
defer c.keyInstallation.Destroy() //nolint: errcheck
2023-02-26 07:22:47 +01:00
bytes, err := c.makeCmd(r, targetDir, args...).Output()
if err != nil {
return
}
out = strings.Trim(string(bytes), " \n")
return
}
func (c CmdGitClient) Clone(r GitRepository) error {
r.Logger.Log("Cloning Repository " + r.Repository.GitURL)
var dirName string
if r.TmpDirName == "" {
dirName = r.Repository.GetDirName(r.TemplateID)
} else {
dirName = r.TmpDirName
}
return c.run(r, GitRepositoryTmpPath,
2023-02-26 07:22:47 +01:00
"clone",
"--recursive",
"--branch",
r.Repository.GitBranch,
r.Repository.GetGitURL(),
dirName)
2023-02-26 07:22:47 +01:00
}
func (c CmdGitClient) Pull(r GitRepository) error {
r.Logger.Log("Updating Repository " + r.Repository.GitURL)
return c.run(r, GitRepositoryFullPath, "pull", "--recurse-submodules", "origin", r.Repository.GitBranch)
2023-02-26 07:22:47 +01:00
}
func (c CmdGitClient) Checkout(r GitRepository, target string) error {
r.Logger.Log("Checkout repository to " + target)
return c.run(r, GitRepositoryFullPath, "checkout", target)
2023-02-26 07:22:47 +01:00
}
func (c CmdGitClient) CanBePulled(r GitRepository) bool {
err := c.run(r, GitRepositoryFullPath, "fetch")
2023-02-26 07:22:47 +01:00
if err != nil {
return false
}
err = c.run(r, GitRepositoryFullPath,
2023-02-26 07:22:47 +01:00
"merge-base", "--is-ancestor", "HEAD", "origin/"+r.Repository.GitBranch)
return err == nil
}
func (c CmdGitClient) GetLastCommitMessage(r GitRepository) (msg string, err error) {
r.Logger.Log("Get current commit message")
msg, err = c.output(r, GitRepositoryFullPath, "show-branch", "--no-name", "HEAD")
2023-02-26 07:22:47 +01:00
if err != nil {
return
}
if len(msg) > 100 {
msg = msg[0:100]
}
return
}
func (c CmdGitClient) GetLastCommitHash(r GitRepository) (hash string, err error) {
r.Logger.Log("Get current commit hash")
hash, err = c.output(r, GitRepositoryFullPath, "rev-parse", "HEAD")
2023-02-26 07:22:47 +01:00
return
}
func (c CmdGitClient) GetLastRemoteCommitHash(r GitRepository) (hash string, err error) {
out, err := c.output(r, GitRepositoryTmpPath, "ls-remote", r.Repository.GetGitURL(), r.Repository.GitBranch)
2023-02-26 07:22:47 +01:00
if err != nil {
return
}
firstSpaceIndex := strings.IndexAny(out, "\t ")
if firstSpaceIndex == -1 {
err = fmt.Errorf("can't retreave remote commit hash")
}
if err != nil {
return
}
hash = out[0:firstSpaceIndex]
return
}