{"action":"closed","number":889,"pull_request":{"url":"https://api.github.com/repos/foosel/OctoPrint/pulls/889","id":35095123,"node_id":"MDExOlB1bGxSZXF1ZXN0MzUwOTUxMjM=","html_url":"https://github.com/foosel/OctoPrint/pull/889","diff_url":"https://github.com/foosel/OctoPrint/pull/889.diff","patch_url":"https://github.com/foosel/OctoPrint/pull/889.patch","issue_url":"https://api.github.com/repos/foosel/OctoPrint/issues/889","number":889,"state":"closed","locked":false,"title":"[WIP] Initial SDCardFileStorage implementation of StorageInterface","user":{"login":"markwal","id":10781013,"node_id":"MDQ6VXNlcjEwNzgxMDEz","avatar_url":"https://avatars1.githubusercontent.com/u/10781013?v=4","gravatar_id":"","url":"https://api.github.com/users/markwal","html_url":"https://github.com/markwal","followers_url":"https://api.github.com/users/markwal/followers","following_url":"https://api.github.com/users/markwal/following{/other_user}","gists_url":"https://api.github.com/users/markwal/gists{/gist_id}","starred_url":"https://api.github.com/users/markwal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/markwal/subscriptions","organizations_url":"https://api.github.com/users/markwal/orgs","repos_url":"https://api.github.com/users/markwal/repos","events_url":"https://api.github.com/users/markwal/events{/privacy}","received_events_url":"https://api.github.com/users/markwal/received_events","type":"User","site_admin":false},"body":"This isn't really ready for a pull. I just created it to continue the conversation on issue #851 with some code.\n\nThis initial change is intended to create a StorageInterface\nimplementation for the sdcard. At this point it doesn't attempt to\nchange any functionality outside of that already supported for SD cards,\njust change the code flow through the fileManager.\n\nIs this the direction you were talking about in issue #851?  What way\nwould you prefer to handle the unsupported (yet) functionality.\nNotImplemented as here or with io.Unsupported as specified for some?\n\nAlso, note how I've got this calling back through the fileManager for\nLOCAL storage on upload. Should it work this way or should it be a\nsubclass of LocalFileStorage or some other structure? To do some of the\nother StorageInterface, more of it will want to rely on the\nLocalFileStorage, I think.\n\nPerhaps the SDCardFileStorage should create its own LocalFileStorage at\na different base path as an SDCard shadow to do some of the metadata,\netc. As an actual mirror rather than just for upload, it would be more\nreliable for some of the metadata, analysis purposes. It could also be\nenhanced if firmwares were willing to give us a hash for comparison (to\navoid streaming the file to check).\n","created_at":"2015-05-11T03:04:24Z","updated_at":"2018-12-19T12:50:52Z","closed_at":"2018-12-19T12:50:52Z","merged_at":null,"merge_commit_sha":"c8e2410d01698b000b804ad4e4d9db1836fab492","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":557039014,"node_id":"MDU6TGFiZWw1NTcwMzkwMTQ=","url":"https://api.github.com/repos/foosel/OctoPrint/labels/pr:work%20in%20progress","name":"pr:work in progress","color":"fef2c0","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/foosel/OctoPrint/pulls/889/commits","review_comments_url":"https://api.github.com/repos/foosel/OctoPrint/pulls/889/comments","review_comment_url":"https://api.github.com/repos/foosel/OctoPrint/pulls/comments{/number}","comments_url":"https://api.github.com/repos/foosel/OctoPrint/issues/889/comments","statuses_url":"https://api.github.com/repos/foosel/OctoPrint/statuses/a26b975b800fdf37f42f1d505866fc295cf6b5e9","head":{"label":"markwal:sdcardstorage","ref":"sdcardstorage","sha":"a26b975b800fdf37f42f1d505866fc295cf6b5e9","user":{"login":"markwal","id":10781013,"node_id":"MDQ6VXNlcjEwNzgxMDEz","avatar_url":"https://avatars1.githubusercontent.com/u/10781013?v=4","gravatar_id":"","url":"https://api.github.com/users/markwal","html_url":"https://github.com/markwal","followers_url":"https://api.github.com/users/markwal/followers","following_url":"https://api.github.com/users/markwal/following{/other_user}","gists_url":"https://api.github.com/users/markwal/gists{/gist_id}","starred_url":"https://api.github.com/users/markwal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/markwal/subscriptions","organizations_url":"https://api.github.com/users/markwal/orgs","repos_url":"https://api.github.com/users/markwal/repos","events_url":"https://api.github.com/users/markwal/events{/privacy}","received_events_url":"https://api.github.com/users/markwal/received_events","type":"User","site_admin":false},"repo":{"id":32898680,"node_id":"MDEwOlJlcG9zaXRvcnkzMjg5ODY4MA==","name":"OctoPrint","full_name":"markwal/OctoPrint","private":false,"owner":{"login":"markwal","id":10781013,"node_id":"MDQ6VXNlcjEwNzgxMDEz","avatar_url":"https://avatars1.githubusercontent.com/u/10781013?v=4","gravatar_id":"","url":"https://api.github.com/users/markwal","html_url":"https://github.com/markwal","followers_url":"https://api.github.com/users/markwal/followers","following_url":"https://api.github.com/users/markwal/following{/other_user}","gists_url":"https://api.github.com/users/markwal/gists{/gist_id}","starred_url":"https://api.github.com/users/markwal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/markwal/subscriptions","organizations_url":"https://api.github.com/users/markwal/orgs","repos_url":"https://api.github.com/users/markwal/repos","events_url":"https://api.github.com/users/markwal/events{/privacy}","received_events_url":"https://api.github.com/users/markwal/received_events","type":"User","site_admin":false},"html_url":"https://github.com/markwal/OctoPrint","description":"OctoPrint provides a responsive web interface for controlling a 3D printer (RepRap, Ultimaker, ...).","fork":true,"url":"https://api.github.com/repos/markwal/OctoPrint","forks_url":"https://api.github.com/repos/markwal/OctoPrint/forks","keys_url":"https://api.github.com/repos/markwal/OctoPrint/keys{/key_id}","collaborators_url":"https://api.github.com/repos/markwal/OctoPrint/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/markwal/OctoPrint/teams","hooks_url":"https://api.github.com/repos/markwal/OctoPrint/hooks","issue_events_url":"https://api.github.com/repos/markwal/OctoPrint/issues/events{/number}","events_url":"https://api.github.com/repos/markwal/OctoPrint/events","assignees_url":"https://api.github.com/repos/markwal/OctoPrint/assignees{/user}","branches_url":"https://api.github.com/repos/markwal/OctoPrint/branches{/branch}","tags_url":"https://api.github.com/repos/markwal/OctoPrint/tags","blobs_url":"https://api.github.com/repos/markwal/OctoPrint/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/markwal/OctoPrint/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/markwal/OctoPrint/git/refs{/sha}","trees_url":"https://api.github.com/repos/markwal/OctoPrint/git/trees{/sha}","statuses_url":"https://api.github.com/repos/markwal/OctoPrint/statuses/{sha}","languages_url":"https://api.github.com/repos/markwal/OctoPrint/languages","stargazers_url":"https://api.github.com/repos/markwal/OctoPrint/stargazers","contributors_url":"https://api.github.com/repos/markwal/OctoPrint/contributors","subscribers_url":"https://api.github.com/repos/markwal/OctoPrint/subscribers","subscription_url":"https://api.github.com/repos/markwal/OctoPrint/subscription","commits_url":"https://api.github.com/repos/markwal/OctoPrint/commits{/sha}","git_commits_url":"https://api.github.com/repos/markwal/OctoPrint/git/commits{/sha}","comments_url":"https://api.github.com/repos/markwal/OctoPrint/comments{/number}","issue_comment_url":"https://api.github.com/repos/markwal/OctoPrint/issues/comments{/number}","contents_url":"https://api.github.com/repos/markwal/OctoPrint/contents/{+path}","compare_url":"https://api.github.com/repos/markwal/OctoPrint/compare/{base}...{head}","merges_url":"https://api.github.com/repos/markwal/OctoPrint/merges","archive_url":"https://api.github.com/repos/markwal/OctoPrint/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/markwal/OctoPrint/downloads","issues_url":"https://api.github.com/repos/markwal/OctoPrint/issues{/number}","pulls_url":"https://api.github.com/repos/markwal/OctoPrint/pulls{/number}","milestones_url":"https://api.github.com/repos/markwal/OctoPrint/milestones{/number}","notifications_url":"https://api.github.com/repos/markwal/OctoPrint/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/markwal/OctoPrint/labels{/name}","releases_url":"https://api.github.com/repos/markwal/OctoPrint/releases{/id}","deployments_url":"https://api.github.com/repos/markwal/OctoPrint/deployments","created_at":"2015-03-26T00:24:49Z","updated_at":"2015-05-06T21:09:41Z","pushed_at":"2017-07-10T09:07:44Z","git_url":"git://github.com/markwal/OctoPrint.git","ssh_url":"git@github.com:markwal/OctoPrint.git","clone_url":"https://github.com/markwal/OctoPrint.git","svn_url":"https://github.com/markwal/OctoPrint","homepage":"http://octoprint.org","size":56094,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"devel"}},"base":{"label":"foosel:devel","ref":"devel","sha":"aa6998ec5e9c99ce2b41538037d86d68f4edd153","user":{"login":"foosel","id":83657,"node_id":"MDQ6VXNlcjgzNjU3","avatar_url":"https://avatars0.githubusercontent.com/u/83657?v=4","gravatar_id":"","url":"https://api.github.com/users/foosel","html_url":"https://github.com/foosel","followers_url":"https://api.github.com/users/foosel/followers","following_url":"https://api.github.com/users/foosel/following{/other_user}","gists_url":"https://api.github.com/users/foosel/gists{/gist_id}","starred_url":"https://api.github.com/users/foosel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/foosel/subscriptions","organizations_url":"https://api.github.com/users/foosel/orgs","repos_url":"https://api.github.com/users/foosel/repos","events_url":"https://api.github.com/users/foosel/events{/privacy}","received_events_url":"https://api.github.com/users/foosel/received_events","type":"User","site_admin":false},"repo":{"id":7386799,"node_id":"MDEwOlJlcG9zaXRvcnk3Mzg2Nzk5","name":"OctoPrint","full_name":"foosel/OctoPrint","private":false,"owner":{"login":"foosel","id":83657,"node_id":"MDQ6VXNlcjgzNjU3","avatar_url":"https://avatars0.githubusercontent.com/u/83657?v=4","gravatar_id":"","url":"https://api.github.com/users/foosel","html_url":"https://github.com/foosel","followers_url":"https://api.github.com/users/foosel/followers","following_url":"https://api.github.com/users/foosel/following{/other_user}","gists_url":"https://api.github.com/users/foosel/gists{/gist_id}","starred_url":"https://api.github.com/users/foosel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/foosel/subscriptions","organizations_url":"https://api.github.com/users/foosel/orgs","repos_url":"https://api.github.com/users/foosel/repos","events_url":"https://api.github.com/users/foosel/events{/privacy}","received_events_url":"https://api.github.com/users/foosel/received_events","type":"User","site_admin":false},"html_url":"https://github.com/foosel/OctoPrint","description":"OctoPrint is the snappy web interface for your 3D printer!","fork":false,"url":"https://api.github.com/repos/foosel/OctoPrint","forks_url":"https://api.github.com/repos/foosel/OctoPrint/forks","keys_url":"https://api.github.com/repos/foosel/OctoPrint/keys{/key_id}","collaborators_url":"https://api.github.com/repos/foosel/OctoPrint/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/foosel/OctoPrint/teams","hooks_url":"https://api.github.com/repos/foosel/OctoPrint/hooks","issue_events_url":"https://api.github.com/repos/foosel/OctoPrint/issues/events{/number}","events_url":"https://api.github.com/repos/foosel/OctoPrint/events","assignees_url":"https://api.github.com/repos/foosel/OctoPrint/assignees{/user}","branches_url":"https://api.github.com/repos/foosel/OctoPrint/branches{/branch}","tags_url":"https://api.github.com/repos/foosel/OctoPrint/tags","blobs_url":"https://api.github.com/repos/foosel/OctoPrint/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/foosel/OctoPrint/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/foosel/OctoPrint/git/refs{/sha}","trees_url":"https://api.github.com/repos/foosel/OctoPrint/git/trees{/sha}","statuses_url":"https://api.github.com/repos/foosel/OctoPrint/statuses/{sha}","languages_url":"https://api.github.com/repos/foosel/OctoPrint/languages","stargazers_url":"https://api.github.com/repos/foosel/OctoPrint/stargazers","contributors_url":"https://api.github.com/repos/foosel/OctoPrint/contributors","subscribers_url":"https://api.github.com/repos/foosel/OctoPrint/subscribers","subscription_url":"https://api.github.com/repos/foosel/OctoPrint/subscription","commits_url":"https://api.github.com/repos/foosel/OctoPrint/commits{/sha}","git_commits_url":"https://api.github.com/repos/foosel/OctoPrint/git/commits{/sha}","comments_url":"https://api.github.com/repos/foosel/OctoPrint/comments{/number}","issue_comment_url":"https://api.github.com/repos/foosel/OctoPrint/issues/comments{/number}","contents_url":"https://api.github.com/repos/foosel/OctoPrint/contents/{+path}","compare_url":"https://api.github.com/repos/foosel/OctoPrint/compare/{base}...{head}","merges_url":"https://api.github.com/repos/foosel/OctoPrint/merges","archive_url":"https://api.github.com/repos/foosel/OctoPrint/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/foosel/OctoPrint/downloads","issues_url":"https://api.github.com/repos/foosel/OctoPrint/issues{/number}","pulls_url":"https://api.github.com/repos/foosel/OctoPrint/pulls{/number}","milestones_url":"https://api.github.com/repos/foosel/OctoPrint/milestones{/number}","notifications_url":"https://api.github.com/repos/foosel/OctoPrint/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/foosel/OctoPrint/labels{/name}","releases_url":"https://api.github.com/repos/foosel/OctoPrint/releases{/id}","deployments_url":"https://api.github.com/repos/foosel/OctoPrint/deployments","created_at":"2012-12-31T12:20:57Z","updated_at":"2018-12-19T02:40:09Z","pushed_at":"2018-12-19T12:37:54Z","git_url":"git://github.com/foosel/OctoPrint.git","ssh_url":"git@github.com:foosel/OctoPrint.git","clone_url":"https://github.com/foosel/OctoPrint.git","svn_url":"https://github.com/foosel/OctoPrint","homepage":"https://octoprint.org","size":36508,"stargazers_count":3159,"watchers_count":3159,"language":"Python","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1055,"mirror_url":null,"archived":false,"open_issues_count":317,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":1055,"open_issues":317,"watchers":3159,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/foosel/OctoPrint/pulls/889"},"html":{"href":"https://github.com/foosel/OctoPrint/pull/889"},"issue":{"href":"https://api.github.com/repos/foosel/OctoPrint/issues/889"},"comments":{"href":"https://api.github.com/repos/foosel/OctoPrint/issues/889/comments"},"review_comments":{"href":"https://api.github.com/repos/foosel/OctoPrint/pulls/889/comments"},"review_comment":{"href":"https://api.github.com/repos/foosel/OctoPrint/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/foosel/OctoPrint/pulls/889/commits"},"statuses":{"href":"https://api.github.com/repos/foosel/OctoPrint/statuses/a26b975b800fdf37f42f1d505866fc295cf6b5e9"}},"author_association":"COLLABORATOR","merged":false,"mergeable":false,"rebaseable":false,"mergeable_state":"dirty","merged_by":null,"comments":1,"review_comments":0,"maintainer_can_modify":false,"commits":2,"additions":206,"deletions":95,"changed_files":5}}
{"actor":{"display_login":"foosel"}}