package git

import (
	"github.com/go-git/go-git/v5"
	"github.com/go-git/go-git/v5/config"
	"github.com/sirupsen/logrus"
)

// Push pushes the latest changes & optionally tags to the default remote
func Push(repoDir string, remote string, tags bool, dryRun bool) error {
	if dryRun {
		logrus.Debugf("dry run: no git changes pushed in %s", repoDir)
		return nil
	}

	commitRepo, err := git.PlainOpen(repoDir)
	if err != nil {
		return err
	}

	opts := &git.PushOptions{}
	if remote != "" {
		opts.RemoteName = remote
	}

	if err := commitRepo.Push(opts); err != nil {
		return err
	}

	logrus.Debugf("git changes pushed")

	if tags {
		opts.RefSpecs = append(opts.RefSpecs, config.RefSpec("+refs/tags/*:refs/tags/*"))

		if err := commitRepo.Push(opts); err != nil {
			return err
		}

		logrus.Debugf("git tags pushed")
	}

	return nil
}