{"action":"created","issue":{"url":"https://api.github.com/repos/LibrePCB/LibrePCB/issues/109","repository_url":"https://api.github.com/repos/LibrePCB/LibrePCB","labels_url":"https://api.github.com/repos/LibrePCB/LibrePCB/issues/109/labels{/name}","comments_url":"https://api.github.com/repos/LibrePCB/LibrePCB/issues/109/comments","events_url":"https://api.github.com/repos/LibrePCB/LibrePCB/issues/109/events","html_url":"https://github.com/LibrePCB/LibrePCB/issues/109","id":172003357,"number":109,"title":"Finally define the workspace/library/repository concept for the first release","user":{"login":"ubruhin","id":5374821,"avatar_url":"https://avatars.githubusercontent.com/u/5374821?v=3","gravatar_id":"","url":"https://api.github.com/users/ubruhin","html_url":"https://github.com/ubruhin","followers_url":"https://api.github.com/users/ubruhin/followers","following_url":"https://api.github.com/users/ubruhin/following{/other_user}","gists_url":"https://api.github.com/users/ubruhin/gists{/gist_id}","starred_url":"https://api.github.com/users/ubruhin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ubruhin/subscriptions","organizations_url":"https://api.github.com/users/ubruhin/orgs","repos_url":"https://api.github.com/users/ubruhin/repos","events_url":"https://api.github.com/users/ubruhin/events{/privacy}","received_events_url":"https://api.github.com/users/ubruhin/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/LibrePCB/LibrePCB/labels/high%20prio","name":"high prio","color":"f7c6c7"}],"state":"open","locked":false,"assignee":{"login":"ubruhin","id":5374821,"avatar_url":"https://avatars.githubusercontent.com/u/5374821?v=3","gravatar_id":"","url":"https://api.github.com/users/ubruhin","html_url":"https://github.com/ubruhin","followers_url":"https://api.github.com/users/ubruhin/followers","following_url":"https://api.github.com/users/ubruhin/following{/other_user}","gists_url":"https://api.github.com/users/ubruhin/gists{/gist_id}","starred_url":"https://api.github.com/users/ubruhin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ubruhin/subscriptions","organizations_url":"https://api.github.com/users/ubruhin/orgs","repos_url":"https://api.github.com/users/ubruhin/repos","events_url":"https://api.github.com/users/ubruhin/events{/privacy}","received_events_url":"https://api.github.com/users/ubruhin/received_events","type":"User","site_admin":false},"assignees":[{"login":"ubruhin","id":5374821,"avatar_url":"https://avatars.githubusercontent.com/u/5374821?v=3","gravatar_id":"","url":"https://api.github.com/users/ubruhin","html_url":"https://github.com/ubruhin","followers_url":"https://api.github.com/users/ubruhin/followers","following_url":"https://api.github.com/users/ubruhin/following{/other_user}","gists_url":"https://api.github.com/users/ubruhin/gists{/gist_id}","starred_url":"https://api.github.com/users/ubruhin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ubruhin/subscriptions","organizations_url":"https://api.github.com/users/ubruhin/orgs","repos_url":"https://api.github.com/users/ubruhin/repos","events_url":"https://api.github.com/users/ubruhin/events{/privacy}","received_events_url":"https://api.github.com/users/ubruhin/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/LibrePCB/LibrePCB/milestones/1","html_url":"https://github.com/LibrePCB/LibrePCB/milestones/0.1","labels_url":"https://api.github.com/repos/LibrePCB/LibrePCB/milestones/1/labels","id":1218786,"number":1,"title":"0.1","description":"First official release of LibrePCB.\r\n\r\nIncluded:\r\n- library elements: component categories, package categories, symbols, footprints, packages, components, devices\r\n- schematic editor with basic functionality\r\n- board editor with basic functionality (incl. gerber export)\r\n- library editor with basic functionality\r\n\r\nNot included:\r\n- library elements: 3D models, SPICE models\r\n- SPICE simulations\r\n- 3D view of boards\r\n- 3D file export of boards","creator":{"login":"ubruhin","id":5374821,"avatar_url":"https://avatars.githubusercontent.com/u/5374821?v=3","gravatar_id":"","url":"https://api.github.com/users/ubruhin","html_url":"https://github.com/ubruhin","followers_url":"https://api.github.com/users/ubruhin/followers","following_url":"https://api.github.com/users/ubruhin/following{/other_user}","gists_url":"https://api.github.com/users/ubruhin/gists{/gist_id}","starred_url":"https://api.github.com/users/ubruhin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ubruhin/subscriptions","organizations_url":"https://api.github.com/users/ubruhin/orgs","repos_url":"https://api.github.com/users/ubruhin/repos","events_url":"https://api.github.com/users/ubruhin/events{/privacy}","received_events_url":"https://api.github.com/users/ubruhin/received_events","type":"User","site_admin":false},"open_issues":14,"closed_issues":17,"state":"open","created_at":"2015-07-21T18:50:21Z","updated_at":"2016-09-01T22:06:59Z","due_on":null,"closed_at":null},"comments":10,"created_at":"2016-08-18T21:17:47Z","updated_at":"2016-09-03T08:21:59Z","closed_at":null,"body":"## Description\r\nThe workspace/library/repository concept is still not completely defined. We need to do that before publishing the first release of LibrePCB. Some discussion (in German) about this topic is available [here](https://etherpad.coredump.ch/p/librepcb), which I will summarize now.\r\n\r\n## Workspace Directory Tree\r\nA workspace directory tree will look like this:\r\n```\r\nworkspace/\r\n    ├── .librepcb-workspace\r\n    ├── projects/\r\n    │   ├── Project_A/\r\n    │   ├── Project_B/\r\n    │   └── Project_C/\r\n    ├── v0/\r\n    │   ├── metadata/\r\n    │   └── libraries/\r\n    │       ├── local/\r\n    │       │   ├── MyLibrary_A.lplib/\r\n    │       │   ├── MyLibrary_B.lplib/\r\n    │       │   └── MyLibrary_C.lplib/\r\n    │       └── remote/\r\n    │           ├── 5d9abd1b-cf0b-4cf7-8666-20a1add9971e.lplib/\r\n    │           ├── 193ef70d-8dab-4a6c-a672-274c5bf09b68.lplib/\r\n    │           └── c2c427a9-17c6-4400-981c-6ece1c9735c3.lplib/\r\n    ├── v1/\r\n    │   ├── metadata/\r\n    │   └── libraries/\r\n    │       ├── local/\r\n    │       │   ├── MyLibrary_A.lplib/\r\n    │       │   ├── MyLibrary_B.lplib/\r\n    │       │   └── MyLibrary_C.lplib/\r\n    │       └── remote/\r\n    │           ├── 5d9abd1b-cf0b-4cf7-8666-20a1add9971e.lplib/\r\n    │           ├── 193ef70d-8dab-4a6c-a672-274c5bf09b68.lplib/\r\n    │           └── c2c427a9-17c6-4400-981c-6ece1c9735c3.lplib/\r\n    └── v2/\r\n        ├── metadata/\r\n        └── libraries/\r\n            ├── local/\r\n            │   ├── MyLibrary_A.lplib/\r\n            │   ├── MyLibrary_B.lplib/\r\n            │   └── MyLibrary_C.lplib/\r\n            └── remote/\r\n                ├── 5d9abd1b-cf0b-4cf7-8666-20a1add9971e.lplib/\r\n                ├── 193ef70d-8dab-4a6c-a672-274c5bf09b68.lplib/\r\n                └── c2c427a9-17c6-4400-981c-6ece1c9735c3.lplib/\r\n```\r\n\r\n### Explanation\r\n- ```.librepcb-workspace```: A (probably empty) file which is only used to determine whether a directory represents a LibrePCB workspace or not.\r\n- ```projects/```: A directory which contains all projects of that workspace. Each project is a subdirectory with their files in it.\r\n- ```v0..*/```: For each file format version, there is a directory which contains the metadata and libraries. A specific application version will only access the metadata/libraries of its corresponding directory, all other ```v*``` directories will be ignored.\r\n  - ```metadata/```: Contains workspace settings and other metadata.\r\n  - ```libraries/local/```: All local libraries (created/maintained by the user itself).\r\n  - ```libraries/remote/```: All libraries which were downloaded from a repository. The library's UUID is used as directory names to avoid name conflicts. These libraries are read-only, the user cannot modify them. To modify them anyway, the user can copy them as a local library and make changes there.\r\n\r\n## Upgrade workspace to newer application version\r\nWhen the user opens the workspace with a specific application's major version the first time (e.g. after updating LibrePCB from ```v1.x``` to ```v2.x```), LibrePCB will realize that the ```v*``` directory (e.g. ```v2```) does not yet exist. Then probably a wizard will be shown to upgrade the workspace to the newer version. Basically, an older version's directory (e.g. ```v1```) will just be copied (e.g. to ```v2```) and the contained files will be upgraded then, if required.\r\n\r\n## Downgrade workspace to older application version\r\nAs the old ```v*``` directories will not be removed after an upgrade, a downgrade is not required at all. The workspace can thus smoothly be used with different application versions at the same time. If older  ```v*``` directories are no longer required for sure, the user can just remove them (to save disk space).\r\n\r\n## Download libraries from a repository\r\nA repository (e.g. [api.librepcb.org](http://api.librepcb.org)) holds a list of available libraries in the internet. The libraries must be hosted as Zip files, for example on the Releases page of a GitHub repository. The application will download these Zip files and extract them into the ```libraries/remote/``` directory in the workspace.\r\n\r\nIn future we may use Git (or something else) to download/update the libraries, but I think Zip is good enough for the first release of LibrePCB and takes not too much time to implement.\r\n\r\n## Contributing features\r\nContributing to remote libraries will not be available in the first release of LibrePCB because it would take too much time to implement. Advanced users can clone libraries with Git anyway to make commits and pull requests.\r\n\r\n## Dependencies of libraries\r\nA library can have dependencies to other libraries. Therefore, a library needs to provide a list of library UUIDs it depends on. We do not track dependencies between each single library element (symbol, component, ...) because that would be too complicated. We also do not take care of the required minimal library version of dependencies, because that would be hard to determine and maintain. The user should just update all his libraries at once to avoid broken dependencies.\r\n\r\nThis simple system also requires to forbid removing elements from an existing library, because this could break other libraries. So when a library element should no longer be used, it must be marked as \"deprecated\" instead of removing it."},"comment":{"url":"https://api.github.com/repos/LibrePCB/LibrePCB/issues/comments/244534169","html_url":"https://github.com/LibrePCB/LibrePCB/issues/109#issuecomment-244534169","issue_url":"https://api.github.com/repos/LibrePCB/LibrePCB/issues/109","id":244534169,"user":{"login":"dbrgn","id":105168,"avatar_url":"https://avatars.githubusercontent.com/u/105168?v=3","gravatar_id":"","url":"https://api.github.com/users/dbrgn","html_url":"https://github.com/dbrgn","followers_url":"https://api.github.com/users/dbrgn/followers","following_url":"https://api.github.com/users/dbrgn/following{/other_user}","gists_url":"https://api.github.com/users/dbrgn/gists{/gist_id}","starred_url":"https://api.github.com/users/dbrgn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dbrgn/subscriptions","organizations_url":"https://api.github.com/users/dbrgn/orgs","repos_url":"https://api.github.com/users/dbrgn/repos","events_url":"https://api.github.com/users/dbrgn/events{/privacy}","received_events_url":"https://api.github.com/users/dbrgn/received_events","type":"User","site_admin":false},"created_at":"2016-09-03T08:21:59Z","updated_at":"2016-09-03T08:21:59Z","body":"> 1. Remove library directory suffix `.lplib`.\r\n\r\nTotally agree. We can place a certain file inside the directory to make it discoverable.\r\n\r\n> 2. Remove element directory suffixes (`.cmp`, `.cmpcat`, `.dev`, ...).\r\n\r\nAgree also.\r\n\r\n> 3. Rename `.version` files to a filename which makes it clear what element is contained in the corresponding directory (e.g. `.librepcb-lib`, `.librepcb-cmp`, `.librepcb-cmpcat`, ...).\r\n\r\nGood idea.\r\n\r\n> 4. Rename XML files to the same name as their containing XML root node (e.g. `component.xml` instead of `cmp.xml`.\r\n\r\nYes please :)\r\n\r\nAnother idea that goes along with 4, is it useful to call directories `cmp`, `cmpcat` and `dev`? That sounds to me like `compare`, `compare category` and `development` :) Why not use the full name (in plural), to make clear what's contained?\r\n\r\n```\r\nMy_Library/\r\n├── components/\r\n│   └── 09febfc6-fb2d-4739-ac57-51ac56a01e7d/\r\n│       ├── component.xml\r\n│       └── .librepcb-cmp\r\n├── component_categories/\r\n│   └── 09febfc6-fb2d-4739-ac57-51ac56a01e7d/\r\n│       ├── component_category.xml\r\n│       └── .librepcb-cmpcat\r\n├── devices/\r\n│   └── 09febfc6-fb2d-4739-ac57-51ac56a01e7d/\r\n│       ├── device.xml\r\n│       └── .librepcb-dev\r\n├── packages/\r\n│   └── 09febfc6-fb2d-4739-ac57-51ac56a01e7d/\r\n│       ├── package.xml\r\n│       └── .librepcb-pkg\r\n├── package_categories/\r\n│   └── 09febfc6-fb2d-4739-ac57-51ac56a01e7d/\r\n│       ├── package_category.xml\r\n│       └── .librepcb-pkgcat\r\n├── symbols/\r\n│   └── 09febfc6-fb2d-4739-ac57-51ac56a01e7d/\r\n│       ├── symbol.xml\r\n│       └── .librepcb-sym\r\n├── library.xml\r\n└── .librepcb-lib\r\n```"}}
{"actor":{"display_login":"dbrgn"}}