From a987e6736dc851316648aadca9c45c357beab897 Mon Sep 17 00:00:00 2001 From: Jason Spriggs Date: Wed, 12 Dec 2012 18:23:09 -0500 Subject: [PATCH 01/49] test upload will this work? --- developer_manual/guidelines.rst | 69 +++++++++++++++++++++++++++++++++ developer_manual/index.rst | 37 +++++++++--------- 2 files changed, 88 insertions(+), 18 deletions(-) create mode 100644 developer_manual/guidelines.rst diff --git a/developer_manual/guidelines.rst b/developer_manual/guidelines.rst new file mode 100644 index 000000000..3dd6bcd74 --- /dev/null +++ b/developer_manual/guidelines.rst @@ -0,0 +1,69 @@ +Contribution Guidelines +======================= + +How you can contribute: +----------------------- + +* Report an issue on our bug tracker +* Translate ownCloud to your language +* Help coding (see below) and check theJunior Jobs +* Develop Apps, if you’re looking for ideas you can check what users reported at the App Opportunities Page. +* Help out with the website and write documentation (contact tpn or deryo in the irc channel) +* Spread the word, tell your friends about it, write a blog post! + +If you have any questions, we are happy to help you. + +Set up your development environment +----------------------------------- + +*. Install git, for example by: ::sudo apt-get install git +*. The following folder structure is suggested: +::/path/to/webserver/owncloud - core repo +::/path/to/webserver/apps - apps repo +::/path/to/webserver/3rdparty - 3rdparty repo +- Open a terminal and: +::cd /path/to/webserver +::git clone https://github.com/owncloud/core ./owncloud +::git clone https://github.com/owncloud/apps +::git clone https://github.com/owncloud/3rdparty +- ownCloud will automatically detect the 3rdparty folder if it’s either in /path/to/webserver/owncloud or in /path/to/webserver/. +*. If you want to use an app from the app repository, you have to setup multiple app directories or symlink each app like e.g. +::ln -s /path/to/webserver/apps/news /path/to/webserver/owncloud/apps/news +*. Install ownCloud +*. Dive into the code! + +If you are new to git, do the git crash course. + +Contribution guidelines +----------------------- + +we use Github, get an account there and clone the ownCloud repository +please check our planning page and ideally communicate your ideas to the mailing list +fixes go directly to master, nevertheless they need to be tested thoroughly +new features are always developed in a branch and only merged to master once they are fully done +when you are finished, use the merge request function on Gitorious. The other developers will look at it and give you feedback. Ideally also post your merge request to the mailing list to let people know. +when you git pull, always git pull --rebase to not generate extra commits like: merged master into master +We need a signed contributor agreement from you to commit into the core repository. But no worries. It´s a nice one. All the information is here +Design guidelines +Software should work. Only put features into master when they are complete. It’s better to not have a feature instead of having one that works poorly. +Software should get out of the way. Do things automatically instead of offering configuration options. +Software should be easy to use. Show only the most important elements. Secondary elements only on hover or via ťAdvancedŤ function. +User data is sacred. Provide undo instead of asking for confirmation – which might be dismissed. +The state of the application should be clear. If something loads, provide feedback. +Do not adapt broken concepts (for example design of desktop apps) just for the sake of ťconsistencyŤ. We provide a better interface. +Regularly reset your installation to see how the first-run experience is like. And improve it. +Ideally do usability testing to know how people use the software. +For further UX principles, read Alex Faaborg from Mozilla. +Coding guidelines +use tabs, not spaces +java doc style documentation always required! +function names in camelCase starting with a lower character +class names are CamelCase starting with an upper case character +opening brackets in the same line as the statement +closing brackets in a sepearate line +no global variables +no global functions +double quotes in HTML, single quotes in JavaScript & PHP +HTML should be HTML5 compliant +CSS in single-line notation +provide unit tests \ No newline at end of file diff --git a/developer_manual/index.rst b/developer_manual/index.rst index b93e3f5d3..683475280 100644 --- a/developer_manual/index.rst +++ b/developer_manual/index.rst @@ -1,18 +1,19 @@ -.. _contents: - -Contents -======== - -.. toctree:: - :maxdepth: 2 - - debugging - apps - - - -Indices and tables -================== - - * :ref:`genindex` - +.. _contents: + +Contents +======== + +.. toctree:: + :maxdepth: 2 + + debugging + apps + guidelines + + + +Indices and tables +================== + + * :ref:`genindex` + From 1200e49e589945b9e1b89dfb4ffa02e6b25dae22 Mon Sep 17 00:00:00 2001 From: WireShout Date: Wed, 12 Dec 2012 20:59:38 -0500 Subject: [PATCH 02/49] Update developer_manual/guidelines.rst Moved to rST format --- developer_manual/guidelines.rst | 123 +++++++++++++++++++------------- 1 file changed, 74 insertions(+), 49 deletions(-) diff --git a/developer_manual/guidelines.rst b/developer_manual/guidelines.rst index 3dd6bcd74..c00058850 100644 --- a/developer_manual/guidelines.rst +++ b/developer_manual/guidelines.rst @@ -4,66 +4,91 @@ Contribution Guidelines How you can contribute: ----------------------- -* Report an issue on our bug tracker -* Translate ownCloud to your language -* Help coding (see below) and check theJunior Jobs -* Develop Apps, if you’re looking for ideas you can check what users reported at the App Opportunities Page. +* `Report an issue on our bug tracker`_ +* `Translate ownCloud to your language`_ +* Help coding (see below) and check the `Junior Jobs`_ +* `Develop Apps`_, if you're looking for ideas you can check what users reported at the `App Opportunities Page`_. * Help out with the website and write documentation (contact tpn or deryo in the irc channel) * Spread the word, tell your friends about it, write a blog post! -If you have any questions, we are happy to help you. +If you have any questions, `we are happy to help you`_. Set up your development environment ----------------------------------- -*. Install git, for example by: ::sudo apt-get install git -*. The following folder structure is suggested: -::/path/to/webserver/owncloud - core repo -::/path/to/webserver/apps - apps repo -::/path/to/webserver/3rdparty - 3rdparty repo -- Open a terminal and: -::cd /path/to/webserver -::git clone https://github.com/owncloud/core ./owncloud -::git clone https://github.com/owncloud/apps -::git clone https://github.com/owncloud/3rdparty -- ownCloud will automatically detect the 3rdparty folder if it’s either in /path/to/webserver/owncloud or in /path/to/webserver/. -*. If you want to use an app from the app repository, you have to setup multiple app directories or symlink each app like e.g. -::ln -s /path/to/webserver/apps/news /path/to/webserver/owncloud/apps/news -*. Install ownCloud -*. Dive into the code! +#. Install git, for example by: ``sudo apt-get install git`` +#. The following folder structure is suggested: + ``/path/to/webserver/owncloud - core repo`` + ``/path/to/webserver/apps - apps repo`` + ``/path/to/webserver/3rdparty - 3rdparty repo`` -If you are new to git, do the git crash course. + - Open a terminal and: + ``cd /path/to/webserver`` + ``git clone https://github.com/owncloud/core ./owncloud`` + ``git clone https://github.com/owncloud/apps`` + ``git clone https://github.com/owncloud/3rdparty`` + - ownCloud will automatically detect the 3rdparty folder if it's either in /path/to/webserver/owncloud or in /path/to/webserver/. +#. If you want to use an app from the app repository, you have to `setup multiple app directories`_ or symlink each app like e.g. + ``ln -s /path/to/webserver/apps/news /path/to/webserver/owncloud/apps/news`` +#. `Install ownCloud`_ +#. Dive into the code! + +If you are new to git, do the `git crash course`_. Contribution guidelines ----------------------- -we use Github, get an account there and clone the ownCloud repository -please check our planning page and ideally communicate your ideas to the mailing list -fixes go directly to master, nevertheless they need to be tested thoroughly -new features are always developed in a branch and only merged to master once they are fully done -when you are finished, use the merge request function on Gitorious. The other developers will look at it and give you feedback. Ideally also post your merge request to the mailing list to let people know. -when you git pull, always git pull --rebase to not generate extra commits like: merged master into master -We need a signed contributor agreement from you to commit into the core repository. But no worries. It´s a nice one. All the information is here +* We use `Github`_, get an account there and clone the ownCloud repository +* Please check `our planning page`_ and ideally communicate your ideas to the `mailing list`_ +* fixes go directly to master, nevertheless they need to be tested thoroughly +* new features are always developed in a branch and only merged to master once they are fully done +* when you are finished, use the merge request function on Gitorious. The other developers will look at it and give you feedback. Ideally also post your merge request to the mailing list to let people know. +* when you ``git pull``, always git ``pull --rebase`` to not generate extra commits like: *merged master into master* +* We need a signed contributor agreement from you to commit into the core repository. But no worries. It' a nice one. All the information is `here`_ + Design guidelines -Software should work. Only put features into master when they are complete. It’s better to not have a feature instead of having one that works poorly. -Software should get out of the way. Do things automatically instead of offering configuration options. -Software should be easy to use. Show only the most important elements. Secondary elements only on hover or via ťAdvancedŤ function. -User data is sacred. Provide undo instead of asking for confirmation – which might be dismissed. -The state of the application should be clear. If something loads, provide feedback. -Do not adapt broken concepts (for example design of desktop apps) just for the sake of ťconsistencyŤ. We provide a better interface. -Regularly reset your installation to see how the first-run experience is like. And improve it. -Ideally do usability testing to know how people use the software. -For further UX principles, read Alex Faaborg from Mozilla. +----------------- + +* Software should work. Only put features into master when they are complete. It's better to not have a feature instead of having one that works poorly. +* Software should get out of the way. Do things automatically instead of offering configuration options. +* Software should be easy to use. Show only the most important elements. Secondary elements only on hover or via Advanced function. +* User data is sacred. Provide undo instead of asking for confirmation `which might be dismissed`_. +* The state of the application should be clear. If something loads, provide feedback. +* Do not adapt broken concepts (for example design of desktop apps) just for the sake of consistency. We provide a better interface. +* Regularly reset your installation to see how the first-run experience is like. And improve it. +* Ideally do `usability testing`_ to know how people use the software. +* For further UX principles, read `Alex Faaborg from Mozilla`_. + Coding guidelines -use tabs, not spaces -java doc style documentation always required! -function names in camelCase starting with a lower character -class names are CamelCase starting with an upper case character -opening brackets in the same line as the statement -closing brackets in a sepearate line -no global variables -no global functions -double quotes in HTML, single quotes in JavaScript & PHP -HTML should be HTML5 compliant -CSS in single-line notation -provide unit tests \ No newline at end of file +----------------- + +* use tabs, not spaces +* java doc style documentation always required! +* function names in camelCase starting with a lower character +* class names are CamelCase starting with an upper case character +* opening brackets in the same line as the statement +* closing brackets in a sepearate line +* no global variables +* no global functions +* double quotes in HTML, single quotes in JavaScript & PHP +* HTML should be HTML5 compliant +* CSS in single-line notation +* provide unit tests + + +.. _Report an issue on our bug tracker: https://github.com/owncloud/core/issues +.. _Translate ownCloud to your language: http://owncloud.org/dev/translation/ +.. _Junior Jobs: http://owncloud.org/dev/junior-jobs/ +.. _Develop Apps: http://owncloud.org/dev/apps/getting-started/ +.. _App Opportunities Page: http://bugs.owncloud.org/thebuggenie/owncloud/issues/find/saved_search/4/search/1 +.. _we are happy to help you: http://owncloud.org/contact/ +.. _setup multiple app directories: https://github.com/owncloud/documentation/blob/master/developer_manual/configfile.rst +.. _git crash course: http://git-scm.com/course/svn.html +.. _Github: https://github.com/owncloud +.. _our planning page: http://gitorious.org/owncloud/pages/Home +.. _mailing list: https://mail.kde.org/mailman/listinfo/owncloud +.. _here: http://owncloud.org/about/contributor-agreement/ +.. _which might be dismissed: http://www.alistapart.com/articles/neveruseawarning/ +.. _usability testing: http://jancborchardt.net/usability-in-free-software +.. _Alex Faaborg from Mozilla: http://uxmag.com/articles/quantifying-usability +.. _Install ownCloud: https://github.com/owncloud/core/issues From 8efccaf8598a274e363ad0344537357abaf0665d Mon Sep 17 00:00:00 2001 From: Jason Spriggs Date: Wed, 12 Dec 2012 21:14:33 -0500 Subject: [PATCH 03/49] Base commit for 4 files Code Reviews Kanban Styleguide Translation --- developer_manual/codereviews.rst | 49 +++++++++++++++++ developer_manual/index.rst | 5 +- developer_manual/kanban.rst | 4 ++ developer_manual/styleguide.rst | 6 +++ developer_manual/translation.rst | 90 ++++++++++++++++++++++++++++++++ 5 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 developer_manual/codereviews.rst create mode 100644 developer_manual/kanban.rst create mode 100644 developer_manual/styleguide.rst create mode 100644 developer_manual/translation.rst diff --git a/developer_manual/codereviews.rst b/developer_manual/codereviews.rst new file mode 100644 index 000000000..8bf69a66e --- /dev/null +++ b/developer_manual/codereviews.rst @@ -0,0 +1,49 @@ +Code Reviews on github +====================== + +``We will start with a test phase for the next 2 month (until end of December). +The test phase will ONLY apply for the `core repository`_ at the moment. +(Other repositories are welcome to join ) +Let's see if we get any benefit from this approach.`` + +Linus’ Law: *“given enough eyeballs, all bugs are shallow”* + +Introduction +------------ + +In order to increase the code quality within ownCloud, developers are requested to perform code reviews. +As we are now heavily using the github platform these code review shall take place on github as well. + +Precondition +------------ + +From now on no direct commits/pushes to master or any of the stable branches are allowed in general. +**Every code** change – **even one liners** – have to be reviewed! + +How will it work? +----------------- + +#. A developer will submit his changes on github via a pull request. `github:help – using pull requests`_ +#. Within the pull request the developer could already name other developers (using @githubusername) and ask them for review. +#. Other developers (either named or at free will) have a look at the changes and are welcome to write comments within the comment field. +#. In case the reviewer is okay with the changes and thinks all his comments and suggestions have been take into account a :+1 on the comment will signal a positive review. +#. Before a pull request will be merged into master or the corresponding branch at least 2 reviewers need to give :+1 score. +#. In the near future we will have the `continuous integration server`_ set up to monitor pull request as well which will give an additional indicator for the quality. + +Examples +-------- + +Please find the first good examples below! +https://github.com/owncloud/core/pull/121 +https://github.com/owncloud/core/pull/146 + +Questions? +---------- + +Feel free to drop a line on the `mailing list`_ or join us on `IRC`_. + +.. _core repository: https://github.com/owncloud/core +.. _github:help – using pull requests: https://help.github.com/articles/using-pull-requests +.. _continuous integration server: https://ci.tmit.eu/ +.. _mailing list: https://mail.kde.org/mailman/listinfo/owncloud +.. _IRC: http://webchat.freenode.net/?channels=owncloud-dev \ No newline at end of file diff --git a/developer_manual/index.rst b/developer_manual/index.rst index 683475280..6c5341ac6 100644 --- a/developer_manual/index.rst +++ b/developer_manual/index.rst @@ -9,7 +9,10 @@ Contents debugging apps guidelines - + styleguide + codereviews + kanban + translation Indices and tables diff --git a/developer_manual/kanban.rst b/developer_manual/kanban.rst new file mode 100644 index 000000000..c0c61735a --- /dev/null +++ b/developer_manual/kanban.rst @@ -0,0 +1,4 @@ +Kanban Board +============ + +See http://owncloud.org/dev/kanban-board/ \ No newline at end of file diff --git a/developer_manual/styleguide.rst b/developer_manual/styleguide.rst new file mode 100644 index 000000000..f033bd362 --- /dev/null +++ b/developer_manual/styleguide.rst @@ -0,0 +1,6 @@ +Coding Style Guide +================== + +*Note: this is work-in-progress! We are currently building up this style guide and it’s topic of discussion.* + +See http://owncloud.org/dev/coding-style-guide/ \ No newline at end of file diff --git a/developer_manual/translation.rst b/developer_manual/translation.rst new file mode 100644 index 000000000..39ec25e82 --- /dev/null +++ b/developer_manual/translation.rst @@ -0,0 +1,90 @@ +Translation +=========== + +Make text translatable +---------------------- + +In HTML or PHP wrap it like this t('This is some text');?> +For the right date format use l('date', time());?>. Change the way dates are shown by editing /core/l10n/l10n-[lang].php +To translate text in javascript use: t('appname','text to translate'); + +You shall never split sentences! +-------------------------------- + +Reason: +~~~~~~~ + +Translators loose the context and they have no chance to possible re-arrange words. + +Example: +~~~~~~~~ + +``t('Select file from') . ' '; ?>t('local filesystem');?>t(' or '); ?>t('cloud');?>`` + +Translators will translate: +~~~~~~~~~~~~~~~~~~~~~~~~~~~ +* Select file from +* local filesystem +* ‘ or ‘ +* cloud +By translating these individual strings for sure the case will be lost of “local filesystem” and “cloud”. The two white spaces with the or will get lost while translating as well. + +Html on translation string: +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Html tags in translation strings is ugly but usually translators can handle this. + +What about variable in the strings? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In case you need to add variables to the translation strings do it like that: +`` $l->t('%s is available. Get more information',array($data['versionstring'], $data['web']));`` + +Automated synchronization of translations +----------------------------------------- + +Multiple nightly jobs have been setup in order to synchronize translations – it’s a multi-step process: +‘perl l10n.pl read’ will rescan all php and javascript files and generate the templates. +The templates are pushed to `Transifex`_ (tx push -s). +All translations are pulled from `Transifex`_ (tx pull -a). +‘perl l10n.pl write’ will write the php files containing the translations. +Finally the changes are pushed to git. + +Please follow the steps below to add translation support to your app: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Create a folder ‘l10n’. +Create the file ‘ignorelist’ which can contain files which shall not be scanned during step 4. +Edit ‘l10n/.tx/config’ and copy/past a config section and adopt it by changing the app/folder name. +Run ‘perl l10n.pl read’ with l10n +Add the newly created translation template (l10n/Templates/.pot) to git and commit the changes above. +After the next nightly sync job a new resource will appear on Transifex and from now on every night the latest translations will arrive. + +Translation sync jobs: +~~~~~~~~~~~~~~~~~~~~~~ + +http://ci.tmit.eu/job/ownCloud-core-tx/ +http://ci.tmit.eu/job/ownCloud-apps-tx/ +http://ci.tmit.eu/job/ownCloud-Mirall-tx/ + +**Caution: information below is in general not needed!** + +Manual quick translation update: +-------------------------------- + +``cd l10n/ && perl l10n.pl read && tx push -s && tx pull -a && perl l10n.pl write && cd ..`` + +The translation script requires Locale::PO, installable via ``apt-get install liblocale-po-perl`` + +Configure transifex +------------------- + +``tx init + +for resource in calendar contacts core files media gallery settings +do +tx set --auto-local -r owncloud.$resource "/$resource.po" --source-language=en \ + --source-file "templates/$resource.pot" --execute +done`` + +.. _Transifex: https://www.transifex.net/projects/p/owncloud/ \ No newline at end of file From f4af997c52195a82026eb796114f5b9576c00381 Mon Sep 17 00:00:00 2001 From: Jason Spriggs Date: Wed, 12 Dec 2012 21:33:53 -0500 Subject: [PATCH 04/49] Base commit for 3 files juniorjobs roadmap testing --- developer_manual/index.rst | 3 ++ developer_manual/juniorjobs.rst | 28 +++++++++++ developer_manual/roadmap.rst | 86 +++++++++++++++++++++++++++++++++ developer_manual/testing.rst | 48 ++++++++++++++++++ 4 files changed, 165 insertions(+) create mode 100644 developer_manual/juniorjobs.rst create mode 100644 developer_manual/roadmap.rst create mode 100644 developer_manual/testing.rst diff --git a/developer_manual/index.rst b/developer_manual/index.rst index 6c5341ac6..e1839ff55 100644 --- a/developer_manual/index.rst +++ b/developer_manual/index.rst @@ -13,6 +13,9 @@ Contents codereviews kanban translation + roadmap + juniorjobs + testing Indices and tables diff --git a/developer_manual/juniorjobs.rst b/developer_manual/juniorjobs.rst new file mode 100644 index 000000000..7c273fbe5 --- /dev/null +++ b/developer_manual/juniorjobs.rst @@ -0,0 +1,28 @@ +Junior Jobs +=========== + +Everybody can help to make ownCloud better. Here is a list of jobs for beginners. +`Junior Jobs in the core repository`_ +`Junior Jobs in the apps repository`_ +Junior developer jobs: +* eBook reader app + Show all the pdf files on a nice overview page ideally with the first page as a thumbnail. The pdf opens with the integrated pdf viewer based on pdf.js for reading. The scanning and indexing of the files should be similar to the Gallery app. Future extension can be downloading of new ebooks from open stores like Project Gutenberg or other repositories and sending of files to ereaders like kindles +* Dolphin Context Menu. + Integration with filemanagers like dolphin should be possible. Sharing of files with others or access to versioning would be cool +* RSS Catcher App / Syncing with Akregator **Work in progress** + An rss catcher and reader similar to Google Reader would be a powerful feature. The feeds and read status could be synced with Readers like Akregator +* Podcast Catcher App + An application that collects podcasts like for example iTunes and provides an embedded player +* HTML 5 Drag/Drop Uploader **Work in progress** + Enable drag and drop so that users can a drag a file from the local desktop into the ownCloud browser window for uploading. +* ssh client application + An embedded ssh terminal to access remote servers from within the ownCloud webinterface. ssh.js could be used for that. +* presentation app + A html5 presentation application for ownCloud using impress.js +* openPhoto integration **Work in progress** + Currently, openPhoto can only store photos on DropBox or Amazon S3. It was proposed on the mailing list `here(1)`_ and `here(2)`_ to create an openPhoto backend for ownCloud. + +.. _Junior Jobs in the core repository: https://github.com/owncloud/core/issues?labels=Junior+Job&page=1&state=open +.. _Junior Jobs in the apps repository: https://github.com/owncloud/apps/issues?labels=Junior+Job&page=1&state=open +.. _here(1): http://mail.kde.org/pipermail/owncloud/2011-December/001875.html +.. _here(2): http://mail.kde.org/pipermail/owncloud/2011-December/001879.html \ No newline at end of file diff --git a/developer_manual/roadmap.rst b/developer_manual/roadmap.rst new file mode 100644 index 000000000..0b9089a86 --- /dev/null +++ b/developer_manual/roadmap.rst @@ -0,0 +1,86 @@ +Roadmap +======= + +Version 5.0 +----------- +January 2013 +~~~~~~~~~~~~ + + +Version 4.5 +----------- +October 23th 2012 +~~~~~~~~~~~~~~~~~ + +Version 4.0 +----------- +`May 22nd 2012, Release Announcement`_ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* versioning of files +* server side encryption +* drag and drop upload +* theming +* ODF file viewer +* ownCloud Application APIs +* migration and backup +* tasks management +* application store +* lots of improvements + +Version 3.0 +----------- +`January 31st 2012, Release Announcement`_ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Text editor +* Improved photo gallery +* Improved calendar view +* PDF viewer + +Version 2.0 +----------- +October 2011 +~~~~~~~~~~~~ + +* refactored codebase +* new plugin / apps system +* redesigned web interface +* Calendar & Address book access from webinterface +* CalDAV & CardDAV support to sync your calendars and contacts + +Version 1.2 +----------- +April 15th 2011 +~~~~~~~~~~~~~~~ + +* UI redesigned from scratch +* Again a lot of fixes + +Version 1.1 +----------- +`November 23rd, 2010, Release Anouncement`_ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* New Plugin system +* User management +* ownCloud can now be installed in a DB shared with other applications since ownCloud tables has a prefix (default is “oc_” but can choose it) +* Experimental PostgreSQL support +* Text viewer with syntax highlighting +* Support for OCS private attribute storage and activity +* A lot of fixes +* Code Cleanup + +Version 1.0 +------------ +`June 24th 2010, Release Announcement`_ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Working web interface to upload, organize and delete your personal files +* WebDAV access to your files. +* Some basic configuration options + +.. _May 22nd 2012, Release Announcement: http://blog.karlitschek.de/2012/05/owncloud-4-released.html +.. _January 31st 2012, Release Announcement: http://owncloud.org/owncloud-3-release/ +.. _ November 23rd, 2010, Release Anouncement: http://blog.karlitschek.de/2010/11/owncloud-11-released.html +.. _June 24th 2010, Release Announcement: http://blog.karlitschek.de/2010/06/owncloud-10-is-here.html \ No newline at end of file diff --git a/developer_manual/testing.rst b/developer_manual/testing.rst new file mode 100644 index 000000000..dcdfbe160 --- /dev/null +++ b/developer_manual/testing.rst @@ -0,0 +1,48 @@ +Testing +======= + +Testing ownCloud is important to ensure quality and the best possible experience for users. The release cycle is fast and to maintain this speed ownCloud needs continuous testing and involvement from the community. When ownCloud approaches a major release, a formal testing process is organized with specific tasks for testers to confirm as functional. This begins with the first alpha release and will continue through the release candidates. Testers will be assigned tasks, test the pre-releases, and report bugs to the `bug tracker`_. Formal testers will be recognized on owncloud.org as a thank from the entire ownCloud community.ownCloud strives to run on all types of platforms without strict requirements. PHP does not have the same behavior on Linux, OS X, and Windows especially with regards to the filesystem. Differences in behavior can also occur on different web servers. This means that ownCloud needs to be tested on as many server configurations as possible before a major release. + +Who can get involved? +--------------------- + +Anyone can get involved in the formal testing process. No programming experience is necessary. If you would like to get involved and help improve the quality of ownCloud please contact Michael Gapczynski (MTGap) in the `Dev IRC Channel`_. Remember, the quality of ownCloud is not only the responsibility of the developers, but the entire community. + +Release Schedule +---------------- + +* 20.08.12 – Soft feature freeze (Alpha 1) +* 28.08.12 – Hard feature freeze (Beta 1) +* 03.09.12 – Beta 2 Only bugfixes are allowed from now on +* 10.09.12 – RC 1 Only showstopper bugfixes are allowed from now on +* 17.09.12 – RC 2 +* 26.09.12 – Announcement of ownCloud 4.5 + +Testing guidelines +------------------ + +* Contact Michael Gapczynski if you would like to formally participate in testing +* Inform Michael of your exact server configuration, including OS, PHP version, and database +* Checkout the latest version from the master branch +* Do not install in a production environment, pre-releases may cause data loss +* Run the unit tests in the tests folder and ensure all tests are passing +* Perform your assigned tasks, report any bugs to the `bug tracker`_ +* When reporting any bugs to the `bug tracker`_, please specify the pre-release version in the release field. + +Tests +----- + +Test tasks are categorized by apps, those at the top of the list have priority for testing during this release. While 3rd party apps are not supported by ownCloud, app developers may also request for testing of their apps here. +* `Files`_ +* `Sharing`_ +* Settings +* Calendar +* Contacts +* Media +* `LDAP user and group backend`_ + +.. _Files: http://owncloud.org/dev/testing/files +.. _Sharing: http://owncloud.org/dev/testing/sharing +.. _LDAP user and group backend: http://owncloud.org/dev/testing/ldap-backend/ +.. _bug tracker: https://github.com/owncloud/core/issues +.. _Dev IRC Channel: http://webchat.freenode.net/?channels=owncloud-dev \ No newline at end of file From c6fcf2670939939f38cebdf43a3d7e8927a5f89f Mon Sep 17 00:00:00 2001 From: WireShout Date: Wed, 12 Dec 2012 21:35:31 -0500 Subject: [PATCH 05/49] Update developer_manual/juniorjobs.rst --- developer_manual/juniorjobs.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/developer_manual/juniorjobs.rst b/developer_manual/juniorjobs.rst index 7c273fbe5..20a22a67d 100644 --- a/developer_manual/juniorjobs.rst +++ b/developer_manual/juniorjobs.rst @@ -5,6 +5,7 @@ Everybody can help to make ownCloud better. Here is a list of jobs for beginners `Junior Jobs in the core repository`_ `Junior Jobs in the apps repository`_ Junior developer jobs: + * eBook reader app Show all the pdf files on a nice overview page ideally with the first page as a thumbnail. The pdf opens with the integrated pdf viewer based on pdf.js for reading. The scanning and indexing of the files should be similar to the Gallery app. Future extension can be downloading of new ebooks from open stores like Project Gutenberg or other repositories and sending of files to ereaders like kindles * Dolphin Context Menu. @@ -25,4 +26,4 @@ Junior developer jobs: .. _Junior Jobs in the core repository: https://github.com/owncloud/core/issues?labels=Junior+Job&page=1&state=open .. _Junior Jobs in the apps repository: https://github.com/owncloud/apps/issues?labels=Junior+Job&page=1&state=open .. _here(1): http://mail.kde.org/pipermail/owncloud/2011-December/001875.html -.. _here(2): http://mail.kde.org/pipermail/owncloud/2011-December/001879.html \ No newline at end of file +.. _here(2): http://mail.kde.org/pipermail/owncloud/2011-December/001879.html From 69292493a865bb3167479d5ec78306d4e6ba28c4 Mon Sep 17 00:00:00 2001 From: WireShout Date: Wed, 12 Dec 2012 21:35:55 -0500 Subject: [PATCH 06/49] Update developer_manual/testing.rst --- developer_manual/testing.rst | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/developer_manual/testing.rst b/developer_manual/testing.rst index dcdfbe160..2614b82e1 100644 --- a/developer_manual/testing.rst +++ b/developer_manual/testing.rst @@ -11,12 +11,12 @@ Anyone can get involved in the formal testing process. No programming experience Release Schedule ---------------- -* 20.08.12 – Soft feature freeze (Alpha 1) -* 28.08.12 – Hard feature freeze (Beta 1) -* 03.09.12 – Beta 2 Only bugfixes are allowed from now on -* 10.09.12 – RC 1 Only showstopper bugfixes are allowed from now on -* 17.09.12 – RC 2 -* 26.09.12 – Announcement of ownCloud 4.5 +* 20.08.12 ďż˝ Soft feature freeze (Alpha 1) +* 28.08.12 ďż˝ Hard feature freeze (Beta 1) +* 03.09.12 ďż˝ Beta 2 Only bugfixes are allowed from now on +* 10.09.12 ďż˝ RC 1 Only showstopper bugfixes are allowed from now on +* 17.09.12 ďż˝ RC 2 +* 26.09.12 ďż˝ Announcement of ownCloud 4.5 Testing guidelines ------------------ @@ -33,6 +33,7 @@ Tests ----- Test tasks are categorized by apps, those at the top of the list have priority for testing during this release. While 3rd party apps are not supported by ownCloud, app developers may also request for testing of their apps here. + * `Files`_ * `Sharing`_ * Settings @@ -45,4 +46,4 @@ Test tasks are categorized by apps, those at the top of the list have priority f .. _Sharing: http://owncloud.org/dev/testing/sharing .. _LDAP user and group backend: http://owncloud.org/dev/testing/ldap-backend/ .. _bug tracker: https://github.com/owncloud/core/issues -.. _Dev IRC Channel: http://webchat.freenode.net/?channels=owncloud-dev \ No newline at end of file +.. _Dev IRC Channel: http://webchat.freenode.net/?channels=owncloud-dev From a405b48509877d0eaf0ca3ff616847ebda1963dd Mon Sep 17 00:00:00 2001 From: WireShout Date: Wed, 12 Dec 2012 21:37:01 -0500 Subject: [PATCH 07/49] Update developer_manual/roadmap.rst --- developer_manual/roadmap.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/developer_manual/roadmap.rst b/developer_manual/roadmap.rst index 0b9089a86..8d858dc7a 100644 --- a/developer_manual/roadmap.rst +++ b/developer_manual/roadmap.rst @@ -64,7 +64,7 @@ Version 1.1 * New Plugin system * User management -* ownCloud can now be installed in a DB shared with other applications since ownCloud tables has a prefix (default is “oc_” but can choose it) +* ownCloud can now be installed in a DB shared with other applications since ownCloud tables has a prefix (default is ďż˝oc_ďż˝ but can choose it) * Experimental PostgreSQL support * Text viewer with syntax highlighting * Support for OCS private attribute storage and activity @@ -82,5 +82,5 @@ Version 1.0 .. _May 22nd 2012, Release Announcement: http://blog.karlitschek.de/2012/05/owncloud-4-released.html .. _January 31st 2012, Release Announcement: http://owncloud.org/owncloud-3-release/ -.. _ November 23rd, 2010, Release Anouncement: http://blog.karlitschek.de/2010/11/owncloud-11-released.html -.. _June 24th 2010, Release Announcement: http://blog.karlitschek.de/2010/06/owncloud-10-is-here.html \ No newline at end of file +.. _November 23rd, 2010, Release Anouncement: http://blog.karlitschek.de/2010/11/owncloud-11-released.html +.. _June 24th 2010, Release Announcement: http://blog.karlitschek.de/2010/06/owncloud-10-is-here.html From 8a8c780b65860badc257da23bd4e8c247d2bf111 Mon Sep 17 00:00:00 2001 From: Jason Spriggs Date: Wed, 12 Dec 2012 21:49:04 -0500 Subject: [PATCH 08/49] App Development Placeholders App Dev section placeholders created --- developer_manual/access.rst | 4 ++++ developer_manual/compatibility.rst | 4 ++++ developer_manual/data-migration.rst | 4 ++++ developer_manual/database.rst | 18 ++++++++++++++++++ developer_manual/dialogs.rst | 4 ++++ developer_manual/filesystem.rst | 4 ++++ developer_manual/formfactors.rst | 4 ++++ developer_manual/getting_started.rst | 4 ++++ developer_manual/hooks.rst | 4 ++++ developer_manual/index.rst | 12 ++++++++++++ developer_manual/share-api.rst | 6 ++++++ developer_manual/theming.rst | 4 ++++ developer_manual/unit-testing.rst | 4 ++++ 13 files changed, 76 insertions(+) create mode 100644 developer_manual/access.rst create mode 100644 developer_manual/compatibility.rst create mode 100644 developer_manual/data-migration.rst create mode 100644 developer_manual/database.rst create mode 100644 developer_manual/dialogs.rst create mode 100644 developer_manual/filesystem.rst create mode 100644 developer_manual/formfactors.rst create mode 100644 developer_manual/getting_started.rst create mode 100644 developer_manual/hooks.rst create mode 100644 developer_manual/share-api.rst create mode 100644 developer_manual/theming.rst create mode 100644 developer_manual/unit-testing.rst diff --git a/developer_manual/access.rst b/developer_manual/access.rst new file mode 100644 index 000000000..b2b8f31f0 --- /dev/null +++ b/developer_manual/access.rst @@ -0,0 +1,4 @@ +public.php and remote.php +========================= + +See http://owncloud.org/dev/apps/public-php-and-remote-php/ \ No newline at end of file diff --git a/developer_manual/compatibility.rst b/developer_manual/compatibility.rst new file mode 100644 index 000000000..11664fa4b --- /dev/null +++ b/developer_manual/compatibility.rst @@ -0,0 +1,4 @@ +Compatibility Notes +=================== + +See http://owncloud.org/dev/apps/make-owncloud-3-apps-compatible-with-owncloud-4/ \ No newline at end of file diff --git a/developer_manual/data-migration.rst b/developer_manual/data-migration.rst new file mode 100644 index 000000000..0b90e277f --- /dev/null +++ b/developer_manual/data-migration.rst @@ -0,0 +1,4 @@ +Data Migration +============== + +See http://owncloud.org/dev/apps/data-migration/ \ No newline at end of file diff --git a/developer_manual/database.rst b/developer_manual/database.rst new file mode 100644 index 000000000..d1ff20f9b --- /dev/null +++ b/developer_manual/database.rst @@ -0,0 +1,18 @@ +Database +======== + +ownCloud uses a database abstraction layer on top of either MDB2 or PDO, depending on the availability of PDO on the server. + +Apps should always use prepared statements when accessing the database as seen in the following example: + +``$query=OC_DB::prepare('SELECT foo,bar FROM *PREFIX*mytable' WHERE user=?'); +$result=$query->execute(array($userId)); +$data=$result->fetchAll();`` + +‘*PREFIX*’ in the query string will be replaced by the configured database table prefix while preparing the query. Arguments for the prepared statement are denoted by a ‘?’ in the query string and passed during execution in an array. +For more information about MDB2 style prepared statements, please see the official MDB2 documentation `here`_ + +If an app requires additional tables in the database they can be automatically created and updated by specifying them inside appinfo/database.xml using MDB2's `xml scheme notation`_ where the placeholders ‘*dbprefix*’ and ‘*dbname*’ can be used for the configured database table prefix and database name. To update the tables used by the app, simply adjust the database.xml file and increase the app version number to trigger an update. + +.. _here: http://pear.php.net/package/MDB2/ +.. _xml scheme notation: http://www.sulc.edu/sulcalumni/app/lib/pear/docs/MDB2_Schema/docs/xml_schema_documentation.html \ No newline at end of file diff --git a/developer_manual/dialogs.rst b/developer_manual/dialogs.rst new file mode 100644 index 000000000..3ea7c87c1 --- /dev/null +++ b/developer_manual/dialogs.rst @@ -0,0 +1,4 @@ +Dialogs +======= + +*Coming Soon* \ No newline at end of file diff --git a/developer_manual/filesystem.rst b/developer_manual/filesystem.rst new file mode 100644 index 000000000..ee50e6f95 --- /dev/null +++ b/developer_manual/filesystem.rst @@ -0,0 +1,4 @@ +Filesystem +========== + +See http://owncloud.org/dev/apps/filesystem-interaction/ \ No newline at end of file diff --git a/developer_manual/formfactors.rst b/developer_manual/formfactors.rst new file mode 100644 index 000000000..3439c3258 --- /dev/null +++ b/developer_manual/formfactors.rst @@ -0,0 +1,4 @@ +Formfactors +=========== + +See http://owncloud.org/dev/apps/formfactors/ \ No newline at end of file diff --git a/developer_manual/getting_started.rst b/developer_manual/getting_started.rst new file mode 100644 index 000000000..1a9d268d5 --- /dev/null +++ b/developer_manual/getting_started.rst @@ -0,0 +1,4 @@ +Getting Started +=============== + +See http://owncloud.org/dev/apps/getting-started/ \ No newline at end of file diff --git a/developer_manual/hooks.rst b/developer_manual/hooks.rst new file mode 100644 index 000000000..854b4d90e --- /dev/null +++ b/developer_manual/hooks.rst @@ -0,0 +1,4 @@ +Hooks +===== + +See http://owncloud.org/dev/apps/hooks/ \ No newline at end of file diff --git a/developer_manual/index.rst b/developer_manual/index.rst index e1839ff55..a893984ae 100644 --- a/developer_manual/index.rst +++ b/developer_manual/index.rst @@ -16,6 +16,18 @@ Contents roadmap juniorjobs testing + database + getting_started + filesystem + hooks + theming + formfactors + dialogs + share_api + data_migration + access + unit_testing + compatibility Indices and tables diff --git a/developer_manual/share-api.rst b/developer_manual/share-api.rst new file mode 100644 index 000000000..5f4a78ece --- /dev/null +++ b/developer_manual/share-api.rst @@ -0,0 +1,6 @@ +Share API +========= + +**Warning: The Share API is still under heavy development and testing. Report issues to Michael Gapczynski.** + +See http://owncloud.org/dev/apps/share-api/ \ No newline at end of file diff --git a/developer_manual/theming.rst b/developer_manual/theming.rst new file mode 100644 index 000000000..1e4eb6d33 --- /dev/null +++ b/developer_manual/theming.rst @@ -0,0 +1,4 @@ +Theming +======= + +See http://owncloud.org/dev/theming/ \ No newline at end of file diff --git a/developer_manual/unit-testing.rst b/developer_manual/unit-testing.rst new file mode 100644 index 000000000..9b60b7b59 --- /dev/null +++ b/developer_manual/unit-testing.rst @@ -0,0 +1,4 @@ +Unit Testing +============ + +See http://owncloud.org/dev/apps/unit-testing/ \ No newline at end of file From 8eacddaab0094f3bf393ef98c6bc63ada749d2d9 Mon Sep 17 00:00:00 2001 From: Jason Spriggs Date: Wed, 12 Dec 2012 21:53:08 -0500 Subject: [PATCH 09/49] Update access doc --- developer_manual/access.rst | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/developer_manual/access.rst b/developer_manual/access.rst index b2b8f31f0..5a7a3ce69 100644 --- a/developer_manual/access.rst +++ b/developer_manual/access.rst @@ -1,4 +1,36 @@ public.php and remote.php ========================= -See http://owncloud.org/dev/apps/public-php-and-remote-php/ \ No newline at end of file +public.php +---------- +The public.php is used for public sharing like public file sharing, public gallery sharing and public calendar sharing. + +Register: +~~~~~~~~~ + +To register an app for public.php you just have to put the following lines into your app’s appinfo/info.xml. + +Example from our source code: `` share.php share.php `` + +Now you can reach the file /apps/calendar/share.php through /public.php?service=calendar and through /public.php?service=caldav + +Example for syntax: `` phpfileforsharing.php `` + +Now you can reach the file */apps/appid/phpfileforsharing.php* through */public.php?service=servicename* + +remote.php +---------- +The remote.php is used for remote services like webdav, caldav, carddav and ampache. + +Register: +~~~~~~~~~ + +To register an app for remote.php you just have to put the following lines into your app’s appinfo/info.xml. + +Example from our source code: `` appinfo/remote.php appinfo/remote.php `` + +Now you can reach the file /apps/calendar/appinfo/remote.php through /remote.php/calendar and through /remote.php/caldav/ + +Example for syntax: `` phpfileforremote.php `` + +Now you can reach the file */apps/appid/phpfileforremote.php* through */remote.php/servicename/* \ No newline at end of file From 6645ef0136404fdafb8f706d7d12fbb51f09fc96 Mon Sep 17 00:00:00 2001 From: WireShout Date: Wed, 12 Dec 2012 21:57:41 -0500 Subject: [PATCH 10/49] Update developer_manual/getting_started.rst --- developer_manual/getting_started.rst | 50 +++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/developer_manual/getting_started.rst b/developer_manual/getting_started.rst index 1a9d268d5..6cf0728a5 100644 --- a/developer_manual/getting_started.rst +++ b/developer_manual/getting_started.rst @@ -1,4 +1,52 @@ Getting Started =============== -See http://owncloud.org/dev/apps/getting-started/ \ No newline at end of file +See http://owncloud.org/dev/apps/getting-started/ + +**THIS NEEDS FORMATTED** + +Before you start, please check if there already is a similar app you could contribute to. On our planning page there are also some app ideas. Also, feel free to communicate your idea and plans to the mailing list so other contributors might join in. +Develop an app +We will use the contacts app as an example, you find it under apps/contacts. +Folder structure +ajax +appinfo +css +img +js +l10n +lib +templates +As you can imagine, templates belong in the template directory, css files in the css directory, images in the img directory and javascript files in the js directory. Renaming these directories is a really bad idea because functions like OC_Helper::linkTo or OC_Helper::imagePath will not work then.The appinfo directory provides everything ownCloud needs to get the app working. The most important file is app.php. ownCloud will call this file everytime it runs, so this is the place where you can register your navigation entries or connect signals and slots. More on this later.The l10n will contain the translations. As soon as the translation detects a l10n folder it knows that this program is translatable.All php scripts that are used to answer AJAX requests are located in ajax. This keeps the root folder clean. Note that ownCloud does not force you to use this folder but it is recommended to use it.If you write a library for your app you can put it into lib. As with the ajax folder this is not a must, but it is recommended. +The Model: lib/ +ownCloud uses the MVC principle. The libraries represent the model. Basically all data should be handled here so the php files the user calls only interact with the library. If you have a look at the lib folder in contacts, you will see three files: addressbook.php, hooks.php and connector_sabre.php.addressbook.php contains all methods that are required for handling addresses. We mostly use the classes as namespaces and write static functions, “real” OOP is only used if it is useful.All functions that are called by hooks are in hooks.phpTo use the CardDAV capabilities of SabreDAV we have the library OC_Connector_Sabre_CardDAV in connector_sabre.php. This file is very small and delegates most work to OC_Contacts_Addressbook in addressbook.php. This way you only have one file with all SQL queries. +The View: templates/ +ownCloud has its own template system. The templates are php files that are included by OC_Template. Having a look at two files basically shows you everything you need to know.The variables are assigned by using $tmpl->assign(‘name’,'value’);, have a look at the end of /index.php to see how it works. +The controllers +In contacts, you find the controllers in the root directory and in ajax/. Controllers are meant to be lean. +Javascripts +The javascript libraries we use are jQuery and Torch. You can add scripts to your pages using:OC_UTIL::addScript(‘[app name]‘, ‘[script name]‘);Scripts can be added this way in either appinfo/app.php or in your app’s individual PHP scripts. +Tell owncloud of our app: appinfo/ +In appinfo are three files. Each app must have app.php and info.xml, database.xml is only needed when the app creates its own tables.app.php is called by owncloud each time it runs. Let us examine this file line by line. +OC::$CLASSPATH['OC_Contacts_Addressbook'] = 'apps/contacts/lib/addressbook.php'; +OC::$CLASSPATH['OC_Contacts_Hooks'] = 'apps/contacts/lib/hooks.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV'] = 'apps/contacts/lib/connector_sabre.php'; +This adds some entries to the OC::$CLASSPATH. This helps the ownCloud autoload function to load classes that are not in /lib. The cool thing about this is that you do not need to include anything else than /lib/base.php. +OC_HOOK::connect('OC_User', 'post_createUser', 'OC_Contacts_Hooks', 'deleteUser'); +We do not need addressbooks of deleted people. But how do we know when a user is being deleted? For this, we use hooks. As soon as someone deletes a user the OC_Uer class emits the signal post_createUser. We use this signal and connect it with the slot deleteUser in the class OC_Contact_Hooks. For more details, have a look at the documentation of OC_Hook. +OC_App::register( array( + 'order' => 10, + 'id' => 'contacts', + 'name' => 'Contacts' )); +Registers the app in ownCloud. +OC_App::addNavigationEntry( array( + 'id' => 'contacts_index', + 'order' => 10, + 'href' => OC_Helper::linkTo( 'contacts', 'index.php' ), + 'icon' => OC_Helper::imagePath( 'contacts', 'icon.png' ), + 'name' => 'Contacts' )); +This adds the entry to the navigation.info.xml is self-explanatory.database.xml describes the database as required by MDB2. Note that the database name is *dbname* and that each table name needs a *dbprefix* in front of it. +App Template +A template for writing new apps can be found here: https://github.com/owncloud/apps/tree/master/apptemplate +Publish your app +At apps.owncloud.com for other ownCloud users From ee026cc4929726b8586062009c6c1858d7c074b9 Mon Sep 17 00:00:00 2001 From: WireShout Date: Wed, 12 Dec 2012 21:59:05 -0500 Subject: [PATCH 11/49] Update developer_manual/filesystem.rst --- developer_manual/filesystem.rst | 50 ++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/developer_manual/filesystem.rst b/developer_manual/filesystem.rst index ee50e6f95..492ea5aab 100644 --- a/developer_manual/filesystem.rst +++ b/developer_manual/filesystem.rst @@ -1,4 +1,52 @@ Filesystem ========== -See http://owncloud.org/dev/apps/filesystem-interaction/ \ No newline at end of file +See http://owncloud.org/dev/apps/filesystem-interaction/ + +**THIS NEEDS FORMATTED** + +ownCloud handling of filesystems is very flexible. A variety of local and remote filesystem types are supported, as well as a variety of hooks and optional features such as encryption and version control. It is important that apps use the correct methods for interacting with files in order to maintain this flexibility. + +In some cases using PHP’s internal filesystem functions directly will be sufficient, such as unlink() and mkdir(). Most of the time however it is necessary to use one of ownCloud’s filesystem classes. This documentation assumes that you are working with files stored within a user’s directory (as opposed to ownCloud core files), and therefore need to use OC_Filesystem. + +Using PHP filesystem functions directly +An example of when it is approprite to use PHP’s filesystem functions instead of OC_Filesystem is if you are storing temporary files which will not be saved, or whose saving is taken care of by external code. ownCloud’s zip compression class does this (OC_Archive_ZIP), and returns the temporarily stored compressed file so that external code can determine what to do with it. Parts of ownCloud’s installation procedure also fall into this category, as certain files need only be saved temporarily in order to set up more permanent storage options. + +Using ownCloud’s filesystem methods +Most filesystem interaction should make use of OC_Filesystem. By using the methods within this class you ensure that non-standard and future ownCloud configurations, as well as other filesystem-related apps, will function correctly with your code. Static methods for performing most filesystem operations are provided, including: + +mkdir( $path ) +rmdir( $path ) +opendir( $path ) +is_dir( $path ) +is_file( $path ) +stat( $path ) +filetype( $path ) +filesize( $path ) +readfile( $path ) +is_readable( $path ) +is_writable( $path ) +file_exists( $path ) +filectime( $path ) +filemtime( $path ) +touch( $path, $mtime ) +file_get_contents( $path ) +file_put_contents( $path,$data ) +unlink( $path ) +rename( $path1,$path2 ) +copy( $path1,$path2 ) +fopen( $path,$mode ) +toTmpFile( $path ) +fromTmpFile( $tmpFile,$path ) +getMimeType( $path ) +hash( $type,$path ) +free_space( $path ) +search( $query ) +OC_Filesystem must be initiated before it can be used using the OC_Filesystem::init() method (the class is follows the singleton pattern). init() takes one argument, which is the root directory to be used within the virtual filesystem that OC_Filesystem will work with. + +Example: +OC_Filesystem::init( '/' . $user . '/' . $root ); + +OC_Filesystem::mkdir( 'test' ); + +if ( OC_Filesystem::is_dir('test') ) { echo 'OC_Filesystem is being used correctly'; } From 9590239ef0b572a27539238cdd4bf44bb13f73a1 Mon Sep 17 00:00:00 2001 From: WireShout Date: Wed, 12 Dec 2012 21:59:30 -0500 Subject: [PATCH 12/49] Update developer_manual/hooks.rst --- developer_manual/hooks.rst | 48 +++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/developer_manual/hooks.rst b/developer_manual/hooks.rst index 854b4d90e..939a56dd7 100644 --- a/developer_manual/hooks.rst +++ b/developer_manual/hooks.rst @@ -1,4 +1,50 @@ Hooks ===== -See http://owncloud.org/dev/apps/hooks/ \ No newline at end of file +See http://owncloud.org/dev/apps/hooks/ + +**THIS NEEDS FORMATTED** + +In ownCloud apps, function or methods (event handlers) which are used by the app and called by ownCloud core hooks, are generally stored in apps/appname/lib/hooks.php.Hooks are a way of implementing the observer pattern, and are commonly used by web platform applications to provide clean interfaces to third party applications which need to modify core application functionality. In ownCloud, a ‘hook’ is a function who’s name can be used by developers of plug-ins to ensure that additional code is executed at a precise place during the execution of other parts of ownCloud code.For example: when an ownCloud user is deleted, the ownCloud core hook ‘post_deleteUser’ is executed. In the calendar app’s appinfo/app.php, this hook is connected to the app’s own event handler ‘deleteUser’ (‘user’ here refers to an ownCloud user; ‘deleteUser’ deletes all addressbooks for that a given ownCloud user). When post_deleteUser calls the calender app’s ‘deleteUser’ event handler, it supplies it with an argument, which is an array containing the user ID of the user that has just been deleted. This user ID is then used by the event handler to specify which address books to delete. There are three components to the use of hooks in this example: +The ownCloud core hook post_deleteUser, (see what arguments / data it will provide in lib/user.php, where it is defined) +The event handler deleteUser, (defined in apps/contacts/lib/hooks.php) +The connection of the hook to the event handler, in apps/contacts/appinfo/app.php +ownCloud uses the following hook terminology: +Signal class / emitter class: the class that contains the method which contains the creation of the hook (and a call to the emit() method) e.g. OC_User +Signal / signal name: the name of the hook, e.g. post_deleteUser +Slot class: class housing the event handling method, e.g. OC_Contacts_Hooks +Slot name: event handler method, e.g. deleteUser (function that deletes all contact address books for a user) +ownCloud core provides the following hooks: +File: apps/calendar/ajax/events.php, Class: OC_Calendar +Hook: getEvents +File: apps/calendar/index.php, Class: OC_Calendar +Hook: getSources +File: dav.php, Class: OC_DAV +Hook: initialize +File: lib/migrate.php, Class: OC_User +Hook: pre_createUser +Hook: post_createUser +File: lib/filecache.php, Class: OC_Filesystem +Hook: post_write +Hook: post_write +Hook: post_delete +Hook: post_write +File: lib/user.php, Class: OC_User +Hook: pre_createUser +Hook: post_createUser +Hook: pre_deleteUser +Hook: post_deleteUser +Hook: pre_login +Hook: post_login +Hook: logout +Hook: pre_setPassword +Hook: post_setPassword +File: lib/group.php, Class: OC_Group +Hook: pre_createGroup +Hook: post_createGroup +Hook: pre_deleteGroup +Hook: post_deleteGroup +Hook: pre_addToGroup +Hook: post_addToGroup +Hook: pre_removeFromGroup +Hook: post_removeFromGroup From 0ba0637c8c4dea0dfa086284a6ad4281e70d7505 Mon Sep 17 00:00:00 2001 From: WireShout Date: Wed, 12 Dec 2012 22:00:01 -0500 Subject: [PATCH 13/49] Update developer_manual/theming.rst --- developer_manual/theming.rst | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/developer_manual/theming.rst b/developer_manual/theming.rst index 1e4eb6d33..0d14e2a68 100644 --- a/developer_manual/theming.rst +++ b/developer_manual/theming.rst @@ -1,4 +1,36 @@ Theming ======= -See http://owncloud.org/dev/theming/ \ No newline at end of file +See http://owncloud.org/dev/theming/ + +**THIS NEEDS FORMATTED** + +Themes can be used to customise the look and feel of ownCloud without the need to patch the source code. +Activate +Themes can be placed in the theme folder “/themes” with the name of the theme as foldername. The theme can be activated by putting “theme” => ‘themename’, into the config.php file. +Structure +The folder structure of a theme is exactly the same as the main ownCloud structure. You can override js files, images and templates with own versions. css files are loaded additionally to the default files so you can override css properties. +Development +Themes should be developed here: https://github.com/owncloud/themes You can also find a super simple example here. +How to change images and the logo +The easiest picture to change in ownCloud is the logo. When you open your browser and point to ownCloud, you will see an ownCloud logo by default. That image can be replaced. We will show you how to do so in this section.There are two pictures to think about: +owncloud-logo-medium-white.png – This is the splash screen logo, appearing above the login page of your ownCloud instance. size: 252w x 122h pixels, approximately, works well. Too much bigger and the logo doesn’t fit in the spot on the page +logo-wide.svg – This is the little logo that appears in the top left of the ownCloud navigate frame (SVGs can be created with adobe illustrator with a free 30 day trial, or open source inkscape) 140w x32h pixels. works well. Too much higher and the logo overflows into the navigation pane and looks terrible. The width, however, can be bigger or smaller to meet your needs, whatever works for your logo +To change either of these logos, simply create your own logo file with these characteristics, and put it in you themes folder in core/img/ +How to change colors +Just put a new style.css into the core/css folder in your themes directory. Changing the header bar colours on the Login and Main Navigation screen: In the style sheet, a bit further down, is a set that looks something like this: +/* HEADERS */ +#body-user #header, #body-settings #header { position:fixed; top:0; z-index:100; width:100%; height:2.5em; padding:.5em; background:#1d2d42; -moz-box-shadow:0 0 10px rgba(0, 0, 0, .5), inset 0 -2px 10px #222; -webkit-box-shadow:0 0 10px rgba(0, 0, 0, .5), inset 0 -2px 10px #222; box-shadow:0 0 10px rgba(0, 0, 0, .5), inset 0 -2px 10px #222; } +#body-login #header { margin: -2em auto 0; text-align:center; height:10em; + -moz-box-shadow:0 0 1em rgba(0, 0, 0, .5); -webkit-box-shadow:0 0 1em rgba(0, 0, 0, .5); box-shadow:0 0 1em rgba(0, 0, 0, .5); +background: #1d2d42; /* Old browsers */ +background: -moz-linear-gradient(top, #33537a 0%, #1d2d42 100%); /* FF3.6+ */ +background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#F1B3A4), color-stop(100%,#1d2d42)); /* Chrome,Safari4+ */ +background: -webkit-linear-gradient(top, #33537a 0%,#1d2d42 100%); /* Chrome10+,Safari5.1+ */ +background: -o-linear-gradient(top, #33537a 0%,#1d2d42 100%); /* Opera11.10+ */ +background: -ms-linear-gradient(top, #33537a 0%,#1d2d42 100%); /* IE10+ */ +background: linear-gradient(top, #33537a 0%,#1d2d42 100%); /* W3C */ +filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#33537a', endColorstr='#1d2d42',GradientType=0 ); /* IE6-9 */ } + +#owncloud { float:left; } +This handles the headers for a lot of different browser types. What we want to do is change the #35537a (lighter blue) and #ld2d42 (dark blue) color to the colours of our choice. In some older and other browsers, there is just one color, but in the rest there are gradients.The login page background is a horizontal gradient. The first hex number, #35537a, is the top color of the gradient at the login screen. The second hex number, #ld2d42 is the botton color of the gradient at the login screen.Simply change these colours to the hex color of your choice, save, and refresh to see the new login screen.The other major color scheme is the blue header bar on the main navigation page once you log in to ownCloud. This color we will change with the above as well.Save the file and refresh the browser for the changes to take affect. From c60a23dd70fb09060639fb6fa85680124b6341fb Mon Sep 17 00:00:00 2001 From: WireShout Date: Wed, 12 Dec 2012 22:00:53 -0500 Subject: [PATCH 14/49] Update developer_manual/formfactors.rst --- developer_manual/formfactors.rst | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/developer_manual/formfactors.rst b/developer_manual/formfactors.rst index 3439c3258..2f682f2d9 100644 --- a/developer_manual/formfactors.rst +++ b/developer_manual/formfactors.rst @@ -1,4 +1,19 @@ Formfactors =========== -See http://owncloud.org/dev/apps/formfactors/ \ No newline at end of file +ownCloud automatically detects what kind of form factor you are using. + +Supported form factors +---------------------- + +Currently supported are mobile, tablet, standalone and the default desktop view. Mobile is a mode that works good for touch screen smartphones. Tablet is optimized for devices like iPads or Android Tablets. The standalone view is a mode where only the content are an App is shown. The header, footer and side navigation is not visible. This is useful if ownCloud is embedded in other applications. + +Over writing +------------ + +The auto detection can be overwritten by using the “formfactor” GET variable in the url. + +How to use it in Apps? +---------------------- + +Developers can provide special versions of js or css files and templates. The special versions are automatically used if present. If not it falls back to the default files. If an App wants to provide a special mobile version of the css file it can just add a second file with a special name. The mobile version of example.css is example.mobile.css. The tablet template of foo.php is foo.tablet.php. From 241a4c789c04bbbe37d1f199e13a7c34dc54d34b Mon Sep 17 00:00:00 2001 From: WireShout Date: Wed, 12 Dec 2012 22:01:28 -0500 Subject: [PATCH 15/49] Update developer_manual/data-migration.rst --- developer_manual/data-migration.rst | 84 ++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/developer_manual/data-migration.rst b/developer_manual/data-migration.rst index 0b90e277f..c45f1a3f8 100644 --- a/developer_manual/data-migration.rst +++ b/developer_manual/data-migration.rst @@ -1,4 +1,86 @@ Data Migration ============== -See http://owncloud.org/dev/apps/data-migration/ \ No newline at end of file +See http://owncloud.org/dev/apps/data-migration/ + +**THIS NEEDS FORMATTED** + +As of OC4, user migration is supported. To include migration support in your app (which is highly recommended and doesn’t take long) you must provide a migrate.php file in appname/appinfo/migrate.php.The function of the migrate.php file is to provide an import and export functions for app data. To assist in this, we set the user id of the user being exported / user being imported in $this->uid. There is also an instance of the OC_Migration_Content class stored in $this->content. The OC_Migration_Content class helps to make importing and exporting data easy for app developers. +Export +In this function, you must do everything necessary to export a user from the current ownCloud instance, given a user id. For most apps this is just the case of saving a few rows from the database. +Database Data +To make exporting database data really easy, the class OC_Migration_Content has a method called copyRows() which will save these rows for you given some options. Take a look at the export function for the bookmarks app: +function export( ){ + OC_Log::write('migration','starting export for bookmarks',OC_Log::INFO); + $options = array( + 'table'=>'bookmarks', + 'matchcol'=>'user_id', + 'matchval'=>$this->uid, + 'idcol'=>'id' + ); + $ids = $this->content->copyRows( $options ); + $options = array( + 'table'=>'bookmarks_tags', + 'matchcol'=>'bookmark_id', + 'matchval'=>$ids + ); + + // Export tags + $ids2 = $this->content->copyRows( $options ); + + // If both returned some ids then they worked + if( is_array( $ids ) && is_array( $ids2 ) ) + { + return true; + } else { + return false; + } +} +The bookmarks app stores all of its data in the database, in two tables: *PREFIX*bookmarks and *PREFIX*bookmarks_tags so to export this, we need to run copyRows() twice. Here is an explanation of the options passed to OC_Migration_Content::copyRows(): +‘table’ => string name of the table to export (without any prefix) +‘matchcol’ => (optional) string name of the column that will be matched with the value in ‘matchval’ (Basically the column used in the WHERE sql query) +‘matchval’ => (optional) the value that will be searched for in the table +‘idcol’ => the name of the column that will be returned +To export the bookmarks, ‘matchcol’ is set to the user_id column and ‘matchval’ is set to the user being exported: $this->content->uid. ‘idcol’ is set to the id of the bookmark, as we need to retrive the tags associated with the bookmarks for the user being exported. The function will return an array of id’s.Next we run the copyRows() method again, this time on the bookmarks_tags table, matching a range of values (as we want to find all tags, related to all bookmarks owned by the exported user).Finally we check that both functions returned arrays which confirms that they were successful and return a boolean value to represent the success of the export. +Files +If you use files to hold some app data in data/userid/appname, they will be automatically copied exported for you. +Import +Import is a little more tricky as we have to take into account data from different versions of your app, and also handle changing primary keys. Here is the import function for the bookmarks app which imports bookmarks and tags: +function import(){ + switch( $this->appinfo->version ){ + default: + // All versions of the app have had the same db structure + // so all can use the same import function + $query = $this->content->prepare( "SELECT * FROM bookmarks WHERE user_id LIKE ?" ); + $results = $query->execute( array( $this->olduid ) ); + $idmap = array(); + while( $row = $results->fetchRow() ){ + // Import each bookmark, saving its id into the map + $query = OC_DB::prepare( "INSERT INTO *PREFIX*bookmarks(url, title, user_id, public, added, lastmodified) VALUES (?, ?, ?, ?, ?, ?)" ); + $query->execute( array( $row['url'], $row['title'], $this->uid, $row['public'], $row['added'], $row['lastmodified'] ) ); + // Map the id + $idmap[$row['id']] = OC_DB::insertid(); + } + // Now tags + foreach($idmap as $oldid => $newid){ + $query = $this->content->prepare( "SELECT * FROM bookmarks_tags WHERE user_id LIKE ?" ); + $results = $query->execute( array( $oldid ) ); + while( $row = $data->fetchRow() ){ + // Import the tags for this bookmark, using the new bookmark id + $query = OC_DB::prepare( "INSERT INTO *PREFIX*bookmarks_tags(bookmark_id, tag) VALUES (?, ?)" ); + $query->execute( array( $newid, $row['tag'] ) ); + } + } + // All done! + break; + } +return true; +} +We start off by using a switch to run different import code for different versions of your app. $this->appinfo->version contains the version string from the info.xml of your app. In the case of the bookmarks app the db structure has not changed, so only one version of import code is needed.To import the db data, first we must retrive it from the migration.db. To do this we use the prepare method from OC_Migration_Content, which returns a MDB2 db object. We then cycle through the bookmarks in migration.db and insert them into the owncloud database. The important bit is the ‘idmapping’. After inserting a boookmark, The new id of the bookmark is saved in an array, with the key being the old id of the bookmark. This means when inserting the tags, we know what the new id of the bookmark is simply by getting the value of $idmap['oldid']. Remember this part of the import code may be a good place to emit some hooks depending on your app. For example the contacts app could emit some hooks to show some contacts have been added.After importing the bookmarks, we must import the tags. It is a very similar process to importing the bookmarks, except we have to take into account the changes in primary keys. This is done by using a foreach key in the $idmap array, and then inserting the tags using the new id.After all this, we must return a boolean value to indicate the success or failure of the import.Again, app data files stored in data/userid/appname will be automatically copied over before the apps import function is executed, this allows you to manipulate the imported files if necessary. +Conclusion +To fully support user migration for your app you must provide a import and export function under an instance of OC_Migration_Provider and put this code in the file appname/appinfo/migrate.php + +You can view other migration providers here: + +Bookmarks migration provider +Contact migration provider From 1b0ebad3be850672b62228318d117475853ec904 Mon Sep 17 00:00:00 2001 From: WireShout Date: Wed, 12 Dec 2012 22:01:54 -0500 Subject: [PATCH 16/49] Update developer_manual/unit-testing.rst --- developer_manual/unit-testing.rst | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/developer_manual/unit-testing.rst b/developer_manual/unit-testing.rst index 9b60b7b59..add0f1e21 100644 --- a/developer_manual/unit-testing.rst +++ b/developer_manual/unit-testing.rst @@ -1,4 +1,18 @@ Unit Testing ============ -See http://owncloud.org/dev/apps/unit-testing/ \ No newline at end of file +See http://owncloud.org/dev/apps/unit-testing/ + +**THIS NEEDS FORMATTED** + +ownCloud uses the SimpleTest PHP unit testing framework for monitoring code stability. As much of ownCloud as possible should be covered by unit tests, including 3rd party apps. + +View unit test results in a web browser by accessing the /tests directory. The current results for the public dev demo ownCloud server (running about 5 mins behind git master) can be viewed at http://demo.owncloud.org/dev/tests/. In development versions of ownCloud tests can also be run from the command-line. To do so execute php -f index.php from within the /tests directory, with appropriate permissions. + +SimpleTest has been configured for easy unit testing of ownCloud apps. The tests folder within an app root directory should be used to store unit tests and any data that they use. These tests will be run automatically when /tests is accessed. + +You can run only a selected number of tests by passing a parameter as prefix-filter for the tests. When running from the browser, the test GET variable is used, when running from command-line it is passed as command line argument. For example, the tests from the files_archive app can be viewed at http://demo.owncloud.org/tests/?test=/apps/files_archive or by executing php -f index.php /apps/files_archive from the command-line. + +Apps which modify core ownCloud functionality can extend test cases which already exist within /tests/lib. For an example of an app unit test which extends an existing unit test, see /apps/files_archive/tests/storage.php. Apps which make use of public ownCloud functions, for getting logged-in user information for example, can use dummy classes which have been provided for this purpose, such as /lib/user/dummy.php. + +For information about writing tests, see SimpleTest documentation. From e42ae357cb03934ddec7cf4635dd9ffdf4ed6593 Mon Sep 17 00:00:00 2001 From: WireShout Date: Wed, 12 Dec 2012 22:02:21 -0500 Subject: [PATCH 17/49] Update developer_manual/compatibility.rst --- developer_manual/compatibility.rst | 37 +++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/developer_manual/compatibility.rst b/developer_manual/compatibility.rst index 11664fa4b..2b7e9fc4d 100644 --- a/developer_manual/compatibility.rst +++ b/developer_manual/compatibility.rst @@ -1,4 +1,39 @@ Compatibility Notes =================== -See http://owncloud.org/dev/apps/make-owncloud-3-apps-compatible-with-owncloud-4/ \ No newline at end of file +See http://owncloud.org/dev/apps/make-owncloud-3-apps-compatible-with-owncloud-4/ + +**THIS NEEDS FORMATTED** + +One of our major improvements of ownCloud 4 are movable apps. Therefore we changed the way ownCloud loads apps. Apps used to be called directly through their index.php (e.g.: /files/index.php). The problem has been that apps would not been movable if they contain a hardcoded link to the Base Library. +Apps will be called trough an parameter in ownCloud 4. An example for this is: /?app=files. +ownCloud 3 apps are not supported regarding to this mayor change, but making an ownCloud 3 app compatible with ownCloud 4 is pretty easy. +The first step is to remove the require_once command to the Base library in every file of your app. +Afterwords you have to make sure that your app uses the ownCloud internal functions to generate paths. +Paths: + +For generating a path in PHP use our new public API: + +OCP\Util::linkTo + +and for generating a path in Js use the function: + +OC.filePath + +CSS: + +You have to use the placeholders %appswebroot% and %webroot%, if your CSS file contains relative paths. + +Example from our source code: + +#contacts_deletecard {position:relative; float:left; background:url('%webroot%/core/img/actions/delete.svg') no-repeat center; } + +public.php and remote.php + +We introduced the files public.php and remote.php in ownCloud 4. + +If you want to know how to use them, you should take a look here. + +New public API + +We also introduced our new public api. The documentation for this api can be found at api.ownCloud.org. From 058d056faecb6143bc2a614c8e4112ef74e01c6a Mon Sep 17 00:00:00 2001 From: WireShout Date: Thu, 13 Dec 2012 12:29:53 -0500 Subject: [PATCH 18/49] Update developer_manual/getting_started.rst --- developer_manual/getting_started.rst | 88 ++++++++++++++++++++-------- 1 file changed, 62 insertions(+), 26 deletions(-) diff --git a/developer_manual/getting_started.rst b/developer_manual/getting_started.rst index 6cf0728a5..a48bdb3fa 100644 --- a/developer_manual/getting_started.rst +++ b/developer_manual/getting_started.rst @@ -1,52 +1,88 @@ Getting Started =============== -See http://owncloud.org/dev/apps/getting-started/ +Before you start, please check if there already is a similar app you could contribute to. `On our planning page`_ there are also some app ideas. Also, feel free to communicate your idea and plans to the `mailing list`_ so other contributors might join in. -**THIS NEEDS FORMATTED** - -Before you start, please check if there already is a similar app you could contribute to. On our planning page there are also some app ideas. Also, feel free to communicate your idea and plans to the mailing list so other contributors might join in. Develop an app +-------------- + We will use the contacts app as an example, you find it under apps/contacts. + Folder structure -ajax -appinfo -css -img -js -l10n -lib -templates +---------------- + +* ajax +* appinfo +* css +* img +* js +* l10n +* lib +* templates + As you can imagine, templates belong in the template directory, css files in the css directory, images in the img directory and javascript files in the js directory. Renaming these directories is a really bad idea because functions like OC_Helper::linkTo or OC_Helper::imagePath will not work then.The appinfo directory provides everything ownCloud needs to get the app working. The most important file is app.php. ownCloud will call this file everytime it runs, so this is the place where you can register your navigation entries or connect signals and slots. More on this later.The l10n will contain the translations. As soon as the translation detects a l10n folder it knows that this program is translatable.All php scripts that are used to answer AJAX requests are located in ajax. This keeps the root folder clean. Note that ownCloud does not force you to use this folder but it is recommended to use it.If you write a library for your app you can put it into lib. As with the ajax folder this is not a must, but it is recommended. + The Model: lib/ +--------------- + ownCloud uses the MVC principle. The libraries represent the model. Basically all data should be handled here so the php files the user calls only interact with the library. If you have a look at the lib folder in contacts, you will see three files: addressbook.php, hooks.php and connector_sabre.php.addressbook.php contains all methods that are required for handling addresses. We mostly use the classes as namespaces and write static functions, “real” OOP is only used if it is useful.All functions that are called by hooks are in hooks.phpTo use the CardDAV capabilities of SabreDAV we have the library OC_Connector_Sabre_CardDAV in connector_sabre.php. This file is very small and delegates most work to OC_Contacts_Addressbook in addressbook.php. This way you only have one file with all SQL queries. + The View: templates/ +-------------------- + ownCloud has its own template system. The templates are php files that are included by OC_Template. Having a look at two files basically shows you everything you need to know.The variables are assigned by using $tmpl->assign(‘name’,'value’);, have a look at the end of /index.php to see how it works. + The controllers +--------------- + In contacts, you find the controllers in the root directory and in ajax/. Controllers are meant to be lean. + Javascripts +----------- + The javascript libraries we use are jQuery and Torch. You can add scripts to your pages using:OC_UTIL::addScript(‘[app name]‘, ‘[script name]‘);Scripts can be added this way in either appinfo/app.php or in your app’s individual PHP scripts. + Tell owncloud of our app: appinfo/ +---------------------------------- + In appinfo are three files. Each app must have app.php and info.xml, database.xml is only needed when the app creates its own tables.app.php is called by owncloud each time it runs. Let us examine this file line by line. -OC::$CLASSPATH['OC_Contacts_Addressbook'] = 'apps/contacts/lib/addressbook.php'; + + +``OC::$CLASSPATH['OC_Contacts_Addressbook'] = 'apps/contacts/lib/addressbook.php'; OC::$CLASSPATH['OC_Contacts_Hooks'] = 'apps/contacts/lib/hooks.php'; -OC::$CLASSPATH['OC_Connector_Sabre_CardDAV'] = 'apps/contacts/lib/connector_sabre.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV'] = 'apps/contacts/lib/connector_sabre.php';`` + This adds some entries to the OC::$CLASSPATH. This helps the ownCloud autoload function to load classes that are not in /lib. The cool thing about this is that you do not need to include anything else than /lib/base.php. -OC_HOOK::connect('OC_User', 'post_createUser', 'OC_Contacts_Hooks', 'deleteUser'); + +``OC_HOOK::connect('OC_User', 'post_createUser', 'OC_Contacts_Hooks', 'deleteUser');`` + We do not need addressbooks of deleted people. But how do we know when a user is being deleted? For this, we use hooks. As soon as someone deletes a user the OC_Uer class emits the signal post_createUser. We use this signal and connect it with the slot deleteUser in the class OC_Contact_Hooks. For more details, have a look at the documentation of OC_Hook. -OC_App::register( array( - 'order' => 10, - 'id' => 'contacts', - 'name' => 'Contacts' )); + +``OC_App::register( array( +'order' => 10, +'id' => 'contacts', +'name' => 'Contacts' ));`` + Registers the app in ownCloud. -OC_App::addNavigationEntry( array( - 'id' => 'contacts_index', - 'order' => 10, - 'href' => OC_Helper::linkTo( 'contacts', 'index.php' ), - 'icon' => OC_Helper::imagePath( 'contacts', 'icon.png' ), - 'name' => 'Contacts' )); + +``OC_App::addNavigationEntry( array( +'id' => 'contacts_index', +'order' => 10, +'href' => OC_Helper::linkTo( 'contacts', 'index.php' ), +'icon' => OC_Helper::imagePath( 'contacts', 'icon.png' ), +'name' => 'Contacts' ));`` + This adds the entry to the navigation.info.xml is self-explanatory.database.xml describes the database as required by MDB2. Note that the database name is *dbname* and that each table name needs a *dbprefix* in front of it. + App Template +------------ + A template for writing new apps can be found here: https://github.com/owncloud/apps/tree/master/apptemplate + Publish your app -At apps.owncloud.com for other ownCloud users +---------------- + +At http://apps.owncloud.com for other ownCloud users + +.. _On our planning page: http://gitorious.org/owncloud/pages/Home +.. _mailing list: http://mail.kde.org/mailman/listinfo/owncloud From 367227c3bc685e288542d5aa6f7adc1a95215e06 Mon Sep 17 00:00:00 2001 From: WireShout Date: Thu, 13 Dec 2012 12:34:05 -0500 Subject: [PATCH 19/49] Update developer_manual/filesystem.rst --- developer_manual/filesystem.rst | 70 +++++++++++++++++---------------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/developer_manual/filesystem.rst b/developer_manual/filesystem.rst index 492ea5aab..0573c9721 100644 --- a/developer_manual/filesystem.rst +++ b/developer_manual/filesystem.rst @@ -1,52 +1,54 @@ Filesystem ========== -See http://owncloud.org/dev/apps/filesystem-interaction/ - -**THIS NEEDS FORMATTED** - ownCloud handling of filesystems is very flexible. A variety of local and remote filesystem types are supported, as well as a variety of hooks and optional features such as encryption and version control. It is important that apps use the correct methods for interacting with files in order to maintain this flexibility. In some cases using PHP’s internal filesystem functions directly will be sufficient, such as unlink() and mkdir(). Most of the time however it is necessary to use one of ownCloud’s filesystem classes. This documentation assumes that you are working with files stored within a user’s directory (as opposed to ownCloud core files), and therefore need to use OC_Filesystem. Using PHP filesystem functions directly +--------------------------------------- + An example of when it is approprite to use PHP’s filesystem functions instead of OC_Filesystem is if you are storing temporary files which will not be saved, or whose saving is taken care of by external code. ownCloud’s zip compression class does this (OC_Archive_ZIP), and returns the temporarily stored compressed file so that external code can determine what to do with it. Parts of ownCloud’s installation procedure also fall into this category, as certain files need only be saved temporarily in order to set up more permanent storage options. Using ownCloud’s filesystem methods +----------------------------------- + Most filesystem interaction should make use of OC_Filesystem. By using the methods within this class you ensure that non-standard and future ownCloud configurations, as well as other filesystem-related apps, will function correctly with your code. Static methods for performing most filesystem operations are provided, including: -mkdir( $path ) -rmdir( $path ) -opendir( $path ) -is_dir( $path ) -is_file( $path ) -stat( $path ) -filetype( $path ) -filesize( $path ) -readfile( $path ) -is_readable( $path ) -is_writable( $path ) -file_exists( $path ) -filectime( $path ) -filemtime( $path ) -touch( $path, $mtime ) -file_get_contents( $path ) -file_put_contents( $path,$data ) -unlink( $path ) -rename( $path1,$path2 ) -copy( $path1,$path2 ) -fopen( $path,$mode ) -toTmpFile( $path ) -fromTmpFile( $tmpFile,$path ) -getMimeType( $path ) -hash( $type,$path ) -free_space( $path ) -search( $query ) -OC_Filesystem must be initiated before it can be used using the OC_Filesystem::init() method (the class is follows the singleton pattern). init() takes one argument, which is the root directory to be used within the virtual filesystem that OC_Filesystem will work with. +* mkdir( $path ) +* rmdir( $path ) +* opendir( $path ) +* is_dir( $path ) +* is_file( $path ) +* stat( $path ) +* filetype( $path ) +* filesize( $path ) +* readfile( $path ) +* is_readable( $path ) +* is_writable( $path ) +* file_exists( $path ) +* filectime( $path ) +* filemtime( $path ) +* touch( $path, $mtime ) +* file_get_contents( $path ) +* file_put_contents( $path,$data ) +* unlink( $path ) +* rename( $path1,$path2 ) +* copy( $path1,$path2 ) +* fopen( $path,$mode ) +* toTmpFile( $path ) +* fromTmpFile( $tmpFile,$path ) +* getMimeType( $path ) +* hash( $type,$path ) +* free_space( $path ) +* search( $query ) + +OC_Filesystem must be initiated before it can be used using the OC_Filesystem::init() method (the class is follows the `singleton pattern`_). init() takes one argument, which is the root directory to be used within the virtual filesystem that OC_Filesystem will work with. Example: -OC_Filesystem::init( '/' . $user . '/' . $root ); +``OC_Filesystem::init( '/' . $user . '/' . $root ); OC_Filesystem::mkdir( 'test' ); +if ( OC_Filesystem::is_dir('test') ) { echo 'OC_Filesystem is being used correctly'; }`` -if ( OC_Filesystem::is_dir('test') ) { echo 'OC_Filesystem is being used correctly'; } +.. _singleton pattern: https://en.wikipedia.org/wiki/Singleton_pattern From faf6ec76f6154270f2d86146cc23a8ba481b273f Mon Sep 17 00:00:00 2001 From: WireShout Date: Thu, 13 Dec 2012 12:40:07 -0500 Subject: [PATCH 20/49] Update developer_manual/hooks.rst --- developer_manual/hooks.rst | 95 +++++++++++++++++++++++--------------- 1 file changed, 59 insertions(+), 36 deletions(-) diff --git a/developer_manual/hooks.rst b/developer_manual/hooks.rst index 939a56dd7..08686d3b8 100644 --- a/developer_manual/hooks.rst +++ b/developer_manual/hooks.rst @@ -1,50 +1,73 @@ Hooks ===== -See http://owncloud.org/dev/apps/hooks/ +In ownCloud apps, function or methods (event handlers) which are used by the app and called by ownCloud core hooks, are generally stored in apps/appname/lib/hooks.php.Hooks are a way of implementing the `observer pattern`_, and are commonly used by web platform applications to provide clean interfaces to third party applications which need to modify core application functionality. In ownCloud, a ‘hook’ is a function who’s name can be used by developers of plug-ins to ensure that additional code is executed at a precise place during the execution of other parts of ownCloud code.For example: when an ownCloud user is deleted, the ownCloud core hook ‘post_deleteUser’ is executed. In the calendar app’s appinfo/app.php, this hook is connected to the app’s own event handler ‘deleteUser’ (‘user’ here refers to an ownCloud user; ‘deleteUser’ deletes all addressbooks for that a given ownCloud user). When post_deleteUser calls the calender app’s ‘deleteUser’ event handler, it supplies it with an argument, which is an array containing the user ID of the user that has just been deleted. This user ID is then used by the event handler to specify which address books to delete. There are three components to the use of hooks in this example: -**THIS NEEDS FORMATTED** +#. The ownCloud core hook post_deleteUser, (see what arguments / data it will provide in lib/user.php, where it is defined) +#. The event handler deleteUser, (defined in apps/contacts/lib/hooks.php) +#. The connection of the hook to the event handler, in apps/contacts/appinfo/app.php -In ownCloud apps, function or methods (event handlers) which are used by the app and called by ownCloud core hooks, are generally stored in apps/appname/lib/hooks.php.Hooks are a way of implementing the observer pattern, and are commonly used by web platform applications to provide clean interfaces to third party applications which need to modify core application functionality. In ownCloud, a ‘hook’ is a function who’s name can be used by developers of plug-ins to ensure that additional code is executed at a precise place during the execution of other parts of ownCloud code.For example: when an ownCloud user is deleted, the ownCloud core hook ‘post_deleteUser’ is executed. In the calendar app’s appinfo/app.php, this hook is connected to the app’s own event handler ‘deleteUser’ (‘user’ here refers to an ownCloud user; ‘deleteUser’ deletes all addressbooks for that a given ownCloud user). When post_deleteUser calls the calender app’s ‘deleteUser’ event handler, it supplies it with an argument, which is an array containing the user ID of the user that has just been deleted. This user ID is then used by the event handler to specify which address books to delete. There are three components to the use of hooks in this example: -The ownCloud core hook post_deleteUser, (see what arguments / data it will provide in lib/user.php, where it is defined) -The event handler deleteUser, (defined in apps/contacts/lib/hooks.php) -The connection of the hook to the event handler, in apps/contacts/appinfo/app.php ownCloud uses the following hook terminology: -Signal class / emitter class: the class that contains the method which contains the creation of the hook (and a call to the emit() method) e.g. OC_User -Signal / signal name: the name of the hook, e.g. post_deleteUser -Slot class: class housing the event handling method, e.g. OC_Contacts_Hooks -Slot name: event handler method, e.g. deleteUser (function that deletes all contact address books for a user) + +* Signal class / emitter class: the class that contains the method which contains the creation of the hook (and a call to the emit() method) e.g. OC_User +* Signal / signal name: the name of the hook, e.g. post_deleteUser +* Slot class: class housing the event handling method, e.g. OC_Contacts_Hooks +* Slot name: event handler method, e.g. deleteUser (function that deletes all contact address books for a user) + ownCloud core provides the following hooks: + File: apps/calendar/ajax/events.php, Class: OC_Calendar -Hook: getEvents +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Hook: getEvents + File: apps/calendar/index.php, Class: OC_Calendar -Hook: getSources +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Hook: getSources + File: dav.php, Class: OC_DAV -Hook: initialize +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Hook: initialize + File: lib/migrate.php, Class: OC_User -Hook: pre_createUser -Hook: post_createUser +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Hook: pre_createUser +* Hook: post_createUser + File: lib/filecache.php, Class: OC_Filesystem -Hook: post_write -Hook: post_write -Hook: post_delete -Hook: post_write +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Hook: post_write +* Hook: post_write +* Hook: post_delete +* Hook: post_write + File: lib/user.php, Class: OC_User -Hook: pre_createUser -Hook: post_createUser -Hook: pre_deleteUser -Hook: post_deleteUser -Hook: pre_login -Hook: post_login -Hook: logout -Hook: pre_setPassword -Hook: post_setPassword +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Hook: pre_createUser +* Hook: post_createUser +* Hook: pre_deleteUser +* Hook: post_deleteUser +* Hook: pre_login +* Hook: post_login +* Hook: logout +* Hook: pre_setPassword +* Hook: post_setPassword + File: lib/group.php, Class: OC_Group -Hook: pre_createGroup -Hook: post_createGroup -Hook: pre_deleteGroup -Hook: post_deleteGroup -Hook: pre_addToGroup -Hook: post_addToGroup -Hook: pre_removeFromGroup -Hook: post_removeFromGroup +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Hook: pre_createGroup +* Hook: post_createGroup +* Hook: pre_deleteGroup +* Hook: post_deleteGroup +* Hook: pre_addToGroup +* Hook: post_addToGroup +* Hook: pre_removeFromGroup +* Hook: post_removeFromGroup + +.. _observer pattern: https://en.wikipedia.org/wiki/Observer_pattern From ac7b0a751f5d9e7db186558007fe734f019e2a6c Mon Sep 17 00:00:00 2001 From: WireShout Date: Thu, 13 Dec 2012 12:44:51 -0500 Subject: [PATCH 21/49] Update developer_manual/theming.rst --- developer_manual/theming.rst | 38 +++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/developer_manual/theming.rst b/developer_manual/theming.rst index 0d14e2a68..8a37d4194 100644 --- a/developer_manual/theming.rst +++ b/developer_manual/theming.rst @@ -1,28 +1,42 @@ Theming ======= -See http://owncloud.org/dev/theming/ - -**THIS NEEDS FORMATTED** - Themes can be used to customise the look and feel of ownCloud without the need to patch the source code. + Activate +-------- + Themes can be placed in the theme folder “/themes” with the name of the theme as foldername. The theme can be activated by putting “theme” => ‘themename’, into the config.php file. + Structure +--------- + The folder structure of a theme is exactly the same as the main ownCloud structure. You can override js files, images and templates with own versions. css files are loaded additionally to the default files so you can override css properties. + Development -Themes should be developed here: https://github.com/owncloud/themes You can also find a super simple example here. +----------- + +Themes should be developed here: https://github.com/owncloud/themes You can also find a super simple example `here`_. + How to change images and the logo +--------------------------------- + The easiest picture to change in ownCloud is the logo. When you open your browser and point to ownCloud, you will see an ownCloud logo by default. That image can be replaced. We will show you how to do so in this section.There are two pictures to think about: -owncloud-logo-medium-white.png – This is the splash screen logo, appearing above the login page of your ownCloud instance. size: 252w x 122h pixels, approximately, works well. Too much bigger and the logo doesn’t fit in the spot on the page -logo-wide.svg – This is the little logo that appears in the top left of the ownCloud navigate frame (SVGs can be created with adobe illustrator with a free 30 day trial, or open source inkscape) 140w x32h pixels. works well. Too much higher and the logo overflows into the navigation pane and looks terrible. The width, however, can be bigger or smaller to meet your needs, whatever works for your logo + +* owncloud-logo-medium-white.png – This is the splash screen logo, appearing above the login page of your ownCloud instance. size: 252w x 122h pixels, approximately, works well. Too much bigger and the logo doesn’t fit in the spot on the page +* logo-wide.svg – This is the little logo that appears in the top left of the ownCloud navigate frame (SVGs can be created with adobe illustrator with a free 30 day trial, or open source inkscape) 140w x32h pixels. works well. Too much higher and the logo overflows into the navigation pane and looks terrible. The width, however, can be bigger or smaller to meet your needs, whatever works for your logo + To change either of these logos, simply create your own logo file with these characteristics, and put it in you themes folder in core/img/ + How to change colors +-------------------- + Just put a new style.css into the core/css folder in your themes directory. Changing the header bar colours on the Login and Main Navigation screen: In the style sheet, a bit further down, is a set that looks something like this: -/* HEADERS */ + +``/* HEADERS */ #body-user #header, #body-settings #header { position:fixed; top:0; z-index:100; width:100%; height:2.5em; padding:.5em; background:#1d2d42; -moz-box-shadow:0 0 10px rgba(0, 0, 0, .5), inset 0 -2px 10px #222; -webkit-box-shadow:0 0 10px rgba(0, 0, 0, .5), inset 0 -2px 10px #222; box-shadow:0 0 10px rgba(0, 0, 0, .5), inset 0 -2px 10px #222; } #body-login #header { margin: -2em auto 0; text-align:center; height:10em; - -moz-box-shadow:0 0 1em rgba(0, 0, 0, .5); -webkit-box-shadow:0 0 1em rgba(0, 0, 0, .5); box-shadow:0 0 1em rgba(0, 0, 0, .5); +-moz-box-shadow:0 0 1em rgba(0, 0, 0, .5); -webkit-box-shadow:0 0 1em rgba(0, 0, 0, .5); box-shadow:0 0 1em rgba(0, 0, 0, .5); background: #1d2d42; /* Old browsers */ background: -moz-linear-gradient(top, #33537a 0%, #1d2d42 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#F1B3A4), color-stop(100%,#1d2d42)); /* Chrome,Safari4+ */ @@ -31,6 +45,8 @@ background: -o-linear-gradient(top, #33537a 0%,#1d2d42 100%); /* Opera11.10+ */ background: -ms-linear-gradient(top, #33537a 0%,#1d2d42 100%); /* IE10+ */ background: linear-gradient(top, #33537a 0%,#1d2d42 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#33537a', endColorstr='#1d2d42',GradientType=0 ); /* IE6-9 */ } +#owncloud { float:left; }`` -#owncloud { float:left; } -This handles the headers for a lot of different browser types. What we want to do is change the #35537a (lighter blue) and #ld2d42 (dark blue) color to the colours of our choice. In some older and other browsers, there is just one color, but in the rest there are gradients.The login page background is a horizontal gradient. The first hex number, #35537a, is the top color of the gradient at the login screen. The second hex number, #ld2d42 is the botton color of the gradient at the login screen.Simply change these colours to the hex color of your choice, save, and refresh to see the new login screen.The other major color scheme is the blue header bar on the main navigation page once you log in to ownCloud. This color we will change with the above as well.Save the file and refresh the browser for the changes to take affect. +This handles the headers for a lot of different browser types. What we want to do is change the #35537a (lighter blue) and #ld2d42 (dark blue) color to the colours of our choice. In some older and other browsers, there is just one color, but in the rest there are gradients.The login page background is a horizontal gradient. The first hex number, #35537a, is the top color of the gradient at the login screen. The second hex number, #ld2d42 is the botton color of the gradient at the login screen.Simply change these colours to the hex color of your choice, save, and refresh to see the new login screen.The other major color scheme is the blue header bar on the main navigation page once you log in to ownCloud. This color we will change with the above as well.Save the file and refresh the browser for the changes to take affect. + +.. _here: https://github.com/owncloud/themes/tree/master/example From 0bb45a0d98625b89cff530f562d3131f6ccc7a43 Mon Sep 17 00:00:00 2001 From: WireShout Date: Thu, 13 Dec 2012 12:51:40 -0500 Subject: [PATCH 22/49] Update developer_manual/data-migration.rst --- developer_manual/data-migration.rst | 148 ++++++++++++++++------------ 1 file changed, 83 insertions(+), 65 deletions(-) diff --git a/developer_manual/data-migration.rst b/developer_manual/data-migration.rst index c45f1a3f8..e7453f375 100644 --- a/developer_manual/data-migration.rst +++ b/developer_manual/data-migration.rst @@ -1,86 +1,104 @@ Data Migration ============== -See http://owncloud.org/dev/apps/data-migration/ - -**THIS NEEDS FORMATTED** - As of OC4, user migration is supported. To include migration support in your app (which is highly recommended and doesn’t take long) you must provide a migrate.php file in appname/appinfo/migrate.php.The function of the migrate.php file is to provide an import and export functions for app data. To assist in this, we set the user id of the user being exported / user being imported in $this->uid. There is also an instance of the OC_Migration_Content class stored in $this->content. The OC_Migration_Content class helps to make importing and exporting data easy for app developers. + Export +------ + In this function, you must do everything necessary to export a user from the current ownCloud instance, given a user id. For most apps this is just the case of saving a few rows from the database. + Database Data +~~~~~~~~~~~~~ + To make exporting database data really easy, the class OC_Migration_Content has a method called copyRows() which will save these rows for you given some options. Take a look at the export function for the bookmarks app: -function export( ){ - OC_Log::write('migration','starting export for bookmarks',OC_Log::INFO); - $options = array( - 'table'=>'bookmarks', - 'matchcol'=>'user_id', - 'matchval'=>$this->uid, - 'idcol'=>'id' - ); - $ids = $this->content->copyRows( $options ); - $options = array( - 'table'=>'bookmarks_tags', - 'matchcol'=>'bookmark_id', - 'matchval'=>$ids - ); - - // Export tags - $ids2 = $this->content->copyRows( $options ); - - // If both returned some ids then they worked - if( is_array( $ids ) && is_array( $ids2 ) ) - { - return true; - } else { - return false; - } -} + +``function export( ){ +OC_Log::write('migration','starting export for bookmarks',OC_Log::INFO); +$options = array( +'table'=>'bookmarks', +'matchcol'=>'user_id', +'matchval'=>$this->uid, +'idcol'=>'id' +); +$ids = $this->content->copyRows( $options ); +$options = array( +'table'=>'bookmarks_tags', +'matchcol'=>'bookmark_id', +'matchval'=>$ids +); +// Export tags +$ids2 = $this->content->copyRows( $options ); +// If both returned some ids then they worked +if( is_array( $ids ) && is_array( $ids2 ) ) +{ +return true; +} else { +return false; +} +}`` + The bookmarks app stores all of its data in the database, in two tables: *PREFIX*bookmarks and *PREFIX*bookmarks_tags so to export this, we need to run copyRows() twice. Here is an explanation of the options passed to OC_Migration_Content::copyRows(): -‘table’ => string name of the table to export (without any prefix) -‘matchcol’ => (optional) string name of the column that will be matched with the value in ‘matchval’ (Basically the column used in the WHERE sql query) -‘matchval’ => (optional) the value that will be searched for in the table -‘idcol’ => the name of the column that will be returned + +* ‘table’ => string name of the table to export (without any prefix) +* ‘matchcol’ => (optional) string name of the column that will be matched with the value in ‘matchval’ (Basically the column used in the WHERE sql query) +* ‘matchval’ => (optional) the value that will be searched for in the table +* ‘idcol’ => the name of the column that will be returned + To export the bookmarks, ‘matchcol’ is set to the user_id column and ‘matchval’ is set to the user being exported: $this->content->uid. ‘idcol’ is set to the id of the bookmark, as we need to retrive the tags associated with the bookmarks for the user being exported. The function will return an array of id’s.Next we run the copyRows() method again, this time on the bookmarks_tags table, matching a range of values (as we want to find all tags, related to all bookmarks owned by the exported user).Finally we check that both functions returned arrays which confirms that they were successful and return a boolean value to represent the success of the export. + Files +~~~~~ + If you use files to hold some app data in data/userid/appname, they will be automatically copied exported for you. + Import +------ + Import is a little more tricky as we have to take into account data from different versions of your app, and also handle changing primary keys. Here is the import function for the bookmarks app which imports bookmarks and tags: -function import(){ - switch( $this->appinfo->version ){ - default: - // All versions of the app have had the same db structure - // so all can use the same import function - $query = $this->content->prepare( "SELECT * FROM bookmarks WHERE user_id LIKE ?" ); - $results = $query->execute( array( $this->olduid ) ); - $idmap = array(); - while( $row = $results->fetchRow() ){ - // Import each bookmark, saving its id into the map - $query = OC_DB::prepare( "INSERT INTO *PREFIX*bookmarks(url, title, user_id, public, added, lastmodified) VALUES (?, ?, ?, ?, ?, ?)" ); - $query->execute( array( $row['url'], $row['title'], $this->uid, $row['public'], $row['added'], $row['lastmodified'] ) ); - // Map the id - $idmap[$row['id']] = OC_DB::insertid(); - } - // Now tags - foreach($idmap as $oldid => $newid){ - $query = $this->content->prepare( "SELECT * FROM bookmarks_tags WHERE user_id LIKE ?" ); - $results = $query->execute( array( $oldid ) ); - while( $row = $data->fetchRow() ){ - // Import the tags for this bookmark, using the new bookmark id - $query = OC_DB::prepare( "INSERT INTO *PREFIX*bookmarks_tags(bookmark_id, tag) VALUES (?, ?)" ); - $query->execute( array( $newid, $row['tag'] ) ); - } - } - // All done! - break; - } -return true; + +``function import(){ +switch( $this->appinfo->version ){ +default: +// All versions of the app have had the same db structure +// so all can use the same import function +$query = $this->content->prepare( "SELECT * FROM bookmarks WHERE user_id LIKE ?" ); +$results = $query->execute( array( $this->olduid ) ); +$idmap = array(); +while( $row = $results->fetchRow() ){ +// Import each bookmark, saving its id into the map +$query = OC_DB::prepare( "INSERT INTO *PREFIX*bookmarks(url, title, user_id, public, added, lastmodified) VALUES (?, ?, ?, ?, ?, ?)" ); +$query->execute( array( $row['url'], $row['title'], $this->uid, $row['public'], $row['added'], $row['lastmodified'] ) ); +// Map the id +$idmap[$row['id']] = OC_DB::insertid(); } +// Now tags +foreach($idmap as $oldid => $newid){ +$query = $this->content->prepare( "SELECT * FROM bookmarks_tags WHERE user_id LIKE ?" ); +$results = $query->execute( array( $oldid ) ); +while( $row = $data->fetchRow() ){ +// Import the tags for this bookmark, using the new bookmark id +$query = OC_DB::prepare( "INSERT INTO *PREFIX*bookmarks_tags(bookmark_id, tag) VALUES (?, ?)" ); +$query->execute( array( $newid, $row['tag'] ) ); +} +} +// All done! +break; +} +return true; +}`` + We start off by using a switch to run different import code for different versions of your app. $this->appinfo->version contains the version string from the info.xml of your app. In the case of the bookmarks app the db structure has not changed, so only one version of import code is needed.To import the db data, first we must retrive it from the migration.db. To do this we use the prepare method from OC_Migration_Content, which returns a MDB2 db object. We then cycle through the bookmarks in migration.db and insert them into the owncloud database. The important bit is the ‘idmapping’. After inserting a boookmark, The new id of the bookmark is saved in an array, with the key being the old id of the bookmark. This means when inserting the tags, we know what the new id of the bookmark is simply by getting the value of $idmap['oldid']. Remember this part of the import code may be a good place to emit some hooks depending on your app. For example the contacts app could emit some hooks to show some contacts have been added.After importing the bookmarks, we must import the tags. It is a very similar process to importing the bookmarks, except we have to take into account the changes in primary keys. This is done by using a foreach key in the $idmap array, and then inserting the tags using the new id.After all this, we must return a boolean value to indicate the success or failure of the import.Again, app data files stored in data/userid/appname will be automatically copied over before the apps import function is executed, this allows you to manipulate the imported files if necessary. + Conclusion +---------- + To fully support user migration for your app you must provide a import and export function under an instance of OC_Migration_Provider and put this code in the file appname/appinfo/migrate.php You can view other migration providers here: -Bookmarks migration provider -Contact migration provider +* `Bookmarks migration provider`_ +* `Contact migration provider`_ + +.. _Bookmarks migration provider: http://gitorious.org/owncloud/owncloud/blobs/migration/apps/bookmarks/appinfo/migrate.php +.. _Contact migration provider: http://gitorious.org/owncloud/owncloud/blobs/migration/apps/contacts/appinfo/migrate.php From 8c981a602f240193fc4425e11b1effab04c0a13a Mon Sep 17 00:00:00 2001 From: WireShout Date: Thu, 13 Dec 2012 12:55:06 -0500 Subject: [PATCH 23/49] Update developer_manual/unit-testing.rst --- developer_manual/unit-testing.rst | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/developer_manual/unit-testing.rst b/developer_manual/unit-testing.rst index add0f1e21..6f134128f 100644 --- a/developer_manual/unit-testing.rst +++ b/developer_manual/unit-testing.rst @@ -1,18 +1,17 @@ Unit Testing ============ -See http://owncloud.org/dev/apps/unit-testing/ +ownCloud uses the `SimpleTest`_ PHP unit testing framework for monitoring code stability. As much of ownCloud as possible should be covered by unit tests, including 3rd party apps. -**THIS NEEDS FORMATTED** +View unit test results in a web browser by accessing the ``/tests`` directory. The current results for the public dev demo ownCloud server (running about 5 mins behind git master) can be viewed at http://demo.owncloud.org/dev/tests/. In development versions of ownCloud tests can also be run from the command-line. To do so execute ``php -f index.php`` from within the ``/tests`` directory, with appropriate permissions. -ownCloud uses the SimpleTest PHP unit testing framework for monitoring code stability. As much of ownCloud as possible should be covered by unit tests, including 3rd party apps. +SimpleTest has been configured for easy unit testing of ownCloud apps. The ``tests`` folder within an app root directory should be used to store unit tests and any data that they use. These tests will be run automatically when ``/tests`` is accessed. -View unit test results in a web browser by accessing the /tests directory. The current results for the public dev demo ownCloud server (running about 5 mins behind git master) can be viewed at http://demo.owncloud.org/dev/tests/. In development versions of ownCloud tests can also be run from the command-line. To do so execute php -f index.php from within the /tests directory, with appropriate permissions. +You can run only a selected number of tests by passing a parameter as prefix-filter for the tests. When running from the browser, the ``test`` GET variable is used, when running from command-line it is passed as command line argument. For example, the tests from the ``files_archive`` app can be viewed at http://demo.owncloud.org/tests/?test=/apps/files_archive or by executing ``php -f index.php /apps/files_archive`` from the command-line. -SimpleTest has been configured for easy unit testing of ownCloud apps. The tests folder within an app root directory should be used to store unit tests and any data that they use. These tests will be run automatically when /tests is accessed. +Apps which modify core ownCloud functionality can extend test cases which already exist within ``/tests/lib``. For an example of an app unit test which extends an existing unit test, see ``/apps/files_archive/tests/storage.php``. Apps which make use of public ownCloud functions, for getting logged-in user information for example, can use dummy classes which have been provided for this purpose, such as ``/lib/user/dummy.php``. -You can run only a selected number of tests by passing a parameter as prefix-filter for the tests. When running from the browser, the test GET variable is used, when running from command-line it is passed as command line argument. For example, the tests from the files_archive app can be viewed at http://demo.owncloud.org/tests/?test=/apps/files_archive or by executing php -f index.php /apps/files_archive from the command-line. +For information about writing tests, see `SimpleTest documentation`_. -Apps which modify core ownCloud functionality can extend test cases which already exist within /tests/lib. For an example of an app unit test which extends an existing unit test, see /apps/files_archive/tests/storage.php. Apps which make use of public ownCloud functions, for getting logged-in user information for example, can use dummy classes which have been provided for this purpose, such as /lib/user/dummy.php. - -For information about writing tests, see SimpleTest documentation. +.. _SimpleTest: http://simpletest.org/ +.. _SimpleTest documentation: http://simpletest.org/en/start-testing.html From 615da50f096824f08608a84e3f0d3669bac2b3a9 Mon Sep 17 00:00:00 2001 From: WireShout Date: Thu, 13 Dec 2012 12:59:20 -0500 Subject: [PATCH 24/49] Update developer_manual/compatibility.rst --- developer_manual/compatibility.rst | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/developer_manual/compatibility.rst b/developer_manual/compatibility.rst index 2b7e9fc4d..ddd707ba9 100644 --- a/developer_manual/compatibility.rst +++ b/developer_manual/compatibility.rst @@ -1,39 +1,46 @@ Compatibility Notes =================== -See http://owncloud.org/dev/apps/make-owncloud-3-apps-compatible-with-owncloud-4/ - -**THIS NEEDS FORMATTED** - One of our major improvements of ownCloud 4 are movable apps. Therefore we changed the way ownCloud loads apps. Apps used to be called directly through their index.php (e.g.: /files/index.php). The problem has been that apps would not been movable if they contain a hardcoded link to the Base Library. + Apps will be called trough an parameter in ownCloud 4. An example for this is: /?app=files. + ownCloud 3 apps are not supported regarding to this mayor change, but making an ownCloud 3 app compatible with ownCloud 4 is pretty easy. -The first step is to remove the require_once command to the Base library in every file of your app. + +The first step is to **remove** the **require_once** command to the **Base library** in **every file** of your app. + Afterwords you have to make sure that your app uses the ownCloud internal functions to generate paths. + Paths: +~~~~~~ For generating a path in PHP use our new public API: -OCP\Util::linkTo +``OCP\Util::linkTo`` and for generating a path in Js use the function: -OC.filePath +``OC.filePath`` CSS: +~~~~ -You have to use the placeholders %appswebroot% and %webroot%, if your CSS file contains relative paths. +You have to use the placeholders ``%appswebroot%`` and ``%webroot%``, if your CSS file contains relative paths. Example from our source code: -#contacts_deletecard {position:relative; float:left; background:url('%webroot%/core/img/actions/delete.svg') no-repeat center; } +``#contacts_deletecard {position:relative; float:left; background:url('%webroot%/core/img/actions/delete.svg') no-repeat center; }`` public.php and remote.php +~~~~~~~~~~~~~~~~~~~~~~~~~ We introduced the files public.php and remote.php in ownCloud 4. -If you want to know how to use them, you should take a look here. +If you want to know how to use them, you should take a look `here`_. New public API +~~~~~~~~~~~~~~ -We also introduced our new public api. The documentation for this api can be found at api.ownCloud.org. +We also introduced our new public api. The documentation for this api can be found at api.ownCloud.org. + +.. _here: http://owncloud.org/dev/apps/public-php-and-remote-php/ From a5cb062da809229e4c2786376be7e9409167482b Mon Sep 17 00:00:00 2001 From: WireShout Date: Thu, 13 Dec 2012 12:59:49 -0500 Subject: [PATCH 25/49] fixing compatability url --- developer_manual/compatibility.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/developer_manual/compatibility.rst b/developer_manual/compatibility.rst index ddd707ba9..255221cf3 100644 --- a/developer_manual/compatibility.rst +++ b/developer_manual/compatibility.rst @@ -41,6 +41,6 @@ If you want to know how to use them, you should take a look `here`_. New public API ~~~~~~~~~~~~~~ -We also introduced our new public api. The documentation for this api can be found at api.ownCloud.org. +We also introduced our new public api. The documentation for this api can be found at http://api.ownCloud.org. -.. _here: http://owncloud.org/dev/apps/public-php-and-remote-php/ +.. _here: http://owncloud.org/dev/apps/public-php-and-remote-php/ From 082d9bbcc0141d70f377edad4c3a3d2bc3957e92 Mon Sep 17 00:00:00 2001 From: WireShout Date: Thu, 13 Dec 2012 13:11:26 -0500 Subject: [PATCH 26/49] Update developer_manual/kanban.rst started, need to finish --- developer_manual/kanban.rst | 69 ++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/developer_manual/kanban.rst b/developer_manual/kanban.rst index c0c61735a..4c0da49a7 100644 --- a/developer_manual/kanban.rst +++ b/developer_manual/kanban.rst @@ -1,4 +1,71 @@ Kanban Board ============ -See http://owncloud.org/dev/kanban-board/ \ No newline at end of file +*This page contains a lot of information about the development process the ownCloud community tries to follow, so please take your time to digest all the information. In any case remember this page as the documentation on how it should be done. Nothing here is set in stone, so if you think something should be changed please discuss it on the mailing list.* + +Kanban Board = github issues + huboard +-------------------------------------- + +We are using huboard.com to visualize ownCloud github issues as a kanban board (see: core, apps, mirall): + +As you may have noticed, the columns of the kanban board represent the life-cycle of an issue (be it a Bug or an Enhancement). An issue flows from the 1 - Backlog on the left to the 7 - To release column on the right and is not closed until it has been released. Instead we pull an issue to the next column by changing the label. The following tables will tell you what the labels mean in the life-cycle and will hopefully help you decide how to label an issue. + +Backlog +------- + +**Why do we have it?** To keep us focused on finishing issues that we started, new issues will be hidden in this column. In huboard you can see the list of things that we could think about by clicking the small arrow in the top left corner of the concept column header. + +**What does a developer think?** Maybe later. + +**When can I pull?** Since this is the bucket for whatever might be done you should only pick issues from the backlog when there is no other issue that you can work on. It is more important to finish an issue currently on the Kanban board than to pull a new one into the flow because only released issues have a value to our users! + +**Who is Assigned?** Either a maintainer feels directly responsible for the issue and assigns himself or the gatekeeper (the guys having a look at unassigned bugs) will try to determine the responsible developer. + +Concept +------- + +Why do we have it? Our think before you act phase serves two purposes. A Bug is in the concept phase while we are trying to figure out why something is broken (analysis). An Enhancement is in the concept phase until we have decided how to implement it (design). +What does a developer think? I’ll write a Scenario for our BDD in Gherkin and post it as a comment. I can always look at the existing ones to get an inspiration how to phrase them as “Given … when … then …“ +When can I pull? As long as you think and discuss on how to implement an enhancement or how to solve a bug you should leave the concept label assigned. Two things should be documented in a comment to the issue before moving it to the “To develop” step: +At least one Scenario – written in Gherkin – that tells you and the tester when the issue is ready to be released. +A concept describing the planned implementation. This can be as simple as a “this just needs changes to the login screen css” or so complex that you link to a blog entry somewhere else. +Who is Assigned? The maintainer that feels responsible for the issue. + +Devolp +------ + +4 - Developing 4 - Developing To review 5 - To review +Why do we have it? This is where the magic happens. If it’s a Bug the fix will be submitted as a PULL REQUEST to the master or corresponding stable branch. If its an Enhancement code will be committed to a feature branch. Instead of directly committing to master we agree that a second set of eyes will spot bugs and increase our code quality and give us an opportunity to learn from each other. See also our Code Review Documentation +What does a developer think? You know, I’m at it. By the way, I’ll also write unit tests. When I’m done I’ll push the issue with a commit containing “push GH-#” where # is the issue number. If I have an idea of who should review it I can also notify them with @githubusername I’ll check the Scenario described earlier works as expected. If necessary I’ll update the related Gherkin Scenarios. Jenkins will test the scenario on all kinds of platforms, webserver and database combinations with cucumber. +When can I pull? As long as you are writing code for the issue or if any unit test fails you should leave the “4 – Developing” label assigned. Two things should have been implemented before moving the issue to the “To review” step: +The enhancement or bug in question +Unit tests for the changed and added code. +If you feel like making sure an issue works as expected you should look for issues with this label. In the comments you should find a gherkin scenario that can be used as a checklist for what to try. Before you start move the issue to the “Reviewing” step by assigning the “6 – Reviewing” label. +Who is Assigned? The most active developer should assign himself. No one. Especially not if you are working on something else! + +Reviewing 6 - Reviewing To release 7 - To release +Why do we have it? With the Gherkin Scenario from the Concept Phase reviewers have a checklist to test if a Bug has been solved and if an Enhancement works as expected. The most eager reviewer we have is Jenkins. When it comes to testing he soldiers on going through the different combinations of platform, webserver and database. This is a list of issues that will make it into the next release. It serves as a source for the changelog, as well as a reminder of the work we can already be proud of. +What does a developer think? Damn! If I had written the Gherkin Scenarios and Cucumber Step Definitions I could leave the task of testing this on the different combinations of platform, webserver and database to Jenkins. I’ll miss something when doing this manually. Look at all the shiny things we will release with the next version of ownCloud! +When can I pull? As long as you are reviewing the issue the you should leave the “6 – Reviewing” label assigned. Before moving the issue to the “To review” step the issue should have been resolved, meaning that not only the issue has been implemented but also no other functionality has been broken. This is the last step of the Kanban board. When the Release finally happens the issue will be closed and removed from the board. +Who is Assigned? The most active reviewer should assign himself. No one. +I said that we push issues to the next column. Of course the issue can go back and forth arbitrarily. Basically you can drag the issue around in the huboard or just change the label when viewing the issue in the github. +Reviewing considered impossible? +How can you possibly review an issue when it requires you to test various combinations of browsers, platforms, databases and maybe even app combinations? Well, you can’t. But you can write a gherkin scenario that can be used to write an automated test that is executed by Jenkins on every commit to the main repositories. If for some reason Jenkins cannot be used for the review you will find yourself in the very uncomfortable situation where you release half tested code that will hopefully not eat user data. Seriously! Write gherkin scenarios! +Other Labels +Priority Labels +Panic should be used with caution. It is reserved for Bugs that would result in the loss of files or other user data. An Enhancement marked as Panic is expected by ownCloud users for the next release. In either case an open Panic issue will prevent a release. +Attention is not as hard as Panic. But we really want this in the next release and will dedicate more effort for it. But if we think the issue is not ready for the next release we will postpone it to the next one. +Regression is something that worked in a previous release but is now not working as expected or missing. If a certain functionality is up for code refactoring, the developer should describe all possible use cases as a Gherkin scenarios beforehand, so that any scenarios that isn’t implemented before the required milestone can be marked as a regression. If a regression is found after a release, the reporter – or the developer triaging the issue – should describe the functionality as a Gherkin scenario and either fix it or assign it to the developer in charge of that part. +App Labels +In the apps repository there are labels like app:gallery and app:calendar. The “app:” prefix is used to allow developers to filter issues related to a specific app. + +Resolution Status +Fixed – Should be assigned to issues in to Release +Won’t fix – Reason is given as a comment +Duplicate – Corresponding bug is given in a comment (using #guthubissuenumber) +Misc Labels +Needs info – Either from a developer or the bug reporter. This is nearly as severe as Panic, because no further action can be taken +L18n – A translation issue go see our transifex +Junior Job – The issue is considered a good starting point to get involved in ownCloud development +Milestones equal Releases +Releases are planned via milestones which contain all the Enhancements and Bugs that we plan to release when the Deadline is met. When the Deadline approaches we will push new Enhancement request and less important bugs to the next milestone. This way a milestone will upon release contain all the issues that make up the changelog for the release. Furthermore, huboard allows us to filter the Kanban board by Milestone, making it especially easy to focus on the current Release. From 4e9211f6ddb103fad9af49f865f267a6da1d3aad Mon Sep 17 00:00:00 2001 From: WireShout Date: Thu, 13 Dec 2012 14:11:17 -0500 Subject: [PATCH 27/49] Update developer_manual/kanban.rst --- developer_manual/kanban.rst | 148 +++++++++++++++++++++++++++--------- 1 file changed, 114 insertions(+), 34 deletions(-) diff --git a/developer_manual/kanban.rst b/developer_manual/kanban.rst index 4c0da49a7..bead3db22 100644 --- a/developer_manual/kanban.rst +++ b/developer_manual/kanban.rst @@ -6,7 +6,9 @@ Kanban Board Kanban Board = github issues + huboard -------------------------------------- -We are using huboard.com to visualize ownCloud github issues as a kanban board (see: core, apps, mirall): +We are using http://huboard.com to visualize ownCloud github issues as a `kanban board`_ (see: `core`_, `apps`_, `mirall`_): + +.. image:: images/kanbanexample.png As you may have noticed, the columns of the kanban board represent the life-cycle of an issue (be it a Bug or an Enhancement). An issue flows from the 1 - Backlog on the left to the 7 - To release column on the right and is not closed until it has been released. Instead we pull an issue to the next column by changing the label. The following tables will tell you what the labels mean in the life-cycle and will hopefully help you decide how to label an issue. @@ -24,48 +26,126 @@ Backlog Concept ------- -Why do we have it? Our think before you act phase serves two purposes. A Bug is in the concept phase while we are trying to figure out why something is broken (analysis). An Enhancement is in the concept phase until we have decided how to implement it (design). -What does a developer think? I’ll write a Scenario for our BDD in Gherkin and post it as a comment. I can always look at the existing ones to get an inspiration how to phrase them as “Given … when … then …“ -When can I pull? As long as you think and discuss on how to implement an enhancement or how to solve a bug you should leave the concept label assigned. Two things should be documented in a comment to the issue before moving it to the “To develop” step: -At least one Scenario – written in Gherkin – that tells you and the tester when the issue is ready to be released. -A concept describing the planned implementation. This can be as simple as a “this just needs changes to the login screen css” or so complex that you link to a blog entry somewhere else. -Who is Assigned? The maintainer that feels responsible for the issue. +**Why do we have it?** Our think before you act phase serves two purposes. A Bug is in the concept phase while we are trying to figure out why something is broken (analysis). An Enhancement is in the concept phase until we have decided how to implement it (design). -Devolp ------- +**What does a developer think?** *I’ll write a Scenario for our BDD in `Gherkin`_ and post it as a comment. I can always look at the `existing ones`_ to get an inspiration how to phrase them as `“Given … when … then …“`_* + +**When can I pull?** As long as you think and discuss on how to implement an enhancement or how to solve a bug you should leave the concept label assigned. Two things should be documented in a comment to the issue before moving it to the “To develop” step: + +* At least one Scenario – written in Gherkin – that tells you and the tester when the issue is ready to be released. +* A concept describing the planned implementation. This can be as simple as a “this just needs changes to the login screen css” or so complex that you link to a blog entry somewhere else. + +**Who is Assigned?** The maintainer that feels responsible for the issue. + +To Devolp +--------- + +**Why do we have it?** Now that we have a plan, any developer can pick an issue from this column and start implementing it. If the issue is also marked with Junior Job this might be a good starting point for new developers. + +**What does a developer think?** *Nice! I can safely implement it that way because more than one person has put his brain to the task of coming up with a good solution. Here! Me! I’ll do it!* + +**When can I pull?** If you feel like diving into the code and getting your hands dirty you should look for issues with this label. In the comments, there should be a gherkin scenario to tell you when you are done and a concept describing how to implement it. Before you start move the issue to the “Developing” step by assigning the “4 – Developing” label. + +**Who is Assigned?** No one. Especially not if you are working on something else! + +Developing +---------- + +**Why do we have it?** This is where the magic happens. If it’s a Bug the fix will be submitted as a PULL REQUEST to the master or corresponding stable branch. If its an Enhancement code will be committed to a feature branch. + +**What does a developer think?** *You know, I’m at it. By the way, I’ll also write `unit tests`_. When I’m done I’ll push the issue with a commit containing “push GH-#” where # is the issue number. If I have an idea of who should review it I can also notify them with @githubusername* + +**When can I pull?** As long as you are writing code for the issue or if any unit test fails you should leave the “4 – Developing” label assigned. Two things should have been implemented before moving the issue to the “To review” step: + +* The enhancement or bug in question +* Unit tests for the changed and added code. + +**Who is Assigned?** The most active developer should assign himself. + +To Review +--------- + +**Why do we have it?** Instead of directly committing to master we agree that **a second set of eyes will spot bugs** and increase our code quality and give us an opportunity to learn from each other. See also our `Code Review Documentation`_ + +**What does a developer think?** *I’ll check the Scenario described earlier works as expected. If necessary I’ll update the related Gherkin Scenarios. `Jenkins`_ will test the scenario on all kinds of platforms, webserver and database combinations with `cucumber`_.* + +**When can I pull?** If you feel like making sure an issue works as expected you should look for issues with this label. In the comments you should find a gherkin scenario that can be used as a checklist for what to try. Before you start move the issue to the “Reviewing” step by assigning the “6 – Reviewing” label. + +**Who is Assigned?** No one. Especially not if you are working on something else! + +Reviewing +--------- + +**Why do we have it?** With the Gherkin Scenario from the Concept Phase reviewers have a checklist to test if a Bug has been solved and if an Enhancement works as expected. **The most eager reviewer we have is Jenkins**. When it comes to testing he soldiers on going through the different combinations of platform, webserver and database. + +**What does a developer think?** *Damn! If I had written the Gherkin Scenarios and Cucumber Step Definitions I could leave the task of testing this on the different combinations of platform, webserver and database to Jenkins. I’ll miss something when doing this manually.* + +**When can I pull?** As long as you are reviewing the issue the you should leave the “6 – Reviewing” label assigned. Before moving the issue to the “To review” step the issue should have been resolved, meaning that not only the issue has been implemented but also no other functionality has been broken. + +**Who is Assigned?** The most active reviewer should assign himself. + +To Release +--------- + +**Why do we have it?** This is a list of issues that will make it into the next release. It serves as a source for the changelog, as well as a reminder of the work we can already be proud of. + +**What does a developer think?** *Look at all the shiny things we will release with the next version of ownCloud!* + +**When can I pull?** This is the last step of the Kanban board. When the Release finally happens the issue will be closed and removed from the board. + +**Who is Assigned?** No one. + + +*I said that we push issues to the next column. Of course the issue can go back and forth arbitrarily. Basically you can drag the issue around in the huboard or just change the label when viewing the issue in the github.* -4 - Developing 4 - Developing To review 5 - To review -Why do we have it? This is where the magic happens. If it’s a Bug the fix will be submitted as a PULL REQUEST to the master or corresponding stable branch. If its an Enhancement code will be committed to a feature branch. Instead of directly committing to master we agree that a second set of eyes will spot bugs and increase our code quality and give us an opportunity to learn from each other. See also our Code Review Documentation -What does a developer think? You know, I’m at it. By the way, I’ll also write unit tests. When I’m done I’ll push the issue with a commit containing “push GH-#” where # is the issue number. If I have an idea of who should review it I can also notify them with @githubusername I’ll check the Scenario described earlier works as expected. If necessary I’ll update the related Gherkin Scenarios. Jenkins will test the scenario on all kinds of platforms, webserver and database combinations with cucumber. -When can I pull? As long as you are writing code for the issue or if any unit test fails you should leave the “4 – Developing” label assigned. Two things should have been implemented before moving the issue to the “To review” step: -The enhancement or bug in question -Unit tests for the changed and added code. -If you feel like making sure an issue works as expected you should look for issues with this label. In the comments you should find a gherkin scenario that can be used as a checklist for what to try. Before you start move the issue to the “Reviewing” step by assigning the “6 – Reviewing” label. -Who is Assigned? The most active developer should assign himself. No one. Especially not if you are working on something else! - -Reviewing 6 - Reviewing To release 7 - To release -Why do we have it? With the Gherkin Scenario from the Concept Phase reviewers have a checklist to test if a Bug has been solved and if an Enhancement works as expected. The most eager reviewer we have is Jenkins. When it comes to testing he soldiers on going through the different combinations of platform, webserver and database. This is a list of issues that will make it into the next release. It serves as a source for the changelog, as well as a reminder of the work we can already be proud of. -What does a developer think? Damn! If I had written the Gherkin Scenarios and Cucumber Step Definitions I could leave the task of testing this on the different combinations of platform, webserver and database to Jenkins. I’ll miss something when doing this manually. Look at all the shiny things we will release with the next version of ownCloud! -When can I pull? As long as you are reviewing the issue the you should leave the “6 – Reviewing” label assigned. Before moving the issue to the “To review” step the issue should have been resolved, meaning that not only the issue has been implemented but also no other functionality has been broken. This is the last step of the Kanban board. When the Release finally happens the issue will be closed and removed from the board. -Who is Assigned? The most active reviewer should assign himself. No one. -I said that we push issues to the next column. Of course the issue can go back and forth arbitrarily. Basically you can drag the issue around in the huboard or just change the label when viewing the issue in the github. Reviewing considered impossible? +-------------------------------- + How can you possibly review an issue when it requires you to test various combinations of browsers, platforms, databases and maybe even app combinations? Well, you can’t. But you can write a gherkin scenario that can be used to write an automated test that is executed by Jenkins on every commit to the main repositories. If for some reason Jenkins cannot be used for the review you will find yourself in the very uncomfortable situation where you release half tested code that will hopefully not eat user data. Seriously! Write gherkin scenarios! + Other Labels +------------ + Priority Labels -Panic should be used with caution. It is reserved for Bugs that would result in the loss of files or other user data. An Enhancement marked as Panic is expected by ownCloud users for the next release. In either case an open Panic issue will prevent a release. -Attention is not as hard as Panic. But we really want this in the next release and will dedicate more effort for it. But if we think the issue is not ready for the next release we will postpone it to the next one. -Regression is something that worked in a previous release but is now not working as expected or missing. If a certain functionality is up for code refactoring, the developer should describe all possible use cases as a Gherkin scenarios beforehand, so that any scenarios that isn’t implemented before the required milestone can be marked as a regression. If a regression is found after a release, the reporter – or the developer triaging the issue – should describe the functionality as a Gherkin scenario and either fix it or assign it to the developer in charge of that part. +~~~~~~~~~~~~~~~ + +* Panic should be used with caution. It is reserved for Bugs that would result in the loss of files or other user data. An Enhancement marked as Panic is expected by ownCloud users for the next release. In either case an open Panic issue will prevent a release. +* Attention is not as hard as Panic. But we really want this in the next release and will dedicate more effort for it. But if we think the issue is not ready for the next release we will postpone it to the next one. +* Regression is something that worked in a previous release but is now not working as expected or missing. If a certain functionality is up for code refactoring, the developer should describe all possible use cases as a Gherkin scenarios beforehand, so that any scenarios that isn’t implemented before the required milestone can be marked as a regression. If a regression is found after a release, the reporter – or the developer triaging the issue – should describe the functionality as a Gherkin scenario and either fix it or assign it to the developer in charge of that part. + App Labels +~~~~~~~~~~ + In the apps repository there are labels like app:gallery and app:calendar. The “app:” prefix is used to allow developers to filter issues related to a specific app. Resolution Status -Fixed – Should be assigned to issues in to Release -Won’t fix – Reason is given as a comment -Duplicate – Corresponding bug is given in a comment (using #guthubissuenumber) +~~~~~~~~~~~~~~~~~ + +* Fixed – Should be assigned to issues in to Release +* Won’t fix – Reason is given as a comment +* Duplicate – Corresponding bug is given in a comment (using #guthubissuenumber) + Misc Labels -Needs info – Either from a developer or the bug reporter. This is nearly as severe as Panic, because no further action can be taken -L18n – A translation issue go see our transifex -Junior Job – The issue is considered a good starting point to get involved in ownCloud development +~~~~~~~~~~~ + +* Needs info – Either from a developer or the bug reporter. This is nearly as severe as Panic, because no further action can be taken +* L18n – A translation issue go see our `transifex`_ +* Junior Job – The issue is considered a good starting point to get involved in ownCloud development + Milestones equal Releases -Releases are planned via milestones which contain all the Enhancements and Bugs that we plan to release when the Deadline is met. When the Deadline approaches we will push new Enhancement request and less important bugs to the next milestone. This way a milestone will upon release contain all the issues that make up the changelog for the release. Furthermore, huboard allows us to filter the Kanban board by Milestone, making it especially easy to focus on the current Release. +------------------------- + +Releases are planned via milestones which contain all the Enhancements and Bugs that we plan to release when the Deadline is met. When the Deadline approaches we will push new Enhancement request and less important bugs to the next milestone. This way a milestone will upon release contain all the issues that make up the changelog for the release. Furthermore, huboard allows us to filter the Kanban board by Milestone, making it especially easy to focus on the current Release. + +.. _kanban board: http://en.wikipedia.org/wiki/Kanban_board +.. _core: http://huboard.com/owncloud/core/board/# +.. _apps: http://huboard.com/owncloud/apps/board/# +.. _mirall: http://huboard.com/owncloud/mirall/board/# +.. _Gherkin: https://github.com/cucumber/cucumber/wiki/Gherkin +.. _look at the existing ones: https://ci.tmit.eu/job/acceptance-test/cucumber-html-reports/? +.. _“Given … when … then …“: https://github.com/cucumber/cucumber/wiki/Given-When-Then +.. _unit tests: https://github.com/owncloud/core/tree/master/tests +.. _Code Review Documentation: http://owncloud.org/dev/code-reviews-on-github/ +.. _Jenkins: https://ci.tmit.eu/ +.. _cucumber: http://cukes.info/ +.. _transifex: https://www.transifex.com/projects/p/owncloud/ From 1e33a433718a42ac8bf79ac5646642a22cb255d8 Mon Sep 17 00:00:00 2001 From: Jason Spriggs Date: Thu, 13 Dec 2012 14:12:58 -0500 Subject: [PATCH 28/49] Adding Kanban Screenshot --- developer_manual/images/kanbanexample.png | Bin 0 -> 217682 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 developer_manual/images/kanbanexample.png diff --git a/developer_manual/images/kanbanexample.png b/developer_manual/images/kanbanexample.png new file mode 100644 index 0000000000000000000000000000000000000000..78fa61886ee2228fb5368645783ebdfa4c7a99c9 GIT binary patch literal 217682 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 z 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

