fork of go-git with some jj specific features
at v4.7.0 46 lines 1.2 kB view raw
1package main 2 3import ( 4 "context" 5 "os" 6 "os/signal" 7 8 "gopkg.in/src-d/go-git.v4" 9 . "gopkg.in/src-d/go-git.v4/_examples" 10) 11 12// Graceful cancellation example of a basic git operation such as Clone. 13func main() { 14 CheckArgs("<url>", "<directory>") 15 url := os.Args[1] 16 directory := os.Args[2] 17 18 // Clone the given repository to the given directory 19 Info("git clone %s %s", url, directory) 20 21 stop := make(chan os.Signal, 1) 22 signal.Notify(stop, os.Interrupt) 23 24 // The context is the mechanism used by go-git, to support deadlines and 25 // cancellation signals. 26 ctx, cancel := context.WithCancel(context.Background()) 27 defer cancel() // cancel when we are finished consuming integers 28 29 go func() { 30 <-stop 31 Warning("\nSignal detected, canceling operation...") 32 cancel() 33 }() 34 35 Warning("To gracefully stop the clone operation, push Crtl-C.") 36 37 // Using PlainCloneContext we can provide to a context, if the context 38 // is cancelled, the clone operation stops gracefully. 39 _, err := git.PlainCloneContext(ctx, directory, false, &git.CloneOptions{ 40 URL: url, 41 Progress: os.Stdout, 42 }) 43 44 // If the context was cancelled, an error is returned. 45 CheckIfError(err) 46}