diff options
Diffstat (limited to 'workhorse/internal/lfs/lfs.go')
-rw-r--r-- | workhorse/internal/lfs/lfs.go | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/workhorse/internal/lfs/lfs.go b/workhorse/internal/lfs/lfs.go new file mode 100644 index 00000000000..ec48dc05ef9 --- /dev/null +++ b/workhorse/internal/lfs/lfs.go @@ -0,0 +1,55 @@ +/* +In this file we handle git lfs objects downloads and uploads +*/ + +package lfs + +import ( + "fmt" + "net/http" + + "gitlab.com/gitlab-org/gitlab-workhorse/internal/api" + "gitlab.com/gitlab-org/gitlab-workhorse/internal/config" + "gitlab.com/gitlab-org/gitlab-workhorse/internal/filestore" + "gitlab.com/gitlab-org/gitlab-workhorse/internal/upload" +) + +type object struct { + size int64 + oid string +} + +func (l *object) Verify(fh *filestore.FileHandler) error { + if fh.Size != l.size { + return fmt.Errorf("LFSObject: expected size %d, wrote %d", l.size, fh.Size) + } + + if fh.SHA256() != l.oid { + return fmt.Errorf("LFSObject: expected sha256 %s, got %s", l.oid, fh.SHA256()) + } + + return nil +} + +type uploadPreparer struct { + objectPreparer upload.Preparer +} + +func NewLfsUploadPreparer(c config.Config, objectPreparer upload.Preparer) upload.Preparer { + return &uploadPreparer{objectPreparer: objectPreparer} +} + +func (l *uploadPreparer) Prepare(a *api.Response) (*filestore.SaveFileOpts, upload.Verifier, error) { + opts, _, err := l.objectPreparer.Prepare(a) + if err != nil { + return nil, nil, err + } + + opts.TempFilePrefix = a.LfsOid + + return opts, &object{oid: a.LfsOid, size: a.LfsSize}, nil +} + +func PutStore(a *api.API, h http.Handler, p upload.Preparer) http.Handler { + return upload.BodyUploader(a, h, p) +} |