lj6?UQ6T1Tb%3ZL5vr$CLog> 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 Date: Thu, 13 Dec 2012 14:18:51 -0500 Subject: [PATCH 29/49] Update developer_manual/styleguide.rst --- developer_manual/styleguide.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/developer_manual/styleguide.rst b/developer_manual/styleguide.rst index f033bd362..fe7a84e2a 100644 --- a/developer_manual/styleguide.rst +++ b/developer_manual/styleguide.rst @@ -1,6 +1,6 @@ Coding Style Guide ================== -*Note: this is work-in-progress! We are currently building up this style guide and it’s topic of discussion.* +See `Coding Style Guidelines`_. -See http://owncloud.org/dev/coding-style-guide/ \ No newline at end of file +.. _Coding Style Guidelines: http://doc.owncloud.com/server/5.0/developer_manual/codingguidelines.html From 3751ef5a65d03a458ad3a347caac9bb5d28d67eb Mon Sep 17 00:00:00 2001 From: WireShout Date: Thu, 13 Dec 2012 14:46:30 -0500 Subject: [PATCH 30/49] Update developer_manual/share-api.rst --- developer_manual/share-api.rst | 112 ++++++++++++++++++++++++++++++++- 1 file changed, 111 insertions(+), 1 deletion(-) diff --git a/developer_manual/share-api.rst b/developer_manual/share-api.rst index 5f4a78ece..09e3fb991 100644 --- a/developer_manual/share-api.rst +++ b/developer_manual/share-api.rst @@ -3,4 +3,114 @@ Share API **Warning: The Share API is still under heavy development and testing. Report issues to Michael Gapczynski.** -See http://owncloud.org/dev/apps/share-api/ \ No newline at end of file +The Share API was introduced in ownCloud 5 as a public API for apps to share content. It is a revision of the original file sharing app with enhancements to increase stability, reduce conflicts, and operate in a generic fashion. At this time it is possible to share content with local ownCloud users, groups, contacts, and email via link. This document is a guide for using the Share API in apps. The Share API is made up of a public class OCP\Share in ``/lib/public/share.php``, an AJAX file ``/core/ajax/share.php``, and a JavaScript file ``/core/js/share.js``. Javadoc style documentation is included in OCP\Share. + +Share backends +-------------- + +The share backends represent a shared item type and are responsible for communicating directly with the Share API. There are 3 interfaces that can be implemented from based on the type of shared item. Apps create a class that implements one of the below interfaces and registers it with the Share API. Item source is a unique identifier of an item to be stored in the database by the Share API. The backend needs to be able to translate the item source back into the original item. It is recommended that the item source is the id of the item in the app’s own database. + +OCP\Share_Backend +~~~~~~~~~~~~~~~~~ + +The base interface for shared items. The other interfaces extend OCP\Share_Backend. + +* isValidSource($itemSource, $uidOwner) +* generateTarget($itemSource, $shareWith, $exclude = null) +* formatItems($items, $format, $parameters = null) + + +**isValidSource($itemSource, $uidOwner)** – Return true if the ``$itemSource`` is found and belongs to the owner, otherwise false. This function should not check for shared items, the Share API automatically recognizes a reshare and does not call isValidSource(). If false, the Share API will cancel sharing the item. + +**generateTarget($itemSource, $shareWith, $exclude = null)** – Return a unique name for the $itemSource that can be used as a target. This is the name of the item that will be displayed for the person. The Share API will call this function again if the target already exists for the person as a shared item. For the second call, the ``$exclude`` argument will be an array with the conflicting target and similar targets that can’t be used as a target. The ``$shareWith`` argument can be false if generating a target for a private link or group. In this case, the function should return the default target. + +**formatItems($items, $format, $parameters = null)** – Return the items in a format that is customary to the app. The Share API calls this function when a backend specific format is requested in one of the functions used for retrieving shared items. The return of this function is completely up to the backend, but the name of the items needs to be overridden by the target values. The desired implementation is to keep logic inside the backend and use array_merge() to merge shared items with normal items in the app. + +OCP\Share_Backend_File_Dependent +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The interface for shared items that are depedent on a file e.g. a song or photo. + +* getFilePath($itemSource, $uidOwner) +* Extends OCP\Share_Backend + +**getFilePath($itemSource, $uidOwner)** – Return the file path if the item source is found and belongs to the owner, otherwise false. + +OCP\Share_Backend_Collection +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The interface for shared items that are collections of another shared item e.g. a folder or addressbook. + +* getChildren($itemSource) +* Extends OCP\Share_Backend + +**getChildren($itemSource)** – Return a 2-dimensional array of the children items in the item source collection. Each child should be represented in the array as an array with the keys source and target, with their corresponding values. The children are passed to the backend that represents their item type and therefore should be able to be interpreted by that backend. + +Register a backend with the Share API in ``appinfo/app.php``: + +``OCP\Share::registerBackend('contact', 'OC_Share_Backend_Contact');`` + +Register a file dependent backend by specifying file extensions within an array in the fourth parameter: + +``OCP\Share::registerBackend('photo', 'OC_Share_Backend_Photo', null, array('gif', 'jpeg', 'jpg', 'png'));`` + +Register a collection backend by specifying the children item in the third parameter: + +``OCP\Share::registerBackend('addressbook', 'OC_Share_Backend_Addressbook', 'contact');`` + +Apps should not make any explicit calls to a share backend. + +Sharing dropdown +---------------- + +The sharing dropdown is the user interface for sharing content. It handles sharing, unsharing, and setting permissions. Attach the sharing dropdown to the app user interface using an anchor tag: + +``t('local filesystem');?>t(' or '); ?>t('cloud');?>`` +.. code-block:: php + + t('Select file from') . ' '; ?>t('local filesystem');?>t(' or '); ?>t('cloud');?> Translators will translate: ~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -38,7 +40,10 @@ What about variable in the strings? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In case you need to add variables to the translation strings do it like that: -`` $l->t('%s is available. Get more information',array($data['versionstring'], $data['web']));`` + +.. code-block:: php + + $l->t('%s is available. Get more information',array($data['versionstring'], $data['web'])); Automated synchronization of translations ----------------------------------------- @@ -72,19 +77,23 @@ http://ci.tmit.eu/job/ownCloud-Mirall-tx/ Manual quick translation update: -------------------------------- -``cd l10n/ && perl l10n.pl read && tx push -s && tx pull -a && perl l10n.pl write && cd ..`` +.. code-block:: bash + + cd l10n/ && perl l10n.pl read && tx push -s && tx pull -a && perl l10n.pl write && cd .. The translation script requires Locale::PO, installable via ``apt-get install liblocale-po-perl`` Configure transifex ------------------- -``tx init - -for resource in calendar contacts core files media gallery settings -do -tx set --auto-local -r owncloud.$resource "/$resource.po" --source-language=en \ - --source-file "templates/$resource.pot" --execute -done`` +.. code-block:: bash -.. _Transifex: https://www.transifex.net/projects/p/owncloud/ + tx init + + for resource in calendar contacts core files media gallery settings + do + tx set --auto-local -r owncloud.$resource "/$resource.po" --source-language=en \ + --source-file "templates/$resource.pot" --execute + done + +.. _Transifex: https://www.transifex.net/projects/p/owncloud/ From e5f1bdd81dee26d37376cffd7a255b1adaf997ab Mon Sep 17 00:00:00 2001 From: WireShout Date: Thu, 13 Dec 2012 15:10:35 -0500 Subject: [PATCH 36/49] Changing to code-block --- developer_manual/theming.rst | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/developer_manual/theming.rst b/developer_manual/theming.rst index 8a37d4194..43184b31a 100644 --- a/developer_manual/theming.rst +++ b/developer_manual/theming.rst @@ -33,20 +33,23 @@ How to change colors Just put a new style.css into the core/css folder in your themes directory. Changing the header bar colours on the Login and Main Navigation screen: In the style sheet, a bit further down, is a set that looks something like this: -``/* HEADERS */ -#body-user #header, #body-settings #header { position:fixed; top:0; z-index:100; width:100%; height:2.5em; padding:.5em; background:#1d2d42; -moz-box-shadow:0 0 10px rgba(0, 0, 0, .5), inset 0 -2px 10px #222; -webkit-box-shadow:0 0 10px rgba(0, 0, 0, .5), inset 0 -2px 10px #222; box-shadow:0 0 10px rgba(0, 0, 0, .5), inset 0 -2px 10px #222; } -#body-login #header { margin: -2em auto 0; text-align:center; height:10em; --moz-box-shadow:0 0 1em rgba(0, 0, 0, .5); -webkit-box-shadow:0 0 1em rgba(0, 0, 0, .5); box-shadow:0 0 1em rgba(0, 0, 0, .5); -background: #1d2d42; /* Old browsers */ -background: -moz-linear-gradient(top, #33537a 0%, #1d2d42 100%); /* FF3.6+ */ -background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#F1B3A4), color-stop(100%,#1d2d42)); /* Chrome,Safari4+ */ -background: -webkit-linear-gradient(top, #33537a 0%,#1d2d42 100%); /* Chrome10+,Safari5.1+ */ -background: -o-linear-gradient(top, #33537a 0%,#1d2d42 100%); /* Opera11.10+ */ -background: -ms-linear-gradient(top, #33537a 0%,#1d2d42 100%); /* IE10+ */ -background: linear-gradient(top, #33537a 0%,#1d2d42 100%); /* W3C */ -filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#33537a', endColorstr='#1d2d42',GradientType=0 ); /* IE6-9 */ } -#owncloud { float:left; }`` +.. code-block:: css + + /* HEADERS */ + #body-user #header, #body-settings #header { position:fixed; top:0; z-index:100; width:100%; height:2.5em; padding:.5em; background:#1d2d42; -moz-box-shadow:0 0 10px rgba(0, 0, 0, .5), inset 0 -2px 10px #222; -webkit-box-shadow:0 0 10px rgba(0, 0, 0, .5), inset 0 -2px 10px #222; box-shadow:0 0 10px rgba(0, 0, 0, .5), inset 0 -2px 10px #222; } + #body-login #header { margin: -2em auto 0; text-align:center; height:10em; + -moz-box-shadow:0 0 1em rgba(0, 0, 0, .5); -webkit-box-shadow:0 0 1em rgba(0, 0, 0, .5); box-shadow:0 0 1em rgba(0, 0, 0, .5); + background: #1d2d42; /* Old browsers */ + background: -moz-linear-gradient(top, #33537a 0%, #1d2d42 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#F1B3A4), color-stop(100%,#1d2d42)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #33537a 0%,#1d2d42 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #33537a 0%,#1d2d42 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, #33537a 0%,#1d2d42 100%); /* IE10+ */ + background: linear-gradient(top, #33537a 0%,#1d2d42 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#33537a', endColorstr='#1d2d42',GradientType=0 ); /* IE6-9 */ } + + #owncloud { float:left; } This handles the headers for a lot of different browser types. What we want to do is change the #35537a (lighter blue) and #ld2d42 (dark blue) color to the colours of our choice. In some older and other browsers, there is just one color, but in the rest there are gradients.The login page background is a horizontal gradient. The first hex number, #35537a, is the top color of the gradient at the login screen. The second hex number, #ld2d42 is the botton color of the gradient at the login screen.Simply change these colours to the hex color of your choice, save, and refresh to see the new login screen.The other major color scheme is the blue header bar on the main navigation page once you log in to ownCloud. This color we will change with the above as well.Save the file and refresh the browser for the changes to take affect. -.. _here: https://github.com/owncloud/themes/tree/master/example +.. _here: https://github.com/owncloud/themes/tree/master/example From f91ed75ecf3c8c8d54315b3749ac620f314f6821 Mon Sep 17 00:00:00 2001 From: WireShout Date: Thu, 13 Dec 2012 15:12:21 -0500 Subject: [PATCH 37/49] Changing to code-block --- developer_manual/share-api.rst | 44 +++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/developer_manual/share-api.rst b/developer_manual/share-api.rst index 09e3fb991..0366ee014 100644 --- a/developer_manual/share-api.rst +++ b/developer_manual/share-api.rst @@ -48,15 +48,21 @@ The interface for shared items that are collections of another shared item e.g. Register a backend with the Share API in ``appinfo/app.php``: -``OCP\Share::registerBackend('contact', 'OC_Share_Backend_Contact');`` +.. code-block:: php + + OCP\Share::registerBackend('contact', 'OC_Share_Backend_Contact'); Register a file dependent backend by specifying file extensions within an array in the fourth parameter: -``OCP\Share::registerBackend('photo', 'OC_Share_Backend_Photo', null, array('gif', 'jpeg', 'jpg', 'png'));`` +.. code-block:: php + + OCP\Share::registerBackend('photo', 'OC_Share_Backend_Photo', null, array('gif', 'jpeg', 'jpg', 'png')); Register a collection backend by specifying the children item in the third parameter: -``OCP\Share::registerBackend('addressbook', 'OC_Share_Backend_Addressbook', 'contact');`` +.. code-block:: php + + OCP\Share::registerBackend('addressbook', 'OC_Share_Backend_Addressbook', 'contact'); Apps should not make any explicit calls to a share backend. @@ -65,7 +71,9 @@ Sharing dropdown The sharing dropdown is the user interface for sharing content. It handles sharing, unsharing, and setting permissions. Attach the sharing dropdown to the app user interface using an anchor tag: -``