|
@@ -340,6 +340,25 @@ class _ConfigError(Exception):
|
|
|
"""
|
|
|
|
|
|
|
|
|
+class _ConfigMethod(enum.Enum):
|
|
|
+ """Enum used in _ConfigInfo."""
|
|
|
+ OAUTH = 1
|
|
|
+ SSO = 2
|
|
|
+
|
|
|
+
|
|
|
+class _ConfigInfo(NamedTuple):
|
|
|
+ """Result for ConfigWizard._configure."""
|
|
|
+ method: _ConfigMethod
|
|
|
+
|
|
|
+
|
|
|
+class _GitcookiesSituation(NamedTuple):
|
|
|
+ """Result for ConfigWizard._check_gitcookies."""
|
|
|
+ gitcookies_exists: bool
|
|
|
+ cookiefile: str
|
|
|
+ cookiefile_exists: bool
|
|
|
+ divergent_cookiefiles: bool
|
|
|
+
|
|
|
+
|
|
|
class ConfigWizard(object):
|
|
|
"""Wizard for setting up user's Git config Gerrit authentication."""
|
|
|
|
|
@@ -431,11 +450,16 @@ class ConfigWizard(object):
|
|
|
for host in hosts:
|
|
|
self._println(f'- {host}')
|
|
|
|
|
|
+ used_oauth = False
|
|
|
for host in hosts:
|
|
|
self._println()
|
|
|
self._println(f'Checking authentication config for {host}')
|
|
|
parts = urllib.parse.urlsplit(f'https://{host}/')
|
|
|
- self._configure(parts, global_email, scope='global')
|
|
|
+ info = self._configure(parts, global_email, scope='global')
|
|
|
+ if info.method == _ConfigMethod.OAUTH:
|
|
|
+ used_oauth = True
|
|
|
+ if used_oauth:
|
|
|
+ self._print_oauth_instructions()
|
|
|
|
|
|
def _run_inside_repo(self, parts: urllib.parse.SplitResult) -> None:
|
|
|
global_email = self._check_global_email()
|
|
@@ -453,15 +477,18 @@ class ConfigWizard(object):
|
|
|
email = local_email
|
|
|
scope = 'local'
|
|
|
self._println()
|
|
|
- self._configure(parts, email, scope=scope)
|
|
|
+ info = self._configure(parts, email, scope=scope)
|
|
|
+ if info.method == _ConfigMethod.OAUTH:
|
|
|
+ self._print_oauth_instructions()
|
|
|
|
|
|
def _configure(self, parts: urllib.parse.SplitResult, email: str, *,
|
|
|
- scope: scm.GitConfigScope) -> None:
|
|
|
+ scope: scm.GitConfigScope) -> _ConfigInfo:
|
|
|
use_sso = self._check_use_sso(parts, email)
|
|
|
if use_sso:
|
|
|
self._configure_sso(parts, scope=scope)
|
|
|
- else:
|
|
|
- self._configure_oauth(parts, scope=scope)
|
|
|
+ return _ConfigInfo(method=_ConfigMethod.SSO)
|
|
|
+ self._configure_oauth(parts, scope=scope)
|
|
|
+ return _ConfigInfo(method=_ConfigMethod.OAUTH)
|
|
|
|
|
|
def _configure_sso(self, parts: urllib.parse.SplitResult, *,
|
|
|
scope: scm.GitConfigScope) -> None:
|
|
@@ -562,7 +589,7 @@ class ConfigWizard(object):
|
|
|
self._move_file(sit.cookiefile)
|
|
|
self._set_config('http.cookiefile', None, scope='global')
|
|
|
|
|
|
- def _check_gitcookies(self) -> '_GitcookiesSituation':
|
|
|
+ def _check_gitcookies(self) -> _GitcookiesSituation:
|
|
|
"""Checks various things about the user's gitcookies situation."""
|
|
|
gitcookies = self._gitcookies()
|
|
|
gitcookies_exists = os.path.exists(gitcookies)
|
|
@@ -636,6 +663,20 @@ class ConfigWizard(object):
|
|
|
'https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_gerrit_auth.html'
|
|
|
)
|
|
|
|
|
|
+ def _print_oauth_instructions(self) -> None:
|
|
|
+ """Prints instructions for setting up OAuth helper."""
|
|
|
+ self._println()
|
|
|
+ self._println('We have configured Git to use an OAuth helper.')
|
|
|
+ self._println('The OAuth helper requires its own login.')
|
|
|
+ self._println_action(
|
|
|
+ 'Please run `git credential-luci login` to set up the OAuth helper.'
|
|
|
+ )
|
|
|
+ self._println(
|
|
|
+ "(If you have already done this, you don't need to do it again.)")
|
|
|
+ self._println(
|
|
|
+ '(However, if you changed your email, you should do this again')
|
|
|
+ self._println("to ensure you're using the right account.)")
|
|
|
+
|
|
|
def _set_oauth_helper(self, parts: urllib.parse.SplitResult, *,
|
|
|
scope: scm.GitConfigScope) -> None:
|
|
|
cred_key = _creds_helper_key(parts)
|
|
@@ -839,14 +880,6 @@ class UserInterface(object):
|
|
|
self._stdout.write(s)
|
|
|
|
|
|
|
|
|
-class _GitcookiesSituation(NamedTuple):
|
|
|
- """Result for _check_gitcookies."""
|
|
|
- gitcookies_exists: bool
|
|
|
- cookiefile: str
|
|
|
- cookiefile_exists: bool
|
|
|
- divergent_cookiefiles: bool
|
|
|
-
|
|
|
-
|
|
|
class _CookiefileInfo(NamedTuple):
|
|
|
"""Result for _parse_cookiefile."""
|
|
|
contains_gerrit: bool
|