github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/kmg/SubCommand/WatchCmd.go.bak (about)

     1  package command
     2  
     3  /*
     4  import (
     5  	"fmt"
     6  	"os"
     7  	"os/exec"
     8  
     9  	"github.com/bronze1man/kmg/console"
    10  	"github.com/bronze1man/kmg/fsnotify"
    11  	"github.com/bronze1man/kmg/kmgCmd"
    12  )
    13  
    14  type WatchCmd struct {
    15  	context *console.Context
    16  	wd      string
    17  	watcher *fsnotify.Watcher
    18  	cmd     *exec.Cmd
    19  	isDebug bool //more output
    20  }
    21  
    22  func (command *WatchCmd) GetNameConfig() *console.NameConfig {
    23  	return &console.NameConfig{Name: "WatchCmd",
    24  		Short: "watch current directory and kill and reexecute a command",
    25  	}
    26  }
    27  
    28  func (command *WatchCmd) Execute(context *console.Context) error {
    29  	command.isDebug = false
    30  	command.context = context
    31  	if len(context.Args) <= 2 {
    32  		return fmt.Errorf("usage: %s watch [command]", context.ExecutionName)
    33  	}
    34  	var err error
    35  	command.wd, err = os.Getwd()
    36  	if err != nil {
    37  		return err
    38  	}
    39  	runner, err := fsnotify.NewRunner(10000)
    40  	if err != nil {
    41  		return err
    42  	}
    43  	runner.Watcher.ErrorHandler = func(err error) {
    44  		fmt.Println("watcher.Error error: ", err)
    45  	}
    46  	runner.Watcher.WatchRecursion(command.wd)
    47  	// wait forever
    48  	runner.Run(func() {
    49  		err := command.restart()
    50  		if err != nil {
    51  			fmt.Println("command.restart() error: ", err)
    52  		}
    53  	})
    54  	return nil
    55  }
    56  func (command *WatchCmd) restart() error {
    57  	//kill old process
    58  	err := command.stop()
    59  	if err != nil {
    60  		return err
    61  	}
    62  
    63  	command.cmd = kmgCmd.NewStdioCmd(command.context, command.context.Args[2], command.context.Args[3:]...)
    64  	err = command.cmd.Start()
    65  	if err != nil {
    66  		return fmt.Errorf("restart error: %s", err.Error())
    67  	}
    68  	fmt.Println("[kmg] cmd running pid:", command.cmd.Process.Pid)
    69  	go func() {
    70  		cmd := command.cmd
    71  		err := cmd.Wait()
    72  		fmt.Println("[kmg] cmd exit pid:", cmd.Process.Pid)
    73  		if err != nil {
    74  			command.debugPrintln("wait error: ", err.Error())
    75  		}
    76  	}()
    77  	return nil
    78  }
    79  
    80  func (command *WatchCmd) stop() error {
    81  	if command.cmd == nil {
    82  		return nil
    83  	}
    84  	if command.cmd.Process == nil {
    85  		return nil
    86  	}
    87  	err := command.cmd.Process.Kill()
    88  	if err != nil {
    89  		command.debugPrintln("Process.Kill() error", err)
    90  	}
    91  	return nil
    92  }
    93  func (command *WatchCmd) debugPrintln(o ...interface{}) {
    94  	if command.isDebug {
    95  		fmt.Println(o...)
    96  	}
    97  }
    98  */