{"action":"created","comment":{"url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/pulls/comments/220785900","pull_request_review_id":159274468,"id":220785900,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyMDc4NTkwMA==","diff_hunk":"@@ -0,0 +1,447 @@\n+/*\n+ * Copyright © 2018 Red Hat, Inc\n+ *\n+ * This program is free software; you can redistribute it and/or\n+ * modify it under the terms of the GNU Lesser General Public\n+ * License as published by the Free Software Foundation; either\n+ * version 2 of the License, or (at your option) any later version.\n+ *\n+ * This library is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n+ * Lesser General Public License for more details.\n+ *\n+ * You should have received a copy of the GNU Lesser General Public\n+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.\n+ *\n+ * Authors:\n+ *       Matthias Clasen <mclasen@redhat.com>\n+ */\n+\n+#include \"config.h\"\n+\n+#include <locale.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include <errno.h>\n+\n+#include <sys/types.h>\n+#include <sys/stat.h>\n+#include <unistd.h>\n+#include <fcntl.h>\n+\n+#include <gio/gio.h>\n+#include <gio/gunixfdlist.h>\n+\n+#include \"file-transfer.h\"\n+#include \"src/xdp-utils.h\"\n+#include \"document-portal-dbus.h\"\n+#include \"document-enums.h\"\n+#include \"document-portal.h\"\n+#include \"document-portal-fuse.h\"\n+\n+static XdpDbusFileTransfer *file_transfer;\n+\n+typedef struct\n+{\n+  GMutex mutex;\n+\n+  GPtrArray *files;\n+  gboolean writable;\n+  gboolean autostop;\n+  char *key;\n+  char *sender;\n+  XdpAppInfo *app_info;\n+} FileTransfer;\n+\n+static inline void\n+auto_unlock_helper (GMutex **mutex)\n+{\n+  if (*mutex)\n+    g_mutex_unlock (*mutex);\n+}\n+\n+static inline GMutex *\n+auto_lock_helper (GMutex *mutex)\n+{\n+  if (mutex)\n+    g_mutex_lock (mutex);\n+  return mutex;\n+}\n+\n+#define TRANSFER_AUTOLOCK(transfer) \\\n+  G_GNUC_UNUSED __attribute__((cleanup (auto_unlock_helper))) \\\n+  GMutex * G_PASTE (auto_unlock, __LINE__) = \\\n+    auto_lock_helper (&transfer->mutex);\n+\n+static void\n+file_transfer_free (gpointer data)\n+{\n+  FileTransfer *transfer = (FileTransfer *)data;\n+\n+  g_mutex_clear (&transfer->mutex);\n+  xdp_app_info_unref (transfer->app_info);\n+  g_ptr_array_unref (transfer->files);\n+  g_free (transfer->key);\n+  g_free (transfer->sender);\n+  g_free (transfer);\n+}\n+\n+G_LOCK_DEFINE (transfers);\n+static GHashTable *transfers;\n+\n+static FileTransfer *\n+lookup_transfer (const char *key)\n+{\n+  FileTransfer *transfer;\n+\n+  G_LOCK (transfers);\n+  transfer = (FileTransfer *)g_hash_table_lookup (transfers, key);\n+  G_UNLOCK (transfers);\n+\n+  return transfer;\n+}\n+\n+static FileTransfer *\n+file_transfer_start (XdpAppInfo *app_info,\n+                     const char *sender,\n+                     gboolean    writable,\n+                     gboolean    autostop)\n+{\n+  FileTransfer *transfer;\n+\n+  transfer = g_new0 (FileTransfer, 1);\n+\n+  g_mutex_init (&transfer->mutex);\n+\n+  transfer->app_info = xdp_app_info_ref (app_info);\n+  transfer->sender = g_strdup (sender);\n+  transfer->writable = writable;\n+  transfer->autostop = autostop;\n+  transfer->key = g_strdup_printf (\"%u\", g_random_int ());\n+  transfer->files = g_ptr_array_new_with_free_func (g_free);\n+\n+  G_LOCK (transfers);\n+  g_hash_table_insert (transfers, transfer->key, transfer);\n+  G_UNLOCK (transfers);\n+\n+  g_debug (\"start file transfer owned by '%s' (%s)\",\n+           xdp_app_info_get_id (transfer->app_info),\n+           transfer->sender);\n+\n+  return transfer;\n+}\n+\n+static gboolean\n+stop (gpointer data)\n+{\n+  FileTransfer *transfer = data;\n+\n+  file_transfer_free (transfer);\n+\n+  return G_SOURCE_REMOVE;\n+}\n+\n+static void\n+file_transfer_stop (FileTransfer *transfer)\n+{\n+  g_debug (\"stop file transfer owned by '%s' (%s)\",\n+           xdp_app_info_get_id (transfer->app_info),\n+           transfer->sender);\n+\n+  G_LOCK (transfers);\n+  g_hash_table_steal (transfers, transfer->key);\n+  G_UNLOCK (transfers);\n+\n+  g_idle_add (stop, transfer);\n+}\n+\n+static void\n+file_transfer_add_files (FileTransfer *transfer,\n+                         const char **files)\n+{\n+  int i;\n+\n+  for (i = 0; files[i]; i++)\n+    g_ptr_array_add (transfer->files, g_strdup (files[i]));\n+\n+  g_debug (\"add %d files to file transfer owned by '%s' (%s)\", g_strv_length (files),\n+           xdp_app_info_get_id (transfer->app_info),\n+           transfer->sender);\n+}\n+\n+static char **\n+file_transfer_execute (FileTransfer *transfer,\n+                       XdpAppInfo *target_app_info,\n+                       GError **error)\n+{\n+  guint32 flags;\n+  DocumentPermissionFlags perms;\n+  const char *target_app_id;\n+  int n_fds;\n+  g_autofree int *fds = NULL;\n+  int i;\n+  g_auto(GStrv) ids = NULL;\n+  char **files = NULL;\n+\n+  g_debug (\"retrieve %d files for %s from file transfer owned by '%s' (%s)\",\n+           transfer->files->len,\n+           xdp_app_info_get_id (target_app_info),\n+           xdp_app_info_get_id (transfer->app_info),\n+           transfer->sender);\n+\n+  if (xdp_app_info_is_host (target_app_info))\n+    return g_strdupv ((char **)transfer->files->pdata);\n+\n+  flags = DOCUMENT_ADD_FLAGS_REUSE_EXISTING | DOCUMENT_ADD_FLAGS_AS_NEEDED_BY_APP;\n+  \n+  perms = DOCUMENT_PERMISSION_FLAGS_READ;\n+  if (transfer->writable)\n+    perms |= DOCUMENT_PERMISSION_FLAGS_WRITE;\n+\n+  target_app_id = xdp_app_info_get_id (target_app_info);\n+\n+  n_fds = transfer->files->len;\n+  fds = g_new (int, n_fds);\n+  for (i = 0; i < n_fds; i++)\n+    {\n+      const char *file;\n+\n+      file = g_ptr_array_index (transfer->files, i);\n+      fds[i] = open (file, O_PATH | O_CLOEXEC);","path":"document-portal/file-transfer.c","position":212,"original_position":212,"commit_id":"a2ef0d99389b3729beb816bc19bcec01fd18bba4","original_commit_id":"a2ef0d99389b3729beb816bc19bcec01fd18bba4","user":{"login":"matthiasclasen","id":4834845,"node_id":"MDQ6VXNlcjQ4MzQ4NDU=","avatar_url":"https://avatars3.githubusercontent.com/u/4834845?v=4","gravatar_id":"","url":"https://api.github.com/users/matthiasclasen","html_url":"https://github.com/matthiasclasen","followers_url":"https://api.github.com/users/matthiasclasen/followers","following_url":"https://api.github.com/users/matthiasclasen/following{/other_user}","gists_url":"https://api.github.com/users/matthiasclasen/gists{/gist_id}","starred_url":"https://api.github.com/users/matthiasclasen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/matthiasclasen/subscriptions","organizations_url":"https://api.github.com/users/matthiasclasen/orgs","repos_url":"https://api.github.com/users/matthiasclasen/repos","events_url":"https://api.github.com/users/matthiasclasen/events{/privacy}","received_events_url":"https://api.github.com/users/matthiasclasen/received_events","type":"User","site_admin":false},"body":"but I think we need fds in document_add_full anyway, to check if the target can access them ?","created_at":"2018-09-27T03:44:09Z","updated_at":"2018-09-27T03:44:09Z","html_url":"https://github.com/flatpak/xdg-desktop-portal/pull/222#discussion_r220785900","pull_request_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/pulls/222","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/flatpak/xdg-desktop-portal/pulls/comments/220785900"},"html":{"href":"https://github.com/flatpak/xdg-desktop-portal/pull/222#discussion_r220785900"},"pull_request":{"href":"https://api.github.com/repos/flatpak/xdg-desktop-portal/pulls/222"}},"in_reply_to_id":220466382},"pull_request":{"url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/pulls/222","id":213454814,"node_id":"MDExOlB1bGxSZXF1ZXN0MjEzNDU0ODE0","html_url":"https://github.com/flatpak/xdg-desktop-portal/pull/222","diff_url":"https://github.com/flatpak/xdg-desktop-portal/pull/222.diff","patch_url":"https://github.com/flatpak/xdg-desktop-portal/pull/222.patch","issue_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/issues/222","number":222,"state":"open","locked":false,"title":"File transfer","user":{"login":"matthiasclasen","id":4834845,"node_id":"MDQ6VXNlcjQ4MzQ4NDU=","avatar_url":"https://avatars3.githubusercontent.com/u/4834845?v=4","gravatar_id":"","url":"https://api.github.com/users/matthiasclasen","html_url":"https://github.com/matthiasclasen","followers_url":"https://api.github.com/users/matthiasclasen/followers","following_url":"https://api.github.com/users/matthiasclasen/following{/other_user}","gists_url":"https://api.github.com/users/matthiasclasen/gists{/gist_id}","starred_url":"https://api.github.com/users/matthiasclasen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/matthiasclasen/subscriptions","organizations_url":"https://api.github.com/users/matthiasclasen/orgs","repos_url":"https://api.github.com/users/matthiasclasen/repos","events_url":"https://api.github.com/users/matthiasclasen/events{/privacy}","received_events_url":"https://api.github.com/users/matthiasclasen/received_events","type":"User","site_admin":false},"body":"This branch adds a \"FileTransfer\" portal to the document portal binary. It can be used to implement dnd and copy/paste. By using the portal as a side-channel to transfer the files (while exporting them as-needed).\r\n\r\nThis works, and https://gitlab.gnome.org/GNOME/gtk/merge_requests/321 has corresponding gtk changes. Future todo: better handling for directories.","created_at":"2018-09-05T23:21:27Z","updated_at":"2018-09-27T03:44:09Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ec355ac6d301e985267b621816a0a8a9e92e8518","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/pulls/222/commits","review_comments_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/pulls/222/comments","review_comment_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/pulls/comments{/number}","comments_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/issues/222/comments","statuses_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/statuses/a2ef0d99389b3729beb816bc19bcec01fd18bba4","head":{"label":"matthiasclasen:file-transfer2","ref":"file-transfer2","sha":"a2ef0d99389b3729beb816bc19bcec01fd18bba4","user":{"login":"matthiasclasen","id":4834845,"node_id":"MDQ6VXNlcjQ4MzQ4NDU=","avatar_url":"https://avatars3.githubusercontent.com/u/4834845?v=4","gravatar_id":"","url":"https://api.github.com/users/matthiasclasen","html_url":"https://github.com/matthiasclasen","followers_url":"https://api.github.com/users/matthiasclasen/followers","following_url":"https://api.github.com/users/matthiasclasen/following{/other_user}","gists_url":"https://api.github.com/users/matthiasclasen/gists{/gist_id}","starred_url":"https://api.github.com/users/matthiasclasen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/matthiasclasen/subscriptions","organizations_url":"https://api.github.com/users/matthiasclasen/orgs","repos_url":"https://api.github.com/users/matthiasclasen/repos","events_url":"https://api.github.com/users/matthiasclasen/events{/privacy}","received_events_url":"https://api.github.com/users/matthiasclasen/received_events","type":"User","site_admin":false},"repo":{"id":61571120,"node_id":"MDEwOlJlcG9zaXRvcnk2MTU3MTEyMA==","name":"xdg-desktop-portal","full_name":"matthiasclasen/xdg-desktop-portal","private":false,"owner":{"login":"matthiasclasen","id":4834845,"node_id":"MDQ6VXNlcjQ4MzQ4NDU=","avatar_url":"https://avatars3.githubusercontent.com/u/4834845?v=4","gravatar_id":"","url":"https://api.github.com/users/matthiasclasen","html_url":"https://github.com/matthiasclasen","followers_url":"https://api.github.com/users/matthiasclasen/followers","following_url":"https://api.github.com/users/matthiasclasen/following{/other_user}","gists_url":"https://api.github.com/users/matthiasclasen/gists{/gist_id}","starred_url":"https://api.github.com/users/matthiasclasen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/matthiasclasen/subscriptions","organizations_url":"https://api.github.com/users/matthiasclasen/orgs","repos_url":"https://api.github.com/users/matthiasclasen/repos","events_url":"https://api.github.com/users/matthiasclasen/events{/privacy}","received_events_url":"https://api.github.com/users/matthiasclasen/received_events","type":"User","site_admin":false},"html_url":"https://github.com/matthiasclasen/xdg-desktop-portal","description":"Desktop integration portal","fork":true,"url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal","forks_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/forks","keys_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/keys{/key_id}","collaborators_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/teams","hooks_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/hooks","issue_events_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/issues/events{/number}","events_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/events","assignees_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/assignees{/user}","branches_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/branches{/branch}","tags_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/tags","blobs_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/git/refs{/sha}","trees_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/git/trees{/sha}","statuses_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/statuses/{sha}","languages_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/languages","stargazers_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/stargazers","contributors_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/contributors","subscribers_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/subscribers","subscription_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/subscription","commits_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/commits{/sha}","git_commits_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/git/commits{/sha}","comments_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/comments{/number}","issue_comment_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/issues/comments{/number}","contents_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/contents/{+path}","compare_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/compare/{base}...{head}","merges_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/merges","archive_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/downloads","issues_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/issues{/number}","pulls_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/pulls{/number}","milestones_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/milestones{/number}","notifications_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/labels{/name}","releases_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/releases{/id}","deployments_url":"https://api.github.com/repos/matthiasclasen/xdg-desktop-portal/deployments","created_at":"2016-06-20T18:33:21Z","updated_at":"2018-09-17T23:33:15Z","pushed_at":"2018-09-27T03:43:02Z","git_url":"git://github.com/matthiasclasen/xdg-desktop-portal.git","ssh_url":"git@github.com:matthiasclasen/xdg-desktop-portal.git","clone_url":"https://github.com/matthiasclasen/xdg-desktop-portal.git","svn_url":"https://github.com/matthiasclasen/xdg-desktop-portal","homepage":null,"size":786,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"lgpl-2.1","name":"GNU Lesser General Public License v2.1","spdx_id":"LGPL-2.1","url":"https://api.github.com/licenses/lgpl-2.1","node_id":"MDc6TGljZW5zZTEx"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"flatpak:master","ref":"master","sha":"80f27dfeeffe0dfca7dd763d7adb9710cbb599cf","user":{"login":"flatpak","id":19473042,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE5NDczMDQy","avatar_url":"https://avatars0.githubusercontent.com/u/19473042?v=4","gravatar_id":"","url":"https://api.github.com/users/flatpak","html_url":"https://github.com/flatpak","followers_url":"https://api.github.com/users/flatpak/followers","following_url":"https://api.github.com/users/flatpak/following{/other_user}","gists_url":"https://api.github.com/users/flatpak/gists{/gist_id}","starred_url":"https://api.github.com/users/flatpak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/flatpak/subscriptions","organizations_url":"https://api.github.com/users/flatpak/orgs","repos_url":"https://api.github.com/users/flatpak/repos","events_url":"https://api.github.com/users/flatpak/events{/privacy}","received_events_url":"https://api.github.com/users/flatpak/received_events","type":"Organization","site_admin":false},"repo":{"id":61550473,"node_id":"MDEwOlJlcG9zaXRvcnk2MTU1MDQ3Mw==","name":"xdg-desktop-portal","full_name":"flatpak/xdg-desktop-portal","private":false,"owner":{"login":"flatpak","id":19473042,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE5NDczMDQy","avatar_url":"https://avatars0.githubusercontent.com/u/19473042?v=4","gravatar_id":"","url":"https://api.github.com/users/flatpak","html_url":"https://github.com/flatpak","followers_url":"https://api.github.com/users/flatpak/followers","following_url":"https://api.github.com/users/flatpak/following{/other_user}","gists_url":"https://api.github.com/users/flatpak/gists{/gist_id}","starred_url":"https://api.github.com/users/flatpak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/flatpak/subscriptions","organizations_url":"https://api.github.com/users/flatpak/orgs","repos_url":"https://api.github.com/users/flatpak/repos","events_url":"https://api.github.com/users/flatpak/events{/privacy}","received_events_url":"https://api.github.com/users/flatpak/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/flatpak/xdg-desktop-portal","description":"Desktop integration portal","fork":false,"url":"https://api.github.com/repos/flatpak/xdg-desktop-portal","forks_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/forks","keys_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/keys{/key_id}","collaborators_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/teams","hooks_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/hooks","issue_events_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/issues/events{/number}","events_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/events","assignees_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/assignees{/user}","branches_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/branches{/branch}","tags_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/tags","blobs_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/git/refs{/sha}","trees_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/git/trees{/sha}","statuses_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/statuses/{sha}","languages_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/languages","stargazers_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/stargazers","contributors_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/contributors","subscribers_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/subscribers","subscription_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/subscription","commits_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/commits{/sha}","git_commits_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/git/commits{/sha}","comments_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/comments{/number}","issue_comment_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/issues/comments{/number}","contents_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/contents/{+path}","compare_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/compare/{base}...{head}","merges_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/merges","archive_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/downloads","issues_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/issues{/number}","pulls_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/pulls{/number}","milestones_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/milestones{/number}","notifications_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/labels{/name}","releases_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/releases{/id}","deployments_url":"https://api.github.com/repos/flatpak/xdg-desktop-portal/deployments","created_at":"2016-06-20T13:39:37Z","updated_at":"2018-09-17T23:33:07Z","pushed_at":"2018-09-20T19:47:45Z","git_url":"git://github.com/flatpak/xdg-desktop-portal.git","ssh_url":"git@github.com:flatpak/xdg-desktop-portal.git","clone_url":"https://github.com/flatpak/xdg-desktop-portal.git","svn_url":"https://github.com/flatpak/xdg-desktop-portal","homepage":null,"size":762,"stargazers_count":36,"watchers_count":36,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":35,"mirror_url":null,"archived":false,"open_issues_count":33,"license":{"key":"lgpl-2.1","name":"GNU Lesser General Public License v2.1","spdx_id":"LGPL-2.1","url":"https://api.github.com/licenses/lgpl-2.1","node_id":"MDc6TGljZW5zZTEx"},"forks":35,"open_issues":33,"watchers":36,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/flatpak/xdg-desktop-portal/pulls/222"},"html":{"href":"https://github.com/flatpak/xdg-desktop-portal/pull/222"},"issue":{"href":"https://api.github.com/repos/flatpak/xdg-desktop-portal/issues/222"},"comments":{"href":"https://api.github.com/repos/flatpak/xdg-desktop-portal/issues/222/comments"},"review_comments":{"href":"https://api.github.com/repos/flatpak/xdg-desktop-portal/pulls/222/comments"},"review_comment":{"href":"https://api.github.com/repos/flatpak/xdg-desktop-portal/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/flatpak/xdg-desktop-portal/pulls/222/commits"},"statuses":{"href":"https://api.github.com/repos/flatpak/xdg-desktop-portal/statuses/a2ef0d99389b3729beb816bc19bcec01fd18bba4"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"matthiasclasen"}}