Help us shape the future of Go! Take the 2026 Go Developer Survey

tools

package
v0.6.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 20, 2023 License: MIT Imports: 11 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var Rebase = app.Register(&app.Command[RebaseFlags, app.Empty]{
	Use:  "rebase [-r remote] [-u] [target]",
	Desc: "Pull and rebase",

	Prepare: func(cmd *cobra.Command, flags *RebaseFlags) {
		cmd.Flags().StringVarP(&flags.Remote, "remote", "r", "", "remote name")
		cmd.RegisterFlagCompletionFunc("remote", app.Comp(app.CompGitRemote))

		cmd.Args = cobra.MaximumNArgs(1)
		cmd.ValidArgsFunction = app.Comp(app.CompGitLocalBranch(false))

		cmd.Flags().BoolVarP(&flags.Upstream, "upstream", "u", false, "use upstream")
	},

	Init: func(_ *app.Context[RebaseFlags, app.Empty]) error {
		err := git.EnsureNoUncommitted(git.Default)
		if err != nil {
			return err
		}
		return nil
	},

	Run: func(ctx *app.Context[RebaseFlags, app.Empty]) error {
		branch := ctx.Arg(0)
		target, _, err := getTarget(branch, ctx.Flags.Remote, ctx.Flags.Upstream)
		if err != nil {
			return err
		}

		err = git.Pull(git.Default)
		if err != nil {
			return err
		}

		err = git.Exec([]string{"rebase", target}, git.Default)
		if err != nil {
			term.Warn("rebase: found conflict(s), please handle manually")
			return nil
		}

		return nil
	},
})
View Source
var Reset = app.Register(&app.Command[ResetFlags, app.Empty]{
	Use:  "reset [-r remote] [-u] [target]",
	Desc: "Reset current branch to target",

	Prepare: func(cmd *cobra.Command, flags *ResetFlags) {
		cmd.Flags().StringVarP(&flags.Remote, "remote", "r", "", "remote name")
		cmd.RegisterFlagCompletionFunc("remote", app.Comp(app.CompGitRemote))

		cmd.Args = cobra.MaximumNArgs(1)
		cmd.ValidArgsFunction = app.Comp(app.CompGitLocalBranch(false))

		cmd.Flags().BoolVarP(&flags.Upstream, "upstream", "u", false, "use upstream")
	},

	Init: func(_ *app.Context[ResetFlags, app.Empty]) error {
		err := git.EnsureNoUncommitted(git.Default)
		if err != nil {
			return err
		}
		return nil
	},

	Run: func(ctx *app.Context[ResetFlags, app.Empty]) error {
		branch := ctx.Arg(0)
		target, _, err := getTarget(branch, ctx.Flags.Remote, ctx.Flags.Upstream)
		if err != nil {
			return err
		}

		err = git.Pull(git.Default)
		if err != nil {
			return err
		}

		return git.Exec([]string{"reset", "--hard", target}, git.Default)
	},
})
View Source
var Restore = app.Register(&app.Command[app.Empty, app.Empty]{
	Use:  "restore",
	Desc: "Restore all changes",

	RunNoContext: func() error {
		err := git.Exec([]string{"restore", "."}, git.Default)
		if err != nil {
			return err
		}
		return git.Exec([]string{"clean", "-fd"}, git.Default)
	},
})
View Source
var Squash = app.Register(&app.Command[SquashFlags, SquashData]{
	Use:  "squash [-r remote] [-n num] [-m message] [branch] [-u]",
	Desc: "Squash multiple commits into one",

	Prepare: func(cmd *cobra.Command, flags *SquashFlags) {
		cmd.Flags().StringVarP(&flags.Remote, "remote", "r", "", "remote name")
		cmd.RegisterFlagCompletionFunc("remote", app.Comp(app.CompGitRemote))

		cmd.Args = cobra.MaximumNArgs(1)
		cmd.ValidArgsFunction = app.Comp(app.CompGitLocalBranch(false))

		cmd.Flags().IntVarP(&flags.Num, "num", "n", 0, "number of commits to squash")

		cmd.Flags().StringVarP(&flags.Message, "message", "m", "", "commit message")
		cmd.Flags().BoolVarP(&flags.Upstream, "upstream", "u", false, "use upstream")
	},

	Init: func(ctx *app.Context[SquashFlags, SquashData]) error {
		branch := ctx.Arg(0)
		target, _, err := getTarget(branch, ctx.Flags.Remote, ctx.Flags.Upstream)
		if err != nil {
			return err
		}

		commits, err := git.ListCommitsBetween(target, git.Default)
		if err != nil {
			return err
		}

		if len(commits) == 0 {
			return errors.New("no commit to squash")
		}
		if len(commits) == 1 {
			return errors.New("only found one commit, no need to squash")
		}

		commitWord := english.Plural(len(commits), "commit", "")
		if ctx.Flags.Num > 1 {
			if ctx.Flags.Num > len(commits) {
				return fmt.Errorf("%s between HEAD and %s, but number %d is too big", commitWord, target, ctx.Flags.Num)
			}
			commits = commits[:ctx.Flags.Num]
		}

		ctx.Data = &SquashData{
			Word:    commitWord,
			Commits: commits,
		}
		return nil
	},

	Run: func(ctx *app.Context[SquashFlags, SquashData]) error {
		commits := ctx.Data.Commits
		if len(commits) == 0 {
			term.Println("nothing to do")
			return nil
		}

		term.Println()
		term.Printf("found %s to squash:", term.Style(ctx.Data.Word, "green"))
		for _, commit := range commits {
			term.Printf("  * %s", commit)
		}
		term.ConfirmExit("continue")

		num := len(commits)
		err := git.Exec([]string{
			"reset", "--soft", fmt.Sprintf("HEAD~%d", num),
		}, git.Default)
		if err != nil {
			return err
		}

		commitArgs := []string{"commit"}
		if ctx.Flags.Message != "" {
			commitArgs = append(commitArgs, "-m", ctx.Flags.Message)
		}
		cmd := exec.Command("git", commitArgs...)
		cmd.Stdout = os.Stdout
		cmd.Stderr = os.Stderr
		cmd.Stdin = os.Stdin

		err = cmd.Run()
		return errors.Trace(err, "git commit")
	},
})

Functions

This section is empty.

Types

type RebaseFlags

type RebaseFlags struct {
	Remote   string
	Upstream bool
}

type ResetFlags added in v0.6.0

type ResetFlags struct {
	Remote   string
	Upstream bool
}

type SquashData

type SquashData struct {
	Word    string
	Commits []string
}

type SquashFlags

type SquashFlags struct {
	Remote string

	Message string

	Num int

	Upstream bool
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL