mirror of
https://github.com/facebook/sapling.git
synced 2024-10-12 01:39:21 +03:00
commitcloud: refactor errors into the error module
Differential Revision: D15282858 fbshipit-source-id: b832b593588290cf94d1826ea20af7ce8d410468
This commit is contained in:
parent
4f3b9594b9
commit
7188ff5a82
@ -149,7 +149,6 @@ from . import (
|
||||
backuplock,
|
||||
backupstate,
|
||||
commitcloudcommands,
|
||||
commitcloudcommon,
|
||||
commitcloudutil,
|
||||
dependencies,
|
||||
status,
|
||||
|
@ -30,9 +30,9 @@ from . import (
|
||||
backupbookmarks,
|
||||
backuplock,
|
||||
backupstate,
|
||||
commitcloudcommon,
|
||||
commitcloudutil,
|
||||
dependencies,
|
||||
error as ccerror,
|
||||
service,
|
||||
sync,
|
||||
syncstate,
|
||||
@ -167,7 +167,7 @@ def cloudrejoin(ui, repo, **opts):
|
||||
)
|
||||
cloudsync(ui, repo, cloudrefs=cloudrefs, **opts)
|
||||
return
|
||||
except commitcloudcommon.RegistrationError:
|
||||
except ccerror.RegistrationError:
|
||||
pass
|
||||
|
||||
ui.status(
|
||||
@ -222,7 +222,7 @@ def cloudauth(ui, repo, **opts):
|
||||
if token:
|
||||
try:
|
||||
service.get(ui, token).check()
|
||||
except commitcloudcommon.RegistrationError:
|
||||
except ccerror.RegistrationError:
|
||||
token = None
|
||||
else:
|
||||
ui.status(_("using existing authentication token\n"))
|
||||
@ -290,7 +290,7 @@ def authenticate(ui, repo, tokenlocator):
|
||||
if not ui.interactive():
|
||||
msg = _("authentication with commit cloud required")
|
||||
hint = _("use 'hg cloud auth --token TOKEN' to set a token")
|
||||
raise commitcloudcommon.RegistrationError(ui, msg, hint=hint)
|
||||
raise ccerror.RegistrationError(ui, msg, hint=hint)
|
||||
|
||||
authhelp = ui.config("commitcloud", "auth_help")
|
||||
if authhelp:
|
||||
@ -313,7 +313,7 @@ def checkauthenticated(ui, repo, tokenlocator):
|
||||
if token:
|
||||
try:
|
||||
service.get(ui, token).check()
|
||||
except commitcloudcommon.RegistrationError:
|
||||
except ccerror.RegistrationError:
|
||||
pass
|
||||
else:
|
||||
return
|
||||
@ -626,7 +626,7 @@ def cloudrecover(ui, repo, **opts):
|
||||
ui.status(_("clearing local commit cloud cache\n"), component="commitcloud")
|
||||
workspacename = workspace.currentworkspace(repo)
|
||||
if workspacename is None:
|
||||
raise commitcloudcommon.WorkspaceError(ui, _("undefined workspace"))
|
||||
raise ccerror.WorkspaceError(ui, _("undefined workspace"))
|
||||
syncstate.SyncState.erasestate(repo, workspacename)
|
||||
cloudsync(ui, repo, **opts)
|
||||
|
||||
|
@ -24,7 +24,7 @@ from edenscm.mercurial import (
|
||||
)
|
||||
from edenscm.mercurial.i18n import _
|
||||
|
||||
from . import commitcloudcommon, workspace
|
||||
from . import error as ccerror, workspace
|
||||
|
||||
|
||||
SERVICE = "commitcloud"
|
||||
@ -44,7 +44,7 @@ def _gethomevfs(ui, config_option_name):
|
||||
"""
|
||||
path = ui.config("commitcloud", config_option_name)
|
||||
if path and not os.path.isdir(path):
|
||||
raise commitcloudcommon.ConfigurationError(
|
||||
raise ccerror.ConfigurationError(
|
||||
ui, _("invalid commitcloud.%s '%s'") % (config_option_name, path)
|
||||
)
|
||||
if path:
|
||||
@ -56,14 +56,12 @@ def _gethomevfs(ui, config_option_name):
|
||||
envvar = "HOME"
|
||||
homedir = encoding.environ.get(envvar)
|
||||
if not homedir:
|
||||
raise commitcloudcommon.ConfigurationError(
|
||||
raise ccerror.ConfigurationError(
|
||||
ui, _("$%s environment variable not found") % envvar
|
||||
)
|
||||
|
||||
if not os.path.isdir(homedir):
|
||||
raise commitcloudcommon.ConfigurationError(
|
||||
ui, _("invalid homedir '%s'") % homedir
|
||||
)
|
||||
raise ccerror.ConfigurationError(ui, _("invalid homedir '%s'") % homedir)
|
||||
|
||||
return vfsmod.vfs(homedir)
|
||||
|
||||
@ -135,9 +133,9 @@ class TokenLocator(object):
|
||||
return text or None
|
||||
|
||||
except OSError as e:
|
||||
raise commitcloudcommon.UnexpectedError(self.ui, e)
|
||||
raise ccerror.UnexpectedError(self.ui, e)
|
||||
except ValueError as e:
|
||||
raise commitcloudcommon.UnexpectedError(self.ui, e)
|
||||
raise ccerror.UnexpectedError(self.ui, e)
|
||||
|
||||
def _settokeninsecretstool(self, token, update=False):
|
||||
"""Token stored in keychain as individual secrets"""
|
||||
@ -164,7 +162,7 @@ class TokenLocator(object):
|
||||
# Try updating token instead
|
||||
self._settokeninsecretstool(token, update=True)
|
||||
else:
|
||||
raise commitcloudcommon.SubprocessError(self.ui, rc, stderrdata)
|
||||
raise ccerror.SubprocessError(self.ui, rc, stderrdata)
|
||||
|
||||
else:
|
||||
self.ui.debug(
|
||||
@ -173,9 +171,9 @@ class TokenLocator(object):
|
||||
)
|
||||
|
||||
except OSError as e:
|
||||
raise commitcloudcommon.UnexpectedError(self.ui, e)
|
||||
raise ccerror.UnexpectedError(self.ui, e)
|
||||
except ValueError as e:
|
||||
raise commitcloudcommon.UnexpectedError(self.ui, e)
|
||||
raise ccerror.UnexpectedError(self.ui, e)
|
||||
|
||||
def _gettokenosx(self):
|
||||
"""On macOS tokens are stored in keychain
|
||||
@ -201,7 +199,7 @@ class TokenLocator(object):
|
||||
# security command is unable to show a prompt
|
||||
# from ssh sessions
|
||||
if rc == 36:
|
||||
raise commitcloudcommon.KeychainAccessError(
|
||||
raise ccerror.KeychainAccessError(
|
||||
self.ui,
|
||||
"failed to access your keychain",
|
||||
"please run `security unlock-keychain` "
|
||||
@ -211,7 +209,7 @@ class TokenLocator(object):
|
||||
# if not found, not an error
|
||||
if rc == 44:
|
||||
return None
|
||||
raise commitcloudcommon.SubprocessError(
|
||||
raise ccerror.SubprocessError(
|
||||
self.ui,
|
||||
rc,
|
||||
"command: `%s`\nstderr: %s" % (" ".join(args), stderrdata),
|
||||
@ -222,9 +220,9 @@ class TokenLocator(object):
|
||||
else:
|
||||
return None
|
||||
except OSError as e:
|
||||
raise commitcloudcommon.UnexpectedError(self.ui, e)
|
||||
raise ccerror.UnexpectedError(self.ui, e)
|
||||
except ValueError as e:
|
||||
raise commitcloudcommon.UnexpectedError(self.ui, e)
|
||||
raise ccerror.UnexpectedError(self.ui, e)
|
||||
|
||||
def _settokenosx(self, token):
|
||||
"""On macOS tokens are stored in keychain
|
||||
@ -251,14 +249,14 @@ class TokenLocator(object):
|
||||
# security command is unable to show a prompt
|
||||
# from ssh sessions
|
||||
if rc == 36:
|
||||
raise commitcloudcommon.KeychainAccessError(
|
||||
raise ccerror.KeychainAccessError(
|
||||
self.ui,
|
||||
"failed to access your keychain",
|
||||
"please run `security unlock-keychain` "
|
||||
"to prove your identity\n"
|
||||
"the command `%s` exited with code %d" % (" ".join(args), rc),
|
||||
)
|
||||
raise commitcloudcommon.SubprocessError(
|
||||
raise ccerror.SubprocessError(
|
||||
self.ui,
|
||||
rc,
|
||||
"command: `%s`\nstderr: %s"
|
||||
@ -266,9 +264,9 @@ class TokenLocator(object):
|
||||
)
|
||||
self.ui.debug("new token is stored in keychain\n")
|
||||
except OSError as e:
|
||||
raise commitcloudcommon.UnexpectedError(self.ui, e)
|
||||
raise ccerror.UnexpectedError(self.ui, e)
|
||||
except ValueError as e:
|
||||
raise commitcloudcommon.UnexpectedError(self.ui, e)
|
||||
raise ccerror.UnexpectedError(self.ui, e)
|
||||
|
||||
@property
|
||||
def token(self):
|
||||
@ -361,7 +359,7 @@ class SubscriptionManager(object):
|
||||
"(run 'hg cloud sync' manually if your workspace is not synchronized)\n"
|
||||
"(please contact %s if this warning persists)\n"
|
||||
)
|
||||
% commitcloudcommon.getownerteam(self.ui),
|
||||
% ccerror.getownerteam(self.ui),
|
||||
component="commitcloud",
|
||||
)
|
||||
|
||||
@ -391,7 +389,7 @@ def getreponame(repo):
|
||||
os.path.basename(repo.ui.config("paths", "default")),
|
||||
)
|
||||
if not reponame:
|
||||
raise commitcloudcommon.ConfigurationError(repo.ui, _("unknown repo"))
|
||||
raise ccerror.ConfigurationError(repo.ui, _("unknown repo"))
|
||||
return reponame
|
||||
|
||||
|
||||
|
@ -2,23 +2,16 @@
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2 or any later version.
|
||||
"""commit cloud errors"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
# Standard Library
|
||||
import traceback
|
||||
|
||||
from edenscm.mercurial import error
|
||||
from edenscm.mercurial.i18n import _
|
||||
|
||||
|
||||
def highlightmsg(ui, msg):
|
||||
"""
|
||||
The tag is used to highlight important messages from Commit Cloud
|
||||
"""
|
||||
return "%s %s" % (ui.label("commitcloud:", "commitcloud.tag"), msg)
|
||||
|
||||
|
||||
def getownerteam(ui):
|
||||
return ui.label(
|
||||
ui.config("commitcloud", "owner_team", "the Source Control Team"),
|
||||
@ -26,11 +19,6 @@ def getownerteam(ui):
|
||||
)
|
||||
|
||||
|
||||
"""
|
||||
commit cloud error wrappers
|
||||
"""
|
||||
|
||||
|
||||
class UnexpectedError(error.Abort):
|
||||
def __init__(self, ui, message, *args):
|
||||
details = traceback.format_exc() # last part of traceback
|
@ -16,7 +16,7 @@ import time
|
||||
from edenscm.mercurial import error, util
|
||||
from edenscm.mercurial.i18n import _
|
||||
|
||||
from . import baseservice, commitcloudcommon
|
||||
from . import baseservice, error as ccerror
|
||||
|
||||
|
||||
httplib = util.httplib
|
||||
@ -63,19 +63,17 @@ class HttpsCommitCloudService(baseservice.BaseService):
|
||||
|
||||
# validation
|
||||
if not self.remote_host:
|
||||
raise commitcloudcommon.ConfigurationError(
|
||||
self.ui, _("'remote_host' is required")
|
||||
)
|
||||
raise ccerror.ConfigurationError(self.ui, _("'remote_host' is required"))
|
||||
|
||||
if self.client_certs and not os.path.isfile(self.client_certs):
|
||||
raise commitcloudcommon.ConfigurationError(
|
||||
raise ccerror.ConfigurationError(
|
||||
ui,
|
||||
_("tls.ca_certs resolved to '%s' (no such file or is a directory)")
|
||||
% self.client_certs,
|
||||
)
|
||||
|
||||
if self.ca_certs and not os.path.isfile(self.ca_certs):
|
||||
raise commitcloudcommon.ConfigurationError(
|
||||
raise ccerror.ConfigurationError(
|
||||
ui,
|
||||
_("tls.ca_certs resolved to '%s' (no such file or is a directory)")
|
||||
% self.ca_certs,
|
||||
@ -157,18 +155,18 @@ class HttpsCommitCloudService(baseservice.BaseService):
|
||||
details.append(
|
||||
_("* certificate authority file used '%s'") % self.ca_certs
|
||||
)
|
||||
return commitcloudcommon.TLSAccessError(self.ui, str(e), details)
|
||||
return ccerror.TLSAccessError(self.ui, str(e), details)
|
||||
|
||||
for attempt in xrange(MAX_CONNECT_RETRIES):
|
||||
try:
|
||||
self.connection.request("POST", path, rdata, self.headers)
|
||||
resp = self.connection.getresponse()
|
||||
if resp.status == httplib.UNAUTHORIZED:
|
||||
raise commitcloudcommon.RegistrationError(
|
||||
raise ccerror.RegistrationError(
|
||||
self.ui, _("unauthorized client (token is invalid)")
|
||||
)
|
||||
if resp.status != httplib.OK:
|
||||
raise commitcloudcommon.ServiceError(
|
||||
raise ccerror.ServiceError(
|
||||
self.ui, "%d %s" % (resp.status, resp.reason)
|
||||
)
|
||||
if resp.getheader("Content-Encoding") == "gzip":
|
||||
@ -188,13 +186,13 @@ class HttpsCommitCloudService(baseservice.BaseService):
|
||||
except socket.error as e:
|
||||
if "SSL" in str(e):
|
||||
raise _tlserror(e)
|
||||
raise commitcloudcommon.ServiceError(self.ui, str(e))
|
||||
raise ccerror.ServiceError(self.ui, str(e))
|
||||
except ssl.CertificateError as e:
|
||||
raise _tlserror(e)
|
||||
time.sleep(sl)
|
||||
sl *= 2
|
||||
if e:
|
||||
raise commitcloudcommon.ServiceError(self.ui, str(e))
|
||||
raise ccerror.ServiceError(self.ui, str(e))
|
||||
|
||||
def check(self):
|
||||
# send a check request. Currently this is an empty 'get_references'
|
||||
@ -210,7 +208,7 @@ class HttpsCommitCloudService(baseservice.BaseService):
|
||||
path = "/commit_cloud/get_references"
|
||||
response = self._send(path, {})
|
||||
if "error" in response:
|
||||
raise commitcloudcommon.ServiceError(self.ui, response["error"])
|
||||
raise ccerror.ServiceError(self.ui, response["error"])
|
||||
|
||||
def getreferences(self, reponame, workspace, baseversion):
|
||||
self.ui.debug("sending 'get_references' request\n", component="commitcloud")
|
||||
@ -230,7 +228,7 @@ class HttpsCommitCloudService(baseservice.BaseService):
|
||||
)
|
||||
|
||||
if "error" in response:
|
||||
raise commitcloudcommon.ServiceError(self.ui, response["error"])
|
||||
raise ccerror.ServiceError(self.ui, response["error"])
|
||||
|
||||
version = response["ref"]["version"]
|
||||
|
||||
@ -299,7 +297,7 @@ class HttpsCommitCloudService(baseservice.BaseService):
|
||||
)
|
||||
|
||||
if "error" in response:
|
||||
raise commitcloudcommon.ServiceError(self.ui, response["error"])
|
||||
raise ccerror.ServiceError(self.ui, response["error"])
|
||||
|
||||
data = response["ref"]
|
||||
rc = response["rc"]
|
||||
@ -336,7 +334,7 @@ class HttpsCommitCloudService(baseservice.BaseService):
|
||||
)
|
||||
|
||||
if "error" in response:
|
||||
raise commitcloudcommon.ServiceError(self.ui, response["error"])
|
||||
raise ccerror.ServiceError(self.ui, response["error"])
|
||||
|
||||
# if 200 OK response format is:
|
||||
# {
|
||||
@ -354,4 +352,4 @@ class HttpsCommitCloudService(baseservice.BaseService):
|
||||
try:
|
||||
return self._makefakedag(nodes, repo)
|
||||
except Exception as e:
|
||||
raise commitcloudcommon.UnexpectedError(self.ui, e)
|
||||
raise ccerror.UnexpectedError(self.ui, e)
|
||||
|
@ -11,7 +11,7 @@ import os
|
||||
|
||||
from edenscm.mercurial import error
|
||||
|
||||
from . import baseservice, commitcloudcommon
|
||||
from . import baseservice, error as ccerror
|
||||
|
||||
|
||||
class LocalService(baseservice.BaseService):
|
||||
@ -129,4 +129,4 @@ class LocalService(baseservice.BaseService):
|
||||
try:
|
||||
return self._makefakedag(nodes, repo)
|
||||
except Exception as e:
|
||||
raise commitcloudcommon.UnexpectedError(self._ui, e)
|
||||
raise ccerror.UnexpectedError(self._ui, e)
|
||||
|
@ -13,8 +13,8 @@ from edenscm.mercurial.i18n import _
|
||||
from . import (
|
||||
background,
|
||||
backuplock,
|
||||
commitcloudcommon,
|
||||
commitcloudutil,
|
||||
error as ccerror,
|
||||
syncstate,
|
||||
workspace,
|
||||
)
|
||||
@ -82,7 +82,4 @@ def summary(repo):
|
||||
ui.warn(_("(run 'hg cloud sync' to synchronize your workspace)\n"))
|
||||
else:
|
||||
ui.warn(_("(run 'hg cloud backup' to perform a backup)\n"))
|
||||
ui.warn(
|
||||
_("(if this fails, please report to %s)\n")
|
||||
% commitcloudcommon.getownerteam(ui)
|
||||
)
|
||||
ui.warn(_("(if this fails, please report to %s)\n") % ccerror.getownerteam(ui))
|
||||
|
@ -27,9 +27,9 @@ from . import (
|
||||
backupbookmarks,
|
||||
backuplock,
|
||||
backupstate,
|
||||
commitcloudcommon,
|
||||
commitcloudutil,
|
||||
dependencies,
|
||||
error as ccerror,
|
||||
service,
|
||||
syncstate,
|
||||
workspace,
|
||||
@ -60,7 +60,7 @@ def docloudsync(ui, repo, cloudrefs=None, dest=None, **opts):
|
||||
reponame = commitcloudutil.getreponame(repo)
|
||||
workspacename = workspace.currentworkspace(repo)
|
||||
if workspacename is None:
|
||||
raise commitcloudcommon.WorkspaceError(ui, _("undefined workspace"))
|
||||
raise ccerror.WorkspaceError(ui, _("undefined workspace"))
|
||||
serv = service.get(ui, tokenlocator.token)
|
||||
ui.status(
|
||||
_("synchronizing '%s' with '%s'\n") % (reponame, workspacename),
|
||||
@ -276,7 +276,7 @@ def docloudsync(ui, repo, cloudrefs=None, dest=None, **opts):
|
||||
and prevsyncbookmarks == newcloudbookmarks
|
||||
and prevsynctime > time.time() - 60
|
||||
):
|
||||
raise commitcloudcommon.SynchronizationError(
|
||||
raise ccerror.SynchronizationError(
|
||||
ui,
|
||||
_(
|
||||
"oscillating commit cloud workspace detected.\n"
|
||||
@ -314,7 +314,7 @@ def docloudsync(ui, repo, cloudrefs=None, dest=None, **opts):
|
||||
|
||||
backuplock.progresscomplete(repo)
|
||||
if pushfailures:
|
||||
raise commitcloudcommon.SynchronizationError(
|
||||
raise ccerror.SynchronizationError(
|
||||
ui, _("%d heads could not be pushed") % len(pushfailures)
|
||||
)
|
||||
ui.status(_("commits synchronized\n"), component="commitcloud")
|
||||
|
@ -11,7 +11,7 @@ import time
|
||||
|
||||
from edenscm.mercurial.i18n import _
|
||||
|
||||
from . import commitcloudcommon
|
||||
from . import error as ccerror
|
||||
|
||||
|
||||
class SyncState(object):
|
||||
@ -45,7 +45,7 @@ class SyncState(object):
|
||||
try:
|
||||
data = json.load(f)
|
||||
except Exception:
|
||||
raise commitcloudcommon.InvalidWorkspaceDataError(
|
||||
raise ccerror.InvalidWorkspaceDataError(
|
||||
repo.ui, _("failed to parse %s") % self.filename
|
||||
)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user