70 lines
1.5 KiB
Go
70 lines
1.5 KiB
Go
|
package cmd
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"fmt"
|
||
|
"os/exec"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/spf13/cobra"
|
||
|
)
|
||
|
|
||
|
var updateCmd = &cobra.Command{
|
||
|
Use: "update",
|
||
|
Short: "Fetch items for a source and update it",
|
||
|
Long: `Fetch items from a feed source using the configured "fetch" action.
|
||
|
Items returned by a successful fetch will be used to update the source.
|
||
|
No changes will be made to the source if the fetch does not succeed.`,
|
||
|
Run: func(cmd *cobra.Command, args []string) {
|
||
|
update()
|
||
|
},
|
||
|
}
|
||
|
|
||
|
var source string
|
||
|
var dryRun bool
|
||
|
|
||
|
func init() {
|
||
|
rootCmd.AddCommand(updateCmd)
|
||
|
|
||
|
updateCmd.Flags().StringVarP(&source, "source", "s", "", "Source name to fetch (required)")
|
||
|
updateCmd.MarkFlagRequired("source")
|
||
|
|
||
|
updateCmd.Flags().BoolVar(&dryRun, "dry-run", false, "Instead of updating the source, print the fetched items")
|
||
|
}
|
||
|
|
||
|
func update() {
|
||
|
fmt.Printf("Hello %s\n", source)
|
||
|
|
||
|
if dryRun {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
cmd := exec.Command("sh", "-c", "echo Wout; sleep 1; echo 1>&2 Werr; sleep 1; echo Wout2; sleep 1; echo 1>&2 Werr2")
|
||
|
stdout, _ := cmd.StdoutPipe()
|
||
|
stderr, _ := cmd.StderrPipe()
|
||
|
|
||
|
cout := make(chan int)
|
||
|
go func() {
|
||
|
scanout := bufio.NewScanner(stdout)
|
||
|
for scanout.Scan() {
|
||
|
text := strings.TrimSpace(scanout.Text())
|
||
|
fmt.Printf("[stdout] %s\n", text)
|
||
|
}
|
||
|
cout <- 1
|
||
|
}()
|
||
|
|
||
|
cerr := make(chan int)
|
||
|
go func() {
|
||
|
scanerr := bufio.NewScanner(stderr)
|
||
|
for scanerr.Scan() {
|
||
|
text := strings.TrimSpace(scanerr.Text())
|
||
|
fmt.Printf("[stderr] %s\n", text)
|
||
|
}
|
||
|
cerr <- 1
|
||
|
}()
|
||
|
|
||
|
cmd.Start()
|
||
|
<-cout
|
||
|
<-cerr
|
||
|
}
|