{"action":"created","comment":{"url":"https://api.github.com/repos/Sonarr/Sonarr/pulls/comments/25317158","id":25317158,"diff_hunk":"@@ -25,13 +25,9 @@ public interface IDiskProvider\n         long GetFolderSize(string path);\n         long GetFileSize(string path);\n         void CreateFolder(string path);\n-        void CopyFolder(string source, string destination);\n-        void MoveFolder(string source, string destination);\n-        void TransferFolder(string source, string destination, TransferMode transferMode);\n         void DeleteFile(string path);\n-        void CopyFile(string source, string destination, bool overwrite = false);\n-        void MoveFile(string source, string destination, bool overwrite = false);\n-        TransferMode TransferFile(string source, string destination, TransferMode transferMode, bool overwrite = false);\n+        void CopySingleFile(string source, string destination, bool overwrite = false);\n+        void MoveSingleFile(string source, string destination, bool overwrite = false);","path":"src/NzbDrone.Common/Disk/IDiskProvider.cs","position":12,"original_position":12,"commit_id":"16efed24f03b64e2e747ee5c5832477a900b5169","original_commit_id":"16efed24f03b64e2e747ee5c5832477a900b5169","user":{"login":"kayone","id":412280,"avatar_url":"https://avatars.githubusercontent.com/u/412280?v=3","gravatar_id":"","url":"https://api.github.com/users/kayone","html_url":"https://github.com/kayone","followers_url":"https://api.github.com/users/kayone/followers","following_url":"https://api.github.com/users/kayone/following{/other_user}","gists_url":"https://api.github.com/users/kayone/gists{/gist_id}","starred_url":"https://api.github.com/users/kayone/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kayone/subscriptions","organizations_url":"https://api.github.com/users/kayone/orgs","repos_url":"https://api.github.com/users/kayone/repos","events_url":"https://api.github.com/users/kayone/events{/privacy}","received_events_url":"https://api.github.com/users/kayone/received_events","type":"User","site_admin":false},"body":"Why not `CopyFile`, `MoveFile`?","created_at":"2015-02-25T04:18:35Z","updated_at":"2015-02-25T04:18:35Z","html_url":"https://github.com/Sonarr/Sonarr/pull/139#discussion_r25317158","pull_request_url":"https://api.github.com/repos/Sonarr/Sonarr/pulls/139","_links":{"self":{"href":"https://api.github.com/repos/Sonarr/Sonarr/pulls/comments/25317158"},"html":{"href":"https://github.com/Sonarr/Sonarr/pull/139#discussion_r25317158"},"pull_request":{"href":"https://api.github.com/repos/Sonarr/Sonarr/pulls/139"}}},"pull_request":{"url":"https://api.github.com/repos/Sonarr/Sonarr/pulls/139","id":24494888,"html_url":"https://github.com/Sonarr/Sonarr/pull/139","diff_url":"https://github.com/Sonarr/Sonarr/pull/139.diff","patch_url":"https://github.com/Sonarr/Sonarr/pull/139.patch","issue_url":"https://api.github.com/repos/Sonarr/Sonarr/issues/139","number":139,"state":"open","locked":false,"title":"Verified file transfer","user":{"login":"Taloth","id":6383890,"avatar_url":"https://avatars.githubusercontent.com/u/6383890?v=3","gravatar_id":"","url":"https://api.github.com/users/Taloth","html_url":"https://github.com/Taloth","followers_url":"https://api.github.com/users/Taloth/followers","following_url":"https://api.github.com/users/Taloth/following{/other_user}","gists_url":"https://api.github.com/users/Taloth/gists{/gist_id}","starred_url":"https://api.github.com/users/Taloth/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Taloth/subscriptions","organizations_url":"https://api.github.com/users/Taloth/orgs","repos_url":"https://api.github.com/users/Taloth/repos","events_url":"https://api.github.com/users/Taloth/events{/privacy}","received_events_url":"https://api.github.com/users/Taloth/received_events","type":"User","site_admin":false},"body":"Episode moves now include filesize checks.\r\nBasically the procedure is as follows:\r\n- If a hardlink was requested, try the hardlink first revert to copy if that fails. (this is what was done already)\r\n- If a copy, do the copy and compare the filesizes, retry 2 times if wrong, throws IOException if it still fails.\r\n- If a move a couple of steps:\r\n\r\n\r\n1. make a hardlink to '{filename}.movebackup' in same directory. If fails, skip to 3.\r\n2. Move that backup file to the destination and compare the filesizes. If succeeds, delete original and exit.\r\n3. Delete backup file if created. Then do a Copy like before, 2 retries at the most.\r\n4. Delete original if succeeded, throw IOException if failed.\r\n\r\nThe goal of this procedure is to detect CIFS errors. Another method would be to revert to read and write the file streams from .net directly, to append missing bytes, but I didn't want to do that at this point.\r\nSo if a copy fails, delete the partial destination and retry, instead of appending the missing bytes.\r\n\r\nI had to include 1 commit from the torrent branch which adds hardlink support.\r\n\r\nI opted to create a separate service for all this instead of embedding it in the DiskProvider, mainly because this makes it possible to have unit tests for it.","created_at":"2014-11-15T22:24:20Z","updated_at":"2015-02-25T04:18:35Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0161c50ce9764eb867682d32242b88f649639ee7","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Sonarr/Sonarr/pulls/139/commits","review_comments_url":"https://api.github.com/repos/Sonarr/Sonarr/pulls/139/comments","review_comment_url":"https://api.github.com/repos/Sonarr/Sonarr/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Sonarr/Sonarr/issues/139/comments","statuses_url":"https://api.github.com/repos/Sonarr/Sonarr/statuses/16efed24f03b64e2e747ee5c5832477a900b5169","head":{"label":"Sonarr:verified-file-transfer","ref":"verified-file-transfer","sha":"16efed24f03b64e2e747ee5c5832477a900b5169","user":{"login":"Sonarr","id":1082903,"avatar_url":"https://avatars.githubusercontent.com/u/1082903?v=3","gravatar_id":"","url":"https://api.github.com/users/Sonarr","html_url":"https://github.com/Sonarr","followers_url":"https://api.github.com/users/Sonarr/followers","following_url":"https://api.github.com/users/Sonarr/following{/other_user}","gists_url":"https://api.github.com/users/Sonarr/gists{/gist_id}","starred_url":"https://api.github.com/users/Sonarr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Sonarr/subscriptions","organizations_url":"https://api.github.com/users/Sonarr/orgs","repos_url":"https://api.github.com/users/Sonarr/repos","events_url":"https://api.github.com/users/Sonarr/events{/privacy}","received_events_url":"https://api.github.com/users/Sonarr/received_events","type":"Organization","site_admin":false},"repo":{"id":2465723,"name":"Sonarr","full_name":"Sonarr/Sonarr","owner":{"login":"Sonarr","id":1082903,"avatar_url":"https://avatars.githubusercontent.com/u/1082903?v=3","gravatar_id":"","url":"https://api.github.com/users/Sonarr","html_url":"https://github.com/Sonarr","followers_url":"https://api.github.com/users/Sonarr/followers","following_url":"https://api.github.com/users/Sonarr/following{/other_user}","gists_url":"https://api.github.com/users/Sonarr/gists{/gist_id}","starred_url":"https://api.github.com/users/Sonarr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Sonarr/subscriptions","organizations_url":"https://api.github.com/users/Sonarr/orgs","repos_url":"https://api.github.com/users/Sonarr/repos","events_url":"https://api.github.com/users/Sonarr/events{/privacy}","received_events_url":"https://api.github.com/users/Sonarr/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Sonarr/Sonarr","description":"Smart PVR for newsgroup and bittorrent users.","fork":false,"url":"https://api.github.com/repos/Sonarr/Sonarr","forks_url":"https://api.github.com/repos/Sonarr/Sonarr/forks","keys_url":"https://api.github.com/repos/Sonarr/Sonarr/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Sonarr/Sonarr/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Sonarr/Sonarr/teams","hooks_url":"https://api.github.com/repos/Sonarr/Sonarr/hooks","issue_events_url":"https://api.github.com/repos/Sonarr/Sonarr/issues/events{/number}","events_url":"https://api.github.com/repos/Sonarr/Sonarr/events","assignees_url":"https://api.github.com/repos/Sonarr/Sonarr/assignees{/user}","branches_url":"https://api.github.com/repos/Sonarr/Sonarr/branches{/branch}","tags_url":"https://api.github.com/repos/Sonarr/Sonarr/tags","blobs_url":"https://api.github.com/repos/Sonarr/Sonarr/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Sonarr/Sonarr/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Sonarr/Sonarr/git/refs{/sha}","trees_url":"https://api.github.com/repos/Sonarr/Sonarr/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Sonarr/Sonarr/statuses/{sha}","languages_url":"https://api.github.com/repos/Sonarr/Sonarr/languages","stargazers_url":"https://api.github.com/repos/Sonarr/Sonarr/stargazers","contributors_url":"https://api.github.com/repos/Sonarr/Sonarr/contributors","subscribers_url":"https://api.github.com/repos/Sonarr/Sonarr/subscribers","subscription_url":"https://api.github.com/repos/Sonarr/Sonarr/subscription","commits_url":"https://api.github.com/repos/Sonarr/Sonarr/commits{/sha}","git_commits_url":"https://api.github.com/repos/Sonarr/Sonarr/git/commits{/sha}","comments_url":"https://api.github.com/repos/Sonarr/Sonarr/comments{/number}","issue_comment_url":"https://api.github.com/repos/Sonarr/Sonarr/issues/comments{/number}","contents_url":"https://api.github.com/repos/Sonarr/Sonarr/contents/{+path}","compare_url":"https://api.github.com/repos/Sonarr/Sonarr/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Sonarr/Sonarr/merges","archive_url":"https://api.github.com/repos/Sonarr/Sonarr/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Sonarr/Sonarr/downloads","issues_url":"https://api.github.com/repos/Sonarr/Sonarr/issues{/number}","pulls_url":"https://api.github.com/repos/Sonarr/Sonarr/pulls{/number}","milestones_url":"https://api.github.com/repos/Sonarr/Sonarr/milestones{/number}","notifications_url":"https://api.github.com/repos/Sonarr/Sonarr/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Sonarr/Sonarr/labels{/name}","releases_url":"https://api.github.com/repos/Sonarr/Sonarr/releases{/id}","created_at":"2011-09-27T05:57:16Z","updated_at":"2015-02-25T02:41:10Z","pushed_at":"2015-02-25T02:41:10Z","git_url":"git://github.com/Sonarr/Sonarr.git","ssh_url":"git@github.com:Sonarr/Sonarr.git","clone_url":"https://github.com/Sonarr/Sonarr.git","svn_url":"https://github.com/Sonarr/Sonarr","homepage":"https://sonarr.tv","size":214224,"stargazers_count":428,"watchers_count":428,"language":"C#","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":131,"mirror_url":null,"open_issues_count":10,"forks":131,"open_issues":10,"watchers":428,"default_branch":"develop"}},"base":{"label":"Sonarr:develop","ref":"develop","sha":"aa52a833955e95d9a43ccd316685f56d59102e03","user":{"login":"Sonarr","id":1082903,"avatar_url":"https://avatars.githubusercontent.com/u/1082903?v=3","gravatar_id":"","url":"https://api.github.com/users/Sonarr","html_url":"https://github.com/Sonarr","followers_url":"https://api.github.com/users/Sonarr/followers","following_url":"https://api.github.com/users/Sonarr/following{/other_user}","gists_url":"https://api.github.com/users/Sonarr/gists{/gist_id}","starred_url":"https://api.github.com/users/Sonarr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Sonarr/subscriptions","organizations_url":"https://api.github.com/users/Sonarr/orgs","repos_url":"https://api.github.com/users/Sonarr/repos","events_url":"https://api.github.com/users/Sonarr/events{/privacy}","received_events_url":"https://api.github.com/users/Sonarr/received_events","type":"Organization","site_admin":false},"repo":{"id":2465723,"name":"Sonarr","full_name":"Sonarr/Sonarr","owner":{"login":"Sonarr","id":1082903,"avatar_url":"https://avatars.githubusercontent.com/u/1082903?v=3","gravatar_id":"","url":"https://api.github.com/users/Sonarr","html_url":"https://github.com/Sonarr","followers_url":"https://api.github.com/users/Sonarr/followers","following_url":"https://api.github.com/users/Sonarr/following{/other_user}","gists_url":"https://api.github.com/users/Sonarr/gists{/gist_id}","starred_url":"https://api.github.com/users/Sonarr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Sonarr/subscriptions","organizations_url":"https://api.github.com/users/Sonarr/orgs","repos_url":"https://api.github.com/users/Sonarr/repos","events_url":"https://api.github.com/users/Sonarr/events{/privacy}","received_events_url":"https://api.github.com/users/Sonarr/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Sonarr/Sonarr","description":"Smart PVR for newsgroup and bittorrent users.","fork":false,"url":"https://api.github.com/repos/Sonarr/Sonarr","forks_url":"https://api.github.com/repos/Sonarr/Sonarr/forks","keys_url":"https://api.github.com/repos/Sonarr/Sonarr/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Sonarr/Sonarr/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Sonarr/Sonarr/teams","hooks_url":"https://api.github.com/repos/Sonarr/Sonarr/hooks","issue_events_url":"https://api.github.com/repos/Sonarr/Sonarr/issues/events{/number}","events_url":"https://api.github.com/repos/Sonarr/Sonarr/events","assignees_url":"https://api.github.com/repos/Sonarr/Sonarr/assignees{/user}","branches_url":"https://api.github.com/repos/Sonarr/Sonarr/branches{/branch}","tags_url":"https://api.github.com/repos/Sonarr/Sonarr/tags","blobs_url":"https://api.github.com/repos/Sonarr/Sonarr/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Sonarr/Sonarr/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Sonarr/Sonarr/git/refs{/sha}","trees_url":"https://api.github.com/repos/Sonarr/Sonarr/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Sonarr/Sonarr/statuses/{sha}","languages_url":"https://api.github.com/repos/Sonarr/Sonarr/languages","stargazers_url":"https://api.github.com/repos/Sonarr/Sonarr/stargazers","contributors_url":"https://api.github.com/repos/Sonarr/Sonarr/contributors","subscribers_url":"https://api.github.com/repos/Sonarr/Sonarr/subscribers","subscription_url":"https://api.github.com/repos/Sonarr/Sonarr/subscription","commits_url":"https://api.github.com/repos/Sonarr/Sonarr/commits{/sha}","git_commits_url":"https://api.github.com/repos/Sonarr/Sonarr/git/commits{/sha}","comments_url":"https://api.github.com/repos/Sonarr/Sonarr/comments{/number}","issue_comment_url":"https://api.github.com/repos/Sonarr/Sonarr/issues/comments{/number}","contents_url":"https://api.github.com/repos/Sonarr/Sonarr/contents/{+path}","compare_url":"https://api.github.com/repos/Sonarr/Sonarr/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Sonarr/Sonarr/merges","archive_url":"https://api.github.com/repos/Sonarr/Sonarr/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Sonarr/Sonarr/downloads","issues_url":"https://api.github.com/repos/Sonarr/Sonarr/issues{/number}","pulls_url":"https://api.github.com/repos/Sonarr/Sonarr/pulls{/number}","milestones_url":"https://api.github.com/repos/Sonarr/Sonarr/milestones{/number}","notifications_url":"https://api.github.com/repos/Sonarr/Sonarr/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Sonarr/Sonarr/labels{/name}","releases_url":"https://api.github.com/repos/Sonarr/Sonarr/releases{/id}","created_at":"2011-09-27T05:57:16Z","updated_at":"2015-02-25T02:41:10Z","pushed_at":"2015-02-25T02:41:10Z","git_url":"git://github.com/Sonarr/Sonarr.git","ssh_url":"git@github.com:Sonarr/Sonarr.git","clone_url":"https://github.com/Sonarr/Sonarr.git","svn_url":"https://github.com/Sonarr/Sonarr","homepage":"https://sonarr.tv","size":214224,"stargazers_count":428,"watchers_count":428,"language":"C#","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":131,"mirror_url":null,"open_issues_count":10,"forks":131,"open_issues":10,"watchers":428,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/Sonarr/Sonarr/pulls/139"},"html":{"href":"https://github.com/Sonarr/Sonarr/pull/139"},"issue":{"href":"https://api.github.com/repos/Sonarr/Sonarr/issues/139"},"comments":{"href":"https://api.github.com/repos/Sonarr/Sonarr/issues/139/comments"},"review_comments":{"href":"https://api.github.com/repos/Sonarr/Sonarr/pulls/139/comments"},"review_comment":{"href":"https://api.github.com/repos/Sonarr/Sonarr/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Sonarr/Sonarr/pulls/139/commits"},"statuses":{"href":"https://api.github.com/repos/Sonarr/Sonarr/statuses/16efed24f03b64e2e747ee5c5832477a900b5169"}}}}