{"action":"created","comment":{"url":"https://api.github.com/repos/dgutov/diff-hl/pulls/comments/38608532","id":38608532,"diff_hunk":"@@ -0,0 +1,195 @@\n+;; Copyright (C) 2012-2013  Free Software Foundation, Inc.\n+\n+;; Author:   Jonathan Hayase <PythonNut@gmail.com>\n+;; URL:      https://github.com/dgutov/diff-hl\n+\n+;; This file is part of GNU Emacs.\n+\n+;; GNU Emacs is free software: you can redistribute it and/or modify\n+;; it under the terms of the GNU General Public License as published by\n+;; the Free Software Foundation, either version 3 of the License, or\n+;; (at your option) any later version.\n+\n+;; GNU Emacs 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\n+;; GNU General Public License for more details.\n+\n+;; You should have received a copy of the GNU General Public License\n+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.\n+\n+;;; Commentary:\n+\n+;; This mode enables diffing on-the-fly (i.e. without saving the buffer first)\n+;; Toggle in all buffers with M-x diff-hl-flydiff-mode\n+\n+;;; Code:\n+\n+(require 'diff-hl)\n+(require 'nadvice)\n+\n+(defvar diff-hl-flydiff-modified-tick 0)\n+(defvar diff-hl-flydiff-timer)\n+(make-variable-buffer-local 'diff-hl-flydiff-modified-tick)\n+\n+;; Polyfill concrete revisions for vc-git-working-revision in Emacs 24.4, 24.5\n+(when (version<= emacs-version \"25.0\")\n+  (with-eval-after-load 'vc-git\n+    (defun vc-git--symbolic-ref (file)\n+      (or\n+        (vc-file-getprop file 'vc-git-symbolic-ref)\n+        (let* (process-file-side-effects\n+                (str (vc-git--run-command-string nil \"symbolic-ref\" \"HEAD\")))\n+          (vc-file-setprop file 'vc-git-symbolic-ref\n+            (if str\n+              (if (string-match \"^\\\\(refs/heads/\\\\)?\\\\(.+\\\\)$\" str)\n+                (match-string 2 str)\n+                str))))))\n+\n+    (defun diff-hl-flydiff/vc-git-working-revision (_file)\n+      \"Git-specific version of `vc-working-revision'.\"\n+      (let (process-file-side-effects)\n+        (vc-git--rev-parse \"HEAD\")))\n+\n+    (defun diff-hl-flydiff/vc-git-mode-line-string (file)\n+      \"Return a string for `vc-mode-line' to put in the mode line for FILE.\"\n+      (let* ((rev (vc-working-revision file))\n+              (disp-rev (or (vc-git--symbolic-ref file)\n+                          (substring rev 0 7)))\n+              (def-ml (vc-default-mode-line-string 'Git file))\n+              (help-echo (get-text-property 0 'help-echo def-ml)))\n+        (propertize (replace-regexp-in-string (concat rev \"\\\\'\") disp-rev def-ml t t)\n+          'help-echo (concat help-echo \"\\nCurrent revision: \" rev))))\n+\n+    (advice-add 'vc-git-working-revision :override\n+      #'diff-hl-flydiff/vc-git-working-revision)\n+    (advice-add 'vc-git-mode-line-string :override\n+      #'diff-hl-flydiff/vc-git-mode-line-string)))\n+\n+(defun diff-hl-flydiff-make-temp-file-name (file rev &optional manual)\n+  \"Return a backup file name for REV or the current version of FILE.\n+If MANUAL is non-nil it means that a name for backups created by\n+the user should be returned.\"\n+  (let* ((auto-save-file-name-transforms\n+           `((\".*\" ,temporary-file-directory t))))\n+    (expand-file-name\n+      (concat (make-auto-save-file-name)\n+        \".~\" (subst-char-in-string\n+               ?/ ?_ rev)\n+        (unless manual \".\") \"~\")\n+      temporary-file-directory)))\n+\n+(defun diff-hl-flydiff-create-revision (file revision)\n+  \"Read REVISION of FILE into a buffer and return the buffer.\"\n+  (let ((automatic-backup (diff-hl-flydiff-make-temp-file-name file revision))\n+         (filebuf (get-file-buffer file))\n+         (filename (diff-hl-flydiff-make-temp-file-name file revision 'manual)))\n+    (unless (file-exists-p filename)\n+      (if (file-exists-p automatic-backup)\n+        (rename-file automatic-backup filename nil)\n+        (with-current-buffer filebuf\n+          (let ((failed t)\n+                 (coding-system-for-read 'no-conversion)\n+                 (coding-system-for-write 'no-conversion))\n+            (unwind-protect\n+              (with-temp-file filename\n+                (let ((outbuf (current-buffer)))\n+                  ;; Change buffer to get local value of\n+                  ;; vc-checkout-switches.\n+                  (with-current-buffer filebuf\n+                    (vc-call find-revision file revision outbuf))))\n+              (setq failed nil)\n+              (when (and failed (file-exists-p filename))\n+                (delete-file filename)))))))\n+    filename))\n+\n+(defun diff-hl-flydiff-buffer-with-head ()\n+  \"View the differences between BUFFER and its associated file.\n+This requires the external program `diff' to be in your `exec-path'.\"\n+  (interactive)\n+  (vc-ensure-vc-buffer)\n+  (with-current-buffer (get-buffer (current-buffer))\n+    (let* ((file buffer-file-name)\n+            (temporary-file-directory\n+              (if (file-directory-p \"/dev/shm/\")\n+                \"/dev/shm/\"\n+                temporary-file-directory))\n+            (rev (diff-hl-flydiff-create-revision\n+                   file\n+                   (vc-working-revision file\n+                     (vc-responsible-backend file)))))\n+      (diff-no-select rev (current-buffer) \"-U 0\" 'noasync\n+        (get-buffer-create \" *diff-hl-diff*\")))))\n+\n+\n+(defun diff-hl-flydiff/update (old-fun &optional auto)\n+  (unless (and auto\n+            (or\n+              (= diff-hl-flydiff-modified-tick (buffer-modified-tick))\n+              (file-remote-p default-directory)\n+              (not (buffer-modified-p))))\n+    (funcall old-fun)))\n+\n+(defun diff-hl-flydiff/changes (&rest args)\n+  (let* ((file buffer-file-name)\n+          (backend (vc-backend file)))\n+    (when backend\n+      (let ((state (vc-state file backend)))\n+        (cond\n+          ((or\n+             (buffer-modified-p)\n+             (eq state 'edited)\n+             (and (eq state 'up-to-date)\n+               ;; VC state is stale in after-revert-hook.\n+               (or revert-buffer-in-progress-p\n+                 ;; Diffing against an older revision.\n+                 diff-hl-reference-revision)))\n+            (let (diff-auto-refine-mode res)\n+              (with-current-buffer (diff-hl-flydiff-buffer-with-head)\n+                (goto-char (point-min))\n+                (unless (eobp)\n+                  (ignore-errors\n+                    (diff-beginning-of-hunk t))\n+                  (while (looking-at diff-hunk-header-re-unified)\n+                    (let ((line (string-to-number (match-string 3)))\n+                           (len (let ((m (match-string 4)))\n+                                  (if m (string-to-number m) 1)))\n+                           (beg (point)))\n+                      (diff-end-of-hunk)\n+                      (let* ((inserts (diff-count-matches \"^\\\\+\" beg (point)))\n+                              (deletes (diff-count-matches \"^-\" beg (point)))\n+                              (type (cond ((zerop deletes) 'insert)\n+                                      ((zerop inserts) 'delete)\n+                                      (t 'change))))\n+                        (when (eq type 'delete)\n+                          (setq len 1)\n+                          (cl-incf line))\n+                        (push (list line len type) res))))))\n+              (setq diff-hl-flydiff-modified-tick (buffer-modified-tick))\n+              (nreverse res)))\n+          ((eq state 'added)\n+            `((1 ,(line-number-at-pos (point-max)) insert)))\n+          ((eq state 'removed)\n+            `((1 ,(line-number-at-pos (point-max)) delete))))))))\n+\n+;;;###autoload\n+(define-minor-mode diff-hl-flydiff-mode\n+  \"Highlight diffs on-the-fly\"\n+  :lighter \"\"\n+  :global t\n+  (if diff-hl-flydiff-mode\n+    (progn\n+      (advice-add 'diff-hl-update :around #'diff-hl-flydiff/update)\n+      (advice-add 'diff-hl-changes :override #'diff-hl-flydiff/changes)\n+      (advice-add 'diff-hl-overlay-modified :override #'ignored)\n+\n+      (setq diff-hl-flydiff-timer\n+        (run-with-idle-timer 0.3 t #'diff-hl-update t)))\n+\n+    (advice-remove 'diff-hl-update #'diff-hl-flydiff/update)\n+    (advice-remove 'diff-hl-changes #'diff-hl-flydiff/changes)\n+    (advice-remove 'diff-hl-overlay-modified #'ignored)","path":"diff-hl-flydiff.el","position":null,"original_position":191,"commit_id":"18e6e2d16d94a204b468024c746a32505a5c83cd","original_commit_id":"3fa2b547a75fdaf7166cdd1fe71920d3aaf0364d","user":{"login":"PythonNut","id":5009546,"avatar_url":"https://avatars.githubusercontent.com/u/5009546?v=3","gravatar_id":"","url":"https://api.github.com/users/PythonNut","html_url":"https://github.com/PythonNut","followers_url":"https://api.github.com/users/PythonNut/followers","following_url":"https://api.github.com/users/PythonNut/following{/other_user}","gists_url":"https://api.github.com/users/PythonNut/gists{/gist_id}","starred_url":"https://api.github.com/users/PythonNut/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PythonNut/subscriptions","organizations_url":"https://api.github.com/users/PythonNut/orgs","repos_url":"https://api.github.com/users/PythonNut/repos","events_url":"https://api.github.com/users/PythonNut/events{/privacy}","received_events_url":"https://api.github.com/users/PythonNut/received_events","type":"User","site_admin":false},"body":"Fixed, but I can't actually change the commit message for a few hours. Anyway, I think this is still blocked by the Emacs bug.","created_at":"2015-09-03T02:38:58Z","updated_at":"2015-09-03T02:38:58Z","html_url":"https://github.com/dgutov/diff-hl/pull/50#discussion_r38608532","pull_request_url":"https://api.github.com/repos/dgutov/diff-hl/pulls/50","_links":{"self":{"href":"https://api.github.com/repos/dgutov/diff-hl/pulls/comments/38608532"},"html":{"href":"https://github.com/dgutov/diff-hl/pull/50#discussion_r38608532"},"pull_request":{"href":"https://api.github.com/repos/dgutov/diff-hl/pulls/50"}}},"pull_request":{"url":"https://api.github.com/repos/dgutov/diff-hl/pulls/50","id":42399345,"html_url":"https://github.com/dgutov/diff-hl/pull/50","diff_url":"https://github.com/dgutov/diff-hl/pull/50.diff","patch_url":"https://github.com/dgutov/diff-hl/pull/50.patch","issue_url":"https://api.github.com/repos/dgutov/diff-hl/issues/50","number":50,"state":"open","locked":false,"title":"[WIP] Allow diffing on-the-fly","user":{"login":"PythonNut","id":5009546,"avatar_url":"https://avatars.githubusercontent.com/u/5009546?v=3","gravatar_id":"","url":"https://api.github.com/users/PythonNut","html_url":"https://github.com/PythonNut","followers_url":"https://api.github.com/users/PythonNut/followers","following_url":"https://api.github.com/users/PythonNut/following{/other_user}","gists_url":"https://api.github.com/users/PythonNut/gists{/gist_id}","starred_url":"https://api.github.com/users/PythonNut/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PythonNut/subscriptions","organizations_url":"https://api.github.com/users/PythonNut/orgs","repos_url":"https://api.github.com/users/PythonNut/repos","events_url":"https://api.github.com/users/PythonNut/events{/privacy}","received_events_url":"https://api.github.com/users/PythonNut/received_events","type":"User","site_admin":false},"body":"See #33 \r\n\r\nThis isn't quite ready. It doesn't have the following advice for the two `vc` functions.\r\n```emacs\r\n(with-eval-after-load 'vc\r\n  (defun nadvice/vc-working-revision (file &optional backend concrete)\r\n    (if concrete\r\n      (vc-call-backend backend 'working-revision file t)\r\n      (or (vc-file-getprop file 'vc-working-revision)\r\n        (progn\r\n          (setq backend (or backend (vc-responsible-backend file)))\r\n          (when backend\r\n            (vc-file-setprop file 'vc-working-revision\r\n              (vc-call-backend backend 'working-revision file)))))))\r\n  (advice-add #'vc-working-revision :override #'nadvice/vc-working-revision))\r\n\r\n(with-eval-after-load 'vc-git\r\n  (defun nadvice/vc-git-working-revision (old-fun file &optional concrete)\r\n    \"Git-specific version of `vc-working-revision'.\"\r\n    (if concrete\r\n      (vc-git--rev-parse (funcall old-fun file))\r\n      (funcall old-fun file)))\r\n\r\n  (advice-add #'vc-git-working-revision :around\r\n    #'nadvice/vc-git-working-revision))\r\n```\r\n\r\nWill I\r\n\r\n1. Commit some variant of these to the Emacs codebase and disallow `diff-hl-flydiff-mode` on all versions up to but not including the patched one?\r\n2. Commit the code to Emacs, and keep some advice in `diff-hl` that:\r\n  1. Switches on the Emacs version?\r\n  2. Switches on some sort of feature detection?\r\n\r\nThis has passed my initial testing with the above advice, so things seem to be going well.","created_at":"2015-08-13T21:08:18Z","updated_at":"2015-09-03T02:38:58Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ca30d6cdcbabdf653f6a9f676a77168115661b79","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dgutov/diff-hl/pulls/50/commits","review_comments_url":"https://api.github.com/repos/dgutov/diff-hl/pulls/50/comments","review_comment_url":"https://api.github.com/repos/dgutov/diff-hl/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dgutov/diff-hl/issues/50/comments","statuses_url":"https://api.github.com/repos/dgutov/diff-hl/statuses/18e6e2d16d94a204b468024c746a32505a5c83cd","head":{"label":"PythonNut:master","ref":"master","sha":"18e6e2d16d94a204b468024c746a32505a5c83cd","user":{"login":"PythonNut","id":5009546,"avatar_url":"https://avatars.githubusercontent.com/u/5009546?v=3","gravatar_id":"","url":"https://api.github.com/users/PythonNut","html_url":"https://github.com/PythonNut","followers_url":"https://api.github.com/users/PythonNut/followers","following_url":"https://api.github.com/users/PythonNut/following{/other_user}","gists_url":"https://api.github.com/users/PythonNut/gists{/gist_id}","starred_url":"https://api.github.com/users/PythonNut/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PythonNut/subscriptions","organizations_url":"https://api.github.com/users/PythonNut/orgs","repos_url":"https://api.github.com/users/PythonNut/repos","events_url":"https://api.github.com/users/PythonNut/events{/privacy}","received_events_url":"https://api.github.com/users/PythonNut/received_events","type":"User","site_admin":false},"repo":{"id":40678646,"name":"diff-hl","full_name":"PythonNut/diff-hl","owner":{"login":"PythonNut","id":5009546,"avatar_url":"https://avatars.githubusercontent.com/u/5009546?v=3","gravatar_id":"","url":"https://api.github.com/users/PythonNut","html_url":"https://github.com/PythonNut","followers_url":"https://api.github.com/users/PythonNut/followers","following_url":"https://api.github.com/users/PythonNut/following{/other_user}","gists_url":"https://api.github.com/users/PythonNut/gists{/gist_id}","starred_url":"https://api.github.com/users/PythonNut/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PythonNut/subscriptions","organizations_url":"https://api.github.com/users/PythonNut/orgs","repos_url":"https://api.github.com/users/PythonNut/repos","events_url":"https://api.github.com/users/PythonNut/events{/privacy}","received_events_url":"https://api.github.com/users/PythonNut/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/PythonNut/diff-hl","description":"Emacs package for highlighting uncommitted changes","fork":true,"url":"https://api.github.com/repos/PythonNut/diff-hl","forks_url":"https://api.github.com/repos/PythonNut/diff-hl/forks","keys_url":"https://api.github.com/repos/PythonNut/diff-hl/keys{/key_id}","collaborators_url":"https://api.github.com/repos/PythonNut/diff-hl/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/PythonNut/diff-hl/teams","hooks_url":"https://api.github.com/repos/PythonNut/diff-hl/hooks","issue_events_url":"https://api.github.com/repos/PythonNut/diff-hl/issues/events{/number}","events_url":"https://api.github.com/repos/PythonNut/diff-hl/events","assignees_url":"https://api.github.com/repos/PythonNut/diff-hl/assignees{/user}","branches_url":"https://api.github.com/repos/PythonNut/diff-hl/branches{/branch}","tags_url":"https://api.github.com/repos/PythonNut/diff-hl/tags","blobs_url":"https://api.github.com/repos/PythonNut/diff-hl/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/PythonNut/diff-hl/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/PythonNut/diff-hl/git/refs{/sha}","trees_url":"https://api.github.com/repos/PythonNut/diff-hl/git/trees{/sha}","statuses_url":"https://api.github.com/repos/PythonNut/diff-hl/statuses/{sha}","languages_url":"https://api.github.com/repos/PythonNut/diff-hl/languages","stargazers_url":"https://api.github.com/repos/PythonNut/diff-hl/stargazers","contributors_url":"https://api.github.com/repos/PythonNut/diff-hl/contributors","subscribers_url":"https://api.github.com/repos/PythonNut/diff-hl/subscribers","subscription_url":"https://api.github.com/repos/PythonNut/diff-hl/subscription","commits_url":"https://api.github.com/repos/PythonNut/diff-hl/commits{/sha}","git_commits_url":"https://api.github.com/repos/PythonNut/diff-hl/git/commits{/sha}","comments_url":"https://api.github.com/repos/PythonNut/diff-hl/comments{/number}","issue_comment_url":"https://api.github.com/repos/PythonNut/diff-hl/issues/comments{/number}","contents_url":"https://api.github.com/repos/PythonNut/diff-hl/contents/{+path}","compare_url":"https://api.github.com/repos/PythonNut/diff-hl/compare/{base}...{head}","merges_url":"https://api.github.com/repos/PythonNut/diff-hl/merges","archive_url":"https://api.github.com/repos/PythonNut/diff-hl/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/PythonNut/diff-hl/downloads","issues_url":"https://api.github.com/repos/PythonNut/diff-hl/issues{/number}","pulls_url":"https://api.github.com/repos/PythonNut/diff-hl/pulls{/number}","milestones_url":"https://api.github.com/repos/PythonNut/diff-hl/milestones{/number}","notifications_url":"https://api.github.com/repos/PythonNut/diff-hl/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/PythonNut/diff-hl/labels{/name}","releases_url":"https://api.github.com/repos/PythonNut/diff-hl/releases{/id}","created_at":"2015-08-13T19:47:14Z","updated_at":"2015-08-13T19:47:14Z","pushed_at":"2015-09-03T02:35:59Z","git_url":"git://github.com/PythonNut/diff-hl.git","ssh_url":"git@github.com:PythonNut/diff-hl.git","clone_url":"https://github.com/PythonNut/diff-hl.git","svn_url":"https://github.com/PythonNut/diff-hl","homepage":"","size":409,"stargazers_count":0,"watchers_count":0,"language":"Emacs Lisp","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":"dgutov:master","ref":"master","sha":"28263c711bcfb2d955b42e10d4e27d828c209dcc","user":{"login":"dgutov","id":271877,"avatar_url":"https://avatars.githubusercontent.com/u/271877?v=3","gravatar_id":"","url":"https://api.github.com/users/dgutov","html_url":"https://github.com/dgutov","followers_url":"https://api.github.com/users/dgutov/followers","following_url":"https://api.github.com/users/dgutov/following{/other_user}","gists_url":"https://api.github.com/users/dgutov/gists{/gist_id}","starred_url":"https://api.github.com/users/dgutov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dgutov/subscriptions","organizations_url":"https://api.github.com/users/dgutov/orgs","repos_url":"https://api.github.com/users/dgutov/repos","events_url":"https://api.github.com/users/dgutov/events{/privacy}","received_events_url":"https://api.github.com/users/dgutov/received_events","type":"User","site_admin":false},"repo":{"id":4781389,"name":"diff-hl","full_name":"dgutov/diff-hl","owner":{"login":"dgutov","id":271877,"avatar_url":"https://avatars.githubusercontent.com/u/271877?v=3","gravatar_id":"","url":"https://api.github.com/users/dgutov","html_url":"https://github.com/dgutov","followers_url":"https://api.github.com/users/dgutov/followers","following_url":"https://api.github.com/users/dgutov/following{/other_user}","gists_url":"https://api.github.com/users/dgutov/gists{/gist_id}","starred_url":"https://api.github.com/users/dgutov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dgutov/subscriptions","organizations_url":"https://api.github.com/users/dgutov/orgs","repos_url":"https://api.github.com/users/dgutov/repos","events_url":"https://api.github.com/users/dgutov/events{/privacy}","received_events_url":"https://api.github.com/users/dgutov/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/dgutov/diff-hl","description":"Emacs package for highlighting uncommitted changes","fork":false,"url":"https://api.github.com/repos/dgutov/diff-hl","forks_url":"https://api.github.com/repos/dgutov/diff-hl/forks","keys_url":"https://api.github.com/repos/dgutov/diff-hl/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dgutov/diff-hl/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dgutov/diff-hl/teams","hooks_url":"https://api.github.com/repos/dgutov/diff-hl/hooks","issue_events_url":"https://api.github.com/repos/dgutov/diff-hl/issues/events{/number}","events_url":"https://api.github.com/repos/dgutov/diff-hl/events","assignees_url":"https://api.github.com/repos/dgutov/diff-hl/assignees{/user}","branches_url":"https://api.github.com/repos/dgutov/diff-hl/branches{/branch}","tags_url":"https://api.github.com/repos/dgutov/diff-hl/tags","blobs_url":"https://api.github.com/repos/dgutov/diff-hl/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dgutov/diff-hl/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dgutov/diff-hl/git/refs{/sha}","trees_url":"https://api.github.com/repos/dgutov/diff-hl/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dgutov/diff-hl/statuses/{sha}","languages_url":"https://api.github.com/repos/dgutov/diff-hl/languages","stargazers_url":"https://api.github.com/repos/dgutov/diff-hl/stargazers","contributors_url":"https://api.github.com/repos/dgutov/diff-hl/contributors","subscribers_url":"https://api.github.com/repos/dgutov/diff-hl/subscribers","subscription_url":"https://api.github.com/repos/dgutov/diff-hl/subscription","commits_url":"https://api.github.com/repos/dgutov/diff-hl/commits{/sha}","git_commits_url":"https://api.github.com/repos/dgutov/diff-hl/git/commits{/sha}","comments_url":"https://api.github.com/repos/dgutov/diff-hl/comments{/number}","issue_comment_url":"https://api.github.com/repos/dgutov/diff-hl/issues/comments{/number}","contents_url":"https://api.github.com/repos/dgutov/diff-hl/contents/{+path}","compare_url":"https://api.github.com/repos/dgutov/diff-hl/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dgutov/diff-hl/merges","archive_url":"https://api.github.com/repos/dgutov/diff-hl/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dgutov/diff-hl/downloads","issues_url":"https://api.github.com/repos/dgutov/diff-hl/issues{/number}","pulls_url":"https://api.github.com/repos/dgutov/diff-hl/pulls{/number}","milestones_url":"https://api.github.com/repos/dgutov/diff-hl/milestones{/number}","notifications_url":"https://api.github.com/repos/dgutov/diff-hl/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dgutov/diff-hl/labels{/name}","releases_url":"https://api.github.com/repos/dgutov/diff-hl/releases{/id}","created_at":"2012-06-25T12:28:23Z","updated_at":"2015-09-02T16:11:52Z","pushed_at":"2015-09-03T02:35:59Z","git_url":"git://github.com/dgutov/diff-hl.git","ssh_url":"git@github.com:dgutov/diff-hl.git","clone_url":"https://github.com/dgutov/diff-hl.git","svn_url":"https://github.com/dgutov/diff-hl","homepage":"","size":903,"stargazers_count":136,"watchers_count":136,"language":"Emacs Lisp","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":11,"mirror_url":null,"open_issues_count":7,"forks":11,"open_issues":7,"watchers":136,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dgutov/diff-hl/pulls/50"},"html":{"href":"https://github.com/dgutov/diff-hl/pull/50"},"issue":{"href":"https://api.github.com/repos/dgutov/diff-hl/issues/50"},"comments":{"href":"https://api.github.com/repos/dgutov/diff-hl/issues/50/comments"},"review_comments":{"href":"https://api.github.com/repos/dgutov/diff-hl/pulls/50/comments"},"review_comment":{"href":"https://api.github.com/repos/dgutov/diff-hl/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dgutov/diff-hl/pulls/50/commits"},"statuses":{"href":"https://api.github.com/repos/dgutov/diff-hl/statuses/18e6e2d16d94a204b468024c746a32505a5c83cd"}}}}