[devassistant] Backport fix of GitHub errors

Miro Hrončok churchyard at fedoraproject.org
Fri Feb 28 17:06:23 UTC 2014


commit 8d0c6284ab83a7d82dab141225db56ac25a9f309
Author: Miro Hrončok <miro at hroncok.cz>
Date:   Fri Feb 28 18:07:02 2014 +0100

    Backport fix of GitHub errors

 devassistant-0.8.0-github-fix.patch |  163 +++++++++++++++++++++++++++++++++++
 devassistant.spec                   |    8 ++-
 2 files changed, 170 insertions(+), 1 deletions(-)
---
diff --git a/devassistant-0.8.0-github-fix.patch b/devassistant-0.8.0-github-fix.patch
new file mode 100644
index 0000000..57feaa2
--- /dev/null
+++ b/devassistant-0.8.0-github-fix.patch
@@ -0,0 +1,163 @@
+diff --git a/devassistant/command_runners.py b/devassistant/command_runners.py
+index 8b46986..939a8d1 100644
+--- a/devassistant/command_runners.py
++++ b/devassistant/command_runners.py
+@@ -416,15 +416,14 @@ class GitHubCommandRunner(CommandRunner):
+         kwargs = {}
+         req_kwargs = cls._required_yaml_args.get(comm, cls._required_yaml_args['default'])
+         for k in req_kwargs:
+-            kwargs[k] = getattr(cls, '_guess_' + k)(c.kwargs)
+-            if k in args_rest and not kwargs[k]:
+-                kwargs[k] = args_rest[k]
++            kwargs[k] = getattr(cls, '_guess_' + k)(args_rest.get(k), c.kwargs)
+ 
+         return comm, kwargs
+ 
+     @classmethod
+-    def _guess_login(cls, ctxt):
+-        """Get github login, either from 'github' global variable or from local username.
++    def _guess_login(cls, explicit, ctxt):
++        """Get github login, either from explicitly given string or 'github' global variable
++        or from local username.
+ 
+         Args:
+             ctxt: global context
+@@ -432,12 +431,13 @@ class GitHubCommandRunner(CommandRunner):
+         Returns:
+             guessed github login
+         """
+-        return ctxt.get('github', None) or getpass.getuser()
++        return explicit or ctxt.get('github', None) or getpass.getuser()
+ 
+ 
+     @classmethod
+-    def _guess_reponame(cls, ctxt):
+-        """Extracts reponame from 'name' global variable, which is possibly a path.
++    def _guess_reponame(cls, explicit, ctxt):
++        """Extract reponame, either from explicitly given string or from 'name' global variable,
++        which is possibly a path.
+ 
+         Args:
+             ctxt: global context
+@@ -448,11 +448,12 @@ class GitHubCommandRunner(CommandRunner):
+         if not 'name' in ctxt:
+             raise exceptions.CommandException('Cannot guess Github reponame - no argument given\
+                                                and there is no "name" variable.')
+-        return os.path.basename(ctxt['name'])
++        return explicit or os.path.basename(ctxt['name'])
+ 
+     @classmethod
+-    def _guess_repo_url(cls, ctxt):
+-        """Get repo to fork in form of '<login>/<reponame>' from global variable 'url'.
++    def _guess_repo_url(cls, explicit, ctxt):
++        """Get repo to fork in form of '<login>/<reponame>' from explicitly given string or
++        global variable 'url'.
+ 
+         Args:
+             ctxt: global context
+@@ -460,11 +461,14 @@ class GitHubCommandRunner(CommandRunner):
+         Returns:
+             guessed fork reponame
+         """
+-        if not 'url' in ctxt:
++        url = explicit or ctxt.get('url')
++        if not url:
+             raise exceptions.CommandException('Cannot guess name of Github repo to fork - no\
+                                                argument given and there is no "url" variable.')
+ 
+-        url = ctxt['url'][:-4] if ctxt['url'].endswith('.git') else ctxt['url']
++        url = url[:-4] if url.endswith('.git') else url
++        # if using git at github:username/reponame.git, strip the stuff before ":"
++        url = url.split(':')[-1]
+         return '/'.join(url.split('/')[-2:])
+ 
+     @classmethod
+diff --git a/devassistant/gui/path_window.py b/devassistant/gui/path_window.py
+index 484832c..ae417a6 100644
+--- a/devassistant/gui/path_window.py
++++ b/devassistant/gui/path_window.py
+@@ -167,13 +167,15 @@ class PathWindow(object):
+ 
+     def _check_box_toggled(self, widget, data=None):
+         active = widget.get_active()
+-        for entry in filter( lambda x: x == widget.get_label(), self.entries):
+-            if active:
+-                self.entries[widget.get_label()].set_sensitive(True)
+-                self.browse_btns[widget.get_label()].set_sensitive(True)
+-            else:
+-                self.entries[widget.get_label()].set_sensitive(False)
+-                self.browse_btns[widget.get_label()].set_sensitive(False)
++        label = widget.get_label()
++
++        browse_btn = self.browse_btns.get(label)
++        if browse_btn:
++            browse_btn.set_sensitive(active)
++
++        for _, entry in filter(lambda x: x[0] == label, self.entries.items()):
++            entry.set_sensitive(active)
++
+         self.path_window.show_all()
+ 
+     def prev_window(self, widget, data=None):
+diff --git a/devassistant/remote_auth.py b/devassistant/remote_auth.py
+index 977dab9..b174c6d 100644
+--- a/devassistant/remote_auth.py
++++ b/devassistant/remote_auth.py
+@@ -58,11 +58,20 @@ class GitHubAuth(object):
+     def _github_create_auth(cls):
+         """ Store token into ~/.gitconfig.
+ 
++        Note: this uses cls._user.get_authorizations(), which only works if cls._user
++        was authorized by login/password, doesn't work for token auth (TODO: why?).
+         If token is not defined then store it into ~/.gitconfig file
+         """
+         if not cls._token:
+             try:
+-                auth = cls._user.create_authorization(scopes=['repo', 'user'], note="DeveloperAssistant")
++                auth = None
++                for a in cls._user.get_authorizations():
++                    if a.note == 'DevAssistant':
++                        auth = a
++                if not auth:
++                    auth = cls._user.create_authorization(
++                        scopes=['repo', 'user', 'admin:public_key'],
++                        note="DevAssistant")
+                 ClHelper.run_command("git config --global github.token.{login} {token}".format(
+                     login=cls._user.login,
+                     token=auth.token))
+@@ -73,27 +82,20 @@ class GitHubAuth(object):
+ 
+     @classmethod
+     def _github_create_ssh_key(cls):
++        """Creates a local ssh key, if it doesn't exist already, and uploads it to Github."""
+         try:
+             login = cls._user.login
+             pkey_path = '{home}/.ssh/{keyname}'.format(home=os.path.expanduser('~'),
+-                                                       keyname=settings.GITHUB_SSH_KEYNAME.format(login=login))
+-            # create ssh keys here
+-            if not os.path.isfile('{pkey_path}.pub'.format(pkey_path=pkey_path)):
++                        keyname=settings.GITHUB_SSH_KEYNAME.format(login=login))
++            # generate ssh key only if it doesn't exist
++            if not os.path.exists(pkey_path):
+                 ClHelper.run_command('ssh-keygen -t rsa -f {pkey_path}\
+-                                     -N \"\" -C \"DeveloperAssistant\"'.\
++                                     -N \"\" -C \"DevAssistant\"'.\
+                                      format(pkey_path=pkey_path))
+-                ClHelper.run_command('ssh-add {pkey_path}'.format(pkey_path=pkey_path))
++            ClHelper.run_command('ssh-add {pkey_path}'.format(pkey_path=pkey_path))
+             public_key = ClHelper.run_command('cat {pkey_path}.pub'.format(pkey_path=pkey_path))
+-            # find out if this key is already registered with this user
+-            for key in cls._user.get_keys():
+-                # don't use "==" because we have comments etc added in public_key
+-                if key._key in public_key:
+-                    break
+-            else:
+-                cls._user.create_key("devassistant", public_key)
+-            # next, create ~/.ssh/config entry for the key, if system username != GH login
+-            cls._github_create_ssh_config_entry()
+-        except exceptions.ClException:
++            cls._user.create_key("DevAssistant", public_key)
++        except exceptions.ClException as e:
+             pass # TODO: determine and log the error
+ 
+     @classmethod
diff --git a/devassistant.spec b/devassistant.spec
index 18ddecc..0a55d77 100644
--- a/devassistant.spec
+++ b/devassistant.spec
@@ -2,7 +2,7 @@
 
 Name:           devassistant
 Version:        0.8.0
-Release:        1%{?dist}
+Release:        2%{?dist}
 Summary:        DevAssistant - Making life easier for developers
 
 License:        GPLv2+
@@ -15,6 +15,7 @@ Source0:        https://pypi.python.org/packages/source/d/%{name}/%{name}-%{vers
 Source1:        %{name}.desktop
 Source2:        %{name}.appdata.xml
 Patch0:         devassistant-0.6.0-alter-paths-for-fedora.patch
+Patch1:         devassistant-0.8.0-github-fix.patch
 BuildArch:      noarch
  
 BuildRequires:  desktop-file-utils
@@ -48,6 +49,8 @@ working with source control, etc.
 # Remove bundled egg-info
 rm -rf %{name}.egg-info
 
+%patch1 -p1
+
 cp %{SOURCE1} .
 sed -i '/Version/d' %{name}.desktop
 
@@ -102,6 +105,9 @@ cp -a %{SOURCE2} %{buildroot}/%{_datadir}/appdata
 %{python_sitelib}/%{name}-%{version}-py?.?.egg-info
 
 %changelog
+* Fri Feb 28 2014 Miro Hrončok <mhroncok at redhat.com> - 0.8.0-2
+- Backport fix of GitHub errors.
+
 * Wed Dec 04 2013 Bohuslav Kabrda <bkabrda at redhat.com> - 0.8.0-1
 - Update to 0.8.0.
 - Don't create the /usr/local hierarchy, leave it up to users.


More information about the scm-commits mailing list