Patchwork D7047: phabricator: add the uploadfile function

login
register
mail settings
Submitter phabricator
Date Oct. 12, 2019, 1:57 a.m.
Message ID <825f13ec650efd1b63d899e41ca07aa5@localhost.localdomain>
Download mbox | patch
Permalink /patch/42248/
State Not Applicable
Headers show

Comments

phabricator - Oct. 12, 2019, 1:57 a.m.
Closed by commit rHG24e8aac7c630: phabricator: add the uploadfile function (authored by Kwan).
This revision was automatically updated to reflect the committed changes.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D7047?vs=17078&id=17095

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D7047/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D7047

AFFECTED FILES
  hgext/phabricator.py

CHANGE DETAILS




To: Kwan, #hg-reviewers, indygreg
Cc: mercurial-devel

Patch

diff --git a/hgext/phabricator.py b/hgext/phabricator.py
--- a/hgext/phabricator.py
+++ b/hgext/phabricator.py
@@ -43,6 +43,7 @@ 
 
 import base64
 import contextlib
+import hashlib
 import itertools
 import json
 import operator
@@ -608,6 +609,43 @@ 
     progress.complete()
 
 
+def uploadfile(fctx):
+    """upload binary files to Phabricator"""
+    repo = fctx.repo()
+    ui = repo.ui
+    fname = fctx.path()
+    size = fctx.size()
+    fhash = pycompat.bytestr(hashlib.sha256(fctx.data()).hexdigest())
+
+    # an allocate call is required first to see if an upload is even required
+    # (Phab might already have it) and to determine if chunking is needed
+    allocateparams = {
+        b'name': fname,
+        b'contentLength': size,
+        b'contentHash': fhash,
+    }
+    filealloc = callconduit(ui, b'file.allocate', allocateparams)
+    fphid = filealloc[b'filePHID']
+
+    if filealloc[b'upload']:
+        ui.write(_(b'uploading %s\n') % bytes(fctx))
+        if not fphid:
+            uploadparams = {
+                b'name': fname,
+                b'data_base64': base64.b64encode(fctx.data()),
+            }
+            fphid = callconduit(ui, b'file.upload', uploadparams)
+        else:
+            uploadchunks(fctx, fphid)
+    else:
+        ui.debug(b'server already has %s\n' % bytes(fctx))
+
+    if not fphid:
+        raise error.Abort(b'Upload of %s failed.' % bytes(fctx))
+
+    return fphid
+
+
 def creatediff(ctx):
     """create a Differential Diff"""
     repo = ctx.repo()