Changeset View
Changeset View
Standalone View
Standalone View
src/workflow/ArcanistUploadWorkflow.php
| Show First 20 Lines • Show All 135 Lines • ▼ Show 20 Lines | public function runWorkflow() { | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| private function writeStatus($line) { | private function writeStatus($line) { | ||||
| $this->writeStatusMessage($line."\n"); | $this->writeStatusMessage($line."\n"); | ||||
| } | } | ||||
| private function uploadChunks($file_phid, $path) { | |||||
| $conduit = $this->getConduit(); | |||||
| $f = @fopen($path, 'rb'); | |||||
| if (!$f) { | |||||
| throw new Exception(pht('Unable to open file "%s"', $path)); | |||||
| } | |||||
| $this->writeStatus(pht('Beginning chunked upload of large file...')); | |||||
| $chunks = $conduit->resolveCall( | |||||
| 'file.querychunks', | |||||
| array( | |||||
| 'filePHID' => $file_phid, | |||||
| )); | |||||
| $remaining = array(); | |||||
| foreach ($chunks as $chunk) { | |||||
| if (!$chunk['complete']) { | |||||
| $remaining[] = $chunk; | |||||
| } | |||||
| } | |||||
| $done = (count($chunks) - count($remaining)); | |||||
| if ($done) { | |||||
| $this->writeStatus( | |||||
| pht( | |||||
| 'Resuming upload (%s of %s chunks remain).', | |||||
| phutil_count($remaining), | |||||
| phutil_count($chunks))); | |||||
| } else { | |||||
| $this->writeStatus( | |||||
| pht( | |||||
| 'Uploading chunks (%s chunks to upload).', | |||||
| phutil_count($remaining))); | |||||
| } | |||||
| $progress = new PhutilConsoleProgressBar(); | |||||
| $progress->setTotal(count($chunks)); | |||||
| for ($ii = 0; $ii < $done; $ii++) { | |||||
| $progress->update(1); | |||||
| } | |||||
| $progress->draw(); | |||||
| // TODO: We could do these in parallel to improve upload performance. | |||||
| foreach ($remaining as $chunk) { | |||||
| $offset = $chunk['byteStart']; | |||||
| $ok = fseek($f, $offset); | |||||
| if ($ok !== 0) { | |||||
| throw new Exception( | |||||
| pht( | |||||
| 'Failed to %s!', | |||||
| 'fseek()')); | |||||
| } | |||||
| $data = fread($f, $chunk['byteEnd'] - $chunk['byteStart']); | |||||
| if ($data === false) { | |||||
| throw new Exception( | |||||
| pht( | |||||
| 'Failed to %s!', | |||||
| 'fread()')); | |||||
| } | |||||
| $conduit->resolveCall( | |||||
| 'file.uploadchunk', | |||||
| array( | |||||
| 'filePHID' => $file_phid, | |||||
| 'byteStart' => $offset, | |||||
| 'dataEncoding' => 'base64', | |||||
| 'data' => base64_encode($data), | |||||
| )); | |||||
| $progress->update(1); | |||||
| } | |||||
| } | |||||
| } | } | ||||