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

branch

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: 8 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var Create = app.Register(&app.Command[gitops.CreateFlags, app.Empty]{
	Use:    "branch {name}",
	Desc:   "Create a branch",
	Action: "Create",

	Prepare: gitops.PrepareCreate,

	Run: func(ctx *app.Context[gitops.CreateFlags, app.Empty]) error {
		name := ctx.Arg(0)
		err := git.Checkout(name, true, git.Default)
		if err != nil {
			return err
		}
		if !ctx.Flags.NoPush {
			err = git.Exec([]string{"push", "--set-upstream", ctx.Flags.Remote, name}, git.Default)
			if err != nil {
				return err
			}
		}
		return nil
	},
})
View Source
var Switch = app.Register(&app.Command[app.Empty, app.Empty]{
	Use:    "branch [branch]",
	Desc:   "Switch to a local branch",
	Action: "Switch",

	PrepareNoFlag: func(cmd *cobra.Command) {
		cmd.Args = cobra.MaximumNArgs(1)
		cmd.ValidArgsFunction = app.Comp(app.CompGitLocalBranch(false))
	},

	Run: func(ctx *app.Context[app.Empty, app.Empty]) error {
		branch := ctx.Arg(0)
		if branch == "" {
			names, err := git.ListLocalBranchNames(false, git.Default)
			if err != nil {
				return err
			}
			if len(names) == 0 {
				return errors.New("no branch to search")
			}
			idx, err := term.FuzzySearch("branch", names)
			if err != nil {
				return err
			}
			branch = names[idx]
		}
		return git.Checkout(branch, false, git.Default)
	},
})
View Source
var SwitchRemote = app.Register(&app.Command[SwitchRemoteFlags, app.Empty]{
	Use:    "remote [-r remote] [--no-fetch] [--local {local}] {remote}",
	Desc:   "Switch to a remote branch",
	Action: "Switch",

	Prepare: func(cmd *cobra.Command, flags *SwitchRemoteFlags) {
		gitops.PreapreRemoteFlags(cmd, &flags.RemoteFlags)
		gitops.PreapreFetchFlags(cmd, &flags.FetchFlags)
		cmd.Args = cobra.MaximumNArgs(1)
		cmd.ValidArgsFunction = app.Comp(app.CompGitRemoteBranch)
		cmd.Flags().StringVarP(&flags.Local, "local", "", "", "local branch name")
	},

	Run: func(ctx *app.Context[SwitchRemoteFlags, app.Empty]) error {
		branch := ctx.Arg(0)
		if branch == "" {
			if !ctx.Flags.NoFetch {
				err := git.Fetch(ctx.Flags.Remote, true, false, git.Default)
				if err != nil {
					return err
				}
			}
			branches, err := git.ListLocalBranches(git.Default)
			if err != nil {
				return err
			}
			names, err := git.ListRemoteBranches(ctx.Flags.Remote, branches, git.Default)
			if err != nil {
				return err
			}
			if len(names) == 0 {
				return errors.New("no remote branch")
			}
			idx, err := term.FuzzySearch("remote branch", names)
			if err != nil {
				return err
			}
			branch = names[idx]
		}

		local := ctx.Flags.Local
		if local == "" {
			local = branch
		}

		target := fmt.Sprintf("%s/%s", ctx.Flags.Remote, branch)
		return git.Switch(local, target, git.Default)
	},
})
View Source
var Sync = app.Register(&app.Command[SyncFlags, SyncData]{
	Use:    "branch",
	Desc:   "Sync branch with remote",
	Action: "Sync",

	Prepare: func(cmd *cobra.Command, flags *SyncFlags) {
		cmd.Flags().BoolVarP(&flags.NoDelete, "no-delete", "", false, "donot delete any branch")
		cmd.Flags().StringVarP(&flags.Remote, "remote", "r", "origin", "remote name")
		cmd.RegisterFlagCompletionFunc("remote", app.Comp(app.CompGitRemote))
	},

	Init: func(ctx *app.Context[SyncFlags, SyncData]) error {
		ctx.Data = new(SyncData)
		err := git.EnsureNoUncommitted(git.Default)
		if err != nil {
			return err
		}
		err = git.Fetch(ctx.Flags.Remote, true, false, git.Default)
		if err != nil {
			return err
		}
		branches, err := git.ListLocalBranches(git.Default)
		if err != nil {
			return err
		}
		ctx.Data.Branches = branches

		branchWord := english.Plural(len(branches), "branch", "branches")
		term.Println("found", term.Style(branchWord, "magenta"))

		mainBranch, err := git.GetDefaultBranch(ctx.Flags.Remote, git.Default)
		if err != nil {
			return err
		}
		ctx.Data.MainBranch = mainBranch
		term.Println("main branch is", term.Style(mainBranch, "magenta"))

		ctx.Data.BackupBranch = mainBranch
		err = syncCreateTasks(ctx)
		if err != nil {
			return err
		}
		if ctx.Data.CurrentBranch == "" {
			ctx.Data.CurrentBranch, err = git.GetCurrentBranch(git.Default)
			if err != nil {
				return err
			}
		}
		back := ctx.Data.BackupBranch
		term.Println("backup branch is", term.Style(back, "magenta"))
		term.Println()
		return nil
	},

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

		taskWord := english.Plural(len(ctx.Data.Tasks), "task", "")
		term.Printf("we have %s to run:", taskWord)
		for _, task := range ctx.Data.Tasks {
			term.Println(task.desc)
		}
		term.ConfirmExit("continue")

		for _, task := range ctx.Data.Tasks {
			if ctx.Data.CurrentBranch != task.branch {
				git.Checkout(task.branch, false, git.QuietOutput)
				ctx.Data.CurrentBranch = task.branch
			}
			err := git.Exec(task.cmd, git.Default)
			if err != nil {
				return err
			}
		}

		if ctx.Data.CurrentBranch != ctx.Data.BackupBranch {
			return git.Checkout(ctx.Data.BackupBranch, false, git.QuietOutput)
		}
		return nil
	},
})

Functions

This section is empty.

Types

type SwitchRemoteFlags added in v0.1.0

type SwitchRemoteFlags struct {
	gitops.RemoteFlags
	gitops.FetchFlags

	Local string
}

type SyncData added in v0.1.0

type SyncData struct {
	MainBranch    string
	BackupBranch  string
	CurrentBranch string

	Branches []*git.BranchDetail

	Tasks []*syncTask
}

type SyncFlags added in v0.1.0

type SyncFlags struct {
	NoDelete bool
	Remote   string
}

Jump to

Keyboard shortcuts

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