{"action":"created","comment":{"url":"https://api.github.com/repos/9fans/plan9port/pulls/comments/227275842","pull_request_review_id":167277666,"id":227275842,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyNzI3NTg0Mg==","diff_hunk":"@@ -0,0 +1,658 @@\n+#define Cursor OSXCursor\n+#define Point OSXPoint\n+#define Rect OSXRect\n+\n+#import <Cocoa/Cocoa.h>\n+\n+#undef Cursor\n+#undef Point\n+#undef Rect\n+\n+#include <u.h>\n+#include <libc.h>\n+#include  \"cocoa-thread.h\"\n+#include <draw.h>\n+#include <memdraw.h>\n+#include <keyboard.h>\n+#include <cursor.h>\n+#include \"cocoa-screen.h\"\n+#include \"osx-keycodes.h\"\n+#include \"devdraw.h\"\n+#include \"bigarrow.h\"\n+#include \"glendapng.h\"\n+\n+AUTOFRAMEWORK(Cocoa)\n+\n+#define LOG\tif(0)NSLog\n+\n+static uint keycvt(NSEvent *event);\n+static uint msec(void);\n+static Memimage* initimg(void);\n+\n+void resizeimg(void);\n+\n+void\n+usage(void)\n+{\n+\tfprint(2, \"usage: devdraw (don't run directly)\\n\");\n+\tthreadexitsall(\"usage\");\n+}\n+\n+@interface AppDelegate : NSObject<NSApplicationDelegate,NSWindowDelegate> @end\n+@interface DevDrawView : NSView @end\n+\n+static AppDelegate *myApp;\n+static DevDrawView *myContent;\n+static NSWindow *win;\n+static NSCursor *currentCursor;\n+\n+static Memimage *img;\n+\n+static QLock cursorl;\n+static QLock snarfl;\n+\n+void\n+threadmain(int argc, char **argv)\n+{\n+\t/*\n+\t * Move the protocol off stdin/stdout so that\n+\t * any inadvertent prints don't screw things up.\n+\t */\n+\tdup(0,3);\n+\tdup(1,4);\n+\tclose(0);\n+\tclose(1);\n+\topen(\"/dev/null\", OREAD);\n+\topen(\"/dev/null\", OWRITE);\n+\n+\tARGBEGIN{\n+\tcase 'D':\t\t/* for good ps -a listings */\n+\t\tbreak;\n+\tcase 'f':\t\t/* fall through for backward compatibility */\n+\tcase 'g':\n+\tcase 'b':\n+\t\tbreak;\n+\tdefault:\n+\t\tusage();\n+\t}ARGEND\n+\n+\t@autoreleasepool{\n+\t\t[NSApplication sharedApplication];\n+\t\t[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];\n+\t\tmyApp = [AppDelegate new];\n+\t\t[NSApp setDelegate:myApp];\n+\t\t[NSApp run];\n+\t}\n+}\n+\n+@implementation AppDelegate\n+\n++ (void)callservep9p:(id)arg\n+{\n+\tservep9p();\n+\t[NSApp terminate:self];\n+}\n+\n++ (void)makewin:(NSValue *)v\n+{\n+\tNSRect r, sr;\n+\tRectangle wr;\n+\tint set;\n+\tchar *s;\n+\n+\tconst NSWindowStyleMask Winstyle = NSWindowStyleMaskTitled\n+\t\t| NSWindowStyleMaskClosable\n+\t\t| NSWindowStyleMaskMiniaturizable\n+\t\t| NSWindowStyleMaskResizable;\n+\n+\tsr = [[NSScreen mainScreen] frame];\n+\tr = [[NSScreen mainScreen] visibleFrame];\n+\n+\ts = [v pointerValue];\n+\tLOG(@\"makewin(%s)\", s);\n+\tif(s && *s){\n+\t\tif(parsewinsize(s, &wr, &set) < 0)\n+\t\t\tsysfatal(\"%r\");\n+\t}else{\n+\t\twr = Rect(0, 0, sr.size.width*2/3, sr.size.height*2/3);\n+\t\tset = 0;\n+\t}\n+\n+\tr.origin.x = wr.min.x;\n+\tr.origin.y = sr.size.height-wr.max.y;\t/* winsize is top-left-based */\n+\tr.size.width = fmin(Dx(wr), r.size.width);\n+\tr.size.height = fmin(Dy(wr), r.size.height);\n+\tr = [NSWindow contentRectForFrameRect:r\n+\t\tstyleMask:Winstyle];\n+\n+\twin = [[NSWindow alloc]\n+\t\tinitWithContentRect:r\n+\t\tstyleMask:Winstyle\n+\t\tbacking:NSBackingStoreBuffered defer:NO];\n+\t[win setTitle:@\"devdraw\"];\n+\n+\tif(!set)\n+\t\t[win center];\n+\t[win setCollectionBehavior:\n+\t\tNSWindowCollectionBehaviorFullScreenPrimary];\n+\t[win setContentMinSize:NSMakeSize(128,128)];\n+\n+\t[win setRestorable:NO];\n+\t[win setAcceptsMouseMovedEvents:YES];\n+\t[win setDelegate:myApp];\n+\t// [win setDisplaysWhenScreenProfileChanges:NO];\n+\tmyContent = [DevDrawView new];\n+\t[win setContentView:myContent];\n+\n+\ttopwin();\n+}\n+\n++ (void)callkicklabel:(NSValue *)v\n+{\n+\tchar *label;\n+\tNSString *s;\n+\n+\tlabel = [v pointerValue];\n+\tLOG(@\"callkicklabel(%s)\", label);\n+\ts = [[NSString alloc] initWithUTF8String:label];\n+\t[win setTitle:s];\n+\t[[NSApp dockTile] setBadgeLabel:s];\n+}\n+\n++ (void)callsetNeedsDisplayInRect:(NSValue *)v\n+{\n+\tNSRect r;\n+\n+\tr = [v rectValue];\n+\tLOG(@\"callsetNeedsDisplayInRect(%g, %g, %g, %g)\", r.origin.x, r.origin.y, r.size.width, r.size.height);\n+\tr = [win convertRectFromBacking:r];\n+\tLOG(@\"setNeedsDisplayInRect(%g, %g, %g, %g)\", r.origin.x, r.origin.y, r.size.width, r.size.height);\n+\t[myContent setNeedsDisplayInRect:r];\n+}\n+\n++ (void)callsetcursor:(NSValue *)v\n+{\n+\tCursor *c;\n+\tNSBitmapImageRep *r;\n+\tNSImage *i;\n+\tNSPoint p;\n+\tint b;\n+\tuchar *plane[5];\n+\n+\tqlock(&cursorl);\n+\tc = [v pointerValue];\n+\tif(!c)\n+\t\tc = &bigarrow;\n+\tr = [[NSBitmapImageRep alloc]\n+\t\tinitWithBitmapDataPlanes:nil\n+\t\tpixelsWide:16\n+\t\tpixelsHigh:16\n+\t\tbitsPerSample:1\n+\t\tsamplesPerPixel:2\n+\t\thasAlpha:YES\n+\t\tisPlanar:YES\n+\t\tcolorSpaceName:NSDeviceWhiteColorSpace\n+\t\tbytesPerRow:2\n+\t\tbitsPerPixel:1];\n+\n+\t[r getBitmapDataPlanes:plane];\n+\n+\tfor(b=0; b<2*16; b++){\n+\t\tplane[0][b] = ~c->set[b];\n+\t\tplane[1][b] = c->clr[b];\n+\t}\n+\tp = NSMakePoint(-c->offset.x, -c->offset.y);\n+\ti = [[NSImage alloc] initWithSize:NSMakeSize(16, 16)];\n+\t[i addRepresentation:r];\n+\n+\tcurrentCursor = [[NSCursor alloc] initWithImage:i hotSpot:p];\n+\tqunlock(&cursorl);\n+\n+\t[win invalidateCursorRectsForView:myContent];\n+}\n+\n+- (void)applicationDidFinishLaunching:(id)arg\n+{\n+\tLOG(@\"applicationDidFinishLaunching\");\n+\t[NSThread\n+\t\tdetachNewThreadSelector:@selector(callservep9p:)\n+\t\ttoTarget:[self class] withObject:nil];\n+}\n+\n+- (NSApplicationPresentationOptions)window:(id)arg\n+\t\twillUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)proposedOptions {\n+\tNSApplicationPresentationOptions o;\n+\to = proposedOptions;\n+\to &= ~(NSApplicationPresentationAutoHideDock | NSApplicationPresentationAutoHideMenuBar);\n+\to |= NSApplicationPresentationHideDock | NSApplicationPresentationHideMenuBar;\n+\treturn o;\n+}\n+\n+- (void)windowDidEndLiveResize:(id)arg\n+{\n+\tresizeimg();\n+}\n+\n+- (void)applicationWillTerminate:(NSNotification *)aNotification {\n+}\n+\n+- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication {\n+\treturn YES;\n+}\n+\n+@end\n+\n+@implementation DevDrawView\n+\n+- (id)initWithFrame:(NSRect)r\n+{\n+\tself = [super initWithFrame:r];\n+\tLOG(@\"initWithFrame(%g,%g,%g,%g)\", r.origin.x, r.origin.y, r.size.width, r.size.height);\n+\treturn self;\n+}\n+\n+- (void)drawRect:(NSRect)r\n+{\n+\tNSRect sr, dr;\n+\tCGContextRef c;\n+\tCGImageRef i;\n+\tint l;\n+\n+\tif(!img){\n+\t\tLOG(@\"img not initialized\");\n+\t\treturn;\n+\t}\n+\n+\tc = [[NSGraphicsContext currentContext] CGContext];\n+\n+\tLOG(@\"drawRect(%g,%g,%g,%g)\", r.origin.x, r.origin.y, r.size.width, r.size.height);\n+\tsr = [win convertRectToBacking:r];\n+\tLOG(@\"sr: %g,%g,%g,%g\", sr.origin.x, sr.origin.y, sr.size.width, sr.size.height);\n+\tdr = r;\n+\tdr.origin.y = self.bounds.size.height - dr.origin.y - dr.size.height;\n+\tLOG(@\"dr: %g,%g,%g,%g\", dr.origin.x, dr.origin.y, dr.size.width, dr.size.height);\n+\n+\tl = img->width*sizeof(u32int);\n+\tCGDataProviderRef provider = CGDataProviderCreateWithData(NULL,\n+\t\tbyteaddr(img, Pt(sr.origin.x, sr.origin.y)), sr.size.height*l, NULL);","path":"src/cmd/devdraw/cocoa-screen-mojave.m","position":281,"original_position":277,"commit_id":"9e381c87637d08760db65129d07ca70ae33cc711","original_commit_id":"5b88da44c72786b1dca29bb2be0db762f0d76305","user":{"login":"jacobvosmaer","id":1336311,"node_id":"MDQ6VXNlcjEzMzYzMTE=","avatar_url":"https://avatars2.githubusercontent.com/u/1336311?v=4","gravatar_id":"","url":"https://api.github.com/users/jacobvosmaer","html_url":"https://github.com/jacobvosmaer","followers_url":"https://api.github.com/users/jacobvosmaer/followers","following_url":"https://api.github.com/users/jacobvosmaer/following{/other_user}","gists_url":"https://api.github.com/users/jacobvosmaer/gists{/gist_id}","starred_url":"https://api.github.com/users/jacobvosmaer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jacobvosmaer/subscriptions","organizations_url":"https://api.github.com/users/jacobvosmaer/orgs","repos_url":"https://api.github.com/users/jacobvosmaer/repos","events_url":"https://api.github.com/users/jacobvosmaer/events{/privacy}","received_events_url":"https://api.github.com/users/jacobvosmaer/received_events","type":"User","site_admin":false},"body":"Thanks, that makes sense. I guess you could call it \"eventually consistent\" drawing :)","created_at":"2018-10-23T08:19:20Z","updated_at":"2018-10-23T08:19:21Z","html_url":"https://github.com/9fans/plan9port/pull/194#discussion_r227275842","pull_request_url":"https://api.github.com/repos/9fans/plan9port/pulls/194","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/9fans/plan9port/pulls/comments/227275842"},"html":{"href":"https://github.com/9fans/plan9port/pull/194#discussion_r227275842"},"pull_request":{"href":"https://api.github.com/repos/9fans/plan9port/pulls/194"}},"in_reply_to_id":227064789},"pull_request":{"url":"https://api.github.com/repos/9fans/plan9port/pulls/194","id":224580863,"node_id":"MDExOlB1bGxSZXF1ZXN0MjI0NTgwODYz","html_url":"https://github.com/9fans/plan9port/pull/194","diff_url":"https://github.com/9fans/plan9port/pull/194.diff","patch_url":"https://github.com/9fans/plan9port/pull/194.patch","issue_url":"https://api.github.com/repos/9fans/plan9port/issues/194","number":194,"state":"open","locked":false,"title":"devdraw: rewrite the cocoa screen","user":{"login":"jxy","id":89739,"node_id":"MDQ6VXNlcjg5NzM5","avatar_url":"https://avatars0.githubusercontent.com/u/89739?v=4","gravatar_id":"","url":"https://api.github.com/users/jxy","html_url":"https://github.com/jxy","followers_url":"https://api.github.com/users/jxy/followers","following_url":"https://api.github.com/users/jxy/following{/other_user}","gists_url":"https://api.github.com/users/jxy/gists{/gist_id}","starred_url":"https://api.github.com/users/jxy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jxy/subscriptions","organizations_url":"https://api.github.com/users/jxy/orgs","repos_url":"https://api.github.com/users/jxy/repos","events_url":"https://api.github.com/users/jxy/events{/privacy}","received_events_url":"https://api.github.com/users/jxy/received_events","type":"User","site_admin":false},"body":"Add a new macOS cocoa screen, cocoa-screen-mojave.m.\r\nRewrite the macOS cocoa drawing code to use the builtin runloop\r\nfor drawRect.\r\nRemove most of the deprecated code, and simplify most of the logic.\r\nModify mkwsysrules.sh such that the new code is used only when\r\nthe system version matches '10\\.14'.\r\nEarlier version can still try it out by setting COCOATYPE=mojave.","created_at":"2018-10-22T02:49:41Z","updated_at":"2018-10-23T08:19:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3afe58b19f80e2b3ab165c27d2b22f973eb5f97e","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/9fans/plan9port/pulls/194/commits","review_comments_url":"https://api.github.com/repos/9fans/plan9port/pulls/194/comments","review_comment_url":"https://api.github.com/repos/9fans/plan9port/pulls/comments{/number}","comments_url":"https://api.github.com/repos/9fans/plan9port/issues/194/comments","statuses_url":"https://api.github.com/repos/9fans/plan9port/statuses/9e381c87637d08760db65129d07ca70ae33cc711","head":{"label":"jxy:cocoa-mojave","ref":"cocoa-mojave","sha":"9e381c87637d08760db65129d07ca70ae33cc711","user":{"login":"jxy","id":89739,"node_id":"MDQ6VXNlcjg5NzM5","avatar_url":"https://avatars0.githubusercontent.com/u/89739?v=4","gravatar_id":"","url":"https://api.github.com/users/jxy","html_url":"https://github.com/jxy","followers_url":"https://api.github.com/users/jxy/followers","following_url":"https://api.github.com/users/jxy/following{/other_user}","gists_url":"https://api.github.com/users/jxy/gists{/gist_id}","starred_url":"https://api.github.com/users/jxy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jxy/subscriptions","organizations_url":"https://api.github.com/users/jxy/orgs","repos_url":"https://api.github.com/users/jxy/repos","events_url":"https://api.github.com/users/jxy/events{/privacy}","received_events_url":"https://api.github.com/users/jxy/received_events","type":"User","site_admin":false},"repo":{"id":108025970,"node_id":"MDEwOlJlcG9zaXRvcnkxMDgwMjU5NzA=","name":"plan9port","full_name":"jxy/plan9port","private":false,"owner":{"login":"jxy","id":89739,"node_id":"MDQ6VXNlcjg5NzM5","avatar_url":"https://avatars0.githubusercontent.com/u/89739?v=4","gravatar_id":"","url":"https://api.github.com/users/jxy","html_url":"https://github.com/jxy","followers_url":"https://api.github.com/users/jxy/followers","following_url":"https://api.github.com/users/jxy/following{/other_user}","gists_url":"https://api.github.com/users/jxy/gists{/gist_id}","starred_url":"https://api.github.com/users/jxy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jxy/subscriptions","organizations_url":"https://api.github.com/users/jxy/orgs","repos_url":"https://api.github.com/users/jxy/repos","events_url":"https://api.github.com/users/jxy/events{/privacy}","received_events_url":"https://api.github.com/users/jxy/received_events","type":"User","site_admin":false},"html_url":"https://github.com/jxy/plan9port","description":"Plan 9 from User Space","fork":true,"url":"https://api.github.com/repos/jxy/plan9port","forks_url":"https://api.github.com/repos/jxy/plan9port/forks","keys_url":"https://api.github.com/repos/jxy/plan9port/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jxy/plan9port/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jxy/plan9port/teams","hooks_url":"https://api.github.com/repos/jxy/plan9port/hooks","issue_events_url":"https://api.github.com/repos/jxy/plan9port/issues/events{/number}","events_url":"https://api.github.com/repos/jxy/plan9port/events","assignees_url":"https://api.github.com/repos/jxy/plan9port/assignees{/user}","branches_url":"https://api.github.com/repos/jxy/plan9port/branches{/branch}","tags_url":"https://api.github.com/repos/jxy/plan9port/tags","blobs_url":"https://api.github.com/repos/jxy/plan9port/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jxy/plan9port/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jxy/plan9port/git/refs{/sha}","trees_url":"https://api.github.com/repos/jxy/plan9port/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jxy/plan9port/statuses/{sha}","languages_url":"https://api.github.com/repos/jxy/plan9port/languages","stargazers_url":"https://api.github.com/repos/jxy/plan9port/stargazers","contributors_url":"https://api.github.com/repos/jxy/plan9port/contributors","subscribers_url":"https://api.github.com/repos/jxy/plan9port/subscribers","subscription_url":"https://api.github.com/repos/jxy/plan9port/subscription","commits_url":"https://api.github.com/repos/jxy/plan9port/commits{/sha}","git_commits_url":"https://api.github.com/repos/jxy/plan9port/git/commits{/sha}","comments_url":"https://api.github.com/repos/jxy/plan9port/comments{/number}","issue_comment_url":"https://api.github.com/repos/jxy/plan9port/issues/comments{/number}","contents_url":"https://api.github.com/repos/jxy/plan9port/contents/{+path}","compare_url":"https://api.github.com/repos/jxy/plan9port/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jxy/plan9port/merges","archive_url":"https://api.github.com/repos/jxy/plan9port/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jxy/plan9port/downloads","issues_url":"https://api.github.com/repos/jxy/plan9port/issues{/number}","pulls_url":"https://api.github.com/repos/jxy/plan9port/pulls{/number}","milestones_url":"https://api.github.com/repos/jxy/plan9port/milestones{/number}","notifications_url":"https://api.github.com/repos/jxy/plan9port/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jxy/plan9port/labels{/name}","releases_url":"https://api.github.com/repos/jxy/plan9port/releases{/id}","deployments_url":"https://api.github.com/repos/jxy/plan9port/deployments","created_at":"2017-10-23T18:57:19Z","updated_at":"2018-10-22T02:15:41Z","pushed_at":"2018-10-23T08:13:11Z","git_url":"git://github.com/jxy/plan9port.git","ssh_url":"git@github.com:jxy/plan9port.git","clone_url":"https://github.com/jxy/plan9port.git","svn_url":"https://github.com/jxy/plan9port","homepage":"https://9fans.github.io/plan9port/","size":25674,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"9fans:master","ref":"master","sha":"48da9bd71ddae0c51f8aff4c0d6806a8e32c4e23","user":{"login":"9fans","id":9520248,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk1MjAyNDg=","avatar_url":"https://avatars2.githubusercontent.com/u/9520248?v=4","gravatar_id":"","url":"https://api.github.com/users/9fans","html_url":"https://github.com/9fans","followers_url":"https://api.github.com/users/9fans/followers","following_url":"https://api.github.com/users/9fans/following{/other_user}","gists_url":"https://api.github.com/users/9fans/gists{/gist_id}","starred_url":"https://api.github.com/users/9fans/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/9fans/subscriptions","organizations_url":"https://api.github.com/users/9fans/orgs","repos_url":"https://api.github.com/users/9fans/repos","events_url":"https://api.github.com/users/9fans/events{/privacy}","received_events_url":"https://api.github.com/users/9fans/received_events","type":"Organization","site_admin":false},"repo":{"id":26095474,"node_id":"MDEwOlJlcG9zaXRvcnkyNjA5NTQ3NA==","name":"plan9port","full_name":"9fans/plan9port","private":false,"owner":{"login":"9fans","id":9520248,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk1MjAyNDg=","avatar_url":"https://avatars2.githubusercontent.com/u/9520248?v=4","gravatar_id":"","url":"https://api.github.com/users/9fans","html_url":"https://github.com/9fans","followers_url":"https://api.github.com/users/9fans/followers","following_url":"https://api.github.com/users/9fans/following{/other_user}","gists_url":"https://api.github.com/users/9fans/gists{/gist_id}","starred_url":"https://api.github.com/users/9fans/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/9fans/subscriptions","organizations_url":"https://api.github.com/users/9fans/orgs","repos_url":"https://api.github.com/users/9fans/repos","events_url":"https://api.github.com/users/9fans/events{/privacy}","received_events_url":"https://api.github.com/users/9fans/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/9fans/plan9port","description":"Plan 9 from User Space","fork":false,"url":"https://api.github.com/repos/9fans/plan9port","forks_url":"https://api.github.com/repos/9fans/plan9port/forks","keys_url":"https://api.github.com/repos/9fans/plan9port/keys{/key_id}","collaborators_url":"https://api.github.com/repos/9fans/plan9port/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/9fans/plan9port/teams","hooks_url":"https://api.github.com/repos/9fans/plan9port/hooks","issue_events_url":"https://api.github.com/repos/9fans/plan9port/issues/events{/number}","events_url":"https://api.github.com/repos/9fans/plan9port/events","assignees_url":"https://api.github.com/repos/9fans/plan9port/assignees{/user}","branches_url":"https://api.github.com/repos/9fans/plan9port/branches{/branch}","tags_url":"https://api.github.com/repos/9fans/plan9port/tags","blobs_url":"https://api.github.com/repos/9fans/plan9port/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/9fans/plan9port/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/9fans/plan9port/git/refs{/sha}","trees_url":"https://api.github.com/repos/9fans/plan9port/git/trees{/sha}","statuses_url":"https://api.github.com/repos/9fans/plan9port/statuses/{sha}","languages_url":"https://api.github.com/repos/9fans/plan9port/languages","stargazers_url":"https://api.github.com/repos/9fans/plan9port/stargazers","contributors_url":"https://api.github.com/repos/9fans/plan9port/contributors","subscribers_url":"https://api.github.com/repos/9fans/plan9port/subscribers","subscription_url":"https://api.github.com/repos/9fans/plan9port/subscription","commits_url":"https://api.github.com/repos/9fans/plan9port/commits{/sha}","git_commits_url":"https://api.github.com/repos/9fans/plan9port/git/commits{/sha}","comments_url":"https://api.github.com/repos/9fans/plan9port/comments{/number}","issue_comment_url":"https://api.github.com/repos/9fans/plan9port/issues/comments{/number}","contents_url":"https://api.github.com/repos/9fans/plan9port/contents/{+path}","compare_url":"https://api.github.com/repos/9fans/plan9port/compare/{base}...{head}","merges_url":"https://api.github.com/repos/9fans/plan9port/merges","archive_url":"https://api.github.com/repos/9fans/plan9port/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/9fans/plan9port/downloads","issues_url":"https://api.github.com/repos/9fans/plan9port/issues{/number}","pulls_url":"https://api.github.com/repos/9fans/plan9port/pulls{/number}","milestones_url":"https://api.github.com/repos/9fans/plan9port/milestones{/number}","notifications_url":"https://api.github.com/repos/9fans/plan9port/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/9fans/plan9port/labels{/name}","releases_url":"https://api.github.com/repos/9fans/plan9port/releases{/id}","deployments_url":"https://api.github.com/repos/9fans/plan9port/deployments","created_at":"2014-11-02T22:40:13Z","updated_at":"2018-10-23T06:02:39Z","pushed_at":"2018-10-23T08:13:12Z","git_url":"git://github.com/9fans/plan9port.git","ssh_url":"git@github.com:9fans/plan9port.git","clone_url":"https://github.com/9fans/plan9port.git","svn_url":"https://github.com/9fans/plan9port","homepage":"https://9fans.github.io/plan9port/","size":25833,"stargazers_count":568,"watchers_count":568,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":144,"mirror_url":null,"archived":false,"open_issues_count":94,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":144,"open_issues":94,"watchers":568,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/9fans/plan9port/pulls/194"},"html":{"href":"https://github.com/9fans/plan9port/pull/194"},"issue":{"href":"https://api.github.com/repos/9fans/plan9port/issues/194"},"comments":{"href":"https://api.github.com/repos/9fans/plan9port/issues/194/comments"},"review_comments":{"href":"https://api.github.com/repos/9fans/plan9port/pulls/194/comments"},"review_comment":{"href":"https://api.github.com/repos/9fans/plan9port/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/9fans/plan9port/pulls/194/commits"},"statuses":{"href":"https://api.github.com/repos/9fans/plan9port/statuses/9e381c87637d08760db65129d07ca70ae33cc711"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"jacobvosmaer"}}