Bug#927912: unblock: gcalcli/4.0.4-2 (pre-approval)
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock
Howdy,
Pending approval, I'm uploading a version of gcalcli which contains an upstream patch to fix the reliance on the Google shortening service.
If a user invokes one of the subcommands with '--details url', the application hits traceback issues as the service has been shut down.
See https://github.com/insanum/gcalcli/issues/440 for more details of the problem.
The changelog reads:
gcalcli (4.0.4-2) unstable; urgency=medium
* d/p/remove_url_shortening.patch: Remove the deprecated goo.gl service.
-- Unit 193 <unit193@ubuntu.com> Wed, 24 Apr 2019 19:46:16 -0400
And debdiff:
diff --git a/debian/changelog b/debian/changelog
index 868a5db..f6bd57b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+gcalcli (4.0.4-2) unstable; urgency=medium
+
+ * d/p/remove_url_shortening.patch: Remove the deprecated goo.gl service.
+
+ -- Unit 193 <unit193@ubuntu.com> Wed, 24 Apr 2019 19:46:16 -0400
+
gcalcli (4.0.4-1) unstable; urgency=medium
* New upstream version 4.0.4
diff --git a/debian/patches/remove_url_shortening.patch b/debian/patches/remove_url_shortening.patch
new file mode 100644
index 0000000..74a3c44
--- /dev/null
+++ b/debian/patches/remove_url_shortening.patch
@@ -0,0 +1,225 @@
+From 428378a88f89d154c8d4046deb9bdb5eb4e81019 Mon Sep 17 00:00:00 2001
+From: Joshua Crowgey <jcrowgey@u.washington.edu>
+Date: Mon, 15 Apr 2019 21:07:49 -0700
+Subject: [PATCH] Remove URL Shortening [fixes #440] (#443)
+
+Google has removed the urlshortening service. After some discussion,
+it was decided to remove the shortening facilities instead of trying to
+integrate with a separate provider. This makes our code simpler and
+folks who need url shortening can hopefully layer on what they need.
+---
+ ChangeLog | 3 +++
+ gcalcli/argparsers.py | 16 +++++-----------
+ gcalcli/gcal.py | 39 +++++++++------------------------------
+ setup.py | 2 +-
+ tests/test_argparsers.py | 9 ++-------
+ 5 files changed, 20 insertions(+), 49 deletions(-)
+
+Index: gcalcli/ChangeLog
+===================================================================
+--- gcalcli.orig/ChangeLog
++++ gcalcli/ChangeLog
+@@ -1,3 +1,6 @@
++v4.1.0
++ * Removed url shortening due to Google deprecation #440
++
+ v4.0.4
+ * Minor bugfixes: conky colors, issues with setup.py
+
+Index: gcalcli/gcalcli/argparsers.py
+===================================================================
+--- gcalcli.orig/gcalcli/argparsers.py
++++ gcalcli/gcalcli/argparsers.py
+@@ -7,11 +7,9 @@ from gcalcli.printer import valid_color_
+ from oauth2client import tools
+ import copy as _copy
+
+-DETAILS = ['all', 'calendar', 'location', 'length', 'reminders', 'description',
+- 'longurl', 'shorturl', 'url', 'attendees', 'email', 'attachments']
++DETAILS = ['calendar', 'location', 'length', 'reminders', 'description',
++ 'url', 'attendees', 'email', 'attachments']
+
+-BOOL_DETAILS = ['calendar', 'location', 'length', 'reminders', 'description',
+- 'attendees', 'email', 'attachments']
+
+ PROGRAM_OPTIONS = {
+ '--client-id': {'default': gcalcli.__API_CLIENT_ID__,
+@@ -60,13 +58,9 @@ class DetailsAction(argparse._AppendActi
+ details = _copy.copy(getattr(namespace, self.dest, {}))
+
+ if value == 'all':
+- details = {d: True for d in BOOL_DETAILS}
+- elif value in BOOL_DETAILS:
++ details = {d: True for d in DETAILS}
++ else:
+ details[value] = True
+- elif value in ['shorturl', 'url']:
+- details['url'] = 'short'
+- elif value == 'longurl':
+- details['url'] = 'long'
+
+ setattr(namespace, self.dest, details)
+
+@@ -90,7 +84,7 @@ def get_details_parser():
+ details_parser = argparse.ArgumentParser(add_help=False)
+ details_parser.add_argument(
+ '--details', default={}, action=DetailsAction,
+- choices=DETAILS,
++ choices=DETAILS + ['all'],
+ help='Which parts to display, can be: ' + ', '.join(DETAILS))
+ return details_parser
+
+Index: gcalcli/gcalcli/gcal.py
+===================================================================
+--- gcalcli.orig/gcalcli/gcal.py
++++ gcalcli/gcalcli/gcal.py
+@@ -47,7 +47,6 @@ class GoogleCalendarInterface:
+ max_retries = 5
+ auth_http = None
+ cal_service = None
+- url_service = None
+
+ ACCESS_OWNER = 'owner'
+ ACCESS_WRITER = 'writer'
+@@ -140,8 +139,7 @@ class GoogleCalendarInterface:
+ OAuth2WebServerFlow(
+ client_id=self.options['client_id'],
+ client_secret=self.options['client_secret'],
+- scope=['https://www.googleapis.com/auth/calendar',
+- 'https://www.googleapis.com/auth/urlshortener'],
++ scope=['https://www.googleapis.com/auth/calendar'],
+ user_agent=__program__ + '/' + __version__
+ ),
+ storage,
+@@ -160,15 +158,6 @@ class GoogleCalendarInterface:
+
+ return self.cal_service
+
+- def get_url_service(self):
+- if not self.url_service:
+- self._google_auth()
+- self.url_service = build(serviceName='urlshortener',
+- version='v1',
+- http=self._google_auth())
+-
+- return self.url_service
+-
+ def _get_cached(self):
+ if self.options['config_folder']:
+ cache_file = os.path.expanduser(
+@@ -224,16 +213,6 @@ class GoogleCalendarInterface:
+ with open(cache_file, 'wb') as _cache_:
+ pickle.dump(self.cache, _cache_)
+
+- def _shorten_url(self, url):
+- if self.details.get('url', False) != 'short':
+- return url
+- # Note that when authenticated to a google account different shortUrls
+- # can be returned for the same longUrl. See: http://goo.gl/Ya0A9
+- shortUrl = self._retry_with_backoff(
+- self.get_url_service().url().insert(body={'longUrl': url})
+- )
+- return shortUrl['id']
+-
+ def _calendar_color(self, event, override_color=False):
+ ansi_codes = {
+ '1': 'brightblue',
+@@ -621,9 +600,9 @@ class GoogleCalendarInterface:
+ _u(event['e'].strftime('%H:%M')))
+
+ if self.details.get('url'):
+- output += '\t%s' % (self._shorten_url(event['htmlLink'])
++ output += '\t%s' % (event['htmlLink']
+ if 'htmlLink' in event else '')
+- output += '\t%s' % (self._shorten_url(event['hangoutLink'])
++ output += '\t%s' % (event['hangoutLink']
+ if 'hangoutLink' in event else '')
+
+ output += '\t%s' % _u(self._valid_title(event).strip())
+@@ -724,12 +703,12 @@ class GoogleCalendarInterface:
+ self.printer.msg(xstr, 'default')
+
+ if self.details.get('url') and 'htmlLink' in event:
+- hlink = self._shorten_url(event['htmlLink'])
++ hlink = event['htmlLink']
+ xstr = '%s Link: %s\n' % (details_indent, hlink)
+ self.printer.msg(xstr, 'default')
+
+ if self.details.get('url') and 'hangoutLink' in event:
+- hlink = self._shorten_url(event['hangoutLink'])
++ hlink = event['hangoutLink']
+ xstr = '%s Hangout Link: %s\n' % (details_indent, hlink)
+ self.printer.msg(xstr, 'default')
+
+@@ -1282,7 +1261,7 @@ class GoogleCalendarInterface:
+ )
+
+ if self.details.get('url'):
+- hlink = self._shorten_url(new_event['htmlLink'])
++ hlink = new_event['htmlLink']
+ self.printer.msg('New event added: %s\n' % hlink, 'green')
+
+ return new_event
+@@ -1323,7 +1302,7 @@ class GoogleCalendarInterface:
+ new_event = self._retry_with_backoff(request)
+
+ if self.details.get('url'):
+- hlink = self._shorten_url(new_event['htmlLink'])
++ hlink = new_event['htmlLink']
+ self.printer.msg('New event added: %s\n' % hlink, 'green')
+
+ return new_event
+@@ -1557,7 +1536,7 @@ class GoogleCalendarInterface:
+ body=event
+ )
+ )
+- hlink = self._shorten_url(new_event.get('htmlLink'))
++ hlink = new_event.get('htmlLink')
+ self.printer.msg(
+ 'New event added: %s\n' % hlink, 'green'
+ )
+@@ -1576,7 +1555,7 @@ class GoogleCalendarInterface:
+ body=event
+ )
+ )
+- hlink = self._shorten_url(new_event.get('htmlLink'))
++ hlink = new_event.get('htmlLink')
+ self.printer.msg('New event added: %s\n' % hlink, 'green')
+ elif val.lower() == 'q':
+ sys.exit(0)
+Index: gcalcli/setup.py
+===================================================================
+--- gcalcli.orig/setup.py
++++ gcalcli/setup.py
+@@ -17,7 +17,7 @@ author_emails = ['edavis@insanum.com',
+ 'jcrowgey@uw.edu']
+
+ setup(name='gcalcli',
+- version='4.0.4',
++ version='4.1.0',
+ author='Eric Davis, Brian Hartvigsen, Joshua Crowgey',
+ author_email=', '.join(author_emails),
+ maintainer='Joshua Crowgey',
+Index: gcalcli/tests/test_argparsers.py
+===================================================================
+--- gcalcli.orig/tests/test_argparsers.py
++++ gcalcli/tests/test_argparsers.py
+@@ -42,16 +42,11 @@ def test_details_parser():
+ parsed_details = details_parser.parse_args(argv).details
+ assert parsed_details['attendees']
+ assert parsed_details['location']
+- assert parsed_details['url'] == 'short'
++ assert parsed_details['url']
+
+ argv = shlex.split('--details all')
+ parsed_details = details_parser.parse_args(argv).details
+- assert all(parsed_details[d] for d in argparsers.BOOL_DETAILS)
+-
+- # ensure we can specify url type even with details=all
+- argv = shlex.split('--details all --details longurl')
+- parsed_details = details_parser.parse_args(argv).details
+- assert parsed_details['url'] == 'long'
++ assert all(parsed_details[d] for d in argparsers.DETAILS)
+
+
+ def test_handle_unparsed():
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..f4dec53
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1 @@
+remove_url_shortening.patch
Reply to: