Title: [288227] trunk/Tools
Revision
288227
Author
[email protected]
Date
2022-01-19 12:13:35 -0800 (Wed, 19 Jan 2022)

Log Message

[git-webkit] Improve setup usability
https://bugs.webkit.org/show_bug.cgi?id=235051
<rdar://problem/87367948>

Reviewed by Aakash Jain.

* Tools/Scripts/libraries/webkitbugspy/setup.py: Bump version.
* Tools/Scripts/libraries/webkitbugspy/webkitbugspy/__init__.py: Ditto.
* Tools/Scripts/libraries/webkitbugspy/webkitbugspy/github.py:
(Tracker.credentials): Retry credential prompt if the user provides an email.
* Tools/Scripts/libraries/webkitcorepy/setup.py: Bump version.
* Tools/Scripts/libraries/webkitcorepy/webkitcorepy/__init__.py: Ditto.
* Tools/Scripts/libraries/webkitcorepy/webkitcorepy/credentials.py:
(credentials): Use Terminal's choosing function.
(delete_credentials): Delete credentials for a service.
* Tools/Scripts/libraries/webkitcorepy/webkitcorepy/editor.py:
(Editor.vi): Add.
(Editor.programs): Add vi.
* Tools/Scripts/libraries/webkitscmpy/setup.py: Bump version.
* Tools/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.
* Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py:
(GitHub.credentials): Retry credential prompt if the user provides an email.
* Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/setup_unittest.py:

Canonical link: https://commits.webkit.org/246186@main

Modified Paths

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]),
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to