{"action":"created","comment":{"url":"https://api.github.com/repos/minio/mc/pulls/comments/74343393","id":74343393,"diff_hunk":"@@ -245,221 +266,422 @@ func doMirror(sURLs mirrorURLs, progressReader *progressBar, accountingReader *a\n \treturn sURLs\n }\n \n-// doPrepareMirrorURLs scans the source URL and prepares a list of objects for mirroring.\n-func doPrepareMirrorURLs(session *sessionV7, isForce bool, isFake bool, isRemove bool, trapCh <-chan bool) {\n-\tsourceURL := session.Header.CommandArgs[0] // first one is source.\n-\ttargetURL := session.Header.CommandArgs[1]\n-\tvar totalBytes int64\n-\tvar totalObjects int\n-\n-\t// Create a session data file to store the processed URLs.\n-\tdataFP := session.NewDataWriter()\n+// Go routine to update session status\n+func (ms *mirrorSession) startStatus() {\n+\tms.wgStatus.Add(1)\n \n-\tvar scanBar scanBarFunc\n-\tif !globalQuiet && !globalJSON { // set up progress bar\n-\t\tscanBar = scanBarFactory()\n-\t}\n+\tgo func() {\n+\t\tdefer ms.wgStatus.Done()\n \n-\tURLsCh := prepareMirrorURLs(sourceURL, targetURL, isForce, isFake, isRemove)\n-\tdone := false\n-\tfor !done {\n-\t\tselect {\n-\t\tcase sURLs, ok := <-URLsCh:\n-\t\t\tif !ok { // Done with URL prepration\n-\t\t\t\tdone = true\n-\t\t\t\tbreak\n-\t\t\t}\n+\t\tfor sURLs := range ms.statusCh {\n \t\t\tif sURLs.Error != nil {\n-\t\t\t\t// Print in new line and adjust to top so that we don't print over the ongoing scan bar\n-\t\t\t\tif !globalQuiet && !globalJSON {\n-\t\t\t\t\tconsole.Eraseline()\n-\t\t\t\t}\n-\t\t\t\terrorIf(sURLs.Error.Trace(), \"Unable to prepare URLs for mirroring.\")\n-\t\t\t\tbreak\n-\t\t\t}\n-\t\t\tif sURLs.isEmpty() {\n-\t\t\t\tbreak\n-\t\t\t}\n-\t\t\tjsonData, e := json.Marshal(sURLs)\n-\t\t\tif e != nil {\n-\t\t\t\tsession.Delete()\n-\t\t\t\tfatalIf(probe.NewError(e), \"Unable to marshal URLs into JSON.\")\n-\t\t\t}\n-\t\t\tfmt.Fprintln(dataFP, string(jsonData))\n-\t\t\tif !globalQuiet && !globalJSON {\n-\t\t\t\t// Source content is empty if removal is requested,\n-\t\t\t\t// put targetContent on to scan bar.\n+\t\t\t\t// Print in new line and adjust to top so that we\n+\t\t\t\t// don't print over the ongoing progress bar.\n \t\t\t\tif sURLs.SourceContent != nil {\n-\t\t\t\t\tscanBar(sURLs.SourceContent.URL.String())\n-\t\t\t\t} else if sURLs.TargetContent != nil && isRemove {\n-\t\t\t\t\tscanBar(sURLs.TargetContent.URL.String())\n+\t\t\t\t\terrorIf(sURLs.Error.Trace(sURLs.SourceContent.URL.String()),\n+\t\t\t\t\t\tfmt.Sprintf(\"Failed to copy ‘%s’.\", sURLs.SourceContent.URL.String()))\n+\t\t\t\t} else {\n+\t\t\t\t\t// When sURLs.SourceContent is nil, we know that we have an error related to removing\n+\t\t\t\t\terrorIf(sURLs.Error.Trace(sURLs.TargetContent.URL.String()),\n+\t\t\t\t\t\tfmt.Sprintf(\"Failed to remove ‘%s’.\", sURLs.TargetContent.URL.String()))\n+\t\t\t\t}\n+\n+\t\t\t\t// For all non critical errors we can continue for the\n+\t\t\t\t// remaining files.\n+\t\t\t\tswitch sURLs.Error.ToGoError().(type) {\n+\t\t\t\t// Handle this specifically for filesystem related errors.\n+\t\t\t\tcase BrokenSymlink, TooManyLevelsSymlink, PathNotFound, PathInsufficientPermission:\n+\t\t\t\t\tcontinue\n+\t\t\t\t// Handle these specifically for object storage related errors.\n+\t\t\t\tcase BucketNameEmpty, ObjectMissing, ObjectAlreadyExists, ObjectAlreadyExistsAsDirectory, BucketDoesNotExist, BucketInvalid, ObjectOnGlacier:\n+\t\t\t\t\tcontinue\n \t\t\t\t}\n+\n+\t\t\t\t// For critical errors we should exit. Session\n+\t\t\t\t// can be resumed after the user figures out\n+\t\t\t\t// the  problem. We know that\n+\t\t\t\t// there are no current copy actions, because\n+\t\t\t\t// we're not multi threading now.\n+\n+\t\t\t\t// this issue could be separated using separate\n+\t\t\t\t// error channel instead of using sURLs.Error\n+\t\t\t\tms.CloseAndDie()\n+\t\t\t}\n+\n+\t\t\t// finished harvesting urls, save queue to session data\n+\t\t\tif err := ms.queue.Save(ms.NewDataWriter()); err != nil {\n+\t\t\t\tms.status.fatalIf(probe.NewError(err), \"Unable to save queue.\")\n \t\t\t}\n-\t\t\t// Remember totalBytes only for mirror not for removal,\n+\n \t\t\tif sURLs.SourceContent != nil {\n-\t\t\t\ttotalBytes += sURLs.SourceContent.Size\n+\t\t\t\tms.Header.LastCopied = sURLs.SourceContent.URL.String()\n+\t\t\t} else if sURLs.TargetContent != nil {\n+\t\t\t\tms.Header.LastRemoved = sURLs.TargetContent.URL.String()\n \t\t\t}\n-\t\t\ttotalObjects++\n-\t\tcase <-trapCh:\n-\t\t\t// Print in new line and adjust to top so that we don't print over the ongoing scan bar\n-\t\t\tif !globalQuiet && !globalJSON {\n-\t\t\t\tconsole.Eraseline()\n+\n+\t\t\tms.Save()\n+\n+\t\t\tif sURLs.SourceContent != nil {\n+\t\t\t} else if sURLs.TargetContent != nil {\n+\t\t\t\t// Construct user facing message and path.\n+\t\t\t\ttargetPath := filepath.ToSlash(filepath.Join(sURLs.TargetAlias, sURLs.TargetContent.URL.Path))\n+\t\t\t\tms.status.PrintMsg(rmMessage{\n+\t\t\t\t\tStatus: \"success\",\n+\t\t\t\t\tURL:    targetPath,\n+\t\t\t\t})\n \t\t\t}\n-\t\t\tsession.Delete() // If we are interrupted during the URL scanning, we drop the session.\n-\t\t\tos.Exit(0)\n \t\t}\n-\t}\n-\tsession.Header.TotalBytes = totalBytes\n-\tsession.Header.TotalObjects = totalObjects\n-\tsession.Save()\n+\t}()\n }\n \n-// Session'fied mirror command.\n-func doMirrorSession(session *sessionV7) {\n-\tisForce := session.Header.CommandBoolFlags[\"force\"]\n-\tisFake := session.Header.CommandBoolFlags[\"fake\"]\n-\tisRemove := session.Header.CommandBoolFlags[\"remove\"]\n+func (ms *mirrorSession) startMirror(wait bool) {\n+\tisRemove := ms.Header.CommandBoolFlags[\"remove\"]\n \n-\t// Initialize signal trap.\n-\ttrapCh := signalTrap(os.Interrupt, syscall.SIGTERM)\n+\tms.wgCopy.Add(1)\n \n-\tif !session.HasData() {\n-\t\tdoPrepareMirrorURLs(session, isForce, isFake, isRemove, trapCh)\n-\t}\n+\tgo func() {\n+\t\tdefer ms.wgCopy.Done()\n \n-\t// Enable accounting reader by default.\n-\taccntReader := newAccounter(session.Header.TotalBytes)\n+\t\tfor {\n+\t\t\tif !wait {\n+\t\t\t} else if err := ms.queue.Wait(); err != nil {\n+\t\t\t\tbreak\n+\t\t\t}\n \n-\t// Set up progress bar.\n-\tvar progressReader *progressBar\n-\tif !globalQuiet && !globalJSON {\n-\t\tprogressReader = newProgressBar(session.Header.TotalBytes)\n-\t}\n+\t\t\tv := ms.queue.Pop()\n+\t\t\tif v == nil {\n+\t\t\t\tbreak\n+\t\t\t}\n+\n+\t\t\tsURLs := v.(mirrorURLs)","path":"mirror-main.go","position":313,"original_position":313,"commit_id":"d413db6281c87d94d405f452dcbd8b9c525f9eba","original_commit_id":"d413db6281c87d94d405f452dcbd8b9c525f9eba","user":{"login":"harshavardhana","id":622699,"avatar_url":"https://avatars.githubusercontent.com/u/622699?v=3","gravatar_id":"","url":"https://api.github.com/users/harshavardhana","html_url":"https://github.com/harshavardhana","followers_url":"https://api.github.com/users/harshavardhana/followers","following_url":"https://api.github.com/users/harshavardhana/following{/other_user}","gists_url":"https://api.github.com/users/harshavardhana/gists{/gist_id}","starred_url":"https://api.github.com/users/harshavardhana/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/harshavardhana/subscriptions","organizations_url":"https://api.github.com/users/harshavardhana/orgs","repos_url":"https://api.github.com/users/harshavardhana/repos","events_url":"https://api.github.com/users/harshavardhana/events{/privacy}","received_events_url":"https://api.github.com/users/harshavardhana/received_events","type":"User","site_admin":false},"body":"Needs proper type assertion here, with 'ok' better we avoid non-typed returns in the first place. ","created_at":"2016-08-10T22:31:16Z","updated_at":"2016-08-10T22:31:16Z","html_url":"https://github.com/minio/mc/pull/1784#discussion_r74343393","pull_request_url":"https://api.github.com/repos/minio/mc/pulls/1784","_links":{"self":{"href":"https://api.github.com/repos/minio/mc/pulls/comments/74343393"},"html":{"href":"https://github.com/minio/mc/pull/1784#discussion_r74343393"},"pull_request":{"href":"https://api.github.com/repos/minio/mc/pulls/1784"}}},"pull_request":{"url":"https://api.github.com/repos/minio/mc/pulls/1784","id":79467132,"html_url":"https://github.com/minio/mc/pull/1784","diff_url":"https://github.com/minio/mc/pull/1784.diff","patch_url":"https://github.com/minio/mc/pull/1784.patch","issue_url":"https://api.github.com/repos/minio/mc/issues/1784","number":1784,"state":"open","locked":false,"title":"async replication support for mirror","user":{"login":"nl5887","id":3748903,"avatar_url":"https://avatars.githubusercontent.com/u/3748903?v=3","gravatar_id":"","url":"https://api.github.com/users/nl5887","html_url":"https://github.com/nl5887","followers_url":"https://api.github.com/users/nl5887/followers","following_url":"https://api.github.com/users/nl5887/following{/other_user}","gists_url":"https://api.github.com/users/nl5887/gists{/gist_id}","starred_url":"https://api.github.com/users/nl5887/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nl5887/subscriptions","organizations_url":"https://api.github.com/users/nl5887/orgs","repos_url":"https://api.github.com/users/nl5887/repos","events_url":"https://api.github.com/users/nl5887/events{/privacy}","received_events_url":"https://api.github.com/users/nl5887/received_events","type":"User","site_admin":false},"body":"resolves minio/mc#1767\r\n\r\n* disk will be monitored for changes, monitoring is client pluggable, so we can use notification for this as well\r\n* refactored code\r\n* needs to be tested thoroughly\r\n","created_at":"2016-07-30T20:29:37Z","updated_at":"2016-08-10T22:31:16Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ac33597a2653832018f5ba0327f26a0a7586316d","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/minio/mc/pulls/1784/commits","review_comments_url":"https://api.github.com/repos/minio/mc/pulls/1784/comments","review_comment_url":"https://api.github.com/repos/minio/mc/pulls/comments{/number}","comments_url":"https://api.github.com/repos/minio/mc/issues/1784/comments","statuses_url":"https://api.github.com/repos/minio/mc/statuses/d413db6281c87d94d405f452dcbd8b9c525f9eba","head":{"label":"dutchcoders:issue-1767","ref":"issue-1767","sha":"d413db6281c87d94d405f452dcbd8b9c525f9eba","user":{"login":"dutchcoders","id":5444419,"avatar_url":"https://avatars.githubusercontent.com/u/5444419?v=3","gravatar_id":"","url":"https://api.github.com/users/dutchcoders","html_url":"https://github.com/dutchcoders","followers_url":"https://api.github.com/users/dutchcoders/followers","following_url":"https://api.github.com/users/dutchcoders/following{/other_user}","gists_url":"https://api.github.com/users/dutchcoders/gists{/gist_id}","starred_url":"https://api.github.com/users/dutchcoders/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dutchcoders/subscriptions","organizations_url":"https://api.github.com/users/dutchcoders/orgs","repos_url":"https://api.github.com/users/dutchcoders/repos","events_url":"https://api.github.com/users/dutchcoders/events{/privacy}","received_events_url":"https://api.github.com/users/dutchcoders/received_events","type":"Organization","site_admin":false},"repo":{"id":62637713,"name":"mc","full_name":"dutchcoders/mc","owner":{"login":"dutchcoders","id":5444419,"avatar_url":"https://avatars.githubusercontent.com/u/5444419?v=3","gravatar_id":"","url":"https://api.github.com/users/dutchcoders","html_url":"https://github.com/dutchcoders","followers_url":"https://api.github.com/users/dutchcoders/followers","following_url":"https://api.github.com/users/dutchcoders/following{/other_user}","gists_url":"https://api.github.com/users/dutchcoders/gists{/gist_id}","starred_url":"https://api.github.com/users/dutchcoders/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dutchcoders/subscriptions","organizations_url":"https://api.github.com/users/dutchcoders/orgs","repos_url":"https://api.github.com/users/dutchcoders/repos","events_url":"https://api.github.com/users/dutchcoders/events{/privacy}","received_events_url":"https://api.github.com/users/dutchcoders/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dutchcoders/mc","description":"Minio Client is a replacement for ls, cp, mkdir, diff and rsync commands for filesystems and object storage.","fork":true,"url":"https://api.github.com/repos/dutchcoders/mc","forks_url":"https://api.github.com/repos/dutchcoders/mc/forks","keys_url":"https://api.github.com/repos/dutchcoders/mc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dutchcoders/mc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dutchcoders/mc/teams","hooks_url":"https://api.github.com/repos/dutchcoders/mc/hooks","issue_events_url":"https://api.github.com/repos/dutchcoders/mc/issues/events{/number}","events_url":"https://api.github.com/repos/dutchcoders/mc/events","assignees_url":"https://api.github.com/repos/dutchcoders/mc/assignees{/user}","branches_url":"https://api.github.com/repos/dutchcoders/mc/branches{/branch}","tags_url":"https://api.github.com/repos/dutchcoders/mc/tags","blobs_url":"https://api.github.com/repos/dutchcoders/mc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dutchcoders/mc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dutchcoders/mc/git/refs{/sha}","trees_url":"https://api.github.com/repos/dutchcoders/mc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dutchcoders/mc/statuses/{sha}","languages_url":"https://api.github.com/repos/dutchcoders/mc/languages","stargazers_url":"https://api.github.com/repos/dutchcoders/mc/stargazers","contributors_url":"https://api.github.com/repos/dutchcoders/mc/contributors","subscribers_url":"https://api.github.com/repos/dutchcoders/mc/subscribers","subscription_url":"https://api.github.com/repos/dutchcoders/mc/subscription","commits_url":"https://api.github.com/repos/dutchcoders/mc/commits{/sha}","git_commits_url":"https://api.github.com/repos/dutchcoders/mc/git/commits{/sha}","comments_url":"https://api.github.com/repos/dutchcoders/mc/comments{/number}","issue_comment_url":"https://api.github.com/repos/dutchcoders/mc/issues/comments{/number}","contents_url":"https://api.github.com/repos/dutchcoders/mc/contents/{+path}","compare_url":"https://api.github.com/repos/dutchcoders/mc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dutchcoders/mc/merges","archive_url":"https://api.github.com/repos/dutchcoders/mc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dutchcoders/mc/downloads","issues_url":"https://api.github.com/repos/dutchcoders/mc/issues{/number}","pulls_url":"https://api.github.com/repos/dutchcoders/mc/pulls{/number}","milestones_url":"https://api.github.com/repos/dutchcoders/mc/milestones{/number}","notifications_url":"https://api.github.com/repos/dutchcoders/mc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dutchcoders/mc/labels{/name}","releases_url":"https://api.github.com/repos/dutchcoders/mc/releases{/id}","deployments_url":"https://api.github.com/repos/dutchcoders/mc/deployments","created_at":"2016-07-05T13:08:54Z","updated_at":"2016-07-05T13:08:55Z","pushed_at":"2016-08-10T08:46:08Z","git_url":"git://github.com/dutchcoders/mc.git","ssh_url":"git@github.com:dutchcoders/mc.git","clone_url":"https://github.com/dutchcoders/mc.git","svn_url":"https://github.com/dutchcoders/mc","homepage":"https://minio.io/downloads/#minio-client","size":7342,"stargazers_count":0,"watchers_count":0,"language":"Go","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":"minio:master","ref":"master","sha":"c9ecd023fa5d3f865adf705524fb041952dfc5f0","user":{"login":"minio","id":695951,"avatar_url":"https://avatars.githubusercontent.com/u/695951?v=3","gravatar_id":"","url":"https://api.github.com/users/minio","html_url":"https://github.com/minio","followers_url":"https://api.github.com/users/minio/followers","following_url":"https://api.github.com/users/minio/following{/other_user}","gists_url":"https://api.github.com/users/minio/gists{/gist_id}","starred_url":"https://api.github.com/users/minio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/minio/subscriptions","organizations_url":"https://api.github.com/users/minio/orgs","repos_url":"https://api.github.com/users/minio/repos","events_url":"https://api.github.com/users/minio/events{/privacy}","received_events_url":"https://api.github.com/users/minio/received_events","type":"Organization","site_admin":false},"repo":{"id":29329884,"name":"mc","full_name":"minio/mc","owner":{"login":"minio","id":695951,"avatar_url":"https://avatars.githubusercontent.com/u/695951?v=3","gravatar_id":"","url":"https://api.github.com/users/minio","html_url":"https://github.com/minio","followers_url":"https://api.github.com/users/minio/followers","following_url":"https://api.github.com/users/minio/following{/other_user}","gists_url":"https://api.github.com/users/minio/gists{/gist_id}","starred_url":"https://api.github.com/users/minio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/minio/subscriptions","organizations_url":"https://api.github.com/users/minio/orgs","repos_url":"https://api.github.com/users/minio/repos","events_url":"https://api.github.com/users/minio/events{/privacy}","received_events_url":"https://api.github.com/users/minio/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/minio/mc","description":"Minio Client is a replacement for ls, cp, mkdir, diff and rsync commands for filesystems and object storage.","fork":false,"url":"https://api.github.com/repos/minio/mc","forks_url":"https://api.github.com/repos/minio/mc/forks","keys_url":"https://api.github.com/repos/minio/mc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/minio/mc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/minio/mc/teams","hooks_url":"https://api.github.com/repos/minio/mc/hooks","issue_events_url":"https://api.github.com/repos/minio/mc/issues/events{/number}","events_url":"https://api.github.com/repos/minio/mc/events","assignees_url":"https://api.github.com/repos/minio/mc/assignees{/user}","branches_url":"https://api.github.com/repos/minio/mc/branches{/branch}","tags_url":"https://api.github.com/repos/minio/mc/tags","blobs_url":"https://api.github.com/repos/minio/mc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/minio/mc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/minio/mc/git/refs{/sha}","trees_url":"https://api.github.com/repos/minio/mc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/minio/mc/statuses/{sha}","languages_url":"https://api.github.com/repos/minio/mc/languages","stargazers_url":"https://api.github.com/repos/minio/mc/stargazers","contributors_url":"https://api.github.com/repos/minio/mc/contributors","subscribers_url":"https://api.github.com/repos/minio/mc/subscribers","subscription_url":"https://api.github.com/repos/minio/mc/subscription","commits_url":"https://api.github.com/repos/minio/mc/commits{/sha}","git_commits_url":"https://api.github.com/repos/minio/mc/git/commits{/sha}","comments_url":"https://api.github.com/repos/minio/mc/comments{/number}","issue_comment_url":"https://api.github.com/repos/minio/mc/issues/comments{/number}","contents_url":"https://api.github.com/repos/minio/mc/contents/{+path}","compare_url":"https://api.github.com/repos/minio/mc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/minio/mc/merges","archive_url":"https://api.github.com/repos/minio/mc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/minio/mc/downloads","issues_url":"https://api.github.com/repos/minio/mc/issues{/number}","pulls_url":"https://api.github.com/repos/minio/mc/pulls{/number}","milestones_url":"https://api.github.com/repos/minio/mc/milestones{/number}","notifications_url":"https://api.github.com/repos/minio/mc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/minio/mc/labels{/name}","releases_url":"https://api.github.com/repos/minio/mc/releases{/id}","deployments_url":"https://api.github.com/repos/minio/mc/deployments","created_at":"2015-01-16T02:56:51Z","updated_at":"2016-08-10T16:10:52Z","pushed_at":"2016-08-10T11:27:37Z","git_url":"git://github.com/minio/mc.git","ssh_url":"git@github.com:minio/mc.git","clone_url":"https://github.com/minio/mc.git","svn_url":"https://github.com/minio/mc","homepage":"https://minio.io/downloads/#minio-client","size":7571,"stargazers_count":296,"watchers_count":296,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":38,"mirror_url":null,"open_issues_count":8,"forks":38,"open_issues":8,"watchers":296,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/minio/mc/pulls/1784"},"html":{"href":"https://github.com/minio/mc/pull/1784"},"issue":{"href":"https://api.github.com/repos/minio/mc/issues/1784"},"comments":{"href":"https://api.github.com/repos/minio/mc/issues/1784/comments"},"review_comments":{"href":"https://api.github.com/repos/minio/mc/pulls/1784/comments"},"review_comment":{"href":"https://api.github.com/repos/minio/mc/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/minio/mc/pulls/1784/commits"},"statuses":{"href":"https://api.github.com/repos/minio/mc/statuses/d413db6281c87d94d405f452dcbd8b9c525f9eba"}}}}
{"actor":{"display_login":"harshavardhana"}}