// Sets the remote repository for this veb repo. // Remote repository must already exist for it to be set. func Remote(index *veb.Index, remote string, log *veb.Log) error { defer log.Un(log.Trace(REMOTE)) var timer veb.Timer timer.Start() // make remote an absolute path if !path.IsAbs(remote) { remote = path.Join(index.Root, remote) } // check to see if remote exists fi, err := os.Stat(remote) if err != nil { if os.IsNotExist(err) { log.Err().Println(err) return fmt.Errorf("veb remote dir does not exist: %v", err) } else { log.Err().Println(err) return err } } else if !fi.IsDir() { // ain't a directory log.Err().Println(remote, "isn't a directory") return fmt.Errorf("veb remote must be a folder: %s is not a folder", remote) } // check to see if it's a veb repo remoteRepo := path.Join(remote, veb.META_FOLDER) fi, err = os.Stat(remoteRepo) if err != nil { if os.IsNotExist(err) { log.Err().Println(err) fmt.Println("veb remote needs to be initialized as a veb repository", "\n (use 'veb init' in remote dir)") return err } else { log.Err().Println(err) return err } } else if !fi.IsDir() { // ain't a directory log.Err().Println(remoteRepo, "isn't a directory") fmt.Println("veb remote needs", remoteRepo, "to be a folder", "\nDelete or rename that file and run 'veb init' from", remote, "\n") return fmt.Errorf("%s isn't a directory", remoteRepo) } // set remote index.Remote = remote index.Save() fmt.Println("veb added", remote, "as the remote") // info log timer.Stop() log.Info().Printf("%s took %v\n", REMOTE, timer.Duration()) return nil }
// Saves all updated/new files to index, so they are available for push/pull. // Saves new file stats & current checksum of the file shown as new/changed. func Commit(index *veb.Index, log *veb.Log) error { defer log.Un(log.Trace(COMMIT)) var timer veb.Timer timer.Start() // check for changes files := make(chan veb.IndexEntry, CHAN_SIZE) go index.Check(files) // start handler pool working on files updates := make(chan veb.IndexEntry, CHAN_SIZE) done := make(chan int, MAX_HANDLERS) for i := 0; i < MAX_HANDLERS; i++ { go func() { for f := range files { // calculate checksum hash err := veb.Xsum(&f, log) if err != nil { log.Err().Println("checksum for verify failed:", err) } updates <- f } done <- 1 }() } // done listener go func() { for i := 0; i < MAX_HANDLERS; i++ { <-done } close(updates) }() // update index var retVal error = nil numCommits := 0 numErrors := 0 first := true for f := range updates { err := index.Update(&f) if err != nil { log.Err().Println("index update failed:", err) fmt.Println("Error: Couldn't commit", f.Path, ":", err) retVal = fmt.Errorf("veb commit failed") numErrors++ } else { if first { fmt.Println("----------------") fmt.Println("Committed files:") fmt.Println("----------------") first = false } fmt.Println(INDENT_F, f.Path) numCommits++ } } // save index once everything's done index.Save() // info timer.Stop() fmt.Println("\nsummary:", numCommits, "commits,", numErrors, "errors in", timer.Duration()) log.Info().Printf("%s (%d commits, %d errors) took %v\n", COMMIT, numCommits, numErrors, timer.Duration()) return retVal }