MCPcopy
hub / github.com/git-lfs/git-lfs / DoTransfer

Method DoTransfer

tq/tus_upload.go:31–156  ·  view source on GitHub ↗
(ctx interface{}, t *Transfer, cb ProgressCallback, authOkFunc func())

Source from the content-addressed store, hash-verified

29}
30
31func (a *tusUploadAdapter) DoTransfer(ctx interface{}, t *Transfer, cb ProgressCallback, authOkFunc func()) error {
32 rel, err := t.Rel("upload")
33 if err != nil {
34 return err
35 }
36 if rel == nil {
37 return errors.New(tr.Tr.Get("No upload action for object: %s", t.Oid))
38 }
39
40 // Note not supporting the Creation extension since the batch API generates URLs
41 // Also not supporting Concatenation to support parallel uploads of chunks; forward only
42
43 // 1. Send HEAD request to determine upload start point
44 // Request must include Tus-Resumable header (version)
45 a.Trace("xfer: sending tus.io HEAD request for %q", t.Oid)
46 req, err := a.newHTTPRequest("HEAD", rel)
47 if err != nil {
48 return err
49 }
50
51 req.Header.Set("Tus-Resumable", TusVersion)
52
53 res, err := a.doHTTP(t, req)
54 if err != nil {
55 return errors.NewRetriableError(err)
56 }
57
58 // Response will contain Upload-Offset if supported
59 offHdr := res.Header.Get("Upload-Offset")
60 if len(offHdr) == 0 {
61 return errors.New(tr.Tr.Get("missing Upload-Offset header from tus.io HEAD response at %q, contact server admin", rel.Href))
62 }
63 offset, err := strconv.ParseInt(offHdr, 10, 64)
64 if err != nil || offset < 0 {
65 return errors.New(tr.Tr.Get("invalid Upload-Offset value %q in response from tus.io HEAD at %q, contact server admin", offHdr, rel.Href))
66 }
67 // Upload-Offset=size means already completed (skip)
68 // Batch API will probably already detect this, but handle just in case
69 if offset >= t.Size {
70 a.Trace("xfer: tus.io HEAD offset %d indicates %q is already fully uploaded, skipping", offset, t.Oid)
71 advanceCallbackProgress(cb, t, t.Size)
72 return nil
73 }
74
75 // Open file for uploading
76 f, err := os.OpenFile(t.Path, os.O_RDONLY, 0644)
77 if err != nil {
78 return errors.Wrap(err, tr.Tr.Get("tus.io upload"))
79 }
80 defer f.Close()
81
82 // Upload-Offset=0 means start from scratch, but still send PATCH
83 if offset == 0 {
84 a.Trace("xfer: tus.io uploading %q from start", t.Oid)
85 } else {
86 a.Trace("xfer: tus.io resuming upload %q from %d", t.Oid, offset)
87 advanceCallbackProgress(cb, t, offset)
88 }

Callers

nothing calls this directly

Calls 15

NewFunction · 0.92
NewRetriableErrorFunction · 0.92
WrapFunction · 0.92
NewBodyWithCallbackFunction · 0.92
advanceCallbackProgressFunction · 0.85
newStartCallbackReaderFunction · 0.85
verifyUploadFunction · 0.85
RelMethod · 0.80
newHTTPRequestMethod · 0.80
doHTTPMethod · 0.80
SeekMethod · 0.80
GetMethod · 0.65

Tested by

no test coverage detected