{"action":"closed","number":267,"pull_request":{"url":"https://api.github.com/repos/dae/anki/pulls/267","id":239230896,"node_id":"MDExOlB1bGxSZXF1ZXN0MjM5MjMwODk2","html_url":"https://github.com/dae/anki/pull/267","diff_url":"https://github.com/dae/anki/pull/267.diff","patch_url":"https://github.com/dae/anki/pull/267.patch","issue_url":"https://api.github.com/repos/dae/anki/issues/267","number":267,"state":"closed","locked":false,"title":"Use fbs to deploy Anki","user":{"login":"mherrmann","id":1076393,"node_id":"MDQ6VXNlcjEwNzYzOTM=","avatar_url":"https://avatars0.githubusercontent.com/u/1076393?v=4","gravatar_id":"","url":"https://api.github.com/users/mherrmann","html_url":"https://github.com/mherrmann","followers_url":"https://api.github.com/users/mherrmann/followers","following_url":"https://api.github.com/users/mherrmann/following{/other_user}","gists_url":"https://api.github.com/users/mherrmann/gists{/gist_id}","starred_url":"https://api.github.com/users/mherrmann/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mherrmann/subscriptions","organizations_url":"https://api.github.com/users/mherrmann/orgs","repos_url":"https://api.github.com/users/mherrmann/repos","events_url":"https://api.github.com/users/mherrmann/events{/privacy}","received_events_url":"https://api.github.com/users/mherrmann/received_events","type":"User","site_admin":false},"body":"[fbs](https://github.com/mherrmann/fbs) is a build system for deploying PyQt5 apps. It is based on PyInstaller, but takes away the many pains still associated with cross-platform desktop apps based on PyQt5:\r\n\r\n * Packaging missing DLLs and .so files so the frozen app runs on all users' systems\r\n * Creating installers\r\n * Code signing\r\n * Automatic updates\r\n\r\nAt the moment, I believe the main benefit Anki could get from using fbs are native packages for Linux. I'm not familiar with Anki's history, and it seems there were eg. `.deb` files at some point. But the home page currently only offers a `.tar.bz2` file. One of the limitations of this approach is that Anki does not have support for automatic updates. Another is that the lack of integration into the native package manager makes it impossible for users to manage Anki's installation (eg. uninstall it) in a \"standard\" way.\r\n\r\nThis PR is actually not yet implemented, because I wanted to gauge your interest before spending a significant amount of time on it. But, if you are open to using fbs provided my changes are \"clean\", I could complete the PR and add the following \"features\":\r\n\r\n * Native Anki packages for Ubuntu (`.deb`), Arch (`.pkg.tar.xz`) and Fedora/CentOS (`.rpm`).\r\n * Support for automatic updates on the above distributions: Publish a new version of Anki with a single command, and have your users receive it automatically via their native package manager.\r\n\r\nTo get a quick feel of what the solution will look like, please see [this article](https://build-system.fman.io/linux-gui-programming). \r\n\r\nIn the future (or alternatively, if you wish), I can also do the same for Windows and Mac. fbs already supports these platforms, with the current limitation that code signing and automatic updates are not yet implemented. But freezing and uploading work.\r\n\r\nFor a more general introduction to fbs, please see its [tutorial](https://github.com/mherrmann/fbs-tutorial), or the [home page](https://build-system.fman.io).","created_at":"2018-12-17T17:47:53Z","updated_at":"2018-12-20T23:13:54Z","closed_at":"2018-12-20T23:13:54Z","merged_at":null,"merge_commit_sha":"97a1ce0233da80170a8c84ba2285096ec84d49cb","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/dae/anki/pulls/267/commits","review_comments_url":"https://api.github.com/repos/dae/anki/pulls/267/comments","review_comment_url":"https://api.github.com/repos/dae/anki/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dae/anki/issues/267/comments","statuses_url":"https://api.github.com/repos/dae/anki/statuses/fd2c091200a478f524a9d44ccc86405989b77a9c","head":{"label":"mherrmann:master","ref":"master","sha":"fd2c091200a478f524a9d44ccc86405989b77a9c","user":{"login":"mherrmann","id":1076393,"node_id":"MDQ6VXNlcjEwNzYzOTM=","avatar_url":"https://avatars0.githubusercontent.com/u/1076393?v=4","gravatar_id":"","url":"https://api.github.com/users/mherrmann","html_url":"https://github.com/mherrmann","followers_url":"https://api.github.com/users/mherrmann/followers","following_url":"https://api.github.com/users/mherrmann/following{/other_user}","gists_url":"https://api.github.com/users/mherrmann/gists{/gist_id}","starred_url":"https://api.github.com/users/mherrmann/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mherrmann/subscriptions","organizations_url":"https://api.github.com/users/mherrmann/orgs","repos_url":"https://api.github.com/users/mherrmann/repos","events_url":"https://api.github.com/users/mherrmann/events{/privacy}","received_events_url":"https://api.github.com/users/mherrmann/received_events","type":"User","site_admin":false},"repo":{"id":162165360,"node_id":"MDEwOlJlcG9zaXRvcnkxNjIxNjUzNjA=","name":"anki","full_name":"mherrmann/anki","private":false,"owner":{"login":"mherrmann","id":1076393,"node_id":"MDQ6VXNlcjEwNzYzOTM=","avatar_url":"https://avatars0.githubusercontent.com/u/1076393?v=4","gravatar_id":"","url":"https://api.github.com/users/mherrmann","html_url":"https://github.com/mherrmann","followers_url":"https://api.github.com/users/mherrmann/followers","following_url":"https://api.github.com/users/mherrmann/following{/other_user}","gists_url":"https://api.github.com/users/mherrmann/gists{/gist_id}","starred_url":"https://api.github.com/users/mherrmann/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mherrmann/subscriptions","organizations_url":"https://api.github.com/users/mherrmann/orgs","repos_url":"https://api.github.com/users/mherrmann/repos","events_url":"https://api.github.com/users/mherrmann/events{/privacy}","received_events_url":"https://api.github.com/users/mherrmann/received_events","type":"User","site_admin":false},"html_url":"https://github.com/mherrmann/anki","description":"Anki for desktop computers","fork":true,"url":"https://api.github.com/repos/mherrmann/anki","forks_url":"https://api.github.com/repos/mherrmann/anki/forks","keys_url":"https://api.github.com/repos/mherrmann/anki/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mherrmann/anki/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mherrmann/anki/teams","hooks_url":"https://api.github.com/repos/mherrmann/anki/hooks","issue_events_url":"https://api.github.com/repos/mherrmann/anki/issues/events{/number}","events_url":"https://api.github.com/repos/mherrmann/anki/events","assignees_url":"https://api.github.com/repos/mherrmann/anki/assignees{/user}","branches_url":"https://api.github.com/repos/mherrmann/anki/branches{/branch}","tags_url":"https://api.github.com/repos/mherrmann/anki/tags","blobs_url":"https://api.github.com/repos/mherrmann/anki/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mherrmann/anki/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mherrmann/anki/git/refs{/sha}","trees_url":"https://api.github.com/repos/mherrmann/anki/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mherrmann/anki/statuses/{sha}","languages_url":"https://api.github.com/repos/mherrmann/anki/languages","stargazers_url":"https://api.github.com/repos/mherrmann/anki/stargazers","contributors_url":"https://api.github.com/repos/mherrmann/anki/contributors","subscribers_url":"https://api.github.com/repos/mherrmann/anki/subscribers","subscription_url":"https://api.github.com/repos/mherrmann/anki/subscription","commits_url":"https://api.github.com/repos/mherrmann/anki/commits{/sha}","git_commits_url":"https://api.github.com/repos/mherrmann/anki/git/commits{/sha}","comments_url":"https://api.github.com/repos/mherrmann/anki/comments{/number}","issue_comment_url":"https://api.github.com/repos/mherrmann/anki/issues/comments{/number}","contents_url":"https://api.github.com/repos/mherrmann/anki/contents/{+path}","compare_url":"https://api.github.com/repos/mherrmann/anki/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mherrmann/anki/merges","archive_url":"https://api.github.com/repos/mherrmann/anki/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mherrmann/anki/downloads","issues_url":"https://api.github.com/repos/mherrmann/anki/issues{/number}","pulls_url":"https://api.github.com/repos/mherrmann/anki/pulls{/number}","milestones_url":"https://api.github.com/repos/mherrmann/anki/milestones{/number}","notifications_url":"https://api.github.com/repos/mherrmann/anki/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mherrmann/anki/labels{/name}","releases_url":"https://api.github.com/repos/mherrmann/anki/releases{/id}","deployments_url":"https://api.github.com/repos/mherrmann/anki/deployments","created_at":"2018-12-17T17:17:02Z","updated_at":"2018-12-17T17:25:12Z","pushed_at":"2018-12-17T17:25:10Z","git_url":"git://github.com/mherrmann/anki.git","ssh_url":"git@github.com:mherrmann/anki.git","clone_url":"https://github.com/mherrmann/anki.git","svn_url":"https://github.com/mherrmann/anki","homepage":null,"size":4022,"stargazers_count":0,"watchers_count":0,"language":"Python","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":"dae:master","ref":"master","sha":"a6c34fd79f2aa0cc54207de791a0d71bc57a8e74","user":{"login":"dae","id":180542,"node_id":"MDQ6VXNlcjE4MDU0Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/180542?v=4","gravatar_id":"","url":"https://api.github.com/users/dae","html_url":"https://github.com/dae","followers_url":"https://api.github.com/users/dae/followers","following_url":"https://api.github.com/users/dae/following{/other_user}","gists_url":"https://api.github.com/users/dae/gists{/gist_id}","starred_url":"https://api.github.com/users/dae/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dae/subscriptions","organizations_url":"https://api.github.com/users/dae/orgs","repos_url":"https://api.github.com/users/dae/repos","events_url":"https://api.github.com/users/dae/events{/privacy}","received_events_url":"https://api.github.com/users/dae/received_events","type":"User","site_admin":false},"repo":{"id":7270538,"node_id":"MDEwOlJlcG9zaXRvcnk3MjcwNTM4","name":"anki","full_name":"dae/anki","private":false,"owner":{"login":"dae","id":180542,"node_id":"MDQ6VXNlcjE4MDU0Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/180542?v=4","gravatar_id":"","url":"https://api.github.com/users/dae","html_url":"https://github.com/dae","followers_url":"https://api.github.com/users/dae/followers","following_url":"https://api.github.com/users/dae/following{/other_user}","gists_url":"https://api.github.com/users/dae/gists{/gist_id}","starred_url":"https://api.github.com/users/dae/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dae/subscriptions","organizations_url":"https://api.github.com/users/dae/orgs","repos_url":"https://api.github.com/users/dae/repos","events_url":"https://api.github.com/users/dae/events{/privacy}","received_events_url":"https://api.github.com/users/dae/received_events","type":"User","site_admin":false},"html_url":"https://github.com/dae/anki","description":"Anki for desktop computers","fork":false,"url":"https://api.github.com/repos/dae/anki","forks_url":"https://api.github.com/repos/dae/anki/forks","keys_url":"https://api.github.com/repos/dae/anki/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dae/anki/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dae/anki/teams","hooks_url":"https://api.github.com/repos/dae/anki/hooks","issue_events_url":"https://api.github.com/repos/dae/anki/issues/events{/number}","events_url":"https://api.github.com/repos/dae/anki/events","assignees_url":"https://api.github.com/repos/dae/anki/assignees{/user}","branches_url":"https://api.github.com/repos/dae/anki/branches{/branch}","tags_url":"https://api.github.com/repos/dae/anki/tags","blobs_url":"https://api.github.com/repos/dae/anki/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dae/anki/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dae/anki/git/refs{/sha}","trees_url":"https://api.github.com/repos/dae/anki/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dae/anki/statuses/{sha}","languages_url":"https://api.github.com/repos/dae/anki/languages","stargazers_url":"https://api.github.com/repos/dae/anki/stargazers","contributors_url":"https://api.github.com/repos/dae/anki/contributors","subscribers_url":"https://api.github.com/repos/dae/anki/subscribers","subscription_url":"https://api.github.com/repos/dae/anki/subscription","commits_url":"https://api.github.com/repos/dae/anki/commits{/sha}","git_commits_url":"https://api.github.com/repos/dae/anki/git/commits{/sha}","comments_url":"https://api.github.com/repos/dae/anki/comments{/number}","issue_comment_url":"https://api.github.com/repos/dae/anki/issues/comments{/number}","contents_url":"https://api.github.com/repos/dae/anki/contents/{+path}","compare_url":"https://api.github.com/repos/dae/anki/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dae/anki/merges","archive_url":"https://api.github.com/repos/dae/anki/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dae/anki/downloads","issues_url":"https://api.github.com/repos/dae/anki/issues{/number}","pulls_url":"https://api.github.com/repos/dae/anki/pulls{/number}","milestones_url":"https://api.github.com/repos/dae/anki/milestones{/number}","notifications_url":"https://api.github.com/repos/dae/anki/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dae/anki/labels{/name}","releases_url":"https://api.github.com/repos/dae/anki/releases{/id}","deployments_url":"https://api.github.com/repos/dae/anki/deployments","created_at":"2012-12-21T08:03:31Z","updated_at":"2018-12-20T22:49:35Z","pushed_at":"2018-12-18T09:48:46Z","git_url":"git://github.com/dae/anki.git","ssh_url":"git@github.com:dae/anki.git","clone_url":"https://github.com/dae/anki.git","svn_url":"https://github.com/dae/anki","homepage":null,"size":4035,"stargazers_count":4048,"watchers_count":4048,"language":"Python","has_issues":false,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":702,"mirror_url":null,"archived":false,"open_issues_count":3,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":702,"open_issues":3,"watchers":4048,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dae/anki/pulls/267"},"html":{"href":"https://github.com/dae/anki/pull/267"},"issue":{"href":"https://api.github.com/repos/dae/anki/issues/267"},"comments":{"href":"https://api.github.com/repos/dae/anki/issues/267/comments"},"review_comments":{"href":"https://api.github.com/repos/dae/anki/pulls/267/comments"},"review_comment":{"href":"https://api.github.com/repos/dae/anki/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dae/anki/pulls/267/commits"},"statuses":{"href":"https://api.github.com/repos/dae/anki/statuses/fd2c091200a478f524a9d44ccc86405989b77a9c"}},"author_association":"NONE","merged":false,"mergeable":true,"rebaseable":true,"mergeable_state":"clean","merged_by":null,"comments":1,"review_comments":0,"maintainer_can_modify":false,"commits":1,"additions":1,"deletions":0,"changed_files":1}}
{"actor":{"display_login":"dae"}}