| package action | 
 |  | 
 | import ( | 
 | 	"os" | 
 | 	"os/exec" | 
 |  | 
 | 	"github.com/Masterminds/glide/msg" | 
 | ) | 
 |  | 
 | // Plugin attempts to find and execute a plugin based on a command. | 
 | // | 
 | // Exit code 99 means the plugin was never executed. Code 1 means the program | 
 | // exited badly. | 
 | func Plugin(command string, args []string) { | 
 |  | 
 | 	cwd, err := os.Getwd() | 
 | 	if err != nil { | 
 | 		msg.ExitCode(99) | 
 | 		msg.Die("Could not get working directory: %s", err) | 
 | 	} | 
 |  | 
 | 	cmd := "glide-" + command | 
 | 	var fullcmd string | 
 | 	if fullcmd, err = exec.LookPath(cmd); err != nil { | 
 | 		fullcmd = cwd + "/" + cmd | 
 | 		if _, err := os.Stat(fullcmd); err != nil { | 
 | 			msg.ExitCode(99) | 
 | 			msg.Die("Command %s does not exist.", cmd) | 
 | 		} | 
 | 	} | 
 |  | 
 | 	// Turning os.Args first argument from `glide` to `glide-command` | 
 | 	args[0] = cmd | 
 | 	// Removing the first argument (command) | 
 | 	removed := false | 
 | 	for i, v := range args { | 
 | 		if removed == false && v == command { | 
 | 			args = append(args[:i], args[i+1:]...) | 
 | 			removed = true | 
 | 		} | 
 | 	} | 
 | 	pa := os.ProcAttr{ | 
 | 		Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}, | 
 | 		Dir:   cwd, | 
 | 	} | 
 |  | 
 | 	msg.Debug("Delegating to plugin %s (%v)\n", fullcmd, args) | 
 |  | 
 | 	proc, err := os.StartProcess(fullcmd, args, &pa) | 
 | 	if err != nil { | 
 | 		msg.Err("Failed to execute %s: %s", cmd, err) | 
 | 		os.Exit(98) | 
 | 	} | 
 |  | 
 | 	if _, err := proc.Wait(); err != nil { | 
 | 		msg.Err(err.Error()) | 
 | 		os.Exit(1) | 
 | 	} | 
 | } |