{"action":"created","comment":{"url":"https://api.github.com/repos/KrauseFx/snapshot/pulls/comments/41567942","id":41567942,"diff_hunk":"@@ -1,254 +1,129 @@\n require 'pty'\n require 'shellwords'\n+require 'plist'\n \n module Snapshot\n   class Runner\n-    TRACE_DIR = '/tmp/snapshot_traces'\n+    attr_accessor :errors\n \n-    def work(clean: true, build: true, take_snapshots: true)\n-      SnapshotConfig.shared_instance.js_file # to verify the file can be found earlier\n+    def work\n+      self.errors = []\n \n-      Builder.new.build_app(clean: clean) if build\n-      @app_path = determine_app_path\n+      Helper.log.info \"Building and running project - this might take some time...\".green\n \n-      counter = 0\n       errors = []\n-\n-      if (SnapshotConfig.shared_instance.clear_previous_screenshots and take_snapshots)\n-        path_to_clear = (SnapshotConfig.shared_instance.screenshots_path + \"/*-*/*.png\") # languages always contain a `-`\n-        Dir[path_to_clear].each { |a| File.delete(a) } # no idea why rm_rf doesn't work\n-      end\n-\n-      SnapshotConfig.shared_instance.devices.each do |device|\n-        SnapshotConfig.shared_instance.languages.each do |language_item|\n-\n-          if language_item.instance_of?String\n-            language = language_item\n-            locale = language_item\n-          else\n-            (language, locale) = language_item            \n-          end\n-\n-\n-          prepare_simulator(device, language)\n-\n-          reinstall_app(device, language, locale) unless ENV[\"SNAPSHOT_SKIP_UNINSTALL\"]\n-          \n+      Snapshot.config[:devices].each do |device|\n+        Snapshot.config[:languages].each do |language|\n           begin\n-            errors.concat(run_tests(device, language, locale))\n+            launch(language, device)\n           rescue => ex\n-            Helper.log.error(ex)\n+            Helper.log.error ex # we should to show right here as well\n+            errors << ex\n           end\n-\n-          # we also want to see the screenshots when something went wrong\n-          counter += copy_screenshots(language) if take_snapshots \n-\n-          teardown_simulator(device, language)\n-\n-          break if errors.any? && ENV[\"SNAPSHOT_BREAK_ON_FIRST_ERROR\"]\n         end\n-\n-        break if errors.any? && ENV[\"SNAPSHOT_BREAK_ON_FIRST_ERROR\"]\n       end\n \n-      `killall \"iOS Simulator\"` # close the simulator after the script is finished\n-\n-      return unless take_snapshots\n-\n-      ReportsGenerator.new.generate\n-\n-      if errors.count > 0\n-        Helper.log.error \"-----------------------------------------------------------\"\n-        Helper.log.error errors.join(' - ').red\n-        Helper.log.error \"-----------------------------------------------------------\"\n-        raise \"Finished generating #{counter} screenshots with #{errors.count} errors.\".red\n-      else\n-        Helper.log.info \"Successfully finished generating #{counter} screenshots.\".green\n-      end\n-      \n-      Helper.log.info \"Check it out here: #{SnapshotConfig.shared_instance.screenshots_path}\".green\n-    end\n-\n-    def clean_old_traces\n-      FileUtils.rm_rf(TRACE_DIR)\n-      FileUtils.mkdir_p(TRACE_DIR)\n+      raise errors.join('; ') if errors.count > 0\n     end\n \n-    def prepare_simulator(device, language)\n-      SnapshotConfig.shared_instance.blocks[:setup_for_device_change].call(device, udid_for_simulator(device), language)  # Callback\n-      SnapshotConfig.shared_instance.blocks[:setup_for_language_change].call(language, device) # deprecated\n-    end\n+    def launch(language, device_type)\n+      screenshots_path = TestCommandGenerator.derived_data_path\n+      FileUtils.rm_rf(screenshots_path)\n+      FileUtils.mkdir_p(screenshots_path)\n \n-    def teardown_simulator(device, language)\n-      SnapshotConfig.shared_instance.blocks[:teardown_language].call(language, device) # Callback\n-      SnapshotConfig.shared_instance.blocks[:teardown_device].call(device, language) # deprecated\n-    end\n+      File.write(\"/tmp/language.txt\", language)\n \n-    def udid_for_simulator(name) # fetches the UDID of the simulator type\n-      all = `instruments -s`.split(\"\\n\")\n-      all.each do |current|\n-        return current.match(/\\[(.*)\\]/)[1] if current.include?name\n-      end\n-      raise \"Could not find simulator '#{name}' to install the app on.\"\n-    end\n+      command = TestCommandGenerator.generate(device_type: device_type)\n \n-    def reinstall_app(device, language, locale)\n-      Helper.log.info \"Reinstalling app...\".yellow unless $verbose\n+      Helper.log_alert(\"#{device_type.name} - #{language}\")\n \n-      app_identifier = ENV[\"SNAPSHOT_APP_IDENTIFIER\"]\n-      app_identifier ||= @app_identifier\n+      FastlaneCore::CommandExecutor.execute(command: command,\n+                                          print_all: true,\n+                                      print_command: true,\n+                                             prefix: {\n+                                                \"Touching\" => \"Running Tests: \"\n+                                              },\n+                                              error: proc do |output, return_code|\n+                                                Helper.log.info \"cought error... #{return_code}\".red\n+                                                ErrorHandler.handle_test_error(output, return_code)\n+                                                # no exception raised... that means we need to retry\n+                                                launch(language, device_type)\n+                                              end)\n \n-      def com(cmd)\n-        puts cmd.magenta if $verbose\n-        result = `#{cmd} 2>&1` # to now show errors\n-        puts result if (result.to_s.length > 0 and $verbose)\n-      end\n-\n-      udid = udid_for_simulator(device)\n-\n-\n-      com(\"killall 'iOS Simulator'\")\n-      sleep 3\n-      com(\"xcrun simctl boot '#{udid}'\")\n-      com(\"xcrun simctl uninstall booted '#{app_identifier}'\")\n-      sleep 3\n-      com(\"xcrun simctl install booted '#{@app_path.shellescape}'\")\n-      com(\"xcrun simctl shutdown booted\")\n+      raw_output = File.read(TestCommandGenerator.xcodebuild_log_path)\n+      fetch_screenshots(raw_output, language, device_type)\n     end\n \n-    def run_tests(device, language, locale)\n-      Helper.log.info \"Running tests on #{device} in language #{language} (locale #{locale})\".green\n-      \n-      clean_old_traces\n-\n-      ENV['SNAPSHOT_LANGUAGE'] = language\n-      command = generate_test_command(device, language, locale)\n-      Helper.log.debug command.yellow\n-      \n-      retry_run = false\n-\n-      lines = []\n-      errors = []\n-      PTY.spawn(command) do |stdout, stdin, pid|\n-\n-        # Waits for process so that we can see if anything has failed\n-        begin\n-          stdout.sync\n-\n-          stdout.each do |line|\n-            lines << line\n-            begin\n-              puts line.strip if $verbose\n-              result = parse_test_line(line)\n-              case result\n-                when :retry\n-                  retry_run = true\n-                when :screenshot\n-                  Helper.log.info \"Successfully took screenshot 📱\"\n-                when :pass\n-                  Helper.log.info line.strip.gsub(\"Pass:\", \"✓\").green\n-                when :fail\n-                  Helper.log.info line.strip.gsub(\"Fail:\", \"✗\").red\n-                when :need_permission\n-                  raise \"Looks like you may need to grant permission for Instruments to analyze other processes.\\nPlease Ctrc + C and run this command: \\\"#{command}\\\"\"\n+    def fetch_screenshots(output, language, device_type)\n+      # The way this works:\n+      # When the user calls `snapshot` in the UI Tests it actually just does a \n+      # long press on the Application (!) which you usually wouldn't do probably\n+      # We go through all test events and check where we do a long press\n+      # \n+      # Xcode generates a plist file that contains all the events and test results\n+      # \n+      # Once we have all events that apply and the file name of the snapshot we now have to \n+      # match them to the actual file name\n+      # we make use of the test run output we have in the `output` variable\n+      # This includes something like\n+      # \n+      #   snapshot: [some random text here]\n+      # ","path":"lib/snapshot/runner.rb","position":200,"original_position":200,"commit_id":"fc60cd5d052865ce56ae5baab9e4358fbd1c2c7f","original_commit_id":"fc60cd5d052865ce56ae5baab9e4358fbd1c2c7f","user":{"login":"houndci","id":6697940,"avatar_url":"https://avatars.githubusercontent.com/u/6697940?v=3","gravatar_id":"","url":"https://api.github.com/users/houndci","html_url":"https://github.com/houndci","followers_url":"https://api.github.com/users/houndci/followers","following_url":"https://api.github.com/users/houndci/following{/other_user}","gists_url":"https://api.github.com/users/houndci/gists{/gist_id}","starred_url":"https://api.github.com/users/houndci/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/houndci/subscriptions","organizations_url":"https://api.github.com/users/houndci/orgs","repos_url":"https://api.github.com/users/houndci/repos","events_url":"https://api.github.com/users/houndci/events{/privacy}","received_events_url":"https://api.github.com/users/houndci/received_events","type":"User","site_admin":false},"body":"Trailing whitespace detected.","created_at":"2015-10-08T20:57:41Z","updated_at":"2015-10-08T20:57:41Z","html_url":"https://github.com/KrauseFx/snapshot/pull/172#discussion_r41567942","pull_request_url":"https://api.github.com/repos/KrauseFx/snapshot/pulls/172","_links":{"self":{"href":"https://api.github.com/repos/KrauseFx/snapshot/pulls/comments/41567942"},"html":{"href":"https://github.com/KrauseFx/snapshot/pull/172#discussion_r41567942"},"pull_request":{"href":"https://api.github.com/repos/KrauseFx/snapshot/pulls/172"}}},"pull_request":{"url":"https://api.github.com/repos/KrauseFx/snapshot/pulls/172","id":40150073,"html_url":"https://github.com/KrauseFx/snapshot/pull/172","diff_url":"https://github.com/KrauseFx/snapshot/pull/172.diff","patch_url":"https://github.com/KrauseFx/snapshot/pull/172.patch","issue_url":"https://api.github.com/repos/KrauseFx/snapshot/issues/172","number":172,"state":"open","locked":false,"title":"[WIP] Upgrade to UI Tests","user":{"login":"KrauseFx","id":869950,"avatar_url":"https://avatars.githubusercontent.com/u/869950?v=3","gravatar_id":"","url":"https://api.github.com/users/KrauseFx","html_url":"https://github.com/KrauseFx","followers_url":"https://api.github.com/users/KrauseFx/followers","following_url":"https://api.github.com/users/KrauseFx/following{/other_user}","gists_url":"https://api.github.com/users/KrauseFx/gists{/gist_id}","starred_url":"https://api.github.com/users/KrauseFx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KrauseFx/subscriptions","organizations_url":"https://api.github.com/users/KrauseFx/orgs","repos_url":"https://api.github.com/users/KrauseFx/repos","events_url":"https://api.github.com/users/KrauseFx/events{/privacy}","received_events_url":"https://api.github.com/users/KrauseFx/received_events","type":"User","site_admin":false},"body":"Work in progress\r\n\r\nFrom the README:\r\n> Apple announced a new version of Xcode with support for UI Tests built in right into Xcode. This technology allows snapshot to be even better: Instead of dealing with UI Automation Javascript code, you will be able to write the screenshot code in Swift or Objective C allowing you to use debugging features like breakpoints.\r\n\r\n> It's still work in progress and there are some technical difficulties I need to solve.\r\n\r\n> As a result, snapshot will be completely rewritten from ground up without changing its public API :rocket:\r\n","created_at":"2015-07-16T16:44:07Z","updated_at":"2015-10-08T20:57:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c787f89893211858e691b59637aa9a608cc47069","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/KrauseFx/snapshot/pulls/172/commits","review_comments_url":"https://api.github.com/repos/KrauseFx/snapshot/pulls/172/comments","review_comment_url":"https://api.github.com/repos/KrauseFx/snapshot/pulls/comments{/number}","comments_url":"https://api.github.com/repos/KrauseFx/snapshot/issues/172/comments","statuses_url":"https://api.github.com/repos/KrauseFx/snapshot/statuses/fc60cd5d052865ce56ae5baab9e4358fbd1c2c7f","head":{"label":"KrauseFx:feature/uitests","ref":"feature/uitests","sha":"fc60cd5d052865ce56ae5baab9e4358fbd1c2c7f","user":{"login":"KrauseFx","id":869950,"avatar_url":"https://avatars.githubusercontent.com/u/869950?v=3","gravatar_id":"","url":"https://api.github.com/users/KrauseFx","html_url":"https://github.com/KrauseFx","followers_url":"https://api.github.com/users/KrauseFx/followers","following_url":"https://api.github.com/users/KrauseFx/following{/other_user}","gists_url":"https://api.github.com/users/KrauseFx/gists{/gist_id}","starred_url":"https://api.github.com/users/KrauseFx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KrauseFx/subscriptions","organizations_url":"https://api.github.com/users/KrauseFx/orgs","repos_url":"https://api.github.com/users/KrauseFx/repos","events_url":"https://api.github.com/users/KrauseFx/events{/privacy}","received_events_url":"https://api.github.com/users/KrauseFx/received_events","type":"User","site_admin":false},"repo":{"id":26403221,"name":"snapshot","full_name":"KrauseFx/snapshot","owner":{"login":"KrauseFx","id":869950,"avatar_url":"https://avatars.githubusercontent.com/u/869950?v=3","gravatar_id":"","url":"https://api.github.com/users/KrauseFx","html_url":"https://github.com/KrauseFx","followers_url":"https://api.github.com/users/KrauseFx/followers","following_url":"https://api.github.com/users/KrauseFx/following{/other_user}","gists_url":"https://api.github.com/users/KrauseFx/gists{/gist_id}","starred_url":"https://api.github.com/users/KrauseFx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KrauseFx/subscriptions","organizations_url":"https://api.github.com/users/KrauseFx/orgs","repos_url":"https://api.github.com/users/KrauseFx/repos","events_url":"https://api.github.com/users/KrauseFx/events{/privacy}","received_events_url":"https://api.github.com/users/KrauseFx/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/KrauseFx/snapshot","description":"Automate taking localized screenshots of your iOS app on every device","fork":false,"url":"https://api.github.com/repos/KrauseFx/snapshot","forks_url":"https://api.github.com/repos/KrauseFx/snapshot/forks","keys_url":"https://api.github.com/repos/KrauseFx/snapshot/keys{/key_id}","collaborators_url":"https://api.github.com/repos/KrauseFx/snapshot/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/KrauseFx/snapshot/teams","hooks_url":"https://api.github.com/repos/KrauseFx/snapshot/hooks","issue_events_url":"https://api.github.com/repos/KrauseFx/snapshot/issues/events{/number}","events_url":"https://api.github.com/repos/KrauseFx/snapshot/events","assignees_url":"https://api.github.com/repos/KrauseFx/snapshot/assignees{/user}","branches_url":"https://api.github.com/repos/KrauseFx/snapshot/branches{/branch}","tags_url":"https://api.github.com/repos/KrauseFx/snapshot/tags","blobs_url":"https://api.github.com/repos/KrauseFx/snapshot/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/KrauseFx/snapshot/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/KrauseFx/snapshot/git/refs{/sha}","trees_url":"https://api.github.com/repos/KrauseFx/snapshot/git/trees{/sha}","statuses_url":"https://api.github.com/repos/KrauseFx/snapshot/statuses/{sha}","languages_url":"https://api.github.com/repos/KrauseFx/snapshot/languages","stargazers_url":"https://api.github.com/repos/KrauseFx/snapshot/stargazers","contributors_url":"https://api.github.com/repos/KrauseFx/snapshot/contributors","subscribers_url":"https://api.github.com/repos/KrauseFx/snapshot/subscribers","subscription_url":"https://api.github.com/repos/KrauseFx/snapshot/subscription","commits_url":"https://api.github.com/repos/KrauseFx/snapshot/commits{/sha}","git_commits_url":"https://api.github.com/repos/KrauseFx/snapshot/git/commits{/sha}","comments_url":"https://api.github.com/repos/KrauseFx/snapshot/comments{/number}","issue_comment_url":"https://api.github.com/repos/KrauseFx/snapshot/issues/comments{/number}","contents_url":"https://api.github.com/repos/KrauseFx/snapshot/contents/{+path}","compare_url":"https://api.github.com/repos/KrauseFx/snapshot/compare/{base}...{head}","merges_url":"https://api.github.com/repos/KrauseFx/snapshot/merges","archive_url":"https://api.github.com/repos/KrauseFx/snapshot/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/KrauseFx/snapshot/downloads","issues_url":"https://api.github.com/repos/KrauseFx/snapshot/issues{/number}","pulls_url":"https://api.github.com/repos/KrauseFx/snapshot/pulls{/number}","milestones_url":"https://api.github.com/repos/KrauseFx/snapshot/milestones{/number}","notifications_url":"https://api.github.com/repos/KrauseFx/snapshot/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/KrauseFx/snapshot/labels{/name}","releases_url":"https://api.github.com/repos/KrauseFx/snapshot/releases{/id}","created_at":"2014-11-09T17:31:03Z","updated_at":"2015-10-08T15:09:55Z","pushed_at":"2015-10-08T20:57:37Z","git_url":"git://github.com/KrauseFx/snapshot.git","ssh_url":"git@github.com:KrauseFx/snapshot.git","clone_url":"https://github.com/KrauseFx/snapshot.git","svn_url":"https://github.com/KrauseFx/snapshot","homepage":"https://fastlane.tools","size":8353,"stargazers_count":1558,"watchers_count":1558,"language":"Ruby","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":110,"mirror_url":null,"open_issues_count":40,"forks":110,"open_issues":40,"watchers":1558,"default_branch":"master"}},"base":{"label":"KrauseFx:master","ref":"master","sha":"23efc574fb77a294f22187b1b26bc546d89306da","user":{"login":"KrauseFx","id":869950,"avatar_url":"https://avatars.githubusercontent.com/u/869950?v=3","gravatar_id":"","url":"https://api.github.com/users/KrauseFx","html_url":"https://github.com/KrauseFx","followers_url":"https://api.github.com/users/KrauseFx/followers","following_url":"https://api.github.com/users/KrauseFx/following{/other_user}","gists_url":"https://api.github.com/users/KrauseFx/gists{/gist_id}","starred_url":"https://api.github.com/users/KrauseFx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KrauseFx/subscriptions","organizations_url":"https://api.github.com/users/KrauseFx/orgs","repos_url":"https://api.github.com/users/KrauseFx/repos","events_url":"https://api.github.com/users/KrauseFx/events{/privacy}","received_events_url":"https://api.github.com/users/KrauseFx/received_events","type":"User","site_admin":false},"repo":{"id":26403221,"name":"snapshot","full_name":"KrauseFx/snapshot","owner":{"login":"KrauseFx","id":869950,"avatar_url":"https://avatars.githubusercontent.com/u/869950?v=3","gravatar_id":"","url":"https://api.github.com/users/KrauseFx","html_url":"https://github.com/KrauseFx","followers_url":"https://api.github.com/users/KrauseFx/followers","following_url":"https://api.github.com/users/KrauseFx/following{/other_user}","gists_url":"https://api.github.com/users/KrauseFx/gists{/gist_id}","starred_url":"https://api.github.com/users/KrauseFx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KrauseFx/subscriptions","organizations_url":"https://api.github.com/users/KrauseFx/orgs","repos_url":"https://api.github.com/users/KrauseFx/repos","events_url":"https://api.github.com/users/KrauseFx/events{/privacy}","received_events_url":"https://api.github.com/users/KrauseFx/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/KrauseFx/snapshot","description":"Automate taking localized screenshots of your iOS app on every device","fork":false,"url":"https://api.github.com/repos/KrauseFx/snapshot","forks_url":"https://api.github.com/repos/KrauseFx/snapshot/forks","keys_url":"https://api.github.com/repos/KrauseFx/snapshot/keys{/key_id}","collaborators_url":"https://api.github.com/repos/KrauseFx/snapshot/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/KrauseFx/snapshot/teams","hooks_url":"https://api.github.com/repos/KrauseFx/snapshot/hooks","issue_events_url":"https://api.github.com/repos/KrauseFx/snapshot/issues/events{/number}","events_url":"https://api.github.com/repos/KrauseFx/snapshot/events","assignees_url":"https://api.github.com/repos/KrauseFx/snapshot/assignees{/user}","branches_url":"https://api.github.com/repos/KrauseFx/snapshot/branches{/branch}","tags_url":"https://api.github.com/repos/KrauseFx/snapshot/tags","blobs_url":"https://api.github.com/repos/KrauseFx/snapshot/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/KrauseFx/snapshot/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/KrauseFx/snapshot/git/refs{/sha}","trees_url":"https://api.github.com/repos/KrauseFx/snapshot/git/trees{/sha}","statuses_url":"https://api.github.com/repos/KrauseFx/snapshot/statuses/{sha}","languages_url":"https://api.github.com/repos/KrauseFx/snapshot/languages","stargazers_url":"https://api.github.com/repos/KrauseFx/snapshot/stargazers","contributors_url":"https://api.github.com/repos/KrauseFx/snapshot/contributors","subscribers_url":"https://api.github.com/repos/KrauseFx/snapshot/subscribers","subscription_url":"https://api.github.com/repos/KrauseFx/snapshot/subscription","commits_url":"https://api.github.com/repos/KrauseFx/snapshot/commits{/sha}","git_commits_url":"https://api.github.com/repos/KrauseFx/snapshot/git/commits{/sha}","comments_url":"https://api.github.com/repos/KrauseFx/snapshot/comments{/number}","issue_comment_url":"https://api.github.com/repos/KrauseFx/snapshot/issues/comments{/number}","contents_url":"https://api.github.com/repos/KrauseFx/snapshot/contents/{+path}","compare_url":"https://api.github.com/repos/KrauseFx/snapshot/compare/{base}...{head}","merges_url":"https://api.github.com/repos/KrauseFx/snapshot/merges","archive_url":"https://api.github.com/repos/KrauseFx/snapshot/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/KrauseFx/snapshot/downloads","issues_url":"https://api.github.com/repos/KrauseFx/snapshot/issues{/number}","pulls_url":"https://api.github.com/repos/KrauseFx/snapshot/pulls{/number}","milestones_url":"https://api.github.com/repos/KrauseFx/snapshot/milestones{/number}","notifications_url":"https://api.github.com/repos/KrauseFx/snapshot/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/KrauseFx/snapshot/labels{/name}","releases_url":"https://api.github.com/repos/KrauseFx/snapshot/releases{/id}","created_at":"2014-11-09T17:31:03Z","updated_at":"2015-10-08T15:09:55Z","pushed_at":"2015-10-08T20:57:37Z","git_url":"git://github.com/KrauseFx/snapshot.git","ssh_url":"git@github.com:KrauseFx/snapshot.git","clone_url":"https://github.com/KrauseFx/snapshot.git","svn_url":"https://github.com/KrauseFx/snapshot","homepage":"https://fastlane.tools","size":8353,"stargazers_count":1558,"watchers_count":1558,"language":"Ruby","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":110,"mirror_url":null,"open_issues_count":40,"forks":110,"open_issues":40,"watchers":1558,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/KrauseFx/snapshot/pulls/172"},"html":{"href":"https://github.com/KrauseFx/snapshot/pull/172"},"issue":{"href":"https://api.github.com/repos/KrauseFx/snapshot/issues/172"},"comments":{"href":"https://api.github.com/repos/KrauseFx/snapshot/issues/172/comments"},"review_comments":{"href":"https://api.github.com/repos/KrauseFx/snapshot/pulls/172/comments"},"review_comment":{"href":"https://api.github.com/repos/KrauseFx/snapshot/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/KrauseFx/snapshot/pulls/172/commits"},"statuses":{"href":"https://api.github.com/repos/KrauseFx/snapshot/statuses/fc60cd5d052865ce56ae5baab9e4358fbd1c2c7f"}}}}