commitcloud: refactor errors into the error module

Differential Revision: D15282858

fbshipit-source-id: b832b593588290cf94d1826ea20af7ce8d410468
This commit is contained in:
Mark Thomas 2019-05-20 06:11:59 -07:00 committed by Facebook Github Bot
parent 4f3b9594b9
commit 7188ff5a82
9 changed files with 50 additions and 70 deletions

View File

@ -149,7 +149,6 @@ from . import (
backuplock,
backupstate,
commitcloudcommands,
commitcloudcommon,
commitcloudutil,
dependencies,
status,

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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))

View File

@ -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")

View File

@ -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
)