package cmd import ( "fmt" "github.com/spf13/cobra" ) var collabPermission string // collaboratorCmd builds the `rickub repo collaborator` subtree. func collaboratorCmd() *cobra.Command { c := &cobra.Command{ Use: "collaborator", Aliases: []string{"collab"}, Short: "Manage repository collaborators", } listCmd := &cobra.Command{ Use: "list ", Short: "List collaborators (admin only)", Args: cobra.ExactArgs(1), RunE: runCollabList, } addCmd := &cobra.Command{ Use: "add ", Short: "Add or update a collaborator", Args: cobra.ExactArgs(2), RunE: runCollabAdd, } addCmd.Flags().StringVar(&collabPermission, "permission", "write", "read | write | admin") removeCmd := &cobra.Command{ Use: "remove ", Aliases: []string{"rm"}, Short: "Remove a collaborator", Args: cobra.ExactArgs(2), RunE: runCollabRemove, } c.AddCommand(listCmd, addCmd, removeCmd) return c } func runCollabList(cmd *cobra.Command, args []string) error { client, err := newClient() if err != nil { return err } owner, repo, err := parseOwnerRepo(args[0]) if err != nil { return err } cols, err := client.ListCollaborators(cmd.Context(), owner, repo) if err != nil { return err } if flagJSON { return printJSON(cmd.OutOrStdout(), cols) } if len(cols) == 0 { fmt.Fprintln(cmd.OutOrStdout(), "No collaborators.") return nil } tw := newTabw(cmd.OutOrStdout()) fmt.Fprintln(tw, "HANDLE\tPERMISSION\tNAME") for _, c := range cols { fmt.Fprintf(tw, "%s\t%s\t%s\n", c.Handle, c.Permission, dash(c.DisplayName)) } tw.Flush() return nil } func runCollabAdd(cmd *cobra.Command, args []string) error { client, err := newClient() if err != nil { return err } owner, repo, err := parseOwnerRepo(args[0]) if err != nil { return err } col, err := client.PutCollaborator(cmd.Context(), owner, repo, args[1], collabPermission) if err != nil { return err } if flagJSON { return printJSON(cmd.OutOrStdout(), col) } fmt.Fprintf(cmd.OutOrStdout(), "Granted %s %s on %s/%s\n", col.Handle, col.Permission, owner, repo) return nil } func runCollabRemove(cmd *cobra.Command, args []string) error { client, err := newClient() if err != nil { return err } owner, repo, err := parseOwnerRepo(args[0]) if err != nil { return err } if err := client.DeleteCollaborator(cmd.Context(), owner, repo, args[1]); err != nil { return err } fmt.Fprintf(cmd.OutOrStdout(), "Removed %s from %s/%s\n", args[1], owner, repo) return nil }