Patchwork D8524: phabricator: load .arcconfig during reposetup (issue6331)

login
register
mail settings
Submitter phabricator
Date May 15, 2020, 12:15 a.m.
Message ID <differential-rev-PHID-DREV-xa6dfw4zr2hgdwy2cs6o-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/46312/
State New
Headers show

Comments

phabricator - May 15, 2020, 12:15 a.m.
sfink created this revision.
Herald added subscribers: mercurial-patches, Kwan.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  Wrapping localrepo's loadhgrc() was not working for me because it is too late to wrap loadhgrc when the extension is loaded.

REPOSITORY
  rHG Mercurial

BRANCH
  default

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

AFFECTED FILES
  hgext/phabricator.py

CHANGE DETAILS




To: sfink, #hg-reviewers
Cc: Kwan, mercurial-patches, mercurial-devel

Patch

diff --git a/hgext/phabricator.py b/hgext/phabricator.py
--- a/hgext/phabricator.py
+++ b/hgext/phabricator.py
@@ -41,6 +41,9 @@ 
 
     # API token. Get it from https://$HOST/conduit/login/
     example.phabtoken = cli-xxxxxxxxxxxxxxxxxxxxxxxxxxxx
+
+phabricator.url and callsign will fallback to values from repo's .arcconfig if
+available.
 """
 
 from __future__ import absolute_import
@@ -165,16 +168,18 @@ 
 ]
 
 
-@eh.wrapfunction(localrepo, "loadhgrc")
-def _loadhgrc(orig, ui, wdirvfs, hgvfs, requirements):
+def reposetup(ui, repo):
     """Load ``.arcconfig`` content into a ui instance on repository open.
     """
-    result = False
+    # Only check for .arcconfig on a localrepo.
+    if not hasattr(repo, 'wvfs'):
+        return
+
     arcconfig = {}
 
     try:
         # json.loads only accepts bytes from 3.6+
-        rawparams = encoding.unifromlocal(wdirvfs.read(b".arcconfig"))
+        rawparams = encoding.unifromlocal(repo.wvfs.read(b'.arcconfig'))
         # json.loads only returns unicode strings
         arcconfig = pycompat.rapply(
             lambda x: encoding.unitolocal(x)
@@ -182,25 +187,19 @@ 
             else x,
             pycompat.json_loads(rawparams),
         )
-
-        result = True
     except ValueError:
-        ui.warn(_(b"invalid JSON in %s\n") % wdirvfs.join(b".arcconfig"))
+        ui.warn(_(b"invalid JSON in %s\n") % repo.wvfs.join('.arcconfig'))
     except IOError:
         pass
 
     cfg = util.sortdict()
 
+    source = repo.wvfs.join(b".arcconfig")
     if b"repository.callsign" in arcconfig:
-        cfg[(b"phabricator", b"callsign")] = arcconfig[b"repository.callsign"]
+        ui.setconfig(b"phabricator", b"callsign", arcconfig[b"repository.callsign"], source=source)
 
     if b"phabricator.uri" in arcconfig:
-        cfg[(b"phabricator", b"url")] = arcconfig[b"phabricator.uri"]
-
-    if cfg:
-        ui.applyconfig(cfg, source=wdirvfs.join(b".arcconfig"))
-
-    return orig(ui, wdirvfs, hgvfs, requirements) or result  # Load .hg/hgrc
+        ui.setconfig(b"phabricator", b"url", arcconfig[b"phabricator.uri"], source=source)
 
 
 def vcrcommand(name, flags, spec, helpcategory=None, optionalrepo=False):
@@ -328,13 +327,18 @@ 
 def readurltoken(ui):
     """return conduit url, token and make sure they exist
 
-    Currently read from [auth] config section. In the future, it might
-    make sense to read from .arcconfig and .arcrc as well.
+    Read token from [auth] config section. Read url from [phabricator] config
+    section or repo's .arcconfig. In the future, it might make sense to read
+    tokens from ~/.arcrc as well.
     """
     url = ui.config(b'phabricator', b'url')
     if not url:
         raise error.Abort(
-            _(b'config %s.%s is required') % (b'phabricator', b'url')
+            _(
+                b'unable to read phabricator uri from from config %s.%s or %s '
+                b'file in repo'
+            )
+            % (b'phabricator', b'url', b'.arcconfig')
         )
 
     res = httpconnectionmod.readauthforuri(ui, url, util.url(url).user)