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)
}