{"action":"created","comment":{"url":"https://api.github.com/repos/ClusterLabs/hawk/pulls/comments/39839999","id":39839999,"diff_hunk":"@@ -2,300 +2,397 @@\n // See COPYING for license.\n \n $(function() {\n-  $('#primitives #middle table.primitives')\n-    .bootstrapTable({\n-      method: 'get',\n-      url: Routes.cib_primitives_path(\n-        $('body').data('cib'),\n-        { format: 'json' }\n-      ),\n-      striped: true,\n-      pagination: true,\n-      pageSize: 50,\n-      pageList: [10, 25, 50, 100, 200],\n-      sidePagination: 'client',\n-      smartDisplay: false,\n-      search: true,\n-      searchAlign: 'left',\n-      showColumns: true,\n-      showRefresh: true,\n-      minimumCountColumns: 0,\n-      sortName: 'id',\n-      sortOrder: 'asc',\n-      columns: [{\n-        field: 'id',\n-        title: __('Primitive ID'),\n-        sortable: true,\n-        switchable: false,\n-        clickToSelect: true\n-      }, {\n-        field: 'operate',\n-        title: __('Operations'),\n-        sortable: false,\n-        clickToSelect: false,\n-        class: 'col-sm-2',\n-        events: {\n-          'click .delete': function (e, value, row, index) {\n-            e.preventDefault();\n-            var $self = $(this);\n-\n-            try {\n-              answer = confirm(\n-                i18n.translate(\n-                  'Are you sure you wish to delete %s?'\n-                ).fetch(row.id)\n-              );\n-            } catch (e) {\n-              (console.error || console.log).call(console, e.stack || e);\n-            }\n+  // Some craziness to avoid duplicating this stuff for both\n+  // primitives and templates. The whole thing is looped over\n+  // twice, once for primitive and once for template\n+  var controller_types = {\n+    primitive: {\n+      table_selector: '#primitives #middle table.primitives',\n+      cib_primitives_path: Routes.cib_primitives_path,\n+      cib_primitive_path: Routes.cib_primitive_path,\n+      edit_cib_primitive_path: Routes.edit_cib_primitive_path,\n+      form_selector: '#primitives #middle form',\n+      template_selector: '#primitive_template',\n+      clazz_selector: '#primitive_clazz',\n+      provider_selector: '#primitive_provider',\n+      type_selector: '#primitive_type',\n+    },\n+    template: {\n+      table_selector: '#templates #middle table.primitives',\n+      cib_primitives_path: Routes.cib_templates_path,\n+      cib_primitive_path: Routes.cib_template_path,\n+      edit_cib_primitive_path: Routes.edit_cib_template_path,\n+      form_selector: '#templates #middle form',\n+      template_selector: '#template_template',\n+      clazz_selector: '#template_clazz',\n+      provider_selector: '#template_provider',\n+      type_selector: '#template_type',\n+    }\n+  };\n \n-            if (answer) {\n-              $.ajax({\n-                dataType: 'json',\n-                method: 'POST',\n-                data: {\n-                  _method: 'delete'\n-                },\n-                url: Routes.cib_primitive_path(\n-                  $('body').data('cib'),\n-                  row.id,\n-                  { format: 'json' }\n-                ),\n-\n-                success: function(data) {\n-                  if (data.success) {\n-                    $.growl({\n-                      message: data.message\n-                    },{\n-                      type: 'success'\n-                    });\n+  $.each(controller_types, function(_, controller_type) {\n+    controller_type.sel_template = \"select\" + controller_type.template_selector;\n+    controller_type.sel_clazz = \"select\" + controller_type.clazz_selector;\n+    controller_type.sel_provider = \"select\" + controller_type.provider_selector;\n+    controller_type.sel_type = \"select\" + controller_type.type_selector;\n+    controller_type.selects = [controller_type.sel_template,\n+                               controller_type.sel_clazz,\n+                               controller_type.sel_provider,\n+                               controller_type.sel_type].join(\", \");\n+    controller_type.sel_template_clazz_provider = [controller_type.template_selector,\n+                                                   controller_type.clazz_selector,\n+                                                   controller_type.provider_selector].join(\", \");\n+    controller_type.sel_readonly = controller_type.form_selector + ' ' + controller_type.clazz_selector + '[readonly]';\n \n-                    $self.parents('table').bootstrapTable('refresh')\n-                  } else {\n-                    if (data.error) {\n+    $(controller_type.table_selector)\n+      .bootstrapTable({\n+        method: 'get',\n+        url: controller_type.cib_primitives_path(\n+          $('body').data('cib'),\n+          { format: 'json' }\n+        ),\n+        striped: true,\n+        pagination: true,\n+        pageSize: 50,\n+        pageList: [10, 25, 50, 100, 200],\n+        sidePagination: 'client',\n+        smartDisplay: false,\n+        search: true,\n+        searchAlign: 'left',\n+        showColumns: true,\n+        showRefresh: true,\n+        minimumCountColumns: 0,\n+        sortName: 'id',\n+        sortOrder: 'asc',\n+        columns: [{\n+          field: 'id',\n+          title: __('Resource ID'),\n+          sortable: true,\n+          switchable: false,\n+          clickToSelect: true\n+        }, {\n+          field: 'operate',\n+          title: __('Operations'),\n+          sortable: false,\n+          clickToSelect: false,\n+          class: 'col-sm-2',\n+          events: {\n+            'click .delete': function (e, value, row, index) {\n+              e.preventDefault();\n+              var $self = $(this);\n+\n+              try {\n+                answer = confirm(\n+                  i18n.translate(\n+                    'Are you sure you wish to delete %s?'\n+                  ).fetch(row.id)\n+                );\n+              } catch (e) {\n+                (console.error || console.log).call(console, e.stack || e);\n+              }\n+\n+              if (answer) {\n+                $.ajax({\n+                  dataType: 'json',\n+                  method: 'POST',\n+                  data: {\n+                    _method: 'delete'\n+                  },\n+                  url: controller_type.cib_primitive_path(\n+                    $('body').data('cib'),\n+                    row.id,\n+                    { format: 'json' }\n+                  ),\n+\n+                  success: function(data) {\n+                    if (data.success) {\n                       $.growl({\n-                        message: data.error\n+                        message: data.message\n                       },{\n-                        type: 'danger'\n+                        type: 'success'\n                       });\n+\n+                      $self.parents('table').bootstrapTable('refresh')\n+                    } else {\n+                      if (data.error) {\n+                        $.growl({\n+                          message: data.error\n+                        },{\n+                          type: 'danger'\n+                        });\n+                      }\n                     }\n+                  },\n+                  error: function(xhr, status, msg) {\n+                    $.growl({\n+                      message: xhr.responseJSON.error || msg\n+                    },{\n+                      type: 'danger'\n+                    });\n                   }\n-                },\n-                error: function(xhr, status, msg) {\n-                  $.growl({\n-                    message: xhr.responseJSON.error || msg\n-                  },{\n-                    type: 'danger'\n-                  });\n-                }\n-              });\n+                });\n+              }\n             }\n-          }\n-        },\n-        formatter: function(value, row, index) {\n-          var operations = []\n-\n-          operations.push([\n-            '<a href=\"',\n-                Routes.edit_cib_primitive_path(\n-                  $('body').data('cib'),\n-                  row.id\n-                ),\n+          },\n+          formatter: function(value, row, index) {\n+            var operations = []\n+\n+            operations.push([\n+              '<a href=\"',\n+              controller_type.edit_cib_primitive_path(\n+                $('body').data('cib'),\n+                row.id\n+              ),\n               '\" class=\"edit btn btn-default btn-xs\" title=\"',\n               __('Edit'),\n-            '\">',\n+              '\">',\n               '<i class=\"fa fa-pencil\"></i>',\n-            '</a> '\n-          ].join(''));\n-\n-          operations.push([\n-            '<a href=\"',\n-                Routes.cib_primitive_path(\n-                  $('body').data('cib'),\n-                  row.id\n-                ),\n+              '</a> '\n+            ].join(''));\n+\n+            operations.push([\n+              '<a href=\"',\n+              controller_type.cib_primitive_path(\n+                $('body').data('cib'),\n+                row.id\n+              ),\n               '\" class=\"delete btn btn-default btn-xs\" title=\"',\n               __('Delete'),\n-            '\">',\n+              '\">',\n               '<i class=\"fa fa-trash\"></i>',\n-            '</a> '\n-          ].join(''));\n+              '</a> '\n+            ].join(''));\n \n-          return [\n-            '<div class=\"btn-group\" role=\"group\">',\n+            return [\n+              '<div class=\"btn-group\" role=\"group\">',\n               operations.join(''),\n-            '</div>',\n-          ].join('');\n+              '</div>',\n+            ].join('');\n+          }\n+        }]\n+      });\n+\n+    var render_attrlists = function($template, $clazz, $provider, $type) {\n+      var new_resource = $('form#new_primitive, form#new_template').length > 0;\n+      var agent = null;\n+      if ($template.length > 0 && $template.val() != \"\") {\n+        agent = \"@\" + $template.val();\n+      } else if ($clazz.val() != \"\" && $provider.val() != \"\" && $type.val() != \"\") {\n+        agent = [$clazz.val(), $provider.val(), $type.val()].join(\":\");\n+      } else if ($clazz.val() != \"\" && $type.val() != \"\") {\n+        agent = [$clazz.val(), $type.val()].join(\":\");\n+      }\n+\n+      var format_longdesc = function(text) {\n+        var longdesc = $.map(text.split('\\n\\n'), function(v) { return $.trim(v); });\n+        var ret = [];\n+        $.each(longdesc, function(i, v) {\n+          if (v) {\n+            ret.push('<p>', v, '</p>');\n+          }\n+        });\n+        return ret.join(\"\");\n+      };\n+\n+      if (agent != null) {\n+        $.ajax({\n+          dataType: \"json\",\n+          url: Routes.agent_path(),\n+          data: {id: agent, format: \"json\"},\n+          success: function(data) {\n+            // Update the sidebar with agent info\n+            var helptext = ['<h3>', data.resource_agent.shortdesc, '</h3>'];\n+            helptext.push(format_longdesc(data.resource_agent.longdesc));\n+            $('.row.agentinfo').html(helptext.join(\"\"));\n+\n+            // TODO: update the sidebar with attribute help info\n+            $(\"#helpentries\").html('');\n+\n+            var lookup = function(root, lstname, elemname) {\n+              if (lstname in root) {\n+                if ($.type(root[lstname]) == \"object\") {\n+                  if (elemname in root[lstname]) {\n+                    if ($.type(root[lstname][elemname]) == \"object\") {\n+                      return [root[lstname][elemname]];\n+                    } else {\n+                      return root[lstname][elemname];\n+                    }\n+                  }\n+                }\n+              }\n+              return [];\n+            };\n+\n+            // display attrlists\n+            // attrlist: {'name': 'value'}\n+            // mapping: {'name': {'type', 'default', 'longdesc', 'values'}}\n+            var pal = {};\n+            var pam = {};\n+            $.each(lookup(data.resource_agent, \"parameters\", \"parameter\"), function(i, v) {\n+              var name = v.name;\n+              var longdesc = \"\";\n+              if ($.trim(v.longdesc)) {\n+                longdesc = v.longdesc;\n+              } else if ($.trim(v.shortdesc)) {\n+                longdesc = v.shortdesc;\n+              }\n+              var type = \"string\";\n+              var defvalue = \"\";\n+              if (\"content\" in v && v.content) {\n+                if (\"type\" in v.content) {\n+                  type = v.content.type;\n+                }\n+                if (\"default\" in v.content) {\n+                  defvalue = v.content[\"default\"];\n+                }\n+              }\n+              if (v.required == \"1\") {\n+                pal[v.name] = defvalue;\n+              }\n+              pam[v.name] = {\n+                type: type,\n+                default: defvalue,\n+                longdesc: v.shortdesc + \": \" + v.longdesc\n+              };\n+              $(\"#helpentries\").append($(\"#tmpl-helpentry\").render({\n+                name: name,\n+                longdesc: longdesc,\n+                default: defvalue\n+              }));\n+            });\n+\n+            $('form #paramslist').html($(\"#jstmpl-paramslist\").render());\n+            var paramslist = $('form #paramslist fieldset');\n+            if (new_resource) {\n+              paramslist.data('attrlist', pal);\n+            }\n+            paramslist.data('attrlist-mapping', pam);\n+            paramslist.attrList();\n+\n+            // meta attributes are never mandated by the agent anyway\n+            $('form #metalist').html($(\"#jstmpl-metalist\").render());\n+            var metalist = $('form #metalist fieldset');\n+            if (new_resource) {\n+              metalist.data('attrlist', {'target-role': 'Stopped'});\n+            }\n+            metalist.attrList();\n+            $(\"#helpentries\").append($(\"#tmpl-metahelp\").render());","path":"hawk/app/assets/javascripts/module/primitives.js","position":386,"original_position":386,"commit_id":"dbc48a23b907ab3d42111d3a4d5cb943b8c8e060","original_commit_id":"dbc48a23b907ab3d42111d3a4d5cb943b8c8e060","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":"Mixed double and single quotes.","created_at":"2015-09-18T09:55:30Z","updated_at":"2015-09-18T09:55:30Z","html_url":"https://github.com/ClusterLabs/hawk/pull/47#discussion_r39839999","pull_request_url":"https://api.github.com/repos/ClusterLabs/hawk/pulls/47","_links":{"self":{"href":"https://api.github.com/repos/ClusterLabs/hawk/pulls/comments/39839999"},"html":{"href":"https://github.com/ClusterLabs/hawk/pull/47#discussion_r39839999"},"pull_request":{"href":"https://api.github.com/repos/ClusterLabs/hawk/pulls/47"}}},"pull_request":{"url":"https://api.github.com/repos/ClusterLabs/hawk/pulls/47","id":45380803,"html_url":"https://github.com/ClusterLabs/hawk/pull/47","diff_url":"https://github.com/ClusterLabs/hawk/pull/47.diff","patch_url":"https://github.com/ClusterLabs/hawk/pull/47.patch","issue_url":"https://api.github.com/repos/ClusterLabs/hawk/issues/47","number":47,"state":"open","locked":false,"title":"Implement operation editing for primitives and templates (fate#318281)","user":{"login":"krig","id":25527,"avatar_url":"https://avatars.githubusercontent.com/u/25527?v=3","gravatar_id":"","url":"https://api.github.com/users/krig","html_url":"https://github.com/krig","followers_url":"https://api.github.com/users/krig/followers","following_url":"https://api.github.com/users/krig/following{/other_user}","gists_url":"https://api.github.com/users/krig/gists{/gist_id}","starred_url":"https://api.github.com/users/krig/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/krig/subscriptions","organizations_url":"https://api.github.com/users/krig/orgs","repos_url":"https://api.github.com/users/krig/repos","events_url":"https://api.github.com/users/krig/events{/privacy}","received_events_url":"https://api.github.com/users/krig/received_events","type":"User","site_admin":false},"body":"Fixes primitive and template editing.\r\n\r\nOther commits are fixed bugs and other improvements.","created_at":"2015-09-18T08:27:28Z","updated_at":"2015-09-18T09:55:30Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e223184460056d337a58cdb07d36c3c472dfc5f6","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/ClusterLabs/hawk/pulls/47/commits","review_comments_url":"https://api.github.com/repos/ClusterLabs/hawk/pulls/47/comments","review_comment_url":"https://api.github.com/repos/ClusterLabs/hawk/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ClusterLabs/hawk/issues/47/comments","statuses_url":"https://api.github.com/repos/ClusterLabs/hawk/statuses/dbc48a23b907ab3d42111d3a4d5cb943b8c8e060","head":{"label":"krig:feature/oplist","ref":"feature/oplist","sha":"dbc48a23b907ab3d42111d3a4d5cb943b8c8e060","user":{"login":"krig","id":25527,"avatar_url":"https://avatars.githubusercontent.com/u/25527?v=3","gravatar_id":"","url":"https://api.github.com/users/krig","html_url":"https://github.com/krig","followers_url":"https://api.github.com/users/krig/followers","following_url":"https://api.github.com/users/krig/following{/other_user}","gists_url":"https://api.github.com/users/krig/gists{/gist_id}","starred_url":"https://api.github.com/users/krig/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/krig/subscriptions","organizations_url":"https://api.github.com/users/krig/orgs","repos_url":"https://api.github.com/users/krig/repos","events_url":"https://api.github.com/users/krig/events{/privacy}","received_events_url":"https://api.github.com/users/krig/received_events","type":"User","site_admin":false},"repo":{"id":11468129,"name":"hawk","full_name":"krig/hawk","owner":{"login":"krig","id":25527,"avatar_url":"https://avatars.githubusercontent.com/u/25527?v=3","gravatar_id":"","url":"https://api.github.com/users/krig","html_url":"https://github.com/krig","followers_url":"https://api.github.com/users/krig/followers","following_url":"https://api.github.com/users/krig/following{/other_user}","gists_url":"https://api.github.com/users/krig/gists{/gist_id}","starred_url":"https://api.github.com/users/krig/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/krig/subscriptions","organizations_url":"https://api.github.com/users/krig/orgs","repos_url":"https://api.github.com/users/krig/repos","events_url":"https://api.github.com/users/krig/events{/privacy}","received_events_url":"https://api.github.com/users/krig/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/krig/hawk","description":"A web-based GUI for managing and monitoring the Pacemaker High-Availability cluster resource manager","fork":true,"url":"https://api.github.com/repos/krig/hawk","forks_url":"https://api.github.com/repos/krig/hawk/forks","keys_url":"https://api.github.com/repos/krig/hawk/keys{/key_id}","collaborators_url":"https://api.github.com/repos/krig/hawk/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/krig/hawk/teams","hooks_url":"https://api.github.com/repos/krig/hawk/hooks","issue_events_url":"https://api.github.com/repos/krig/hawk/issues/events{/number}","events_url":"https://api.github.com/repos/krig/hawk/events","assignees_url":"https://api.github.com/repos/krig/hawk/assignees{/user}","branches_url":"https://api.github.com/repos/krig/hawk/branches{/branch}","tags_url":"https://api.github.com/repos/krig/hawk/tags","blobs_url":"https://api.github.com/repos/krig/hawk/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/krig/hawk/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/krig/hawk/git/refs{/sha}","trees_url":"https://api.github.com/repos/krig/hawk/git/trees{/sha}","statuses_url":"https://api.github.com/repos/krig/hawk/statuses/{sha}","languages_url":"https://api.github.com/repos/krig/hawk/languages","stargazers_url":"https://api.github.com/repos/krig/hawk/stargazers","contributors_url":"https://api.github.com/repos/krig/hawk/contributors","subscribers_url":"https://api.github.com/repos/krig/hawk/subscribers","subscription_url":"https://api.github.com/repos/krig/hawk/subscription","commits_url":"https://api.github.com/repos/krig/hawk/commits{/sha}","git_commits_url":"https://api.github.com/repos/krig/hawk/git/commits{/sha}","comments_url":"https://api.github.com/repos/krig/hawk/comments{/number}","issue_comment_url":"https://api.github.com/repos/krig/hawk/issues/comments{/number}","contents_url":"https://api.github.com/repos/krig/hawk/contents/{+path}","compare_url":"https://api.github.com/repos/krig/hawk/compare/{base}...{head}","merges_url":"https://api.github.com/repos/krig/hawk/merges","archive_url":"https://api.github.com/repos/krig/hawk/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/krig/hawk/downloads","issues_url":"https://api.github.com/repos/krig/hawk/issues{/number}","pulls_url":"https://api.github.com/repos/krig/hawk/pulls{/number}","milestones_url":"https://api.github.com/repos/krig/hawk/milestones{/number}","notifications_url":"https://api.github.com/repos/krig/hawk/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/krig/hawk/labels{/name}","releases_url":"https://api.github.com/repos/krig/hawk/releases{/id}","created_at":"2013-07-17T05:38:56Z","updated_at":"2015-06-29T13:43:57Z","pushed_at":"2015-09-18T09:55:17Z","git_url":"git://github.com/krig/hawk.git","ssh_url":"git@github.com:krig/hawk.git","clone_url":"https://github.com/krig/hawk.git","svn_url":"https://github.com/krig/hawk","homepage":null,"size":14110,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","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":"ClusterLabs:master","ref":"master","sha":"678c06985ea9532af874477651dd38c9d8da7e5f","user":{"login":"ClusterLabs","id":574912,"avatar_url":"https://avatars.githubusercontent.com/u/574912?v=3","gravatar_id":"","url":"https://api.github.com/users/ClusterLabs","html_url":"https://github.com/ClusterLabs","followers_url":"https://api.github.com/users/ClusterLabs/followers","following_url":"https://api.github.com/users/ClusterLabs/following{/other_user}","gists_url":"https://api.github.com/users/ClusterLabs/gists{/gist_id}","starred_url":"https://api.github.com/users/ClusterLabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ClusterLabs/subscriptions","organizations_url":"https://api.github.com/users/ClusterLabs/orgs","repos_url":"https://api.github.com/users/ClusterLabs/repos","events_url":"https://api.github.com/users/ClusterLabs/events{/privacy}","received_events_url":"https://api.github.com/users/ClusterLabs/received_events","type":"Organization","site_admin":false},"repo":{"id":4154361,"name":"hawk","full_name":"ClusterLabs/hawk","owner":{"login":"ClusterLabs","id":574912,"avatar_url":"https://avatars.githubusercontent.com/u/574912?v=3","gravatar_id":"","url":"https://api.github.com/users/ClusterLabs","html_url":"https://github.com/ClusterLabs","followers_url":"https://api.github.com/users/ClusterLabs/followers","following_url":"https://api.github.com/users/ClusterLabs/following{/other_user}","gists_url":"https://api.github.com/users/ClusterLabs/gists{/gist_id}","starred_url":"https://api.github.com/users/ClusterLabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ClusterLabs/subscriptions","organizations_url":"https://api.github.com/users/ClusterLabs/orgs","repos_url":"https://api.github.com/users/ClusterLabs/repos","events_url":"https://api.github.com/users/ClusterLabs/events{/privacy}","received_events_url":"https://api.github.com/users/ClusterLabs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ClusterLabs/hawk","description":"A web-based GUI for managing and monitoring the Pacemaker High-Availability cluster resource manager","fork":false,"url":"https://api.github.com/repos/ClusterLabs/hawk","forks_url":"https://api.github.com/repos/ClusterLabs/hawk/forks","keys_url":"https://api.github.com/repos/ClusterLabs/hawk/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ClusterLabs/hawk/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ClusterLabs/hawk/teams","hooks_url":"https://api.github.com/repos/ClusterLabs/hawk/hooks","issue_events_url":"https://api.github.com/repos/ClusterLabs/hawk/issues/events{/number}","events_url":"https://api.github.com/repos/ClusterLabs/hawk/events","assignees_url":"https://api.github.com/repos/ClusterLabs/hawk/assignees{/user}","branches_url":"https://api.github.com/repos/ClusterLabs/hawk/branches{/branch}","tags_url":"https://api.github.com/repos/ClusterLabs/hawk/tags","blobs_url":"https://api.github.com/repos/ClusterLabs/hawk/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ClusterLabs/hawk/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ClusterLabs/hawk/git/refs{/sha}","trees_url":"https://api.github.com/repos/ClusterLabs/hawk/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ClusterLabs/hawk/statuses/{sha}","languages_url":"https://api.github.com/repos/ClusterLabs/hawk/languages","stargazers_url":"https://api.github.com/repos/ClusterLabs/hawk/stargazers","contributors_url":"https://api.github.com/repos/ClusterLabs/hawk/contributors","subscribers_url":"https://api.github.com/repos/ClusterLabs/hawk/subscribers","subscription_url":"https://api.github.com/repos/ClusterLabs/hawk/subscription","commits_url":"https://api.github.com/repos/ClusterLabs/hawk/commits{/sha}","git_commits_url":"https://api.github.com/repos/ClusterLabs/hawk/git/commits{/sha}","comments_url":"https://api.github.com/repos/ClusterLabs/hawk/comments{/number}","issue_comment_url":"https://api.github.com/repos/ClusterLabs/hawk/issues/comments{/number}","contents_url":"https://api.github.com/repos/ClusterLabs/hawk/contents/{+path}","compare_url":"https://api.github.com/repos/ClusterLabs/hawk/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ClusterLabs/hawk/merges","archive_url":"https://api.github.com/repos/ClusterLabs/hawk/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ClusterLabs/hawk/downloads","issues_url":"https://api.github.com/repos/ClusterLabs/hawk/issues{/number}","pulls_url":"https://api.github.com/repos/ClusterLabs/hawk/pulls{/number}","milestones_url":"https://api.github.com/repos/ClusterLabs/hawk/milestones{/number}","notifications_url":"https://api.github.com/repos/ClusterLabs/hawk/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ClusterLabs/hawk/labels{/name}","releases_url":"https://api.github.com/repos/ClusterLabs/hawk/releases{/id}","created_at":"2012-04-27T02:30:01Z","updated_at":"2015-09-16T20:52:54Z","pushed_at":"2015-09-18T09:55:18Z","git_url":"git://github.com/ClusterLabs/hawk.git","ssh_url":"git@github.com:ClusterLabs/hawk.git","clone_url":"https://github.com/ClusterLabs/hawk.git","svn_url":"https://github.com/ClusterLabs/hawk","homepage":null,"size":14818,"stargazers_count":44,"watchers_count":44,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":16,"mirror_url":null,"open_issues_count":5,"forks":16,"open_issues":5,"watchers":44,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ClusterLabs/hawk/pulls/47"},"html":{"href":"https://github.com/ClusterLabs/hawk/pull/47"},"issue":{"href":"https://api.github.com/repos/ClusterLabs/hawk/issues/47"},"comments":{"href":"https://api.github.com/repos/ClusterLabs/hawk/issues/47/comments"},"review_comments":{"href":"https://api.github.com/repos/ClusterLabs/hawk/pulls/47/comments"},"review_comment":{"href":"https://api.github.com/repos/ClusterLabs/hawk/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ClusterLabs/hawk/pulls/47/commits"},"statuses":{"href":"https://api.github.com/repos/ClusterLabs/hawk/statuses/dbc48a23b907ab3d42111d3a4d5cb943b8c8e060"}}}}