{"action":"created","comment":{"url":"https://api.github.com/repos/docker/notary/pulls/comments/53048729","id":53048729,"diff_hunk":"@@ -0,0 +1,204 @@\n+package data\n+\n+import (\n+\t\"bytes\"\n+\trjson \"encoding/json\"\n+\t\"path\"\n+\t\"reflect\"\n+\t\"testing\"\n+\t\"time\"\n+\n+\tcjson \"github.com/docker/go/canonical/json\"\n+\t\"github.com/stretchr/testify/require\"\n+)\n+\n+func validTargetsTemplate() *SignedTargets {\n+\treturn &SignedTargets{\n+\t\tSigned: Targets{\n+\t\t\tSignedCommon: SignedCommon{Type: \"Targets\", Version: 1, Expires: time.Now()},\n+\t\t\tTargets:      Files{},\n+\t\t\tDelegations: Delegations{\n+\t\t\t\tRoles: []*Role{},\n+\t\t\t\tKeys: Keys{\n+\t\t\t\t\t\"key1\": NewPublicKey(RSAKey, []byte(\"key1\")),\n+\t\t\t\t\t\"key2\": NewPublicKey(RSAKey, []byte(\"key2\")),\n+\t\t\t\t},\n+\t\t\t},\n+\t\t},\n+\t\tSignatures: []Signature{\n+\t\t\t{KeyID: \"key1\", Method: \"method1\", Signature: []byte(\"hello\")},\n+\t\t},\n+\t}\n+}\n+\n+func TestTargetsToSignedMarshalsSignedPortionWithCanonicalJSON(t *testing.T) {\n+\ttg := SignedTargets{Signed: Targets{SignedCommon: SignedCommon{Type: \"Targets\", Version: 1, Expires: time.Now()}}}\n+\tsignedCanonical, err := tg.ToSigned()\n+\trequire.NoError(t, err)\n+\n+\tcanonicalSignedPortion, err := cjson.MarshalCanonical(tg.Signed)\n+\trequire.NoError(t, err)\n+\n+\tcastedCanonical := rjson.RawMessage(canonicalSignedPortion)\n+\n+\t// don't bother testing regular JSON because it might not be different\n+\n+\trequire.True(t, bytes.Equal(signedCanonical.Signed, castedCanonical),\n+\t\t\"expected %v == %v\", signedCanonical.Signed, castedCanonical)\n+}\n+\n+func TestTargetsToSignCopiesSignatures(t *testing.T) {\n+\ttg := SignedTargets{\n+\t\tSigned: Targets{SignedCommon: SignedCommon{Type: \"Targets\", Version: 2, Expires: time.Now()}},\n+\t\tSignatures: []Signature{\n+\t\t\t{KeyID: \"key1\", Method: \"method1\", Signature: []byte(\"hello\")},\n+\t\t},\n+\t}\n+\tsigned, err := tg.ToSigned()\n+\trequire.NoError(t, err)\n+\n+\trequire.True(t, reflect.DeepEqual(tg.Signatures, signed.Signatures),\n+\t\t\"expected %v == %v\", tg.Signatures, signed.Signatures)\n+\n+\ttg.Signatures[0].KeyID = \"changed\"\n+\trequire.False(t, reflect.DeepEqual(tg.Signatures, signed.Signatures),\n+\t\t\"expected %v != %v\", tg.Signatures, signed.Signatures)\n+}\n+\n+func TestTargetsToSignedMarshallingErrorsPropagated(t *testing.T) {\n+\tsetDefaultSerializer(errorSerializer{})\n+\tdefer setDefaultSerializer(canonicalJSON{})\n+\ttg := SignedTargets{\n+\t\tSigned: Targets{SignedCommon: SignedCommon{Type: \"Targets\", Version: 2, Expires: time.Now()}},\n+\t}\n+\t_, err := tg.ToSigned()\n+\trequire.EqualError(t, err, \"bad\")\n+}\n+\n+func TestTargetsMarshalJSONMarshalsSignedWithRegularJSON(t *testing.T) {\n+\ttg := SignedTargets{\n+\t\tSigned: Targets{SignedCommon: SignedCommon{Type: \"Targets\", Version: 1, Expires: time.Now()}},\n+\t\tSignatures: []Signature{\n+\t\t\t{KeyID: \"key1\", Method: \"method1\", Signature: []byte(\"hello\")},\n+\t\t\t{KeyID: \"key2\", Method: \"method2\", Signature: []byte(\"there\")},\n+\t\t},\n+\t}\n+\tserialized, err := tg.MarshalJSON()\n+\trequire.NoError(t, err)\n+\n+\tsigned, err := tg.ToSigned()\n+\trequire.NoError(t, err)\n+\n+\t// don't bother testing canonical JSON because it might not be different\n+\n+\tregular, err := rjson.Marshal(signed)\n+\trequire.NoError(t, err)\n+\n+\trequire.True(t, bytes.Equal(serialized, regular),\n+\t\t\"expected %v != %v\", serialized, regular)\n+}\n+\n+func TestTargetsMarshalJSONMarshallingErrorsPropagated(t *testing.T) {\n+\tsetDefaultSerializer(errorSerializer{})\n+\tdefer setDefaultSerializer(canonicalJSON{})\n+\ttg := SignedTargets{\n+\t\tSigned: Targets{SignedCommon: SignedCommon{Type: \"Targets\", Version: 2, Expires: time.Now()}},\n+\t}\n+\t_, err := tg.MarshalJSON()\n+\trequire.EqualError(t, err, \"bad\")\n+}\n+\n+// TargetsFromSigned succeeds if the targets is valid, and copies the signatures\n+// rather than assigns them\n+func TestTargetsFromSignedCopiesSignatures(t *testing.T) {\n+\tfor _, roleName := range []string{CanonicalTargetsRole, path.Join(CanonicalTargetsRole, \"a\")} {\n+\t\tsigned, err := validTargetsTemplate().ToSigned()\n+\t\trequire.NoError(t, err)\n+\n+\t\tsignedTargets, err := TargetsFromSigned(signed, roleName)\n+\t\trequire.NoError(t, err)\n+\n+\t\tsigned.Signatures[0] = Signature{KeyID: \"key3\", Method: \"method3\", Signature: []byte(\"world\")}\n+\n+\t\trequire.Equal(t, \"key3\", signed.Signatures[0].KeyID)\n+\t\trequire.Equal(t, \"key1\", signedTargets.Signatures[0].KeyID)\n+\t}\n+}\n+\n+// If the targets metadata contains delegations which are invalid, the targets metadata\n+// fails to validate and thus fails to convert into a SignedTargets\n+func TestTargetsBaseFromSignedValidatesDelegations(t *testing.T) {\n+\tfor _, roleName := range []string{CanonicalTargetsRole, path.Join(CanonicalTargetsRole, \"a\")} {\n+\t\ttargets := validTargetsTemplate()\n+\t\tdelgRole, err := NewRole(path.Join(roleName, \"b\"), 1, []string{\"key1\"}, nil, nil)\n+\t\trequire.NoError(t, err)\n+\t\ttargets.Signed.Delegations.Roles = []*Role{delgRole}\n+\n+\t\t// delegation has invalid threshold\n+\t\tdelgRole.Threshold = 0\n+\t\ts, err := targets.ToSigned()\n+\t\trequire.NoError(t, err)\n+\t\t_, err = TargetsFromSigned(s, roleName)\n+\t\trequire.Error(t, err)\n+\t\trequire.IsType(t, ErrInvalidMeta{}, err)\n+\n+\t\t// Keys that aren't in the list of keys\n+\t\tdelgRole.KeyIDs = []string{\"keys11\"}\n+\t\ts, err = targets.ToSigned()\n+\t\trequire.NoError(t, err)\n+\t\t_, err = TargetsFromSigned(s, roleName)\n+\t\trequire.Error(t, err)\n+\t\trequire.IsType(t, ErrInvalidMeta{}, err)\n+\n+\t\tdelgRole.KeyIDs = []string{\"keys1\"}\n+\n+\t\t// not delegation role\n+\t\tdelgRole.Name = CanonicalRootRole\n+\t\ts, err = targets.ToSigned()\n+\t\trequire.NoError(t, err)\n+\t\t_, err = TargetsFromSigned(s, roleName)\n+\t\trequire.Error(t, err)\n+\t\trequire.IsType(t, ErrInvalidMeta{}, err)\n+\n+\t\t// more than one level deep\n+\t\tdelgRole.Name = path.Join(roleName, \"x\", \"y\")\n+\t\ts, err = targets.ToSigned()\n+\t\trequire.NoError(t, err)\n+\t\t_, err = TargetsFromSigned(s, roleName)\n+\t\trequire.Error(t, err)\n+\t\trequire.IsType(t, ErrInvalidMeta{}, err)\n+\n+\t\t// not in delegation hierarchy\n+\t\tif IsDelegation(roleName) {\n+\t\t\tdelgRole.Name = path.Join(CanonicalTargetsRole, \"z\")\n+\t\t\ts, err := targets.ToSigned()\n+\t\t\trequire.NoError(t, err)\n+\t\t\t_, err = TargetsFromSigned(s, roleName)\n+\t\t\trequire.Error(t, err)\n+\t\t\trequire.IsType(t, ErrInvalidMeta{}, err)\n+\t\t}\n+\t}\n+}","path":"tuf/data/targets_test.go","position":181,"original_position":181,"commit_id":"6d68eee2170492b9de9f5ba1dac9bf22b5791eb5","original_commit_id":"6d68eee2170492b9de9f5ba1dac9bf22b5791eb5","user":{"login":"riyazdf","id":1865981,"avatar_url":"https://avatars.githubusercontent.com/u/1865981?v=3","gravatar_id":"","url":"https://api.github.com/users/riyazdf","html_url":"https://github.com/riyazdf","followers_url":"https://api.github.com/users/riyazdf/followers","following_url":"https://api.github.com/users/riyazdf/following{/other_user}","gists_url":"https://api.github.com/users/riyazdf/gists{/gist_id}","starred_url":"https://api.github.com/users/riyazdf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/riyazdf/subscriptions","organizations_url":"https://api.github.com/users/riyazdf/orgs","repos_url":"https://api.github.com/users/riyazdf/repos","events_url":"https://api.github.com/users/riyazdf/events{/privacy}","received_events_url":"https://api.github.com/users/riyazdf/received_events","type":"User","site_admin":false},"body":"Could we add a test with an invalid `roleName` passed to `TargetsFromSigned`?","created_at":"2016-02-16T17:48:46Z","updated_at":"2016-02-16T17:48:46Z","html_url":"https://github.com/docker/notary/pull/573#discussion_r53048729","pull_request_url":"https://api.github.com/repos/docker/notary/pulls/573","_links":{"self":{"href":"https://api.github.com/repos/docker/notary/pulls/comments/53048729"},"html":{"href":"https://github.com/docker/notary/pull/573#discussion_r53048729"},"pull_request":{"href":"https://api.github.com/repos/docker/notary/pulls/573"}}},"pull_request":{"url":"https://api.github.com/repos/docker/notary/pulls/573","id":59444959,"html_url":"https://github.com/docker/notary/pull/573","diff_url":"https://github.com/docker/notary/pull/573.diff","patch_url":"https://github.com/docker/notary/pull/573.patch","issue_url":"https://api.github.com/repos/docker/notary/issues/573","number":573,"state":"open","locked":false,"title":"Adds extra validation when calling `XFromSigned` functions","user":{"login":"cyli","id":223200,"avatar_url":"https://avatars.githubusercontent.com/u/223200?v=3","gravatar_id":"","url":"https://api.github.com/users/cyli","html_url":"https://github.com/cyli","followers_url":"https://api.github.com/users/cyli/followers","following_url":"https://api.github.com/users/cyli/following{/other_user}","gists_url":"https://api.github.com/users/cyli/gists{/gist_id}","starred_url":"https://api.github.com/users/cyli/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cyli/subscriptions","organizations_url":"https://api.github.com/users/cyli/orgs","repos_url":"https://api.github.com/users/cyli/repos","events_url":"https://api.github.com/users/cyli/events{/privacy}","received_events_url":"https://api.github.com/users/cyli/received_events","type":"User","site_admin":false},"body":"To make sure that the per-metadata type validation always happens","created_at":"2016-02-16T05:21:40Z","updated_at":"2016-02-16T17:48:46Z","closed_at":null,"merged_at":null,"merge_commit_sha":"25f53fcbbb13dee054407ed226cb5e2257b97bdb","assignee":null,"milestone":{"url":"https://api.github.com/repos/docker/notary/milestones/6","html_url":"https://github.com/docker/notary/milestones/notary/0.2","labels_url":"https://api.github.com/repos/docker/notary/milestones/6/labels","id":1485686,"number":6,"title":"notary/0.2","description":"","creator":{"login":"diogomonica","id":55332,"avatar_url":"https://avatars.githubusercontent.com/u/55332?v=3","gravatar_id":"","url":"https://api.github.com/users/diogomonica","html_url":"https://github.com/diogomonica","followers_url":"https://api.github.com/users/diogomonica/followers","following_url":"https://api.github.com/users/diogomonica/following{/other_user}","gists_url":"https://api.github.com/users/diogomonica/gists{/gist_id}","starred_url":"https://api.github.com/users/diogomonica/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/diogomonica/subscriptions","organizations_url":"https://api.github.com/users/diogomonica/orgs","repos_url":"https://api.github.com/users/diogomonica/repos","events_url":"https://api.github.com/users/diogomonica/events{/privacy}","received_events_url":"https://api.github.com/users/diogomonica/received_events","type":"User","site_admin":false},"open_issues":22,"closed_issues":41,"state":"open","created_at":"2016-01-05T19:39:48Z","updated_at":"2016-02-16T05:21:40Z","due_on":"2016-02-12T08:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/docker/notary/pulls/573/commits","review_comments_url":"https://api.github.com/repos/docker/notary/pulls/573/comments","review_comment_url":"https://api.github.com/repos/docker/notary/pulls/comments{/number}","comments_url":"https://api.github.com/repos/docker/notary/issues/573/comments","statuses_url":"https://api.github.com/repos/docker/notary/statuses/6d68eee2170492b9de9f5ba1dac9bf22b5791eb5","head":{"label":"docker:validate-meta-on-parse","ref":"validate-meta-on-parse","sha":"6d68eee2170492b9de9f5ba1dac9bf22b5791eb5","user":{"login":"docker","id":5429470,"avatar_url":"https://avatars.githubusercontent.com/u/5429470?v=3","gravatar_id":"","url":"https://api.github.com/users/docker","html_url":"https://github.com/docker","followers_url":"https://api.github.com/users/docker/followers","following_url":"https://api.github.com/users/docker/following{/other_user}","gists_url":"https://api.github.com/users/docker/gists{/gist_id}","starred_url":"https://api.github.com/users/docker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/docker/subscriptions","organizations_url":"https://api.github.com/users/docker/orgs","repos_url":"https://api.github.com/users/docker/repos","events_url":"https://api.github.com/users/docker/events{/privacy}","received_events_url":"https://api.github.com/users/docker/received_events","type":"Organization","site_admin":false},"repo":{"id":37743436,"name":"notary","full_name":"docker/notary","owner":{"login":"docker","id":5429470,"avatar_url":"https://avatars.githubusercontent.com/u/5429470?v=3","gravatar_id":"","url":"https://api.github.com/users/docker","html_url":"https://github.com/docker","followers_url":"https://api.github.com/users/docker/followers","following_url":"https://api.github.com/users/docker/following{/other_user}","gists_url":"https://api.github.com/users/docker/gists{/gist_id}","starred_url":"https://api.github.com/users/docker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/docker/subscriptions","organizations_url":"https://api.github.com/users/docker/orgs","repos_url":"https://api.github.com/users/docker/repos","events_url":"https://api.github.com/users/docker/events{/privacy}","received_events_url":"https://api.github.com/users/docker/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/docker/notary","description":"Notary is a Docker project that allows anyone to have trust over arbitrary collections of data","fork":false,"url":"https://api.github.com/repos/docker/notary","forks_url":"https://api.github.com/repos/docker/notary/forks","keys_url":"https://api.github.com/repos/docker/notary/keys{/key_id}","collaborators_url":"https://api.github.com/repos/docker/notary/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/docker/notary/teams","hooks_url":"https://api.github.com/repos/docker/notary/hooks","issue_events_url":"https://api.github.com/repos/docker/notary/issues/events{/number}","events_url":"https://api.github.com/repos/docker/notary/events","assignees_url":"https://api.github.com/repos/docker/notary/assignees{/user}","branches_url":"https://api.github.com/repos/docker/notary/branches{/branch}","tags_url":"https://api.github.com/repos/docker/notary/tags","blobs_url":"https://api.github.com/repos/docker/notary/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/docker/notary/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/docker/notary/git/refs{/sha}","trees_url":"https://api.github.com/repos/docker/notary/git/trees{/sha}","statuses_url":"https://api.github.com/repos/docker/notary/statuses/{sha}","languages_url":"https://api.github.com/repos/docker/notary/languages","stargazers_url":"https://api.github.com/repos/docker/notary/stargazers","contributors_url":"https://api.github.com/repos/docker/notary/contributors","subscribers_url":"https://api.github.com/repos/docker/notary/subscribers","subscription_url":"https://api.github.com/repos/docker/notary/subscription","commits_url":"https://api.github.com/repos/docker/notary/commits{/sha}","git_commits_url":"https://api.github.com/repos/docker/notary/git/commits{/sha}","comments_url":"https://api.github.com/repos/docker/notary/comments{/number}","issue_comment_url":"https://api.github.com/repos/docker/notary/issues/comments{/number}","contents_url":"https://api.github.com/repos/docker/notary/contents/{+path}","compare_url":"https://api.github.com/repos/docker/notary/compare/{base}...{head}","merges_url":"https://api.github.com/repos/docker/notary/merges","archive_url":"https://api.github.com/repos/docker/notary/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/docker/notary/downloads","issues_url":"https://api.github.com/repos/docker/notary/issues{/number}","pulls_url":"https://api.github.com/repos/docker/notary/pulls{/number}","milestones_url":"https://api.github.com/repos/docker/notary/milestones{/number}","notifications_url":"https://api.github.com/repos/docker/notary/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/docker/notary/labels{/name}","releases_url":"https://api.github.com/repos/docker/notary/releases{/id}","deployments_url":"https://api.github.com/repos/docker/notary/deployments","created_at":"2015-06-19T20:07:53Z","updated_at":"2016-02-16T00:43:01Z","pushed_at":"2016-02-16T14:11:25Z","git_url":"git://github.com/docker/notary.git","ssh_url":"git@github.com:docker/notary.git","clone_url":"https://github.com/docker/notary.git","svn_url":"https://github.com/docker/notary","homepage":"https://docker.com","size":24122,"stargazers_count":479,"watchers_count":479,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":73,"mirror_url":null,"open_issues_count":90,"forks":73,"open_issues":90,"watchers":479,"default_branch":"master"}},"base":{"label":"docker:master","ref":"master","sha":"9010989a208abd414e0ab01e5a772045937a6098","user":{"login":"docker","id":5429470,"avatar_url":"https://avatars.githubusercontent.com/u/5429470?v=3","gravatar_id":"","url":"https://api.github.com/users/docker","html_url":"https://github.com/docker","followers_url":"https://api.github.com/users/docker/followers","following_url":"https://api.github.com/users/docker/following{/other_user}","gists_url":"https://api.github.com/users/docker/gists{/gist_id}","starred_url":"https://api.github.com/users/docker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/docker/subscriptions","organizations_url":"https://api.github.com/users/docker/orgs","repos_url":"https://api.github.com/users/docker/repos","events_url":"https://api.github.com/users/docker/events{/privacy}","received_events_url":"https://api.github.com/users/docker/received_events","type":"Organization","site_admin":false},"repo":{"id":37743436,"name":"notary","full_name":"docker/notary","owner":{"login":"docker","id":5429470,"avatar_url":"https://avatars.githubusercontent.com/u/5429470?v=3","gravatar_id":"","url":"https://api.github.com/users/docker","html_url":"https://github.com/docker","followers_url":"https://api.github.com/users/docker/followers","following_url":"https://api.github.com/users/docker/following{/other_user}","gists_url":"https://api.github.com/users/docker/gists{/gist_id}","starred_url":"https://api.github.com/users/docker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/docker/subscriptions","organizations_url":"https://api.github.com/users/docker/orgs","repos_url":"https://api.github.com/users/docker/repos","events_url":"https://api.github.com/users/docker/events{/privacy}","received_events_url":"https://api.github.com/users/docker/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/docker/notary","description":"Notary is a Docker project that allows anyone to have trust over arbitrary collections of data","fork":false,"url":"https://api.github.com/repos/docker/notary","forks_url":"https://api.github.com/repos/docker/notary/forks","keys_url":"https://api.github.com/repos/docker/notary/keys{/key_id}","collaborators_url":"https://api.github.com/repos/docker/notary/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/docker/notary/teams","hooks_url":"https://api.github.com/repos/docker/notary/hooks","issue_events_url":"https://api.github.com/repos/docker/notary/issues/events{/number}","events_url":"https://api.github.com/repos/docker/notary/events","assignees_url":"https://api.github.com/repos/docker/notary/assignees{/user}","branches_url":"https://api.github.com/repos/docker/notary/branches{/branch}","tags_url":"https://api.github.com/repos/docker/notary/tags","blobs_url":"https://api.github.com/repos/docker/notary/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/docker/notary/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/docker/notary/git/refs{/sha}","trees_url":"https://api.github.com/repos/docker/notary/git/trees{/sha}","statuses_url":"https://api.github.com/repos/docker/notary/statuses/{sha}","languages_url":"https://api.github.com/repos/docker/notary/languages","stargazers_url":"https://api.github.com/repos/docker/notary/stargazers","contributors_url":"https://api.github.com/repos/docker/notary/contributors","subscribers_url":"https://api.github.com/repos/docker/notary/subscribers","subscription_url":"https://api.github.com/repos/docker/notary/subscription","commits_url":"https://api.github.com/repos/docker/notary/commits{/sha}","git_commits_url":"https://api.github.com/repos/docker/notary/git/commits{/sha}","comments_url":"https://api.github.com/repos/docker/notary/comments{/number}","issue_comment_url":"https://api.github.com/repos/docker/notary/issues/comments{/number}","contents_url":"https://api.github.com/repos/docker/notary/contents/{+path}","compare_url":"https://api.github.com/repos/docker/notary/compare/{base}...{head}","merges_url":"https://api.github.com/repos/docker/notary/merges","archive_url":"https://api.github.com/repos/docker/notary/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/docker/notary/downloads","issues_url":"https://api.github.com/repos/docker/notary/issues{/number}","pulls_url":"https://api.github.com/repos/docker/notary/pulls{/number}","milestones_url":"https://api.github.com/repos/docker/notary/milestones{/number}","notifications_url":"https://api.github.com/repos/docker/notary/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/docker/notary/labels{/name}","releases_url":"https://api.github.com/repos/docker/notary/releases{/id}","deployments_url":"https://api.github.com/repos/docker/notary/deployments","created_at":"2015-06-19T20:07:53Z","updated_at":"2016-02-16T00:43:01Z","pushed_at":"2016-02-16T14:11:25Z","git_url":"git://github.com/docker/notary.git","ssh_url":"git@github.com:docker/notary.git","clone_url":"https://github.com/docker/notary.git","svn_url":"https://github.com/docker/notary","homepage":"https://docker.com","size":24122,"stargazers_count":479,"watchers_count":479,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":73,"mirror_url":null,"open_issues_count":90,"forks":73,"open_issues":90,"watchers":479,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/docker/notary/pulls/573"},"html":{"href":"https://github.com/docker/notary/pull/573"},"issue":{"href":"https://api.github.com/repos/docker/notary/issues/573"},"comments":{"href":"https://api.github.com/repos/docker/notary/issues/573/comments"},"review_comments":{"href":"https://api.github.com/repos/docker/notary/pulls/573/comments"},"review_comment":{"href":"https://api.github.com/repos/docker/notary/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/docker/notary/pulls/573/commits"},"statuses":{"href":"https://api.github.com/repos/docker/notary/statuses/6d68eee2170492b9de9f5ba1dac9bf22b5791eb5"}}}}