diff --git a/README.md b/README.md index b1d865c..c83bf47 100644 --- a/README.md +++ b/README.md @@ -223,11 +223,12 @@ shown below: Homemaker will process the dependency tasks before processing the task itself. -In addition to creating links, Homemaker is capable of executing commands on a per-task basis. Commands should be -defined in an array called `cmds`, split into an item per each command line argument. All of the commands are executed -with `dest` as the working directory (as mentioned previously, this defaults to your home directory). If any command -returns a nonzero exit code, Homemaker will display an error message and prompt the user to determine if it should -*abort*, *retry*, or *cancel*. +In addition to creating links, Homemaker is capable of executing commands on a per-task basis. Homemaker can commands both +before and after linking your configuration. Commands should be placed in either an array, under the field `precmds` or +`postcmds` (for commands to be run before and after linking respectively). These commands should be split into an array of +strings, with each entry corresponding to one command line argument. All of the commands are executed with `dest` as +the working directory (as mentioned previously, this defaults to your home directory). If any command returns a nonzero +exit code, Homemaker will display an error message and prompt the user to determine if it should *abort*, *retry*, or *cancel*. The example task below will clone and install configuration files for Vim into the `~/.config` directory, and create links to it from the home directory. You may notice that this task references an environment variable (set by Homemaker diff --git a/task.go b/task.go index f99c358..f11ffcb 100644 --- a/task.go +++ b/task.go @@ -28,12 +28,14 @@ import ( ) type task struct { - Deps []string - Links [][]string - Cmds [][]string - Envs [][]string - Accepts [][]string - Rejects [][]string + Deps []string + Links [][]string + CmdsPre [][]string + Cmds [][]string + CmdsPost [][]string + Envs [][]string + Accepts [][]string + Rejects [][]string } func (t *task) deps(conf *config) []string { @@ -62,6 +64,11 @@ func (t *task) process(conf *config) error { } if conf.flags&flagNoCmds == 0 { + for _, currCmd := range t.CmdsPre { + if err := processCmd(currCmd, true, conf); err != nil { + return err + } + } for _, currCmd := range t.Cmds { if err := processCmd(currCmd, true, conf); err != nil { return err @@ -77,6 +84,14 @@ func (t *task) process(conf *config) error { } } + if conf.flags&flagNoCmds == 0 { + for _, currCmd := range t.CmdsPost { + if err := processCmd(currCmd, true, conf); err != nil { + return err + } + } + } + return nil }