[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