{"action":"created","comment":{"url":"https://api.github.com/repos/projectatomic/rpm-ostree/pulls/comments/95255426","pull_request_review_id":15804967,"id":95255426,"diff_hunk":"@@ -92,50 +145,144 @@ child_setup_fchdir (gpointer user_data)\n     err (1, \"fchdir\");\n }\n \n-gboolean\n-rpmostree_run_sync_fchdir_setup (char **argv_array, GSpawnFlags flags,\n-                                 int rootfs_fd, GError **error)\n+static gboolean\n+setup_rofiles_usr (RpmOstreeBwrap *bwrap,\n+                   GError **error)\n {\n+  gboolean ret = FALSE;\n   int estatus;\n-  \n-  if (!g_spawn_sync (NULL, argv_array, NULL, flags,\n-                     child_setup_fchdir, GINT_TO_POINTER (rootfs_fd),\n+  const char *rofiles_argv[] = { \"rofiles-fuse\", \"./usr\", NULL, NULL};\n+  gboolean mntpoint_created = FALSE;\n+\n+  bwrap->rofiles_mnt = g_strdup (\"/tmp/rofiles-fuse.XXXXXX\");\n+  rofiles_argv[2] = bwrap->rofiles_mnt;\n+\n+  if (!glnx_mkdtempat (AT_FDCWD, bwrap->rofiles_mnt, 0700, error))\n+    goto out;\n+  mntpoint_created = TRUE;\n+\n+  if (!g_spawn_sync (NULL, (char**)rofiles_argv, NULL, G_SPAWN_SEARCH_PATH,\n+                     child_setup_fchdir, GINT_TO_POINTER (bwrap->rootfs_fd),\n                      NULL, NULL, &estatus, error))\n-    return FALSE;\n+    goto out;\n   if (!g_spawn_check_exit_status (estatus, error))\n-    return FALSE;\n+    goto out;\n \n-  return TRUE;\n+  ret = TRUE;\n+ out:\n+  if (!ret && mntpoint_created)\n+    (void) unlinkat (AT_FDCWD, bwrap->rofiles_mnt, AT_REMOVEDIR);\n+  return ret;\n }\n \n-typedef struct {\n-  int rootfs_fd;\n-  GSpawnChildSetupFunc func;\n-  gpointer data;\n-} ChildSetupData;\n+RpmOstreeBwrap *\n+rpmostree_bwrap_new (int rootfs_fd,\n+                     RpmOstreeBwrapMutability mutable,\n+                     GError **error,\n+                     ...)\n+{\n+  va_list args;\n+  RpmOstreeBwrap *retval = NULL;\n+  g_autoptr(RpmOstreeBwrap) ret = g_new0 (RpmOstreeBwrap, 1);\n+  static const char *usr_links[] = {\"lib\", \"lib32\", \"lib64\", \"bin\", \"sbin\"};\n+\n+  ret->rootfs_fd = rootfs_fd;\n+  ret->argv = g_ptr_array_new_with_free_func (g_free);\n+\n+  rpmostree_bwrap_append_bwrap_argv (ret,\n+                                     WITH_BUBBLEWRAP_PATH,\n+                                     \"--dev\", \"/dev\",\n+                                     \"--proc\", \"/proc\",\n+                                     \"--dir\", \"/tmp\",\n+                                     \"--chdir\", \"/\",\n+                                     \"--ro-bind\", \"/sys/block\", \"/sys/block\",\n+                                     \"--ro-bind\", \"/sys/bus\", \"/sys/bus\",\n+                                     \"--ro-bind\", \"/sys/class\", \"/sys/class\",\n+                                     \"--ro-bind\", \"/sys/dev\", \"/sys/dev\",\n+                                     \"--ro-bind\", \"/sys/devices\", \"/sys/devices\",\n+                                     NULL);\n+\n+  for (guint i = 0; i < G_N_ELEMENTS (usr_links); i++)\n+    {\n+      const char *subdir = usr_links[i];\n+      struct stat stbuf;\n+      g_autofree char *srcpath = NULL;\n+      g_autofree char *destpath = NULL;\n+\n+      if (fstatat (rootfs_fd, subdir, &stbuf, AT_SYMLINK_NOFOLLOW) < 0)\n+        {\n+          if (errno != ENOENT)\n+            {\n+              glnx_set_error_from_errno (error);\n+              return FALSE;\n+            }\n+          continue;\n+        }\n+      else if (!S_ISLNK (stbuf.st_mode))\n+        continue;\n+\n+      srcpath = g_strconcat (\"usr/\", subdir, NULL);\n+      destpath = g_strconcat (\"/\", subdir, NULL);\n+      rpmostree_bwrap_append_bwrap_argv (ret, \"--symlink\", srcpath, destpath, NULL);\n+    }\n+\n+  switch (mutable)\n+    {\n+    case RPMOSTREE_BWRAP_IMMUTABLE:\n+      rpmostree_bwrap_append_bwrap_argv (ret, \"--ro-bind\", \"usr\", \"/usr\", NULL);\n+      break;\n+    case RPMOSTREE_BWRAP_MUTATE_ROFILES:\n+      if (!setup_rofiles_usr (ret, error))\n+        goto out;\n+      break;\n+    case RPMOSTREE_BWRAP_MUTATE_FREELY:\n+      rpmostree_bwrap_append_bwrap_argv (ret, \"--bind\", \"usr\", \"/usr\", NULL);\n+      break;\n+    }\n+\n+  { const char *arg;\n+    va_start (args, error);\n+    while ((arg = va_arg (args, char *)))\n+      g_ptr_array_add (ret->argv, g_strdup (arg));\n+    va_end (args);\n+  }\n+\n+  retval = g_steal_pointer (&ret);\n+ out:\n+  return retval;\n+}\n \n static void\n bwrap_child_setup (gpointer data)\n {\n-  ChildSetupData *cdata = data;\n+  RpmOstreeBwrap *bwrap = data;\n \n-  if (fchdir (cdata->rootfs_fd) < 0)\n+  if (fchdir (bwrap->rootfs_fd) < 0)\n     err (1, \"fchdir\");\n \n-  if (cdata->func)\n-    cdata->func (cdata->data);\n+  if (bwrap->child_setup_func)\n+    bwrap->child_setup_func (bwrap->child_setup_data);\n+}\n+\n+void\n+rpmostree_bwrap_set_child_setup (RpmOstreeBwrap *bwrap,\n+                                 GSpawnChildSetupFunc func,\n+                                 gpointer             data)\n+{\n+  g_assert (!bwrap->executed);\n+  bwrap->child_setup_func = func;\n+  bwrap->child_setup_data = data;\n }\n \n gboolean\n-rpmostree_run_bwrap_sync_setup (char **argv_array,\n-                                int rootfs_fd,\n-                                GSpawnChildSetupFunc func,\n-                                gpointer             data,\n-                                GError **error)\n+rpmostree_bwrap_run (RpmOstreeBwrap *bwrap,\n+                     GError **error)\n {\n   int estatus;\n   const char *current_lang = getenv (\"LANG\");\n-  ChildSetupData csetupdata = { rootfs_fd, func, data };\n+\n+  g_assert (!bwrap->executed);","path":"src/libpriv/rpmostree-bwrap.c","position":null,"original_position":314,"commit_id":"9f087ca3e3f319757e3791eb42b6312265770b2f","original_commit_id":"8a97493cfeea606fd81c20ff04289a2ad7194869","user":{"login":"cgwalters","id":244096,"avatar_url":"https://avatars.githubusercontent.com/u/244096?v=3","gravatar_id":"","url":"https://api.github.com/users/cgwalters","html_url":"https://github.com/cgwalters","followers_url":"https://api.github.com/users/cgwalters/followers","following_url":"https://api.github.com/users/cgwalters/following{/other_user}","gists_url":"https://api.github.com/users/cgwalters/gists{/gist_id}","starred_url":"https://api.github.com/users/cgwalters/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cgwalters/subscriptions","organizations_url":"https://api.github.com/users/cgwalters/orgs","repos_url":"https://api.github.com/users/cgwalters/repos","events_url":"https://api.github.com/users/cgwalters/events{/privacy}","received_events_url":"https://api.github.com/users/cgwalters/received_events","type":"User","site_admin":false},"body":"I'm increasingly less of a fan of that...it tends to get ignored.  And often there isn't a lot of thought to how the process behaves if a precondition is violated - things are worse if you e.g. return a NULL pointer to some place that isn't expecting it and most of the time SEGV, if you're really unlucky end up executing arbitrary other code.  Better to crash.","created_at":"2017-01-09T21:55:55Z","updated_at":"2017-01-09T21:55:55Z","html_url":"https://github.com/projectatomic/rpm-ostree/pull/560#discussion_r95255426","pull_request_url":"https://api.github.com/repos/projectatomic/rpm-ostree/pulls/560","_links":{"self":{"href":"https://api.github.com/repos/projectatomic/rpm-ostree/pulls/comments/95255426"},"html":{"href":"https://github.com/projectatomic/rpm-ostree/pull/560#discussion_r95255426"},"pull_request":{"href":"https://api.github.com/repos/projectatomic/rpm-ostree/pulls/560"}}},"pull_request":{"url":"https://api.github.com/repos/projectatomic/rpm-ostree/pulls/560","id":100145521,"html_url":"https://github.com/projectatomic/rpm-ostree/pull/560","diff_url":"https://github.com/projectatomic/rpm-ostree/pull/560.diff","patch_url":"https://github.com/projectatomic/rpm-ostree/pull/560.patch","issue_url":"https://api.github.com/repos/projectatomic/rpm-ostree/issues/560","number":560,"state":"open","locked":false,"title":"local-initramfs prep patches","user":{"login":"cgwalters","id":244096,"avatar_url":"https://avatars.githubusercontent.com/u/244096?v=3","gravatar_id":"","url":"https://api.github.com/users/cgwalters","html_url":"https://github.com/cgwalters","followers_url":"https://api.github.com/users/cgwalters/followers","following_url":"https://api.github.com/users/cgwalters/following{/other_user}","gists_url":"https://api.github.com/users/cgwalters/gists{/gist_id}","starred_url":"https://api.github.com/users/cgwalters/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cgwalters/subscriptions","organizations_url":"https://api.github.com/users/cgwalters/orgs","repos_url":"https://api.github.com/users/cgwalters/repos","events_url":"https://api.github.com/users/cgwalters/events{/privacy}","received_events_url":"https://api.github.com/users/cgwalters/received_events","type":"User","site_admin":false},"body":"Some prep cleanup.","created_at":"2017-01-04T16:33:12Z","updated_at":"2017-01-09T21:55:55Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fdab406cee25c7deebb5a49363ddf2d05c48cf9c","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/projectatomic/rpm-ostree/pulls/560/commits","review_comments_url":"https://api.github.com/repos/projectatomic/rpm-ostree/pulls/560/comments","review_comment_url":"https://api.github.com/repos/projectatomic/rpm-ostree/pulls/comments{/number}","comments_url":"https://api.github.com/repos/projectatomic/rpm-ostree/issues/560/comments","statuses_url":"https://api.github.com/repos/projectatomic/rpm-ostree/statuses/9f087ca3e3f319757e3791eb42b6312265770b2f","head":{"label":"cgwalters:local-initramfs","ref":"local-initramfs","sha":"9f087ca3e3f319757e3791eb42b6312265770b2f","user":{"login":"cgwalters","id":244096,"avatar_url":"https://avatars.githubusercontent.com/u/244096?v=3","gravatar_id":"","url":"https://api.github.com/users/cgwalters","html_url":"https://github.com/cgwalters","followers_url":"https://api.github.com/users/cgwalters/followers","following_url":"https://api.github.com/users/cgwalters/following{/other_user}","gists_url":"https://api.github.com/users/cgwalters/gists{/gist_id}","starred_url":"https://api.github.com/users/cgwalters/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cgwalters/subscriptions","organizations_url":"https://api.github.com/users/cgwalters/orgs","repos_url":"https://api.github.com/users/cgwalters/repos","events_url":"https://api.github.com/users/cgwalters/events{/privacy}","received_events_url":"https://api.github.com/users/cgwalters/received_events","type":"User","site_admin":false},"repo":{"id":26416044,"name":"rpm-ostree","full_name":"cgwalters/rpm-ostree","owner":{"login":"cgwalters","id":244096,"avatar_url":"https://avatars.githubusercontent.com/u/244096?v=3","gravatar_id":"","url":"https://api.github.com/users/cgwalters","html_url":"https://github.com/cgwalters","followers_url":"https://api.github.com/users/cgwalters/followers","following_url":"https://api.github.com/users/cgwalters/following{/other_user}","gists_url":"https://api.github.com/users/cgwalters/gists{/gist_id}","starred_url":"https://api.github.com/users/cgwalters/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cgwalters/subscriptions","organizations_url":"https://api.github.com/users/cgwalters/orgs","repos_url":"https://api.github.com/users/cgwalters/repos","events_url":"https://api.github.com/users/cgwalters/events{/privacy}","received_events_url":"https://api.github.com/users/cgwalters/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/cgwalters/rpm-ostree","description":"Store RPMs in OSTree repository","fork":true,"url":"https://api.github.com/repos/cgwalters/rpm-ostree","forks_url":"https://api.github.com/repos/cgwalters/rpm-ostree/forks","keys_url":"https://api.github.com/repos/cgwalters/rpm-ostree/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cgwalters/rpm-ostree/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cgwalters/rpm-ostree/teams","hooks_url":"https://api.github.com/repos/cgwalters/rpm-ostree/hooks","issue_events_url":"https://api.github.com/repos/cgwalters/rpm-ostree/issues/events{/number}","events_url":"https://api.github.com/repos/cgwalters/rpm-ostree/events","assignees_url":"https://api.github.com/repos/cgwalters/rpm-ostree/assignees{/user}","branches_url":"https://api.github.com/repos/cgwalters/rpm-ostree/branches{/branch}","tags_url":"https://api.github.com/repos/cgwalters/rpm-ostree/tags","blobs_url":"https://api.github.com/repos/cgwalters/rpm-ostree/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cgwalters/rpm-ostree/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cgwalters/rpm-ostree/git/refs{/sha}","trees_url":"https://api.github.com/repos/cgwalters/rpm-ostree/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cgwalters/rpm-ostree/statuses/{sha}","languages_url":"https://api.github.com/repos/cgwalters/rpm-ostree/languages","stargazers_url":"https://api.github.com/repos/cgwalters/rpm-ostree/stargazers","contributors_url":"https://api.github.com/repos/cgwalters/rpm-ostree/contributors","subscribers_url":"https://api.github.com/repos/cgwalters/rpm-ostree/subscribers","subscription_url":"https://api.github.com/repos/cgwalters/rpm-ostree/subscription","commits_url":"https://api.github.com/repos/cgwalters/rpm-ostree/commits{/sha}","git_commits_url":"https://api.github.com/repos/cgwalters/rpm-ostree/git/commits{/sha}","comments_url":"https://api.github.com/repos/cgwalters/rpm-ostree/comments{/number}","issue_comment_url":"https://api.github.com/repos/cgwalters/rpm-ostree/issues/comments{/number}","contents_url":"https://api.github.com/repos/cgwalters/rpm-ostree/contents/{+path}","compare_url":"https://api.github.com/repos/cgwalters/rpm-ostree/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cgwalters/rpm-ostree/merges","archive_url":"https://api.github.com/repos/cgwalters/rpm-ostree/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cgwalters/rpm-ostree/downloads","issues_url":"https://api.github.com/repos/cgwalters/rpm-ostree/issues{/number}","pulls_url":"https://api.github.com/repos/cgwalters/rpm-ostree/pulls{/number}","milestones_url":"https://api.github.com/repos/cgwalters/rpm-ostree/milestones{/number}","notifications_url":"https://api.github.com/repos/cgwalters/rpm-ostree/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cgwalters/rpm-ostree/labels{/name}","releases_url":"https://api.github.com/repos/cgwalters/rpm-ostree/releases{/id}","deployments_url":"https://api.github.com/repos/cgwalters/rpm-ostree/deployments","created_at":"2014-11-10T01:32:34Z","updated_at":"2015-02-04T18:58:49Z","pushed_at":"2017-01-09T16:16:14Z","git_url":"git://github.com/cgwalters/rpm-ostree.git","ssh_url":"git@github.com:cgwalters/rpm-ostree.git","clone_url":"https://github.com/cgwalters/rpm-ostree.git","svn_url":"https://github.com/cgwalters/rpm-ostree","homepage":null,"size":3407,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"projectatomic:master","ref":"master","sha":"e71e7219d3b9e2c30472ffd795bf508a7c340c39","user":{"login":"projectatomic","id":6852258,"avatar_url":"https://avatars.githubusercontent.com/u/6852258?v=3","gravatar_id":"","url":"https://api.github.com/users/projectatomic","html_url":"https://github.com/projectatomic","followers_url":"https://api.github.com/users/projectatomic/followers","following_url":"https://api.github.com/users/projectatomic/following{/other_user}","gists_url":"https://api.github.com/users/projectatomic/gists{/gist_id}","starred_url":"https://api.github.com/users/projectatomic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/projectatomic/subscriptions","organizations_url":"https://api.github.com/users/projectatomic/orgs","repos_url":"https://api.github.com/users/projectatomic/repos","events_url":"https://api.github.com/users/projectatomic/events{/privacy}","received_events_url":"https://api.github.com/users/projectatomic/received_events","type":"Organization","site_admin":false},"repo":{"id":15369584,"name":"rpm-ostree","full_name":"projectatomic/rpm-ostree","owner":{"login":"projectatomic","id":6852258,"avatar_url":"https://avatars.githubusercontent.com/u/6852258?v=3","gravatar_id":"","url":"https://api.github.com/users/projectatomic","html_url":"https://github.com/projectatomic","followers_url":"https://api.github.com/users/projectatomic/followers","following_url":"https://api.github.com/users/projectatomic/following{/other_user}","gists_url":"https://api.github.com/users/projectatomic/gists{/gist_id}","starred_url":"https://api.github.com/users/projectatomic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/projectatomic/subscriptions","organizations_url":"https://api.github.com/users/projectatomic/orgs","repos_url":"https://api.github.com/users/projectatomic/repos","events_url":"https://api.github.com/users/projectatomic/events{/privacy}","received_events_url":"https://api.github.com/users/projectatomic/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/projectatomic/rpm-ostree","description":"Store RPMs in OSTree repository, and atomically upgrade from commits","fork":false,"url":"https://api.github.com/repos/projectatomic/rpm-ostree","forks_url":"https://api.github.com/repos/projectatomic/rpm-ostree/forks","keys_url":"https://api.github.com/repos/projectatomic/rpm-ostree/keys{/key_id}","collaborators_url":"https://api.github.com/repos/projectatomic/rpm-ostree/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/projectatomic/rpm-ostree/teams","hooks_url":"https://api.github.com/repos/projectatomic/rpm-ostree/hooks","issue_events_url":"https://api.github.com/repos/projectatomic/rpm-ostree/issues/events{/number}","events_url":"https://api.github.com/repos/projectatomic/rpm-ostree/events","assignees_url":"https://api.github.com/repos/projectatomic/rpm-ostree/assignees{/user}","branches_url":"https://api.github.com/repos/projectatomic/rpm-ostree/branches{/branch}","tags_url":"https://api.github.com/repos/projectatomic/rpm-ostree/tags","blobs_url":"https://api.github.com/repos/projectatomic/rpm-ostree/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/projectatomic/rpm-ostree/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/projectatomic/rpm-ostree/git/refs{/sha}","trees_url":"https://api.github.com/repos/projectatomic/rpm-ostree/git/trees{/sha}","statuses_url":"https://api.github.com/repos/projectatomic/rpm-ostree/statuses/{sha}","languages_url":"https://api.github.com/repos/projectatomic/rpm-ostree/languages","stargazers_url":"https://api.github.com/repos/projectatomic/rpm-ostree/stargazers","contributors_url":"https://api.github.com/repos/projectatomic/rpm-ostree/contributors","subscribers_url":"https://api.github.com/repos/projectatomic/rpm-ostree/subscribers","subscription_url":"https://api.github.com/repos/projectatomic/rpm-ostree/subscription","commits_url":"https://api.github.com/repos/projectatomic/rpm-ostree/commits{/sha}","git_commits_url":"https://api.github.com/repos/projectatomic/rpm-ostree/git/commits{/sha}","comments_url":"https://api.github.com/repos/projectatomic/rpm-ostree/comments{/number}","issue_comment_url":"https://api.github.com/repos/projectatomic/rpm-ostree/issues/comments{/number}","contents_url":"https://api.github.com/repos/projectatomic/rpm-ostree/contents/{+path}","compare_url":"https://api.github.com/repos/projectatomic/rpm-ostree/compare/{base}...{head}","merges_url":"https://api.github.com/repos/projectatomic/rpm-ostree/merges","archive_url":"https://api.github.com/repos/projectatomic/rpm-ostree/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/projectatomic/rpm-ostree/downloads","issues_url":"https://api.github.com/repos/projectatomic/rpm-ostree/issues{/number}","pulls_url":"https://api.github.com/repos/projectatomic/rpm-ostree/pulls{/number}","milestones_url":"https://api.github.com/repos/projectatomic/rpm-ostree/milestones{/number}","notifications_url":"https://api.github.com/repos/projectatomic/rpm-ostree/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/projectatomic/rpm-ostree/labels{/name}","releases_url":"https://api.github.com/repos/projectatomic/rpm-ostree/releases{/id}","deployments_url":"https://api.github.com/repos/projectatomic/rpm-ostree/deployments","created_at":"2013-12-22T03:16:38Z","updated_at":"2017-01-06T01:15:08Z","pushed_at":"2017-01-09T16:16:15Z","git_url":"git://github.com/projectatomic/rpm-ostree.git","ssh_url":"git@github.com:projectatomic/rpm-ostree.git","clone_url":"https://github.com/projectatomic/rpm-ostree.git","svn_url":"https://github.com/projectatomic/rpm-ostree","homepage":"","size":3018,"stargazers_count":135,"watchers_count":135,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":56,"mirror_url":null,"open_issues_count":97,"forks":56,"open_issues":97,"watchers":135,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/projectatomic/rpm-ostree/pulls/560"},"html":{"href":"https://github.com/projectatomic/rpm-ostree/pull/560"},"issue":{"href":"https://api.github.com/repos/projectatomic/rpm-ostree/issues/560"},"comments":{"href":"https://api.github.com/repos/projectatomic/rpm-ostree/issues/560/comments"},"review_comments":{"href":"https://api.github.com/repos/projectatomic/rpm-ostree/pulls/560/comments"},"review_comment":{"href":"https://api.github.com/repos/projectatomic/rpm-ostree/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/projectatomic/rpm-ostree/pulls/560/commits"},"statuses":{"href":"https://api.github.com/repos/projectatomic/rpm-ostree/statuses/9f087ca3e3f319757e3791eb42b6312265770b2f"}}}}
{"actor":{"display_login":"cgwalters"}}