// Write implements a io.Writer that expects messages from users. func (h *Hal) Write(cmd []byte) (n int, err error) { l := len(cmd) cmd = bytes.Replace(cmd, []byte("<"), []byte(""), -1) cmd = bytes.Replace(cmd, []byte(">"), []byte(""), -1) chunks := bytes.Split(cmd, space) if len(chunks) < 1 { h.out.Write([]byte("Say what?!")) return l, errMissingCommand } s := string(chunks[0]) switch s { case "help": h.out.Write([]byte(`set-repo [repo-url]`)) h.out.Write([]byte(`[network] [target]`)) return l, nil case "wipe": h.reset() h.out.Write([]byte(`Now I don't have a memory.`)) return l, nil case "set-repo": if len(chunks) > 1 { repo := string(chunks[1]) if repo != "" { // TODO: check this is an actual repo. h.repo = repo h.save() h.out.Write([]byte(fmt.Sprintf("You current repo is %q", h.repo))) return l, nil } } h.out.Write([]byte(fmt.Sprintf("Try `set-repo [repo-url]`"))) return l, errMissingCommand default: if h.repo != "" { h.out.Write([]byte(fmt.Sprintf("Hang in there, I'm cloning %q...", h.repo))) // TODO: grab branch name from URL, if any. repo, err := git.Clone(h.repo) if err != nil { h.out.Write([]byte(fmt.Sprintf("I'm sorry Dave, %v", err))) h.out.Write([]byte("Clone failed.")) return l, err } if err := repo.Checkout("master"); err != nil { h.out.Write([]byte(fmt.Sprintf("I'm sorry Dave, %v", err))) h.out.Write([]byte("Check out failed.")) return l, err } h.out.Write([]byte(fmt.Sprintf("Running sup..."))) var outbuf bytes.Buffer // TODO: check error cmd, _ := sup.New(&outbuf, repo.Dir()) defer func() { log.Printf("Cleaning %v", repo.Dir()) os.RemoveAll(repo.Dir()) }() if len(chunks) > 0 { cmd.SetNetwork(string(chunks[0])) } if len(chunks) > 1 { cmd.SetTarget(string(chunks[1])) } err = cmd.Exec() if err != nil { h.out.Write([]byte(fmt.Sprintf("I'm sorry Dave, %v", err))) return l, err } h.out.Write(outbuf.Bytes()) return l, nil } h.out.Write([]byte(fmt.Sprintf("Missing repo, try `set-repo [repo-url]`"))) return l, errMissingCommand } // Catch-all, this should never run return l, errUnexpectedIssue }
func (h *Hal) Write(cmd []byte) (n int, err error) { l := len(cmd) cmd = bytes.Replace(cmd, []byte("<"), []byte(""), -1) cmd = bytes.Replace(cmd, []byte(">"), []byte(""), -1) chunks := bytes.Split(cmd, space) if len(chunks) < 1 { h.out.Write([]byte(msgMissingCommand)) return l, errMissingCommand } s := string(chunks[0]) switch s { case "help": h.out.Write([]byte(`[repository]/[branch] [network] [target]`)) return l, nil case "wipe": h.reset() h.out.Write([]byte(`Now I don't have a memory.`)) return l, nil default: if len(chunks) > 0 { switch string(chunks[0]) { case "set-repo": if len(chunks) > 1 { repo := string(chunks[1]) if repo != "" { // TODO: check this is an actual repo. h.repo = repo h.save() h.out.Write([]byte(fmt.Sprintf("You current repo is %q", h.repo))) return l, nil } } h.out.Write([]byte(fmt.Sprintf("Try `set-repo [repo-url]`"))) return l, errMissingCommand } if h.repo != "" { h.out.Write([]byte(fmt.Sprintf("Hang in there, I'm cloning %q...", h.repo))) // TODO: grab branch name from URL, if any. repo, err := git.Clone(h.repo) if err != nil { return l, err } if err := repo.Checkout("master"); err != nil { return l, err } h.out.Write([]byte(fmt.Sprintf("Running sup..."))) // TODO: insert sup magic here. var outbuf bytes.Buffer cmd := sup.NewSup(&outbuf).Setwd(repo.Dir()) defer func() { log.Printf("Cleaning %v", repo.Dir()) os.RemoveAll(repo.Dir()) }() if len(chunks) > 0 { cmd.Network(string(chunks[0])) } if len(chunks) > 1 { cmd.Target(string(chunks[1])) } err = cmd.Exec() h.out.Write(outbuf.Bytes()) return l, err } else { h.out.Write([]byte(fmt.Sprintf("Missing repo, try `set-repo [repo-url]`"))) } return l, errMissingCommand } } return l, nil }