func()

in snapshot/git/gitdb/db.go [176:277]


func (db *DB) loop(initer RepoIniter) {
	if db.init(initer); db.err != nil {
		// we couldn't create our repo, so all operations will fail before
		// sending to reqCh, so we can stop serving
		return
	}
	// Handle checkout logic separately and block until each request completes
	checkoutCh := make(chan interface{})
	go func() {
		for req := range checkoutCh {
			switch req := req.(type) {
			case checkoutReq:
				path, err := db.checkout(req.id)
				req.resultCh <- stringAndError{str: path, err: err}
			case releaseCheckoutReq:
				req.resultCh <- db.releaseCheckout(req.path)
			}
		}
	}()

	// Handle all request types
	for db.reqCh != nil {
		req, ok := <-db.reqCh
		if !ok {
			db.reqCh = nil
			continue
		}
		switch req := req.(type) {
		case ingestReq:
			log.Debugf("processing ingestReq")
			go func() {
				s, err := db.ingestDir(req.dir)
				if err == nil && db.autoUpload != nil {
					s, err = db.autoUpload.upload(s, db)
				}
				if err != nil {
					req.resultCh <- idAndError{err: err}
				} else {
					req.resultCh <- idAndError{id: s.ID()}
				}
			}()
		case ingestGitCommitReq:
			log.Debugf("processing ingestGitCommitReq")
			go func() {
				s, err := db.ingestGitCommit(req.ingestRepo, req.commitish)
				if err == nil && db.autoUpload != nil {
					s, err = db.autoUpload.upload(s, db)
				}
				if err != nil {
					req.resultCh <- idAndError{err: err}
				} else {
					req.resultCh <- idAndError{id: s.ID()}
				}
			}()
		case ingestGitWorkingDirReq:
			log.Debugf("processing ingestGitWorkingDirReq")
			go func() {
				s, err := db.ingestGitWorkingDir(req.ingestRepo)
				if err == nil && db.autoUpload != nil {
					s, err = db.autoUpload.upload(s, db)
				}
				if err != nil {
					req.resultCh <- idAndError{err: err}
				} else {
					req.resultCh <- idAndError{id: s.ID()}
				}
			}()
		case uploadFileReq:
			log.Debugf("processing uploadFileReq")
			go func() {
				s, err := db.bundles.uploadFile(req.filePath, req.ttl)
				req.resultCh <- stringAndError{str: s, err: err}
			}()
		case readFileAllReq:
			log.Debugf("processing readFileAllReq")
			go func() {
				data, err := db.readFileAll(req.id, req.path)
				req.resultCh <- stringAndError{str: data, err: err}
			}()
		case checkoutReq, releaseCheckoutReq:
			log.Debugf("processing checkoutReq, releaseCheckoutReq")
			go func() {
				checkoutCh <- req
			}()
		case exportGitCommitReq:
			log.Debugf("processing exportGitCommitReq")
			go func() {
				sha, err := db.exportGitCommit(req.id, req.exportRepo)
				req.resultCh <- stringAndError{str: sha, err: err}
			}()
		case updateRepoReq:
			log.Debugf("processing updateRepoReq")
			go func() {
				req.resultCh <- db.updateRepo()
			}()
		default:
			panic(fmt.Errorf("unknown reqtype: %T %v", req, req))
		}
	}

	close(checkoutCh)
}