Diff
Modified: trunk/Tools/ChangeLog (288226 => 288227)
--- trunk/Tools/ChangeLog 2022-01-19 20:07:02 UTC (rev 288226)
+++ trunk/Tools/ChangeLog 2022-01-19 20:13:35 UTC (rev 288227)
@@ -1,3 +1,32 @@
+2022-01-10 Jonathan Bedard <[email protected]>
+
+ [git-webkit] Improve setup usability
+ https://bugs.webkit.org/show_bug.cgi?id=235051
+ <rdar://problem/87367948>
+
+ Reviewed by Aakash Jain.
+
+ * Scripts/libraries/webkitbugspy/setup.py: Bump version.
+ * Scripts/libraries/webkitbugspy/webkitbugspy/__init__.py: Ditto.
+ * Scripts/libraries/webkitbugspy/webkitbugspy/github.py:
+ (Tracker.credentials): Retry credential prompt if the user provides an email.
+ * Scripts/libraries/webkitcorepy/setup.py: Bump version.
+ * Scripts/libraries/webkitcorepy/webkitcorepy/__init__.py: Ditto.
+ * Scripts/libraries/webkitcorepy/webkitcorepy/credentials.py:
+ (credentials): Use Terminal's choosing function.
+ (delete_credentials): Delete credentials for a service.
+ * Scripts/libraries/webkitcorepy/webkitcorepy/editor.py:
+ (Editor.vi): Add.
+ (Editor.programs): Add vi.
+ * Scripts/libraries/webkitscmpy/setup.py: Bump version.
+ * Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py: Ditto.
+ * Scripts/libraries/webkitscmpy/webkitscmpy/program/setup.py:
+ (Setup.git): SSH replacement applies to http and https remotes.
+ (Setup.main): Include explicit conclusion messages.
+ * Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py:
+ (GitHub.credentials): Retry credential prompt if the user provides an email.
+ * Scripts/libraries/webkitscmpy/webkitscmpy/test/setup_unittest.py:
+
2022-01-19 Jon Lee <[email protected]>
Swap accelerated drawing flag between the two GPU Process iOS simulator bots
Modified: trunk/Tools/Scripts/libraries/webkitbugspy/webkitbugspy/github.py (288226 => 288227)
--- trunk/Tools/Scripts/libraries/webkitbugspy/webkitbugspy/github.py 2022-01-19 20:07:02 UTC (rev 288226)
+++ trunk/Tools/Scripts/libraries/webkitbugspy/webkitbugspy/github.py 2022-01-19 20:13:35 UTC (rev 288227)
@@ -24,6 +24,7 @@
import re
import requests
import sys
+import webkitcorepy
from .issue import Issue
from .tracker import Tracker as GenericTracker
@@ -30,7 +31,6 @@
from datetime import datetime
from requests.auth import HTTPBasicAuth
-from webkitcorepy import credentials, decorators
class Tracker(GenericTracker):
@@ -66,14 +66,26 @@
return None
def credentials(self, required=True):
- return credentials(
+ hostname = self.url.split('/')[2]
+ args = dict(
url=""
required=required,
name=self.url.split('/')[2].replace('.', '_').upper(),
- prompt="GitHub's API\nPlease generate a 'Personal access token' via 'Developer settings' for your user",
+ prompt='''GitHub's API
+Please go to https://{host}/settings/tokens and generate a new 'Personal access token' via 'Developer settings'
+with 'repo' and 'workflow' access and appropriate 'Expiration' for your {host} user'''.format(host=hostname),
key_name='token',
)
+ username, token = webkitcorepy.credentials(**args)
+ if username and '@' in username:
+ sys.stderr.write("Provided username contains an '@' symbol. Please make sure to enter your GitHub username, not an email associated with the account\n")
+ webkitcorepy.delete_credentials(url="" name=args['name'])
+ username, token = webkitcorepy.credentials(**args)
+ if username and '@' in username:
+ raise ValueError("GitHub usernames cannot have '@' in them")
+ return username, token
+
def request(self, path=None, params=None, headers=None, authenticated=None, paginate=True):
headers = {key: value for key, value in headers.items()} if headers else dict()
headers['Accept'] = headers.get('Accept', 'application/vnd.github.v3+json')
Modified: trunk/Tools/Scripts/libraries/webkitcorepy/setup.py (288226 => 288227)
--- trunk/Tools/Scripts/libraries/webkitcorepy/setup.py 2022-01-19 20:07:02 UTC (rev 288226)
+++ trunk/Tools/Scripts/libraries/webkitcorepy/setup.py 2022-01-19 20:13:35 UTC (rev 288227)
@@ -30,7 +30,7 @@
setup(
name='webkitcorepy',
- version='0.12.5',
+ version='0.12.6',
description='Library containing various Python support classes and functions.',
long_description=readme(),
classifiers=[
Modified: trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/__init__.py (288226 => 288227)
--- trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/__init__.py 2022-01-19 20:07:02 UTC (rev 288226)
+++ trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/__init__.py 2022-01-19 20:13:35 UTC (rev 288227)
@@ -37,7 +37,7 @@
from webkitcorepy.task_pool import TaskPool
from webkitcorepy.terminal import Terminal
from webkitcorepy.environment import Environment
-from webkitcorepy.credentials import credentials
+from webkitcorepy.credentials import credentials, delete_credentials
from webkitcorepy.measure_time import MeasureTime
from webkitcorepy.nested_fuzzy_dict import NestedFuzzyDict
from webkitcorepy.call_by_need import CallByNeed
@@ -44,7 +44,7 @@
from webkitcorepy.editor import Editor
from webkitcorepy.file_lock import FileLock
-version = Version(0, 12, 5)
+version = Version(0, 12, 6)
from webkitcorepy.autoinstall import Package, AutoInstall
if sys.version_info > (3, 0):
Modified: trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/credentials.py (288226 => 288227)
--- trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/credentials.py 2022-01-19 20:07:02 UTC (rev 288226)
+++ trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/credentials.py 2022-01-19 20:13:35 UTC (rev 288227)
@@ -83,9 +83,10 @@
_cache[name] = (username, key)
if keyring and (username_prompted or key_prompted):
- sys.stderr.write('Store username and {} in system keyring for {}? (Y/N): '.format(key_name, url))
- response = Terminal.input()
- if response.lower() in ['y', 'yes', 'ok']:
+ if Terminal.choose(
+ 'Store username and {} in system keyring for {}?'.format(key_name, url),
+ default='Yes',
+ ) == 'Yes':
sys.stderr.write('Storing credentials...\n')
keyring.set_password(url, 'username', username)
keyring.set_password(url, username, key)
@@ -93,3 +94,29 @@
sys.stderr.write('Credentials cached in process.\n')
return username, key
+
+
+def delete_credentials(url, name=None):
+ global _cache
+
+ name = name or url.split('/')[2].replace('.', '_')
+ if name in _cache:
+ del _cache[name]
+
+ with OutputCapture():
+ try:
+ import keyring
+
+ username = None
+ try:
+ if keyring:
+ username = keyring.get_password(url, 'username')
+ except (RuntimeError, AttributeError):
+ pass
+
+ for key in ['username', username]:
+ if key:
+ keyring.delete_password(url, key)
+
+ except (CalledProcessError, ImportError):
+ pass
Modified: trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/editor.py (288226 => 288227)
--- trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/editor.py 2022-01-19 20:07:02 UTC (rev 288226)
+++ trunk/Tools/Scripts/libraries/webkitcorepy/webkitcorepy/editor.py 2022-01-19 20:13:35 UTC (rev 288227)
@@ -74,6 +74,16 @@
)
@classmethod
+ def vi(cls):
+ from whichcraft import which
+ path = which('vi')
+ return cls(
+ name='vi',
+ path=path,
+ command=[path],
+ )
+
+ @classmethod
def default(cls):
from whichcraft import which
path = which('open')
@@ -106,6 +116,7 @@
Editor.atom(),
Editor.xcode(),
Editor.textedit(),
+ Editor.vi(),
Editor.default(),
]:
if not exists or program:
Modified: trunk/Tools/Scripts/libraries/webkitscmpy/setup.py (288226 => 288227)
--- trunk/Tools/Scripts/libraries/webkitscmpy/setup.py 2022-01-19 20:07:02 UTC (rev 288226)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/setup.py 2022-01-19 20:13:35 UTC (rev 288227)
@@ -29,7 +29,7 @@
setup(
name='webkitscmpy',
- version='3.1.1',
+ version='3.1.2',
description='Library designed to interact with git and svn repositories.',
long_description=readme(),
classifiers=[
Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py (288226 => 288227)
--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py 2022-01-19 20:07:02 UTC (rev 288226)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py 2022-01-19 20:13:35 UTC (rev 288227)
@@ -46,7 +46,7 @@
"Please install webkitcorepy with `pip install webkitcorepy --extra-index-url <package index URL>`"
)
-version = Version(3, 1, 1)
+version = Version(3, 1, 2)
AutoInstall.register(Package('fasteners', Version(0, 15, 0)))
AutoInstall.register(Package('jinja2', Version(2, 11, 3)))
Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/program/setup.py (288226 => 288227)
--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/program/setup.py 2022-01-19 20:07:02 UTC (rev 288226)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/program/setup.py 2022-01-19 20:13:35 UTC (rev 288227)
@@ -191,7 +191,7 @@
# Pushing to http repositories is difficult, offer to change http checkouts to ssh
http_remote = local.Git.HTTP_REMOTE.match(repository.url())
if http_remote and not args.defaults and Terminal.choose(
- "http based remotes will prompt for your password when pushing,\nwould you like to convert to a ssh remote?",
+ "http(s) based remotes will prompt for your password every time when pushing,\nit is recommended to convert to a ssh remote, would you like to convert to a ssh remote?",
default='Yes',
) == 'Yes':
if run([
@@ -271,10 +271,14 @@
@classmethod
def main(cls, args, repository, **kwargs):
if isinstance(repository, local.Git):
- return cls.git(args, repository, **kwargs)
+ result = cls.git(args, repository, **kwargs)
+ print('Setup failed' if result else 'Setup succeeded!')
+ return result
if isinstance(repository, remote.GitHub):
- return cls.github(args, repository, **kwargs)
+ result = cls.github(args, repository, **kwargs)
+ print('Setup failed' if result else 'Setup succeeded!')
+ return result
sys.stderr.write('No setup required for {}\n'.format(
getattr(repository, 'root_path', getattr(repository, 'url', '?')),
Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py (288226 => 288227)
--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py 2022-01-19 20:07:02 UTC (rev 288226)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py 2022-01-19 20:13:35 UTC (rev 288227)
@@ -25,10 +25,11 @@
import requests
import six
import sys
+import webkitcorepy
from datetime import datetime
from requests.auth import HTTPBasicAuth
-from webkitcorepy import credentials, decorators
+from webkitcorepy import decorators
from webkitscmpy import Commit, Contributor, PullRequest
from webkitscmpy.remote.scm import Scm
from xml.dom import minidom
@@ -301,17 +302,26 @@
self.pull_requests = self.PRGenerator(self)
def credentials(self, required=True):
- username, token = credentials(
+ # FIXME: Should use webkitbugspy's impelementation
+ hostname = self.url.split('/')[2]
+ args = dict(
url=""
required=required,
name=self.url.split('/')[2].replace('.', '_').upper(),
prompt='''GitHub's API
-Please generate a 'Personal access token' via 'Developer settings' with 'repo' and 'workflow' access
-for your {} user'''.format(self.url.split('/')[2]),
+ Please go to https://{host}/settings/tokens and generate a new 'Personal access token' via 'Developer settings'
+ with 'repo' and 'workflow' access and appropriate 'Expiration' for your {host} user'''.format(host=hostname),
key_name='token',
)
- if username:
- username = username.split('@')[0]
+
+ username, token = webkitcorepy.credentials(**args)
+ if username and '@' in username:
+ sys.stderr.write(
+ "Provided username contains an '@' symbol. Please make sure to enter your GitHub username, not an email associated with the account\n")
+ webkitcorepy.delete_credentials(url="" name=args['name'])
+ username, token = webkitcorepy.credentials(**args)
+ if username and '@' in username:
+ raise ValueError("GitHub usernames cannot have '@' in them")
return username, token
@property
Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/setup_unittest.py (288226 => 288227)
--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/setup_unittest.py 2022-01-19 20:07:02 UTC (rev 288226)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/setup_unittest.py 2022-01-19 20:13:35 UTC (rev 288227)
@@ -52,7 +52,7 @@
path=self.path,
))
- self.assertEqual(captured.stdout.getvalue(), "Create a private fork of 'WebKit' belonging to 'username' ([Yes]/No): \n")
+ self.assertEqual(captured.stdout.getvalue(), "Create a private fork of 'WebKit' belonging to 'username' ([Yes]/No): \nSetup succeeded!\n")
self.assertEqual(captured.stderr.getvalue(), '')
self.assertEqual(
captured.root.log.getvalue(),
@@ -78,7 +78,7 @@
self.assertEqual('auto', config.get('color.branch', ''))
self.assertEqual('true', config.get('pull.rebase', ''))
- self.assertEqual(captured.stdout.getvalue(), '')
+ self.assertEqual(captured.stdout.getvalue(), 'Setup succeeded!\n')
self.assertEqual(captured.stderr.getvalue(), '')
self.assertEqual(
captured.root.log.getvalue(),
@@ -123,9 +123,10 @@
Pick a commit message editor:
{}
:
-http based remotes will prompt for your password when pushing,
-would you like to convert to a ssh remote? ([Yes]/No):
+http(s) based remotes will prompt for your password every time when pushing,
+it is recommended to convert to a ssh remote, would you like to convert to a ssh remote? ([Yes]/No):
Create a private fork of 'WebKit' belonging to 'username' ([Yes]/No):
+Setup succeeded!
'''.format('\n '.join([
'{}) {}'.format(
count + 1, programs[count] if count else '[{}]'.format(programs[count]),