Compare commits
419 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e13d02de2d | |||
| fb82321090 | |||
| 218a206a6e | |||
| a834531aef | |||
| ec1a66b8a6 | |||
| 145810dc20 | |||
| 795f321a19 | |||
| d359311afc | |||
| 1c23fa5d16 | |||
| fe753fe722 | |||
| 62a35d3f7a | |||
| 98820f2af3 | |||
| 4f5c03e310 | |||
| 36bba77575 | |||
| 438d451391 | |||
| 884c8215f8 | |||
| 06bfd58b2c | |||
| 9a1688db7c | |||
| 7ee7d091f2 | |||
| ffe561df62 | |||
| 590ed3edda | |||
| a70d6f6a62 | |||
| e542bfd1d7 | |||
| 1087385cae | |||
| 80a31b7565 | |||
| 6c861f71eb | |||
| bec8465902 | |||
| b425a0e307 | |||
| 1397d9a93c | |||
| b375086c47 | |||
| d436326e19 | |||
| 51f5edd749 | |||
| 1aa8765177 | |||
| 5925ab99f8 | |||
| dd415b62f5 | |||
| 5b126cde48 | |||
| 8ebde1e74d | |||
| 57b9ae18f0 | |||
| 98431b490e | |||
| a6164472a3 | |||
| d2b4bf7682 | |||
| bbc720d2d3 | |||
| 3e1dc64737 | |||
| 27d12f7a99 | |||
| 711641e4a9 | |||
| 27d6852b3e | |||
| 9dc1c6c41f | |||
| 81b5df3236 | |||
| 6365851672 | |||
| 7a2a6ce609 | |||
| 830a080f0e | |||
| 4e50dd87d5 | |||
| ed746a7ec2 | |||
| 74ed0a8aba | |||
| 440cf335ad | |||
| e33adcf0df | |||
| 68f62ad50a | |||
| 80993b245b | |||
| a4a800fe30 | |||
| 572ff9c9fe | |||
| 2d373416d8 | |||
| 22f9a12c74 | |||
| fcebd32e37 | |||
| e2a274fdd3 | |||
| df544e8dbe | |||
| fdab395925 | |||
| 2296552104 | |||
| 98647b8fe4 | |||
| ccddb18cab | |||
| 466b7dc05f | |||
| 21970c1b19 | |||
| 288b4e21d0 | |||
| bd19bbb926 | |||
| 6f5d30b8ee | |||
| 57c08cfd77 | |||
| 6e8adea2ab | |||
| 4f5d1e9f60 | |||
| a87d961d01 | |||
| aecfcf64c4 | |||
| 5408b16728 | |||
| 3e0f106876 | |||
| 3587531331 | |||
| 847834ee73 | |||
| 1d4d45e91f | |||
| d2c11a35b7 | |||
| c929c4db84 | |||
| 0a79241a0a | |||
| 8b87837a4d | |||
| 35d044c121 | |||
| 54fc92c372 | |||
| 76342fa27d | |||
| c43713515b | |||
| e5bec54e4e | |||
| b87b27cbd9 | |||
| dca6869a89 | |||
| 1092de539f | |||
| 6e55f93836 | |||
| fa7f1874dd | |||
| cfd8cc3fd8 | |||
| 118c39d472 | |||
| b05269826a | |||
| cff3122a37 | |||
| 19541dd1ce | |||
| a50619200c | |||
| 7fdac35654 | |||
| 277c9f4a03 | |||
| 4da4163d14 | |||
| 85a0dd3689 | |||
| f8b1e2cca1 | |||
| 501cb1a147 | |||
| dd5f38e351 | |||
| d857f7caf2 | |||
| 6774f60240 | |||
| c58e96e639 | |||
| 51ff3e7443 | |||
| d8261d41cc | |||
| 752e6676e1 | |||
| 78ee14dad5 | |||
| 9c800f62dd | |||
| 059df32542 | |||
| 43579e784f | |||
| 193a33a8ad | |||
| b84746ce36 | |||
| 2cb45e71ea | |||
| e3cc82df38 | |||
| 05fd4f2da0 | |||
| d16553d2d8 | |||
| 8453073fdb | |||
| b6fb3148c2 | |||
| cfe0a6450e | |||
| 5f5e13351a | |||
| ef8b75960c | |||
| f28817aed5 | |||
| cb300d164e | |||
| e664e582fb | |||
| 9bd5fd23e7 | |||
| 835e24826d | |||
| 8d6aff69a8 | |||
| 7c7e079a36 | |||
| 1f7b037a59 | |||
| 99843c06f9 | |||
| ed88f7b8b5 | |||
| 03f89d8242 | |||
| f981661195 | |||
| 424c2b8263 | |||
| 2ab503f70a | |||
| cdff098357 | |||
| 57596e1415 | |||
| dd8d1c2b94 | |||
| 2660cf80c3 | |||
| 3cadc45ca5 | |||
| 8c9842fbd9 | |||
| 456035a750 | |||
| fb77aa2e62 | |||
| 3b4999c835 | |||
| 52f4acf23d | |||
| 6b7c694a42 | |||
| 605abf9088 | |||
| b5922e467a | |||
| 1733b6e8c8 | |||
| c066882309 | |||
| b456035aa7 | |||
| 03f461591e | |||
| 4f78cb1e3d | |||
| 1f4e824d0b | |||
| 7a6d4a3287 | |||
| 1f4738c372 | |||
| af7c34d9a6 | |||
| 515ebc02b0 | |||
| 0bb7644150 | |||
| c9eadb7b77 | |||
| a381cbc241 | |||
| 2139130ec8 | |||
| 195cf4111e | |||
| 443d72ee87 | |||
| 5a630c6a0e | |||
| 24670b4218 | |||
| c864420d6c | |||
| f77ce8829c | |||
| 70a5233f69 | |||
| 5ca10cf6f8 | |||
| 0009bf244b | |||
| 3d0e4bdc82 | |||
| 6edf403f3f | |||
| 43516ebef9 | |||
| 53f95373ba | |||
| a9c13dc58a | |||
| 7fb32f8358 | |||
| 656c7f38b6 | |||
| 97dc57a143 | |||
| 3b98e8c56d | |||
| 1a100c69ba | |||
| 03fcbc8ceb | |||
| 49b5b1b08c | |||
| 2da2f26e56 | |||
| d60f39e4f2 | |||
| 329e72a286 | |||
| 90a2be58f8 | |||
| 9b2fdc5358 | |||
| 0d9edd80f1 | |||
| 4fdb2254a4 | |||
| b3ead7568d | |||
| f8f292ab16 | |||
| c7f1b82b4b | |||
| aa75cfcf14 | |||
| e9fc791e9f | |||
| 4d8c81a2d9 | |||
| ad852ca24a | |||
| 50e94db4d5 | |||
| ae2c207b6e | |||
| f5fe2b4d08 | |||
| 77afc18b82 | |||
| 3a955ca43c | |||
| 204288f4a5 | |||
| 8af75c734a | |||
| 177ad39854 | |||
| d59860aacd | |||
| f6b6813f5f | |||
| da95db78d0 | |||
| 3d19a179c7 | |||
| 3f4be066f9 | |||
| 419adc8d50 | |||
| 627724bc6a | |||
| b3fef39006 | |||
| 3d9187e231 | |||
| 1a239b2f0d | |||
| 6afac05937 | |||
| 571de654cd | |||
| 546a0929a6 | |||
| fefaa1fd87 | |||
| ce0f68c7ce | |||
| 660c0da0a9 | |||
| 179ac2b98c | |||
| d282affec2 | |||
| 8ef8be6be5 | |||
| 064e13511f | |||
| a7dfc70e2e | |||
| df056e1299 | |||
| 26deb0a897 | |||
| 3c77311397 | |||
| fb705fa305 | |||
| c513317c49 | |||
| d9b632c001 | |||
| 1fdf790c8f | |||
| d65c3a77e2 | |||
| 382b18e85e | |||
| 9e5c5c804b | |||
| 7d80b20368 | |||
| 1e1c0885c6 | |||
| 8e0b78c746 | |||
| e7152f495c | |||
| 00ef623f1c | |||
| 9dfcb55a2f | |||
| ec4c5a3e75 | |||
| f46225fa2c | |||
| f28f6a3001 | |||
| 25027c31ff | |||
| b8af6e703a | |||
| 403eb87f4d | |||
| ed4ed0e26f | |||
| 24dcdf9d5c | |||
| 3a773f4eca | |||
| e71ebf334d | |||
| 08b9193919 | |||
| dbcb037639 | |||
| adbc5bbd1f | |||
| 4720719b08 | |||
| 7b818d9442 | |||
| aa91d50d04 | |||
| 95cd1671b3 | |||
| 8c035ae6f6 | |||
| d54106dada | |||
| f9ad57ee52 | |||
| cdadd4cd1b | |||
| 6f7fc6c5db | |||
| 9ef7340dc7 | |||
| d1978a6950 | |||
| dfc7e6b421 | |||
| b580d26270 | |||
| 5466a800fa | |||
| 0f372a2a8c | |||
| 987146d5db | |||
| 9d688e655d | |||
| f29440dbbc | |||
| 5a6b2956d8 | |||
| 99de93a6c6 | |||
| 4159187a6e | |||
| 6f64c99653 | |||
| ce0f28c123 | |||
| cca3a249fd | |||
| 0608455b01 | |||
| 3a5e90fa03 | |||
| e2c557ab82 | |||
| e1727477ac | |||
| cf232c4182 | |||
| efa673136e | |||
| 3380a3af74 | |||
| 80d0e43fc7 | |||
| effc522572 | |||
| 689f3dea45 | |||
| 3a73f97706 | |||
| a09ffb274b | |||
| 2609bf3500 | |||
| 9190885b4e | |||
| f79195853e | |||
| 884a3b9bb4 | |||
| a9ed80869a | |||
| 8e49a99896 | |||
| 5b593450c3 | |||
| 69cf557d0b | |||
| 5c38c1c845 | |||
| dac69225d2 | |||
| f984718921 | |||
| b752a08d63 | |||
| 9bc99bb297 | |||
| e3de44ea51 | |||
| aeb480a8c3 | |||
| b0c7eba7d0 | |||
| e89f27e191 | |||
| bd17cc793c | |||
| 62a36ee884 | |||
| a58e374956 | |||
| 67c4759017 | |||
| 36b543c490 | |||
| 8465f9b6c6 | |||
| 281a0e9e03 | |||
| 7126b64088 | |||
| 38d137c34c | |||
| 098ce188b7 | |||
| 730620cfb2 | |||
| dd7131512d | |||
| 85168315ab | |||
| 09febaad49 | |||
| 83894b58fe | |||
| f374368568 | |||
| 4030b82c97 | |||
| 4e90bc017e | |||
| b315a5ee29 | |||
| b017434302 | |||
| 48cdf38d00 | |||
| 11f76b2918 | |||
| 316f86f2a3 | |||
| bd144efeb1 | |||
| 88b9db44a0 | |||
| 91c7d293ca | |||
| 313b881d2b | |||
| 9120448302 | |||
| d4d4b8d51a | |||
| b955ce6141 | |||
| e2b43c4095 | |||
| d84cccb911 | |||
| c2a16e0584 | |||
| d652c87f86 | |||
| 72d4e672b2 | |||
| 95201a829f | |||
| 734b3e1408 | |||
| ddf56b84d4 | |||
| 1975ffa9e7 | |||
| 81f694d83e | |||
| 8d6a6667e5 | |||
| f9a80a9c12 | |||
| d63f5561fb | |||
| 213dfa2b85 | |||
| 859303164e | |||
| 795331212a | |||
| c9476115b0 | |||
| cfd9c7f6b9 | |||
| ebfc8b67d7 | |||
| f9e1d4d56e | |||
| fab42c7cd2 | |||
| 9232a124e2 | |||
| b5a06ecd5c | |||
| 79811b5806 | |||
| 6413fffdcb | |||
| b3b57621b7 | |||
| 6bfeb4595d | |||
| 5af8ebe3bd | |||
| 27f3dcc682 | |||
| b1a1a46193 | |||
| 71b3033b35 | |||
| c1876ea51c | |||
| 9ec89b99b1 | |||
| 0945cb7a0e | |||
| 6f4712a314 | |||
| d043b6ba91 | |||
| ef66729980 | |||
| 17f5f19187 | |||
| 71e3f7f866 | |||
| 0a5f34ab80 | |||
| 5488bb74fe | |||
| 4b85660984 | |||
| 5080c34d78 | |||
| 5d402fc817 | |||
| fb62043cc1 | |||
| b3c9ed8d5c | |||
| 9737290e39 | |||
| 121ff350d4 | |||
| bb0c304482 | |||
| c9c85b8d4a | |||
| eb59aa8be4 | |||
| 96d45e90dc | |||
| 0655f25406 | |||
| 434747f450 | |||
| 7ff2b9232b | |||
| 3d28f364c5 | |||
| 62399f7852 | |||
| 4fc6deaaf0 | |||
| e6c6ee8d2a | |||
| 3673cfae3c | |||
| 4da858b3b7 | |||
| 8e8f5cdddf | |||
| f603c57751 | |||
| e155f28f5e | |||
| dd556d77da | |||
| 750fc9ae26 | |||
| 4186bcbdf2 | |||
| 98f79173ed | |||
| 8d07cb4d85 | |||
| 445957a0e2 |
@@ -1,12 +0,0 @@
|
||||
codecov:
|
||||
branch: master
|
||||
|
||||
coverage:
|
||||
precision: 2
|
||||
round: down
|
||||
range: "70...100"
|
||||
status:
|
||||
project: off
|
||||
patch: off
|
||||
|
||||
comment: off
|
||||
-951
@@ -1,951 +0,0 @@
|
||||
clone:
|
||||
git:
|
||||
image: plugins/git
|
||||
depth: 1
|
||||
|
||||
pipeline:
|
||||
jsunit:
|
||||
image: nextcloudci/jsunit:jsunit-5
|
||||
commands:
|
||||
- ./autotest-js.sh
|
||||
- curl -o codecov.sh https://codecov.io/bash
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' = 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -P $DRONE_PULL_REQUEST -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5; fi"
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' != 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5; fi"
|
||||
when:
|
||||
matrix:
|
||||
TESTS: jsunit
|
||||
checkers:
|
||||
image: nextcloudci/php7.0:php7.0-16
|
||||
commands:
|
||||
- ./autotest-checkers.sh
|
||||
when:
|
||||
matrix:
|
||||
TESTS: checkers
|
||||
syntax-php5.6:
|
||||
image: nextcloudci/php5.6:php5.6-8
|
||||
commands:
|
||||
- composer install
|
||||
- ./lib/composer/bin/parallel-lint --exclude build/.phan/ --exclude lib/composer/jakub-onderka/ --exclude 3rdparty/symfony/polyfill-php70/Resources/stubs/ --exclude 3rdparty/patchwork/utf8/src/Patchwork/Utf8/Bootup/ --exclude 3rdparty/paragonie/random_compat/lib/ --exclude lib/composer/composer/autoload_static.php --exclude 3rdparty/composer/autoload_static.php .
|
||||
when:
|
||||
matrix:
|
||||
TESTS: syntax-php5.6
|
||||
syntax-php7.0:
|
||||
image: nextcloudci/php7.0:php7.0-16
|
||||
commands:
|
||||
- composer install
|
||||
- ./lib/composer/bin/parallel-lint --exclude lib/composer/jakub-onderka/ --exclude 3rdparty/symfony/polyfill-php70/Resources/stubs/ --exclude 3rdparty/patchwork/utf8/src/Patchwork/Utf8/Bootup/ --exclude 3rdparty/paragonie/random_compat/lib/ --exclude lib/composer/composer/autoload_static.php --exclude 3rdparty/composer/autoload_static.php .
|
||||
when:
|
||||
matrix:
|
||||
TESTS: syntax-php7.0
|
||||
syntax-php7.1:
|
||||
image: nextcloudci/php7.1:php7.1-15
|
||||
commands:
|
||||
- composer install
|
||||
- ./lib/composer/bin/parallel-lint --exclude lib/composer/jakub-onderka/ --exclude 3rdparty/symfony/polyfill-php70/Resources/stubs/ --exclude 3rdparty/patchwork/utf8/src/Patchwork/Utf8/Bootup/ --exclude 3rdparty/paragonie/random_compat/lib/ --exclude lib/composer/composer/autoload_static.php --exclude 3rdparty/composer/autoload_static.php .
|
||||
when:
|
||||
matrix:
|
||||
TESTS: syntax-php7.1
|
||||
phan:
|
||||
image: nextcloudci/php7.2:php7.2-11
|
||||
commands:
|
||||
- composer install
|
||||
- composer require --dev "phan/phan:0.11.1"
|
||||
- ./lib/composer/phan/phan/phan -k build/.phan/config.php
|
||||
- php ./build/.phan/plugin-checker.php
|
||||
when:
|
||||
matrix:
|
||||
TESTS: phan
|
||||
litmus-v1:
|
||||
image: nextcloudci/litmus-php7.0:litmus-php7.0-6
|
||||
commands:
|
||||
- bash tests/travis/install.sh sqlite
|
||||
- bash apps/dav/tests/travis/litmus-v1/script.sh
|
||||
when:
|
||||
matrix:
|
||||
TESTS: litmus-v1
|
||||
litmus-v2:
|
||||
image: nextcloudci/litmus-php7.0:litmus-php7.0-6
|
||||
commands:
|
||||
- bash tests/travis/install.sh sqlite
|
||||
- bash apps/dav/tests/travis/litmus-v2/script.sh
|
||||
when:
|
||||
matrix:
|
||||
TESTS: litmus-v2
|
||||
caldavtester-new-endpoint:
|
||||
image: nextcloudci/litmus-php7.0:litmus-php7.0-6
|
||||
commands:
|
||||
- bash tests/travis/install.sh sqlite
|
||||
- bash apps/dav/tests/travis/caldav/install.sh
|
||||
- bash apps/dav/tests/travis/caldav/script-new-endpoint.sh
|
||||
when:
|
||||
matrix:
|
||||
TESTS: caldavtester-new-endpoint
|
||||
caldavtester-old-endpoint:
|
||||
image: nextcloudci/litmus-php7.0:litmus-php7.0-6
|
||||
commands:
|
||||
- bash tests/travis/install.sh sqlite
|
||||
- bash apps/dav/tests/travis/caldav/install.sh
|
||||
- bash apps/dav/tests/travis/caldav/script-old-endpoint.sh
|
||||
when:
|
||||
matrix:
|
||||
TESTS: caldavtester-old-endpoint
|
||||
carddavtester-new-endpoint:
|
||||
image: nextcloudci/litmus-php7.0:litmus-php7.0-6
|
||||
commands:
|
||||
- bash tests/travis/install.sh sqlite
|
||||
- bash apps/dav/tests/travis/carddav/install.sh
|
||||
- bash apps/dav/tests/travis/carddav/script-new-endpoint.sh
|
||||
when:
|
||||
matrix:
|
||||
TESTS: carddavtester-new-endpoint
|
||||
carddavtester-old-endpoint:
|
||||
image: nextcloudci/litmus-php7.0:litmus-php7.0-6
|
||||
commands:
|
||||
- bash tests/travis/install.sh sqlite
|
||||
- bash apps/dav/tests/travis/carddav/install.sh
|
||||
- bash apps/dav/tests/travis/carddav/script-old-endpoint.sh
|
||||
when:
|
||||
matrix:
|
||||
TESTS: carddavtester-old-endpoint
|
||||
sqlite-php7.0-samba-native:
|
||||
image: nextcloudci/samba-native-php7.0:samba-native-php7.0-3
|
||||
commands:
|
||||
- smbd -D -FS &
|
||||
- ./autotest-external.sh sqlite smb-linux
|
||||
- wget https://codecov.io/bash -O codecov.sh
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' = 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -P $DRONE_PULL_REQUEST -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-external-clover-sqlite.xml; fi"
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' != 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-external-clover-sqlite.xml; fi"
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' = 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -P $DRONE_PULL_REQUEST -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-external-clover-sqlite-smb-linux.xml; fi"
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' != 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-external-clover-sqlite-smb-linux.xml; fi"
|
||||
when:
|
||||
matrix:
|
||||
TESTS: sqlite-php7.0-samba-native
|
||||
sqlite-php7.0-samba-non-native:
|
||||
image: nextcloudci/samba-non-native-php7.0:samba-non-native-php7.0-4
|
||||
commands:
|
||||
- smbd -D -FS &
|
||||
- ./autotest-external.sh sqlite smb-linux
|
||||
- wget https://codecov.io/bash -O codecov.sh
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' = 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -P $DRONE_PULL_REQUEST -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-external-clover-sqlite.xml; fi"
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' != 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-external-clover-sqlite.xml; fi"
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' = 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -P $DRONE_PULL_REQUEST -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-external-clover-sqlite-smb-linux.xml; fi"
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' != 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-external-clover-sqlite-smb-linux.xml; fi"
|
||||
when:
|
||||
matrix:
|
||||
TESTS: sqlite-php7.0-samba-non-native
|
||||
sqlite-php7.0-webdav-apache:
|
||||
image: nextcloudci/webdav-apache-php7.0
|
||||
commands:
|
||||
- apache2
|
||||
- ./autotest-external.sh sqlite webdav-apachedrone
|
||||
- wget https://codecov.io/bash -O codecov.sh
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' = 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -P $DRONE_PULL_REQUEST -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-external-clover-sqlite.xml; fi"
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' != 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-external-clover-sqlite.xml; fi"
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' = 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -P $DRONE_PULL_REQUEST -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-external-clover-sqlite-webdav-apachedrone.xml; fi"
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' != 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-external-clover-sqlite-webdav-apachedrone.xml; fi"
|
||||
when:
|
||||
matrix:
|
||||
TESTS: sqlite-php7.0-webdav-apache
|
||||
nodb-php5.6:
|
||||
image: nextcloudci/php5.6:php5.6-8
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=NODB ./autotest.sh sqlite
|
||||
when:
|
||||
matrix:
|
||||
DB: NODB
|
||||
PHP: 5.6
|
||||
nodb-php7.0:
|
||||
image: nextcloudci/php7.0:php7.0-16
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=NODB ./autotest.sh sqlite
|
||||
when:
|
||||
matrix:
|
||||
DB: NODB
|
||||
PHP: "7.0"
|
||||
nodb-php7.1:
|
||||
image: nextcloudci/php7.1:php7.1-15
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=NODB ./autotest.sh sqlite
|
||||
when:
|
||||
matrix:
|
||||
DB: NODB
|
||||
PHP: 7.1
|
||||
nodb-php7.2:
|
||||
image: nextcloudci/php7.2:php7.2-9
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=NODB ./autotest.sh sqlite
|
||||
when:
|
||||
matrix:
|
||||
DB: NODB
|
||||
PHP: 7.2
|
||||
sqlite-php5.6:
|
||||
image: nextcloudci/php5.6:php5.6-8
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh sqlite
|
||||
when:
|
||||
matrix:
|
||||
DB: sqlite
|
||||
PHP: 5.6
|
||||
sqlite-php7.0:
|
||||
image: nextcloudci/php7.0:php7.0-16
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh sqlite
|
||||
when:
|
||||
matrix:
|
||||
DB: sqlite
|
||||
PHP: "7.0"
|
||||
sqlite-php7.1:
|
||||
image: nextcloudci/php7.1:php7.1-15
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh sqlite
|
||||
when:
|
||||
matrix:
|
||||
DB: sqlite
|
||||
PHP: 7.1
|
||||
sqlite-php7.2:
|
||||
image: nextcloudci/php7.2:php7.2-9
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh sqlite
|
||||
when:
|
||||
matrix:
|
||||
DB: sqlite
|
||||
PHP: 7.2
|
||||
mysql-php5.6:
|
||||
image: nextcloudci/php5.6:php5.6-8
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh mysql
|
||||
when:
|
||||
matrix:
|
||||
DB: mysql
|
||||
PHP: 5.6
|
||||
mysql-php7.0:
|
||||
image: nextcloudci/php7.0:php7.0-16
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh mysql
|
||||
when:
|
||||
matrix:
|
||||
DB: mysql
|
||||
PHP: "7.0"
|
||||
mysql-php7.1:
|
||||
image: nextcloudci/php7.1:php7.1-15
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh mysql
|
||||
when:
|
||||
matrix:
|
||||
DB: mysql
|
||||
PHP: 7.1
|
||||
mysql-php7.2:
|
||||
image: nextcloudci/php7.2:php7.2-9
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh mysql
|
||||
when:
|
||||
matrix:
|
||||
DB: mysql
|
||||
PHP: 7.2
|
||||
mysql5.6-php5.6:
|
||||
image: nextcloudci/php5.6:php5.6-8
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh mysql
|
||||
when:
|
||||
matrix:
|
||||
DB: mysql5.6
|
||||
PHP: 5.6
|
||||
mysql5.6-php7.0:
|
||||
image: nextcloudci/php7.0:php7.0-16
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh mysql
|
||||
when:
|
||||
matrix:
|
||||
DB: mysql5.6
|
||||
PHP: "7.0"
|
||||
mysql5.6-php7.1:
|
||||
image: nextcloudci/php7.1:php7.1-15
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh mysql
|
||||
when:
|
||||
matrix:
|
||||
DB: mysql5.6
|
||||
PHP: 7.1
|
||||
mysql5.5-php5.6:
|
||||
image: nextcloudci/php5.6:php5.6-8
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh mysql
|
||||
when:
|
||||
matrix:
|
||||
DB: mysql5.5
|
||||
PHP: 5.6
|
||||
mysql5.5-php7.0:
|
||||
image: nextcloudci/php7.0:php7.0-16
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh mysql
|
||||
when:
|
||||
matrix:
|
||||
DB: mysql5.5
|
||||
PHP: "7.0"
|
||||
mysql5.5-php7.1:
|
||||
image: nextcloudci/php7.1:php7.1-15
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh mysql
|
||||
when:
|
||||
matrix:
|
||||
DB: mysql5.5
|
||||
PHP: 7.1
|
||||
postgres-php5.6:
|
||||
image: nextcloudci/php5.6:php5.6-8
|
||||
commands:
|
||||
- sleep 10 # gives the database enough time to initialize
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh pgsql
|
||||
when:
|
||||
matrix:
|
||||
DB: postgres
|
||||
PHP: 5.6
|
||||
POSTGRES: 9
|
||||
postgres-php7.0:
|
||||
image: nextcloudci/php7.0:php7.0-16
|
||||
commands:
|
||||
- sleep 10 # gives the database enough time to initialize
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh pgsql
|
||||
when:
|
||||
matrix:
|
||||
DB: postgres
|
||||
PHP: "7.0"
|
||||
postgres-php7.1:
|
||||
image: nextcloudci/php7.1:php7.1-15
|
||||
commands:
|
||||
- sleep 10 # gives the database enough time to initialize
|
||||
- POSTGRES=${POSTGRES} NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh pgsql
|
||||
when:
|
||||
matrix:
|
||||
DB: postgres
|
||||
PHP: 7.1
|
||||
mysqlmb4-php5.6:
|
||||
image: nextcloudci/php5.6:php5.6-8
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh mysqlmb4
|
||||
when:
|
||||
matrix:
|
||||
DB: mysqlmb4
|
||||
PHP: 5.6
|
||||
mysqlmb4-php7.0:
|
||||
image: nextcloudci/php7.0:php7.0-16
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh mysqlmb4
|
||||
when:
|
||||
matrix:
|
||||
DB: mysqlmb4
|
||||
PHP: "7.0"
|
||||
mysqlmb4-php7.1:
|
||||
image: nextcloudci/php7.1:php7.1-15
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh mysqlmb4
|
||||
when:
|
||||
matrix:
|
||||
DB: mysqlmb4
|
||||
PHP: 7.1
|
||||
mysqlmb4-php7.2:
|
||||
image: nextcloudci/php7.2:php7.2-9
|
||||
commands:
|
||||
- NOCOVERAGE=true TEST_SELECTION=DB ./autotest.sh mysqlmb4
|
||||
when:
|
||||
matrix:
|
||||
DB: mysqlmb4
|
||||
PHP: 7.2
|
||||
integration-capabilities_features:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh capabilities_features/capabilities.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-capabilities_features
|
||||
integration-federation_features:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin
|
||||
- cd build/integration
|
||||
- ./run.sh federation_features/federated.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-federation_features
|
||||
integration-auth:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/auth.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-auth
|
||||
integration-maintenance-mode:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/maintenance-mode.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-maintenance-mode
|
||||
integration-ratelimiting:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- ./occ config:system:set redis host --value=cache
|
||||
- ./occ config:system:set redis port --value=6379 --type=integer
|
||||
- ./occ config:system:set redis timeout --value=0 --type=integer
|
||||
- ./occ config:system:set --type string --value "\\OC\\Memcache\\Redis" memcache.local
|
||||
- ./occ config:system:set --type string --value "\\OC\\Memcache\\Redis" memcache.distributed
|
||||
- ./occ app:enable testing
|
||||
- cd build/integration
|
||||
- ./run.sh features/ratelimiting.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-ratelimiting
|
||||
integration-carddav:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/carddav.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-carddav
|
||||
integration-dav-v2:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/dav-v2.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-dav-v2
|
||||
integration-ocs-v1:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/ocs-v1.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-ocs-v1
|
||||
integration-sharing-v1:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/sharing-v1.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-sharing-v1
|
||||
integration-sharing-v1-part2:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/sharing-v1-part2.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-sharing-v1-part2
|
||||
integration-sharing-v1-part3:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/sharing-v1-part3.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-sharing-v1-part3
|
||||
integration-checksums-v1:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/checksums.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-checksums
|
||||
integration-external-storage:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/external-storage.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-external-storage
|
||||
integration-provisioning-v1:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/provisioning-v1.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-provisioning-v1
|
||||
integration-tags:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/tags.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-tags
|
||||
integration-caldav:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/caldav.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-caldav
|
||||
integration-comments:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/comments.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-comments
|
||||
integration-favorites:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/favorites.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-favorites
|
||||
integration-provisioning-v2:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/provisioning-v2.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-provisioning-v2
|
||||
integration-webdav-related:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/webdav-related.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-webdav-related
|
||||
integration-sharees-features:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh sharees_features/sharees.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-sharees-features
|
||||
integration-sharees-v2-features:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh sharees_features/sharees_provisioningapiv2.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-sharees-v2-features
|
||||
integration-setup-features:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- cd build/integration
|
||||
- ./run.sh setup_features/setup.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-setup-features
|
||||
integration-filesdrop-features:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh filesdrop_features/filesdrop.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-filesdrop-features
|
||||
integration-transfer-ownership-features:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/transfer-ownership.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-transfer-ownership-features
|
||||
integration-ldap-features:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- ./occ app:enable user_ldap
|
||||
- cd build/integration
|
||||
- ./run.sh ldap_features/ldap-ocs.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-ldap-features
|
||||
integration-trashbin:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh features/trashbin.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-trashbin
|
||||
integration-remote-api:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- ./occ maintenance:install --admin-pass=admin --data-dir=/dev/shm/nc_int
|
||||
- cd build/integration
|
||||
- ./run.sh remoteapi_features/remote.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS: integration-remote-api
|
||||
acceptance-access-levels:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- tests/acceptance/run-local.sh --timeout-multiplier 10 --nextcloud-server-domain acceptance-access-levels --selenium-server selenium:4444 allow-git-repository-modifications features/access-levels.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS-ACCEPTANCE: access-levels
|
||||
acceptance-app-comments:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- tests/acceptance/run-local.sh --timeout-multiplier 10 --nextcloud-server-domain acceptance-app-comments --selenium-server selenium:4444 allow-git-repository-modifications features/app-comments.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS-ACCEPTANCE: app-comments
|
||||
acceptance-app-files:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- tests/acceptance/run-local.sh --timeout-multiplier 10 --nextcloud-server-domain acceptance-app-files --selenium-server selenium:4444 allow-git-repository-modifications features/app-files.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS-ACCEPTANCE: app-files
|
||||
acceptance-app-theming:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- tests/acceptance/run-local.sh --timeout-multiplier 10 --nextcloud-server-domain acceptance-app-theming --selenium-server selenium:4444 allow-git-repository-modifications features/app-theming.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS-ACCEPTANCE: app-theming
|
||||
acceptance-login:
|
||||
image: nextcloudci/integration-php7.0:integration-php7.0-6
|
||||
commands:
|
||||
- tests/acceptance/run-local.sh --timeout-multiplier 10 --nextcloud-server-domain acceptance-login --selenium-server selenium:4444 allow-git-repository-modifications features/login.feature
|
||||
when:
|
||||
matrix:
|
||||
TESTS-ACCEPTANCE: login
|
||||
nodb-codecov:
|
||||
image: nextcloudci/php7.0:php7.0-16
|
||||
commands:
|
||||
- phpenmod xdebug
|
||||
- TEST_SELECTION=NODB ./autotest.sh sqlite
|
||||
- wget https://codecov.io/bash -O codecov.sh
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' = 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -P $DRONE_PULL_REQUEST -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-clover-sqlite.xml; fi"
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' != 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-clover-sqlite.xml; fi"
|
||||
when:
|
||||
matrix:
|
||||
TESTS: nodb-codecov
|
||||
db-codecov:
|
||||
image: nextcloudci/php7.0:php7.0-16
|
||||
commands:
|
||||
- phpenmod xdebug
|
||||
- TEST_SELECTION=QUICKDB ./autotest.sh sqlite
|
||||
- wget https://codecov.io/bash -O codecov.sh
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' = 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -P $DRONE_PULL_REQUEST -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-clover-sqlite.xml; fi"
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' != 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-clover-sqlite.xml; fi"
|
||||
when:
|
||||
matrix:
|
||||
TESTS: db-codecov
|
||||
object-store:
|
||||
image: nextcloudci/php7.0:php7.0-16
|
||||
commands:
|
||||
- phpenmod xdebug
|
||||
- TEST_SELECTION=PRIMARY-${OBJECT_STORE} ./autotest.sh sqlite
|
||||
- wget https://codecov.io/bash -O codecov.sh
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' = 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -P $DRONE_PULL_REQUEST -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-clover-sqlite.xml; fi"
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' != 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-clover-sqlite.xml; fi"
|
||||
when:
|
||||
matrix:
|
||||
TESTS: object-store
|
||||
memcache-memcached:
|
||||
image: nextcloudci/php7.0-memcached:php7.0-memcached-8
|
||||
commands:
|
||||
- phpenmod xdebug
|
||||
- service memcached restart
|
||||
- ./autotest.sh sqlite tests/lib/Memcache/MemcachedTest.php
|
||||
- wget https://codecov.io/bash -O codecov.sh
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' = 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -P $DRONE_PULL_REQUEST -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-clover-sqlite.xml; fi"
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' != 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-clover-sqlite.xml; fi"
|
||||
when:
|
||||
matrix:
|
||||
TEST: memcache-memcached
|
||||
memcache-redis-cluster:
|
||||
image: nextcloudci/php7.0:php7.0-17
|
||||
commands:
|
||||
- phpenmod xdebug
|
||||
- sleep 20
|
||||
- ./autotest.sh sqlite tests/lib/Memcache/RedisTest.php
|
||||
- wget https://codecov.io/bash -O codecov.sh
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' = 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -P $DRONE_PULL_REQUEST -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-clover-sqlite.xml; fi"
|
||||
- sh -c "if [ '$DRONE_BUILD_EVENT' != 'pull_request' ]; then bash codecov.sh -B $DRONE_BRANCH -C $DRONE_COMMIT -t 117641e2-a9e8-4b7b-984b-ae872d9b05f5 -f tests/autotest-clover-sqlite.xml; fi"
|
||||
when:
|
||||
matrix:
|
||||
TEST: memcache-redis-cluster
|
||||
matrix:
|
||||
include:
|
||||
- TESTS: checkers
|
||||
- TESTS: nodb-codecov
|
||||
ENABLE_REDIS: true
|
||||
- TESTS: db-codecov
|
||||
ENABLE_REDIS: true
|
||||
- DB: NODB
|
||||
PHP: 5.6
|
||||
ENABLE_REDIS: true
|
||||
- DB: NODB
|
||||
PHP: 7.0
|
||||
ENABLE_REDIS: true
|
||||
- DB: NODB
|
||||
PHP: 7.1
|
||||
ENABLE_REDIS: true
|
||||
- DB: NODB
|
||||
PHP: 7.2
|
||||
ENABLE_REDIS: false
|
||||
- DB: sqlite
|
||||
PHP: 5.6
|
||||
ENABLE_REDIS: true
|
||||
- DB: sqlite
|
||||
PHP: 7.0
|
||||
ENABLE_REDIS: true
|
||||
- DB: sqlite
|
||||
PHP: 7.1
|
||||
ENABLE_REDIS: true
|
||||
- DB: sqlite
|
||||
PHP: 7.2
|
||||
ENABLE_REDIS: false
|
||||
- DB: mysql
|
||||
PHP: 5.6
|
||||
ENABLE_REDIS: true
|
||||
- DB: mysql
|
||||
PHP: 7.0
|
||||
ENABLE_REDIS: true
|
||||
- DB: mysql
|
||||
PHP: 7.1
|
||||
ENABLE_REDIS: true
|
||||
- DB: mysql
|
||||
PHP: 7.2
|
||||
ENABLE_REDIS: false
|
||||
- DB: mysql5.6
|
||||
PHP: 5.6
|
||||
ENABLE_REDIS: true
|
||||
- DB: mysql5.6
|
||||
PHP: 7.0
|
||||
ENABLE_REDIS: true
|
||||
- DB: mysql5.6
|
||||
PHP: 7.1
|
||||
ENABLE_REDIS: true
|
||||
- DB: mysql5.5
|
||||
PHP: 5.6
|
||||
ENABLE_REDIS: true
|
||||
- DB: mysql5.5
|
||||
PHP: 7.0
|
||||
ENABLE_REDIS: true
|
||||
- DB: mysql5.5
|
||||
PHP: 7.1
|
||||
ENABLE_REDIS: true
|
||||
- DB: postgres
|
||||
PHP: 5.6
|
||||
POSTGRES: 9
|
||||
ENABLE_REDIS: true
|
||||
- DB: postgres
|
||||
PHP: 7.0
|
||||
POSTGRES: 9
|
||||
ENABLE_REDIS: true
|
||||
- DB: postgres
|
||||
PHP: 7.1
|
||||
POSTGRES: 9
|
||||
ENABLE_REDIS: true
|
||||
- DB: postgres
|
||||
PHP: 7.1
|
||||
POSTGRES: 10
|
||||
ENABLE_REDIS: true
|
||||
- DB: mysqlmb4
|
||||
PHP: 5.6
|
||||
ENABLE_REDIS: true
|
||||
- DB: mysqlmb4
|
||||
PHP: 7.0
|
||||
ENABLE_REDIS: true
|
||||
- DB: mysqlmb4
|
||||
PHP: 7.1
|
||||
ENABLE_REDIS: true
|
||||
- DB: mysqlmb4
|
||||
PHP: 7.2
|
||||
ENABLE_REDIS: false
|
||||
- TESTS: integration-capabilities_features
|
||||
- TESTS: integration-federation_features
|
||||
- TESTS: integration-maintenance-mode
|
||||
- TESTS: integration-ratelimiting
|
||||
ENABLE_REDIS: true
|
||||
- TESTS: integration-auth
|
||||
- TESTS: integration-carddav
|
||||
- TESTS: integration-dav-v2
|
||||
- TESTS: integration-ocs-v1
|
||||
- TESTS: integration-sharing-v1
|
||||
- TESTS: integration-sharing-v1-part2
|
||||
- TESTS: integration-sharing-v1-part3
|
||||
- TESTS: integration-checksums
|
||||
- TESTS: integration-external-storage
|
||||
- TESTS: integration-provisioning-v1
|
||||
- TESTS: integration-tags
|
||||
- TESTS: integration-caldav
|
||||
- TESTS: integration-comments
|
||||
- TESTS: integration-favorites
|
||||
- TESTS: integration-provisioning-v2
|
||||
- TESTS: integration-webdav-related
|
||||
- TESTS: integration-sharees-features
|
||||
- TESTS: integration-sharees-v2-features
|
||||
- TESTS: integration-setup-features
|
||||
- TESTS: integration-filesdrop-features
|
||||
- TESTS: integration-transfer-ownership-features
|
||||
- TESTS: integration-ldap-features
|
||||
- TESTS: integration-trashbin
|
||||
- TESTS: integration-remote-api
|
||||
- TESTS: acceptance
|
||||
TESTS-ACCEPTANCE: access-levels
|
||||
- TESTS: acceptance
|
||||
TESTS-ACCEPTANCE: app-comments
|
||||
- TESTS: acceptance
|
||||
TESTS-ACCEPTANCE: app-files
|
||||
- TESTS: acceptance
|
||||
TESTS-ACCEPTANCE: app-theming
|
||||
- TESTS: acceptance
|
||||
TESTS-ACCEPTANCE: login
|
||||
- TESTS: jsunit
|
||||
- TESTS: syntax-php5.6
|
||||
- TESTS: syntax-php7.0
|
||||
- TESTS: syntax-php7.1
|
||||
- TESTS: phan
|
||||
- TESTS: litmus-v1
|
||||
- TESTS: litmus-v2
|
||||
- TESTS: caldavtester-old-endpoint
|
||||
- TESTS: caldavtester-new-endpoint
|
||||
- TESTS: carddavtester-new-endpoint
|
||||
- TESTS: carddavtester-old-endpoint
|
||||
- TESTS: object-store
|
||||
OBJECT_STORE: s3
|
||||
- TESTS: sqlite-php7.0-samba-native
|
||||
- TESTS: sqlite-php7.0-samba-non-native
|
||||
- TEST: memcache-memcached
|
||||
- TEST: memcache-redis-cluster
|
||||
ENABLE_REDIS_CLUSTER: true
|
||||
- TESTS: sqlite-php7.0-webdav-apache
|
||||
ENABLE_REDIS: true
|
||||
|
||||
services:
|
||||
cache:
|
||||
image: redis
|
||||
when:
|
||||
matrix:
|
||||
ENABLE_REDIS: true
|
||||
cache-cluster:
|
||||
image: morrisjobke/redis-cluster
|
||||
when:
|
||||
matrix:
|
||||
ENABLE_REDIS_CLUSTER: true
|
||||
postgres-9:
|
||||
image: postgres:9
|
||||
environment:
|
||||
- POSTGRES_USER=oc_autotest
|
||||
- POSTGRES_DB=oc_autotest_dummy
|
||||
- POSTGRES_PASSWORD=owncloud
|
||||
tmpfs:
|
||||
- /var/lib/postgresql/data
|
||||
when:
|
||||
matrix:
|
||||
DB: postgres
|
||||
POSTGRES: 9
|
||||
postgres-10:
|
||||
image: postgres:10
|
||||
environment:
|
||||
- POSTGRES_USER=oc_autotest
|
||||
- POSTGRES_DB=oc_autotest_dummy
|
||||
- POSTGRES_PASSWORD=owncloud
|
||||
tmpfs:
|
||||
- /var/lib/postgresql/data
|
||||
when:
|
||||
matrix:
|
||||
DB: postgres
|
||||
POSTGRES: 10
|
||||
mysql:
|
||||
image: mysql:5.7
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=owncloud
|
||||
- MYSQL_USER=oc_autotest
|
||||
- MYSQL_PASSWORD=owncloud
|
||||
- MYSQL_DATABASE=oc_autotest
|
||||
tmpfs:
|
||||
- /var/lib/mysql
|
||||
when:
|
||||
matrix:
|
||||
DB: mysql
|
||||
mysql:
|
||||
image: mysql:5.6
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=owncloud
|
||||
- MYSQL_USER=oc_autotest
|
||||
- MYSQL_PASSWORD=owncloud
|
||||
- MYSQL_DATABASE=oc_autotest
|
||||
tmpfs:
|
||||
- /var/lib/mysql
|
||||
when:
|
||||
matrix:
|
||||
DB: mysql5.6
|
||||
mysql:
|
||||
image: mysql:5.5
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=owncloud
|
||||
- MYSQL_USER=oc_autotest
|
||||
- MYSQL_PASSWORD=owncloud
|
||||
- MYSQL_DATABASE=oc_autotest
|
||||
tmpfs:
|
||||
- /var/lib/mysql
|
||||
when:
|
||||
matrix:
|
||||
DB: mysql5.5
|
||||
mysqlmb4:
|
||||
image: mysql:5.7.22
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=owncloud
|
||||
- MYSQL_USER=oc_autotest
|
||||
- MYSQL_PASSWORD=owncloud
|
||||
- MYSQL_DATABASE=oc_autotest
|
||||
command: [ "--innodb_large_prefix=true", "--innodb_file_format=barracuda", "--innodb_file_per_table=true" ]
|
||||
tmpfs:
|
||||
- /var/lib/mysql
|
||||
when:
|
||||
matrix:
|
||||
DB: mysqlmb4
|
||||
fake-s3:
|
||||
image: lphoward/fake-s3
|
||||
when:
|
||||
matrix:
|
||||
OBJECT_STORE: s3
|
||||
selenium:
|
||||
image: selenium/standalone-firefox:2.53.1-beryllium
|
||||
environment:
|
||||
# Reduce default log level for Selenium server (INFO) as it is too
|
||||
# verbose.
|
||||
- JAVA_OPTS=-Dselenium.LOGGER.level=WARNING
|
||||
when:
|
||||
matrix:
|
||||
TESTS: acceptance
|
||||
|
||||
branches: [ master, stable* ]
|
||||
@@ -1,2 +0,0 @@
|
||||
*/Activity/* @nickvergessen
|
||||
*/Notifications/* @nickvergessen
|
||||
+3
-24
@@ -3,13 +3,9 @@
|
||||
/owncloud
|
||||
/config/config.php
|
||||
/config/*.config.php
|
||||
/config/mimetype*.json
|
||||
/config/mount.php
|
||||
/apps/inc.php
|
||||
/assets
|
||||
/.htaccess
|
||||
/translationfiles
|
||||
/translationtool.phar
|
||||
|
||||
# ignore all apps except core ones
|
||||
/apps*/*
|
||||
@@ -18,23 +14,15 @@
|
||||
!/apps/files
|
||||
!/apps/federation
|
||||
!/apps/federatedfilesharing
|
||||
!/apps/sharebymail
|
||||
!/apps/encryption
|
||||
!/apps/files_external
|
||||
!/apps/files_sharing
|
||||
!/apps/files_trashbin
|
||||
!/apps/files_versions
|
||||
!/apps/lookup_server_connector
|
||||
!/apps/user_ldap
|
||||
!/apps/oauth2
|
||||
!/apps/provisioning_api
|
||||
!/apps/systemtags
|
||||
!/apps/testing
|
||||
!/apps/admin_audit
|
||||
!/apps/updatenotification
|
||||
!/apps/theming
|
||||
!/apps/twofactor_backupcodes
|
||||
!/apps/workflowengine
|
||||
/apps/files_external/3rdparty/irodsphp/PHPUnitTest
|
||||
/apps/files_external/3rdparty/irodsphp/web
|
||||
/apps/files_external/3rdparty/irodsphp/prods/test
|
||||
@@ -43,6 +31,7 @@
|
||||
/apps/files_external/tests/config.*.php
|
||||
|
||||
|
||||
|
||||
# ignore themes except the example and the README
|
||||
/themes/*
|
||||
!/themes/example
|
||||
@@ -76,16 +65,13 @@ RCS/*
|
||||
.project
|
||||
.settings
|
||||
|
||||
# netbeans
|
||||
# netbeans
|
||||
nbproject
|
||||
|
||||
# phpStorm
|
||||
.idea
|
||||
*.iml
|
||||
|
||||
# vscode
|
||||
.vscode
|
||||
|
||||
# geany
|
||||
*.geany
|
||||
|
||||
@@ -98,7 +84,7 @@ nbproject
|
||||
|
||||
# ack(-grep)
|
||||
.ackrc
|
||||
|
||||
|
||||
# Mac OS
|
||||
.DS_Store
|
||||
|
||||
@@ -113,11 +99,9 @@ nbproject
|
||||
/build/node_modules/
|
||||
|
||||
# nodejs
|
||||
/build/bin
|
||||
/build/lib/
|
||||
/build/jsdocs/
|
||||
/npm-debug.log
|
||||
/PhantomJS_*
|
||||
|
||||
# puphpet
|
||||
puphpet
|
||||
@@ -129,7 +113,6 @@ Vagrantfile
|
||||
# Tests - auto-generated files
|
||||
/data-autotest
|
||||
/tests/coverage*
|
||||
/tests/css
|
||||
/tests/karma-coverage
|
||||
/tests/autoconfig*
|
||||
/tests/autotest*
|
||||
@@ -138,7 +121,3 @@ Vagrantfile
|
||||
/config/config-autotest-backup.php
|
||||
/config/autoconfig.php
|
||||
clover.xml
|
||||
|
||||
# Tests - dependencies
|
||||
tests/acceptance/composer.lock
|
||||
tests/acceptance/vendor/
|
||||
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
[submodule "3rdparty"]
|
||||
path = 3rdparty
|
||||
url = https://github.com/nextcloud/3rdparty.git
|
||||
url = https://github.com/owncloud/3rdparty.git
|
||||
|
||||
@@ -14,24 +14,20 @@
|
||||
Header set X-Content-Type-Options "nosniff"
|
||||
Header set X-XSS-Protection "1; mode=block"
|
||||
Header set X-Robots-Tag "none"
|
||||
Header set X-Frame-Options "SAMEORIGIN"
|
||||
Header set X-Download-Options "noopen"
|
||||
Header set X-Permitted-Cross-Domain-Policies "none"
|
||||
SetEnv modHeadersAvailable true
|
||||
</IfModule>
|
||||
|
||||
# Add cache control for static resources
|
||||
<FilesMatch "\.(css|js|svg|gif)$">
|
||||
Header set Cache-Control "max-age=15778463"
|
||||
</FilesMatch>
|
||||
|
||||
# Let browsers cache WOFF files for a week
|
||||
<FilesMatch "\.woff$">
|
||||
Header set Cache-Control "max-age=604800"
|
||||
# Add cache control for CSS and JS files
|
||||
<FilesMatch "\.(css|js)$">
|
||||
Header set Cache-Control "max-age=7200, public"
|
||||
</FilesMatch>
|
||||
</IfModule>
|
||||
<IfModule mod_php5.c>
|
||||
php_value upload_max_filesize 511M
|
||||
php_value post_max_size 511M
|
||||
php_value upload_max_filesize 513M
|
||||
php_value post_max_size 513M
|
||||
php_value memory_limit 512M
|
||||
php_value mbstring.func_overload 0
|
||||
php_value always_populate_raw_post_data -1
|
||||
@@ -42,8 +38,8 @@
|
||||
</IfModule>
|
||||
</IfModule>
|
||||
<IfModule mod_php7.c>
|
||||
php_value upload_max_filesize 511M
|
||||
php_value post_max_size 511M
|
||||
php_value upload_max_filesize 513M
|
||||
php_value post_max_size 513M
|
||||
php_value memory_limit 512M
|
||||
php_value mbstring.func_overload 0
|
||||
php_value default_charset 'UTF-8'
|
||||
@@ -54,17 +50,32 @@
|
||||
</IfModule>
|
||||
<IfModule mod_rewrite.c>
|
||||
RewriteEngine on
|
||||
RewriteCond %{HTTP_USER_AGENT} DavClnt
|
||||
RewriteRule ^$ /remote.php/webdav/ [L,R=302]
|
||||
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
|
||||
RewriteRule ^\.well-known/host-meta /public.php?service=host-meta [QSA,L]
|
||||
RewriteRule ^\.well-known/host-meta\.json /public.php?service=host-meta-json [QSA,L]
|
||||
RewriteRule ^\.well-known/carddav /remote.php/dav/ [R=301,L]
|
||||
RewriteRule ^\.well-known/caldav /remote.php/dav/ [R=301,L]
|
||||
RewriteRule ^remote/(.*) remote.php [QSA,L]
|
||||
RewriteRule ^(?:build|tests|config|lib|3rdparty|templates)/.* - [R=404,L]
|
||||
RewriteCond %{REQUEST_URI} !^/.well-known/(acme-challenge|pki-validation)/.*
|
||||
RewriteRule ^(?:\.|autotest|occ|issue|indie|db_|console).* - [R=404,L]
|
||||
RewriteRule ^(build|tests|config|lib|3rdparty|templates)/.* - [R=404,L]
|
||||
RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge/.*
|
||||
RewriteRule ^(\.|autotest|occ|issue|indie|db_|console).* - [R=404,L]
|
||||
|
||||
# Rewrite rules for `front_controller_active`
|
||||
Options -MultiViews
|
||||
RewriteRule ^core/js/oc.js$ index.php [PT,E=PATH_INFO:$1]
|
||||
RewriteRule ^core/preview.png$ index.php [PT,E=PATH_INFO:$1]
|
||||
RewriteCond %{REQUEST_FILENAME} !\.(css|js|svg|gif|png|html|ttf|woff|ico|jpg|jpeg)$
|
||||
RewriteCond %{REQUEST_FILENAME} !core/img/favicon.ico$
|
||||
RewriteCond %{REQUEST_FILENAME} !/remote.php
|
||||
RewriteCond %{REQUEST_FILENAME} !/public.php
|
||||
RewriteCond %{REQUEST_FILENAME} !/cron.php
|
||||
RewriteCond %{REQUEST_FILENAME} !/core/ajax/update.php
|
||||
RewriteCond %{REQUEST_FILENAME} !/status.php
|
||||
RewriteCond %{REQUEST_FILENAME} !/ocs/v1.php
|
||||
RewriteCond %{REQUEST_FILENAME} !/ocs/v2.php
|
||||
RewriteCond %{REQUEST_FILENAME} !/updater/
|
||||
RewriteCond %{REQUEST_FILENAME} !/ocs-provider/
|
||||
RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge/.*
|
||||
</IfModule>
|
||||
<IfModule mod_mime.c>
|
||||
AddType image/svg+xml svg svgz
|
||||
|
||||
@@ -28,10 +28,7 @@
|
||||
"_": true,
|
||||
"OC": true,
|
||||
"OCA": true,
|
||||
"OCP": true,
|
||||
"t": true,
|
||||
"n": true,
|
||||
"escapeHTML": true,
|
||||
"Promise": true
|
||||
"n": true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,8 +16,8 @@ Andreas Schönebeck <aschoenebeck@web.de>
|
||||
Andreas Ergenzinger <andreas.ergenzinger@gmx.de> AndreasErgenzinger <andreas.ergenzinger@gmx.de>
|
||||
Andrew Brown <andrew@casabrown.com>
|
||||
André Gaul <gaul@web-yard.de>
|
||||
Arthur Schiwon <blizzz@arthur-schiwon.de> Arthur Schiwon <blizzz@owncloud.com>
|
||||
Arthur Schiwon <blizzz@arthur-schiwon.de> blizzz <blizzz@owncloud.com>
|
||||
Arthur Schiwon <blizzz@owncloud.com> Arthur Schiwon <blizzz@arthur-schiwon.de>
|
||||
Arthur Schiwon <blizzz@owncloud.com> blizzz <blizzz@owncloud.com>
|
||||
Artur Duque de Souza <asouza@kde.org>
|
||||
Axel Roenn <axel@mpim-bonn.mpg.de>
|
||||
Bagera <victor@baquero-wihlborg.se>
|
||||
@@ -30,16 +30,14 @@ Benjamin Diele <benjamin@diele.be>
|
||||
Benjamin Liles <benliles@arch.tamu.edu>
|
||||
Bernhard Posselt <dev@bernhard-posselt.com> Bernhard Posselt <nukeawhale@gmail.com>
|
||||
Bernhard Posselt <dev@bernhard-posselt.com> Bernhard Posselt <Raydiation@users.noreply.github.com>
|
||||
Bernhard Posselt <dev@bernhard-posselt.com> Bernhard Posselt <BernhardPosselt@users.noreply.github.com>
|
||||
Bernhard Reiter <ockham@raz.or.at>
|
||||
Birk Borkason <daniel.niccoli@gmail.com>
|
||||
Björn Schießle <bjoern@schiessle.org> Bjoern Schiessle <schiesbn@woody.(none)>
|
||||
Björn Schießle <bjoern@schiessle.org> Björn Schießle <schiessle@owncloud.com>
|
||||
Björn Schießle <bjoern@schiessle.org> Björn Schießle <schiesbn@potato.(none)>
|
||||
Björn Schießle <bjoern@schiessle.org> Björn Schiessle <schiessle@owncloud.com>
|
||||
Björn Schießle <bjoern@schiessle.org> Bjoern Schießle <schiessle@owncloud.com>
|
||||
Björn Schießle <bjoern@schiessle.org> Bjoern Schiessle <schiessle@owncloud.com>
|
||||
Björn Schießle <bjoern@schiessle.org> Björn Schießle <schiessle@owncloud.com>
|
||||
Björn Schießle <schiessle@owncloud.com> Bjoern Schiessle <schiesbn@woody.(none)>
|
||||
Björn Schießle <schiessle@owncloud.com> Björn Schießle <bjoern@schiessle.org>
|
||||
Björn Schießle <schiessle@owncloud.com> Björn Schießle <schiesbn@potato.(none)>
|
||||
Björn Schießle <schiessle@owncloud.com> Björn Schiessle <schiessle@owncloud.com>
|
||||
Björn Schießle <schiessle@owncloud.com> Bjoern Schießle <schiessle@owncloud.com>
|
||||
Björn Schießle <schiessle@owncloud.com> Bjoern Schiessle <schiessle@owncloud.com>
|
||||
BlackEagle <ike.devolder@gmail.com>
|
||||
Boris Rybalkin <ribalkin@gmail.com>
|
||||
Borjan Tchakaloff <borjan@tchakaloff.fr>
|
||||
@@ -63,8 +61,6 @@ Christian Berendt <berendt@b1-systems.de>
|
||||
Christian Kampka <christian@kampka.net>
|
||||
Christian Koch <koch.chris@gmail.com>
|
||||
Christian Reiner <github@christian-reiner.info> Christian Reiner <arkascha@balder.site>
|
||||
Christoph Wurst <christoph@owncloud.com> Christoph Wurst <ChristophWurst@users.noreply.github.com>
|
||||
Christoph Wurst <christoph@owncloud.com> Christoph Wurst <christoph@winzerhof-wurst.at>
|
||||
Christopher Bunn <b11.chris@gmail.com>
|
||||
Christopher Schäpers <kondou@ts.unde.re> Christopher <kondou@ts.unde.re>
|
||||
Christopher Schäpers <kondou@ts.unde.re> kondou <kondou@ts.unde.re>
|
||||
@@ -100,7 +96,6 @@ derkostka <sebastian.kostka@gmail.com>
|
||||
Diederik de Haas <diederik@cknow.org>
|
||||
Dominik Schmidt <dev@dominik-schmidt.de>
|
||||
Donald Buczek <buczek@molgen.mpg.de>
|
||||
Donquixote <marjunebatac@gmail.com> Donquixote <marjunebatac@gmailcom>
|
||||
Doug Neiner <doug@pixelgraphics.us>
|
||||
drarko <drarko@users.noreply.github.com>
|
||||
dratini0 <dratini0@gmail.com>
|
||||
@@ -128,11 +123,11 @@ Florian Vichot <florian.vichot@gmail.com>
|
||||
Florin Peter <github@florin-peter.de> Florin Peter <fp@datawerk.de>
|
||||
Florin Peter <github@florin-peter.de> FlorinPeter <github@florin-peter.de>
|
||||
Francesco Piraneo G. <fpiraneo@iface.ch>
|
||||
Frank Karlitschek <frank@karlitschek.de> Frank Karlitschek <frank@dev.(none)>
|
||||
Frank Karlitschek <frank@karlitschek.de> Frank Karlitschek <frank@devel.(none)>
|
||||
Frank Karlitschek <frank@karlitschek.de> Frank Karlitschek <frank@oc.(none)>
|
||||
Frank Karlitschek <frank@karlitschek.de> Frank Karlitschek <frank@owncloud.org>
|
||||
Frank Karlitschek <frank@karlitschek.de> Frank Karlitschek <karlitschek@kde.org>
|
||||
Frank Karlitschek <frank@owncloud.org> Frank Karlitschek <frank@dev.(none)>
|
||||
Frank Karlitschek <frank@owncloud.org> Frank Karlitschek <frank@devel.(none)>
|
||||
Frank Karlitschek <frank@owncloud.org> Frank Karlitschek <frank@oc.(none)>
|
||||
Frank Karlitschek <frank@owncloud.org> Frank Karlitschek <karlitschek@gmx.de>
|
||||
Frank Karlitschek <frank@owncloud.org> Frank Karlitschek <karlitschek@kde.org>
|
||||
François Kubler <francois@kubler.org>
|
||||
Frédéric Fortier <frederic.fortier@oronospolytechnique.com> Frédéric Fortier <frederic.fortier@polymtl.ca>
|
||||
Frederik Gladhorn <gladhorn@kde.org>
|
||||
@@ -141,13 +136,12 @@ ganomi <ganomi@gmail.com>
|
||||
Gaël Beaudoin <gaboo@home.gaboo.org>
|
||||
geez0x1 <geez0x1@users.noreply.github.com>
|
||||
gekmihesg <markus@gekmihesg.de>
|
||||
Georg Ehrke <oc.list@georgehrke.com> Georg Ehrke <dev@georgswebsite.de>
|
||||
Georg Ehrke <oc.list@georgehrke.com> Georg Ehrke <developer@georgehrke.com>
|
||||
Georg Ehrke <oc.list@georgehrke.com> Georg Ehrke <georg.stefan.germany@googlemail.com>
|
||||
Georg Ehrke <oc.list@georgehrke.com> Georg Ehrke <ownclouddev@georgswebsite.de>
|
||||
Georg Ehrke <oc.list@georgehrke.com> Georg Ehrke <devgeorg@ownCloud.com>
|
||||
Georg Ehrke <oc.list@georgehrke.com> Georg Ehrke <georg@ownCloud.com>
|
||||
Georg Ehrke <oc.list@georgehrke.com> Georg Ehrke <georg@owncloud.com>
|
||||
Georg Ehrke <georg@owncloud.com> Georg Ehrke <dev@georgswebsite.de>
|
||||
Georg Ehrke <georg@owncloud.com> Georg Ehrke <developer@georgehrke.com>
|
||||
Georg Ehrke <georg@owncloud.com> Georg Ehrke <georg.stefan.germany@googlemail.com>
|
||||
Georg Ehrke <georg@owncloud.com> Georg Ehrke <ownclouddev@georgswebsite.de>
|
||||
Georg Ehrke <georg@owncloud.com> Georg Ehrke <devgeorg@ownCloud.com>
|
||||
Georg Ehrke <georg@owncloud.com> Georg Ehrke <georg@ownCloud.com>
|
||||
Golnaz Nilieh <g382nilieh@gmail.com>
|
||||
Grundik <grundik@ololo.cc>
|
||||
Guillaume AMAT <guillaume.amat@informatique-libre.com>
|
||||
@@ -185,8 +179,7 @@ Jesús Macias <jmacias@solidgear.es> Jesus Macias <jmacias@full-on-net.com>
|
||||
jknockaert <jasper@knockaert.nl>
|
||||
Joan <aseques@gmail.com>
|
||||
Joar Wandborg <git@wandborg.com>
|
||||
Joas Schilling <coding@schilljs.com> Joas Schilling <nickvergessen@gmx.de>
|
||||
Joas Schilling <coding@schilljs.com> Joas Schilling <nickvergessen@owncloud.com>
|
||||
Joas Schilling <nickvergessen@owncloud.com> Joas Schilling <nickvergessen@gmx.de>
|
||||
joel hansson <joel.hansson@gmail.com>
|
||||
Johan Björk <johanimon@gmail.com>
|
||||
Johannes Twittmann <github.com@deryo.de>
|
||||
@@ -213,8 +206,8 @@ Sebastian Döll <sebastian.doell@libasys.de> libasys <sebastian.doell@libasys.de
|
||||
Lode Hoste <zillode@zillode.be>
|
||||
lolozere <laurent@chedanne.pro>
|
||||
Lorenzo M. Catucci <lorenzo@sancho.ccd.uniroma2.it>
|
||||
Lukas Reschke <lukas@statuscode.ch> Lukas Reschke <lukas@owncloud.com>
|
||||
Lukas Reschke <lukas@statuscode.ch> Lukas Reschke <lukas@owncloud.org>
|
||||
Lukas Reschke <lukas@owncloud.com> Lukas Reschke <lukas@owncloud.org>
|
||||
Lukas Reschke <lukas@owncloud.com> Lukas Reschke <lukas@statuscode.ch>
|
||||
Luke Policinski <lpolicinski@gmail.com>
|
||||
Lyonel Vincent <lyonel@ezix.org>
|
||||
macjohnny <estebanmarin@gmx.ch>
|
||||
@@ -305,19 +298,17 @@ Riccardo Iaconelli <riccardo@kde.org>
|
||||
Richard Clarkson <robert@trash-mail.com>
|
||||
rnveach <rveach02@gmail.com>
|
||||
Robert Jäckel <rjaeckel@users.noreply.github.com>
|
||||
Robin Appelman <robin@icewind.nl> icewind1991 <icewind1991@gmail.com>
|
||||
Robin Appelman <robin@icewind.nl> icewind1991 <robin@icewind.nl>
|
||||
Robin Appelman <robin@icewind.nl> Robin <Robin Appelman icewind1991@gmail.com>
|
||||
Robin Appelman <robin@icewind.nl> Robin <robin@Amaya.(none)>
|
||||
Robin Appelman <robin@icewind.nl> Robin Appelman <icewind1991@gmail.com>
|
||||
Robin Appelman <robin@icewind.nl> Robin Appelman <icewind1991@gmail>
|
||||
Robin Appelman <robin@icewind.nl> Robin Appelman <icewind@owncloud.com>
|
||||
Robin Appelman <icewind@owncloud.com> icewind1991 <icewind1991@gmail.com>
|
||||
Robin Appelman <icewind@owncloud.com> icewind1991 <robin@icewind.nl>
|
||||
Robin Appelman <icewind@owncloud.com> Robin <Robin Appelman icewind1991@gmail.com>
|
||||
Robin Appelman <icewind@owncloud.com> Robin <robin@Amaya.(none)>
|
||||
Robin Appelman <icewind@owncloud.com> Robin Appelman <icewind1991@gmail.com>
|
||||
Robin Appelman <icewind@owncloud.com> Robin Appelman <icewind1991@gmail>
|
||||
Robin Appelman <icewind@owncloud.com> Robin Appelman <robin@icewind.nl>
|
||||
Robin McCorkell <robin@mccorkell.me.uk> Robin McCorkell <rmccorkell@karoshi.org.uk>
|
||||
Robin McCorkell <robin@mccorkell.me.uk> Robin McCorkell <rmccorkell@owncloud.com>
|
||||
Rodrigo Hjort <rodrigo.hjort@gmail.com>
|
||||
Roeland Jago Douma <roeland@famdouma.nl> Roeland Jago Douma <rullzer@owncloud.com>
|
||||
Roeland Jago Douma <roeland@famdouma.nl> Roeland Douma <rullzer@users.noreply.github.com>
|
||||
Roger Szabo <roger.szabo@web.de> root <roger.szabo@web.de>
|
||||
Roeland Jago Douma <rullzer@owncloud.com> Roeland Jago Douma <roeland@famdouma.nl>
|
||||
rok <brejktru@gmail.com>
|
||||
Roland Hager <roland.hager@tu-berlin.de>
|
||||
Roland van Laar <roland@micite.net>
|
||||
@@ -377,7 +368,6 @@ TheSFReader <TheSFReader@gmail.com>
|
||||
Thibaut GRIDEL <tgridel@free.fr>
|
||||
thomas <thomas@thomas-VirtualBox.(none)>
|
||||
Thomas Müller <thomas.mueller@tmit.eu> Thomas Mueller <thomas.mueller@tmit.eu>
|
||||
Thomas Müller <thomas.mueller@tmit.eu> Thomas Müller <DeepDiver1975@users.noreply.github.com>
|
||||
Thomas Olsen <tol@tanghus>
|
||||
Thomas Schmidt <tschmidt@suse.de>
|
||||
Thomas Tanghus <thomas@tanghus.net>
|
||||
@@ -403,7 +393,6 @@ Victor Dubiniuk <dubiniuk@owncloud.com> VicDeo <victor.dubiniuk@gmail.com>
|
||||
Vincent Cloutier <vincent1cloutier@gmail.com>
|
||||
Vincent Petry <pvince81@owncloud.com> Vincent Petry <PVince81@yahoo.fr>
|
||||
Vincent Petry <pvince81@owncloud.com> Vincent Petry <vincent@vvortex.site>
|
||||
Vinicius Cubas Brand <vinicius@eita.org.br> Vinicius Cubas Brand <viniciuscb@gmail.com>
|
||||
Vitaly Kuznetsov <vitty@altlinux.ru>
|
||||
Vladimir Sapronov <vladimir.sapronov@gmail.com>
|
||||
Volkan Gezer <volkangezer@gmail.com> Volkan Gezer <wakeup@users.noreply.github.com>
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"maxReviewers": 3,
|
||||
"numFilesToCheck": 5,
|
||||
"alwaysNotifyForPaths": [
|
||||
{
|
||||
"name": "DeepDiver1975",
|
||||
"files": [
|
||||
"apps/dav/**"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "nickvergessen",
|
||||
"files": [
|
||||
"lib/private/activity/**",
|
||||
"lib/private/notification/**",
|
||||
"lib/public/activity/**",
|
||||
"lib/public/notification/**"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Xenopathic",
|
||||
"files": [
|
||||
"apps/files_external/**"
|
||||
]
|
||||
}
|
||||
],
|
||||
"userBlacklist": [
|
||||
"owncloud-bot",
|
||||
"scrutinizer-auto-fixer",
|
||||
"th3fallen",
|
||||
"zander"
|
||||
]
|
||||
}
|
||||
+1
-9
@@ -1,11 +1,3 @@
|
||||
before_commands:
|
||||
- 'git submodule update --init --recursive'
|
||||
|
||||
checks:
|
||||
php:
|
||||
excluded_dependencies:
|
||||
- etsy/phan
|
||||
|
||||
filter:
|
||||
excluded_paths:
|
||||
- '3rdparty/*'
|
||||
@@ -25,7 +17,7 @@ filter:
|
||||
- 'settings/l10n/*'
|
||||
- 'tests/*'
|
||||
- 'build/*'
|
||||
- 'lib/composer/*'
|
||||
|
||||
|
||||
imports:
|
||||
- javascript
|
||||
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
sudo: false
|
||||
language: php
|
||||
php:
|
||||
- 5.4
|
||||
|
||||
env:
|
||||
global:
|
||||
- TEST_DAV=$(tests/travis/changed_app.sh dav)
|
||||
- TC=litmus-v2
|
||||
matrix:
|
||||
- DB=sqlite
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- /^stable\d+(\.\d+)?$/
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- realpath
|
||||
|
||||
before_install:
|
||||
- sh -c "if [ '$TEST_DAV' = '1' ]; then bash tests/travis/before_install.sh $DB; fi"
|
||||
|
||||
install:
|
||||
- sh -c "if [ '$TEST_DAV' = '1' ]; then bash tests/travis/install.sh $DB; fi"
|
||||
- sh -c "if [ '$TEST_DAV' = '1' ]; then bash apps/dav/tests/travis/$TC/install.sh; fi"
|
||||
|
||||
|
||||
script:
|
||||
- sh -c "if [ '$TC' = 'syntax' ]; then composer install && vendor/bin/parallel-lint --exclude vendor/jakub-onderka/ --exclude 3rdparty/symfony/polyfill-php70/Resources/stubs/ --exclude 3rdparty/patchwork/utf8/src/Patchwork/Utf8/Bootup/ --exclude 3rdparty/paragonie/random_compat/lib/ --exclude vendor/composer/autoload_static.php --exclude 3rdparty/composer/autoload_static.php .; fi"
|
||||
- sh -c "if [ '$TEST_DAV' != '1' ]; then echo \"Not testing DAV\"; fi"
|
||||
- sh -c "if [ '$TEST_DAV' = '1' ]; then echo \"Testing DAV\"; fi"
|
||||
|
||||
- sh -c "if [ '$TEST_DAV' = '1' ]; then bash apps/dav/tests/travis/$TC/script.sh; fi"
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- php: 5.4
|
||||
env: DB=pgsql;TC=litmus-v1
|
||||
- php: 5.4
|
||||
env: DB=sqlite;TC=carddav
|
||||
- php: 5.4
|
||||
env: DB=sqlite;TC=caldav
|
||||
- php: 5.4
|
||||
env: DB=sqlite;TC=syntax;TEST_DAV=0
|
||||
- php: 5.5
|
||||
env: DB=sqlite;TC=syntax;TEST_DAV=0
|
||||
- php: 5.6
|
||||
env: DB=sqlite;TC=syntax;TEST_DAV=0
|
||||
- php: 7.0
|
||||
env: DB=sqlite;TC=syntax;TEST_DAV=0
|
||||
|
||||
fast_finish: true
|
||||
-129
@@ -1,129 +0,0 @@
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
lang_map = bg_BG: bg, cs_CZ: cs, fi_FI: fi, hu_HU: hu, nb_NO: nb, sk_SK: sk, th_TH: th, ja_JP: ja
|
||||
|
||||
[nextcloud.core]
|
||||
file_filter = translationfiles/<lang>/core.po
|
||||
source_file = translationfiles/templates/core.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.files]
|
||||
file_filter = translationfiles/<lang>/files.po
|
||||
source_file = translationfiles/templates/files.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.settings-1]
|
||||
file_filter = translationfiles/<lang>/settings.po
|
||||
source_file = translationfiles/templates/settings.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.lib]
|
||||
file_filter = translationfiles/<lang>/lib.po
|
||||
source_file = translationfiles/templates/lib.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.dav]
|
||||
file_filter = translationfiles/<lang>/dav.po
|
||||
source_file = translationfiles/templates/dav.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.files_encryption]
|
||||
file_filter = translationfiles/<lang>/encryption.po
|
||||
source_file = translationfiles/templates/encryption.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.files_external]
|
||||
file_filter = translationfiles/<lang>/files_external.po
|
||||
source_file = translationfiles/templates/files_external.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.files_sharing]
|
||||
file_filter = translationfiles/<lang>/files_sharing.po
|
||||
source_file = translationfiles/templates/files_sharing.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.files_trashbin]
|
||||
file_filter = translationfiles/<lang>/files_trashbin.po
|
||||
source_file = translationfiles/templates/files_trashbin.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.files_versions]
|
||||
file_filter = translationfiles/<lang>/files_versions.po
|
||||
source_file = translationfiles/templates/files_versions.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.user_ldap]
|
||||
file_filter = translationfiles/<lang>/user_ldap.po
|
||||
source_file = translationfiles/templates/user_ldap.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.comments]
|
||||
file_filter = translationfiles/<lang>/comments.po
|
||||
source_file = translationfiles/templates/comments.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.federatedfilesharing]
|
||||
file_filter = translationfiles/<lang>/federatedfilesharing.po
|
||||
source_file = translationfiles/templates/federatedfilesharing.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.federation]
|
||||
file_filter = translationfiles/<lang>/federation.po
|
||||
source_file = translationfiles/templates/federation.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.oauth2]
|
||||
file_filter = translationfiles/<lang>/oauth2.po
|
||||
source_file = translationfiles/templates/oauth2.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.sharebymail]
|
||||
file_filter = translationfiles/<lang>/sharebymail.po
|
||||
source_file = translationfiles/templates/sharebymail.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.systemtags]
|
||||
file_filter = translationfiles/<lang>/systemtags.po
|
||||
source_file = translationfiles/templates/systemtags.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.updatenotification]
|
||||
file_filter = translationfiles/<lang>/updatenotification.po
|
||||
source_file = translationfiles/templates/updatenotification.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.theming]
|
||||
file_filter = translationfiles/<lang>/theming.po
|
||||
source_file = translationfiles/templates/theming.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.twofactor_backupcodes]
|
||||
file_filter = translationfiles/<lang>/twofactor_backupcodes.po
|
||||
source_file = translationfiles/templates/twofactor_backupcodes.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
||||
[nextcloud.workflowengine]
|
||||
file_filter = translationfiles/<lang>/workflowengine.po
|
||||
source_file = translationfiles/templates/workflowengine.pot
|
||||
source_lang = en
|
||||
type = PO
|
||||
@@ -1,5 +1,5 @@
|
||||
upload_max_filesize=511M
|
||||
post_max_size=511M
|
||||
upload_max_filesize=513M
|
||||
post_max_size=513M
|
||||
memory_limit=512M
|
||||
mbstring.func_overload=0
|
||||
always_populate_raw_post_data=-1
|
||||
|
||||
+1
-1
Submodule 3rdparty updated: 5486fdcff8...1c47b6e680
@@ -1,24 +1,15 @@
|
||||
Nextcloud is written by:
|
||||
- 1 Man Projects <reed@1manprojects.de>
|
||||
ownCloud is written by:
|
||||
- AW-UC <git@a-wesemann.de>
|
||||
- Aaron Wood <aaronjwood@gmail.com>
|
||||
- Achim Königs <garfonso@tratschtante.de>
|
||||
- Adam Williamson <awilliam@redhat.com>
|
||||
- Administrator "Administrator@WINDOWS-2012"
|
||||
- Administrator <Administrator@WINDOWS-2012>
|
||||
- Aldo "xoen" Giambelluca <xoen@xoen.org>
|
||||
- Alex Weirig <alex.weirig@technolink.lu>
|
||||
- Alexander Bergolth <leo@strike.wu.ac.at>
|
||||
- Allan Nordhøy <epost@anotheragency.no>
|
||||
- Andreas Böhler <dev@aboehler.at>
|
||||
- Andreas Fischer <bantu@owncloud.com>
|
||||
- Andreas Pflug <dev@admin4.org>
|
||||
- Andrew Brown <andrew@casabrown.com>
|
||||
- Andrius <andrius.kulbis@ktu.lt>
|
||||
- André Gaul <gaul@web-yard.de>
|
||||
- Ardinis <Ardinis@users.noreply.github.com>
|
||||
- Artem Kochnev <MrJeos@gmail.com>
|
||||
- Artem Sidorenko <artem@posteo.de>
|
||||
- Arthur Schiwon <blizzz@arthur-schiwon.de>
|
||||
- Axel Helmert <axel.helmert@luka.de>
|
||||
- Arthur Schiwon <blizzz@owncloud.com>
|
||||
- Bart Visscher <bartv@thisnet.nl>
|
||||
- Bartek Przybylski <bart.p.pl@gmail.com>
|
||||
- Bastien Ho <bastienho@urbancube.fr>
|
||||
@@ -27,270 +18,182 @@ Nextcloud is written by:
|
||||
- Bernhard Posselt <dev@bernhard-posselt.com>
|
||||
- Bernhard Reiter <ockham@raz.or.at>
|
||||
- Birk Borkason <daniel.niccoli@gmail.com>
|
||||
- Bjoern Schiessle <bjoern@schiessle.org>
|
||||
- Björn Schießle <bjoern@schiessle.org>
|
||||
- Boris Rybalkin <ribalkin@gmail.com>
|
||||
- Björn Schießle <schiessle@owncloud.com>
|
||||
- Borjan Tchakaloff <borjan@tchakaloff.fr>
|
||||
- Brent Bloxam <brent.bloxam@gmail.com>
|
||||
- Brice Maron <brice@bmaron.net>
|
||||
- Byron Marohn <combustible@live.com>
|
||||
- Carla Schroder <carla@owncloud.com>
|
||||
- C Montero-Luque <cml@owncloud.com>
|
||||
- Carlos Cerrillo <ccerrillo@gmail.com>
|
||||
- Carlos Damken <carlos@damken.com>
|
||||
- Christian Berendt <berendt@b1-systems.de>
|
||||
- Christian Jürges <christian@eqipe.ch>
|
||||
- Christian Kampka <christian@kampka.net>
|
||||
- Christian Schnidrig <christian.schnidrig@switch.ch>
|
||||
- Christian Weiske <cweiske@cweiske.de>
|
||||
- Christoph Schaefer "christophł@wolkesicher.de"
|
||||
- Christoph Wickert <cwickert@suse.de>
|
||||
- Christoph Wurst <christoph@owncloud.com>
|
||||
- Christopher Bartz <bartz@dkrz.de>
|
||||
- Christoph Schaefer <christophł@wolkesicher.de>
|
||||
- Christopher Schäpers <kondou@ts.unde.re>
|
||||
- Christopher T. Johnson <ctjctj@gmail.com>
|
||||
- Clark Tomlinson <fallen013@gmail.com>
|
||||
- Cornelius Kölbel <cornelius.koelbel@netknights.it>
|
||||
- Damjan Georgievski <gdamjan@gmail.com>
|
||||
- Craig Morrissey <craig@owncloud.com>
|
||||
- Dan Bartram <daneybartram@gmail.com>
|
||||
- Daniel Calviño Sánchez <danxuliu@gmail.com>
|
||||
- Daniel Hansson <daniel@techandme.se>
|
||||
- Daniel Jagszent <daniel@jagszent.de>
|
||||
- Daniel Hansson <enoch85@gmail.com>
|
||||
- Daniel Molkentin <daniel@molkentin.de>
|
||||
- Daniel Tosello <tosello.daniel@gmail.com>
|
||||
- David Prévot <taffit@debian.org>
|
||||
- David Toledo <dtoledo@solidgear.es>
|
||||
- Derek <derek.kelly27@gmail.com>
|
||||
- Dominik Schmidt <dev@dominik-schmidt.de>
|
||||
- Donquixote <marjunebatac@gmail.com>
|
||||
- Donald Buczek <buczek@molgen.mpg.de>
|
||||
- Edward Crompton <edward.crompton@gmail.com>
|
||||
- Fabian Henze <flyser42@gmx.de>
|
||||
- Fabrizio Steiner <fabrizio.steiner@gmail.com>
|
||||
- Felix A. Epp <work@felixepp.de>
|
||||
- Felix Epp <work@felixepp.de>
|
||||
- Felix Heidecke <felix@heidecke.me>
|
||||
- Faruk Uzun <farukuzun@collabora.com>
|
||||
- Felix Böhm <felixboehm@gmx.de>
|
||||
- Felix Moeller <mail@felixmoeller.de>
|
||||
- Felix Rupp <github@felixrupp.com>
|
||||
- Florian Preinstorfer <nblock@archlinux.us>
|
||||
- Florian Pritz <bluewind@xinu.at>
|
||||
- Florian Scholz <FlorianScholz@bgstyle.de>
|
||||
- Florin Peter <github@florin-peter.de>
|
||||
- Frank Isemann <frank@isemann.name>
|
||||
- Frank Karlitschek <frank@karlitschek.de>
|
||||
- Frank Karlitschek <frank@owncloud.org>
|
||||
- François Kubler <francois@kubler.org>
|
||||
- Frédéric Fortier <frederic.fortier@oronospolytechnique.com>
|
||||
- Gadzy <dev@gadzy.fr>
|
||||
- Georg Ehrke <oc.list@georgehrke.com>
|
||||
- Hemanth Kumar Veeranki <hems.india1997@gmail.com>
|
||||
- Georg Ehrke <georg@owncloud.com>
|
||||
- Guillaume AMAT <guillaume.amat@informatique-libre.com>
|
||||
- Hasso Tepper <hasso@zone.ee>
|
||||
- Hendrik Leppelsack <hendrik@leppelsack.de>
|
||||
- Ilja Neumann <ineumann@owncloud.com>
|
||||
- Hugo Gonzalez Labrador <hglavra@gmail.com>
|
||||
- Individual IT Services <info@individual-it.net>
|
||||
- Jakob Sack <mail@jakobsack.de>
|
||||
- Jan-Christoph Borchardt <hey@jancborchardt.net>
|
||||
- Jan-Philipp Litza <jplitza@users.noreply.github.com>
|
||||
- Jarkko Lehtoranta <devel@jlranta.com>
|
||||
- Jean-Louis Dupond <jean-louis@dupond.be>
|
||||
- Jens-Christian Fischer <jens-christian.fischer@switch.ch>
|
||||
- Jesús Macias <jmacias@solidgear.es>
|
||||
- Joachim Bauch <bauch@struktur.de>
|
||||
- Joachim Sokolowski <github@sokolowski.org>
|
||||
- Joas Schilling <coding@schilljs.com>
|
||||
- Joas Schilling <nickvergessen@owncloud.com>
|
||||
- Johan Björk <johanimon@gmail.com>
|
||||
- Johannes Ernst <jernst@indiecomputing.com>
|
||||
- Johannes Schlichenmaier <johannes@schlichenmaier.info>
|
||||
- Johannes Willnecker <johannes@willnecker.com>
|
||||
- John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
|
||||
- John Molakvoæ <skjnldsv@users.noreply.github.com>
|
||||
- Jonny007-MKD <1-23-4-5@web.de>
|
||||
- Juan Pablo Villafañez <jvillafanez@solidgear.es>
|
||||
- Juan Pablo Villafáñez <jvillafanez@solidgear.es>
|
||||
- Juan Pablo Villafáñez <jvillafanez@solidgear.es>
|
||||
- Julius Haertl <jus@bitgrid.net>
|
||||
- Julius Härtl <jus@bitgrid.net>
|
||||
- Jost Baron <Jost.Baron@gmx.de>
|
||||
- Jörn Friedrich Dreyer <jfd@butonic.de>
|
||||
- Jürgen Haas <juergen@paragon-es.de>
|
||||
- KB7777 <k.burkowski@gmail.com>
|
||||
- Kamil Domanski <kdomanski@kdemail.net>
|
||||
- Kawohl <john@owncloud.com>
|
||||
- Kenneth Newwood <kenneth@newwood.name>
|
||||
- Klaas Freitag <freitag@owncloud.com>
|
||||
- Knut Ahlers <knut@ahlers.me>
|
||||
- Ko- <k.stoffelen@cs.ru.nl>
|
||||
- Kristof Provost <github@sigsegv.be>
|
||||
- Lars <winnetou+github@catolic.de>
|
||||
- Laurens Post <Crote@users.noreply.github.com>
|
||||
- Laurens Post <lkpost@scept.re>
|
||||
- Lennart Rosam <hello@takuto.de>
|
||||
- Lennart Rosam <lennart.rosam@medien-systempartner.de>
|
||||
- Leon Klingele <git@leonklingele.de>
|
||||
- Leon Klingele <leon@struktur.de>
|
||||
- Loki3000 <github@labcms.ru>
|
||||
- Leonardo Diez <leio10@users.noreply.github.com>
|
||||
- Lorenzo M. Catucci <lorenzo@sancho.ccd.uniroma2.it>
|
||||
- Lukas Reschke <lukas@statuscode.ch>
|
||||
- Lukas Reschke <lukas@owncloud.com>
|
||||
- Luke Policinski <lpolicinski@gmail.com>
|
||||
- Lyonel Vincent <lyonel@ezix.org>
|
||||
- Magnus Walbeck <mw@mwalbeck.org>
|
||||
- Manish Bisht <manish.bisht490@gmail.com>
|
||||
- Marcel Waldvogel <marcel.waldvogel@uni-konstanz.de>
|
||||
- Marin Treselj <marin@pixelipo.com>
|
||||
- Mario Kolling <mario.kolling@serpro.gov.br>
|
||||
- Marius Blüm <marius@lineone.io>
|
||||
- Markus Goetz <markus@woboq.com>
|
||||
- Martin <github@diemattels.at>
|
||||
- Martin Konrad <info@martin-konrad.net>
|
||||
- Martin Konrad <konrad@frib.msu.edu>
|
||||
- Martin Mattel <martin.mattel@diemattels.at>
|
||||
- Marvin Thomas Rabe <mrabe@marvinrabe.de>
|
||||
- Masaki Kawabata Neto <masaki.kawabata@gmail.com>
|
||||
- Matthew Setter <matthew@matthewsetter.com>
|
||||
- Maxence Lange <maxence@artificial-owl.com>
|
||||
- Maxence Lange <maxence@nextcloud.com>
|
||||
- Maxence Lange <maxence@pontapreta.net>
|
||||
- Michael Gapczynski <GapczynskiM@gmail.com>
|
||||
- Michael Göhler <somebody.here@gmx.de>
|
||||
- Michael Jobst <mjobst+github@tecratech.de>
|
||||
- Michael Letzgus <www@chronos.michael-letzgus.de>
|
||||
- Michael Kuhn <suraia@ikkoku.de>
|
||||
- Michael Roitzsch <reactorcontrol@icloud.com>
|
||||
- Michael Roth <michael.roth@rz.uni-augsburg.de>
|
||||
- Michael Telatynski <7t3chguy@gmail.com>
|
||||
- Michael U <mdusher@users.noreply.github.com>
|
||||
- Miguel Prokop <miguel.prokop@vtu.com>
|
||||
- Miha Frangez <miha.frangez@gmail.com>
|
||||
- Mitar <mitar.git@tnode.com>
|
||||
- Morris Jobke <hey@morrisjobke.de>
|
||||
- Nicolai Ehemann <en@enlightened.de>
|
||||
- Nicolas Grekas <nicolas.grekas@gmail.com>
|
||||
- Nils <git@to.nilsschnabel.de>
|
||||
- Nmz <nemesiz@nmz.lt>
|
||||
- Noveen Sachdeva <noveen.sachdeva@research.iiit.ac.in>
|
||||
- Normal Ra <normalraw@gmail.com>
|
||||
- Oliver Gasser <oliver.gasser@gmail.com>
|
||||
- Oliver Kohl D.Sc. <oliver@kohl.bz>
|
||||
- Olivier Mehani <shtrom@ssji.net>
|
||||
- Olivier Paroz <github@oparoz.com>
|
||||
- Otto Sabart <ottosabart@seberm.com>
|
||||
- Owen Winkler <a_github@midnightcircus.com>
|
||||
- Pascal de Bruijn <pmjdebruijn@pcode.nl>
|
||||
- Patrick Paysant <patrick.paysant@linagora.com>
|
||||
- Patrick Paysant <ppaysant@linagora.com>
|
||||
- Patrik Kernstock <info@pkern.at>
|
||||
- Pauli Järvinen <pauli.jarvinen@gmail.com>
|
||||
- Pellaeon Lin <nfsmwlin@gmail.com>
|
||||
- Petr Svoboda <weits666@gmail.com>
|
||||
- Phiber2000 <phiber2000@gmx.de>
|
||||
- Phil Davis <phil.davis@inf.org>
|
||||
- Philipp Kapfer <philipp.kapfer@gmx.at>
|
||||
- Philipp Schaffrath <github@philipp.schaffrath.email>
|
||||
- Philippe Jung <phil.jung@free.fr>
|
||||
- Philippe Le Brouster <plb@nebkha.net>
|
||||
- Pierre Jochem <pierrejochem@msn.com>
|
||||
- Pierre Ozoux <pierre@ozoux.net>
|
||||
- Pierre Rudloff <contact@rudloff.pro>
|
||||
- Piotr Filiciak <piotr@filiciak.pl>
|
||||
- Piotr M <mrow4a@yahoo.com>
|
||||
- Piotr Mrowczynski <mrow4a@yahoo.com>
|
||||
- Piotr Mrówczyński <mrow4a@yahoo.com>
|
||||
- Qingping Hou <dave2008713@gmail.com>
|
||||
- Raghu Nayyar <hey@raghunayyar.com>
|
||||
- Raghu Nayyar <me@iraghu.com>
|
||||
- Ralph Krimmel <rkrimme1@gwdg.de>
|
||||
- Ramiro Aparicio <rapariciog@gmail.com>
|
||||
- Randolph Carter <RandolphCarter@fantasymail.de>
|
||||
- RealRancor <Fisch.666@gmx.de>
|
||||
- RealRancor <fisch.666@gmx.de>
|
||||
- Rello <Rello@users.noreply.github.com>
|
||||
- Remco Brenninkmeijer <requist1@starmail.nl>
|
||||
- Renaud Fortier <Renaud.Fortier@fsaa.ulaval.ca>
|
||||
- Robert Scheck <robert@fedoraproject.org>
|
||||
- Robin Appelman <robin@icewind.nl>
|
||||
- Robin Appelman <icewind@owncloud.com>
|
||||
- Robin McCorkell <robin@mccorkell.me.uk>
|
||||
- Roeland Jago Douma <roeland@famdouma.nl>
|
||||
- Roger Szabo <roger.szabo@web.de>
|
||||
- Roeland Jago Douma <rullzer@owncloud.com>
|
||||
- Roman Geber <rgeber@owncloudapps.com>
|
||||
- Roman Kreisel <mail@romankreisel.de>
|
||||
- Ross Nicoll <jrn@jrn.me.uk>
|
||||
- SA <stephen@mthosting.net>
|
||||
- Sam Tuke <mail@samtuke.com>
|
||||
- Sander <brantje@gmail.com>
|
||||
- Sander Ruitenbeek <sander@grids.be>
|
||||
- Sandro Lutz <sandro.lutz@temparus.ch>
|
||||
- Sascha Sambale <mastixmc@gmail.com>
|
||||
- Sascha Schmidt <realriot@realriot.de>
|
||||
- Sean Comeau <sean@ftlnetworks.ca>
|
||||
- Sebastian Döll <sebastian.doell@libasys.de>
|
||||
- Sebastian Wessalowski <sebastian@wessalowski.org>
|
||||
- Semih Serhat Karakaya <karakayasemi@itu.edu.tr>
|
||||
- Senorsen <senorsen.zhang@gmail.com>
|
||||
- Serge Martin <edb@sigluy.net>
|
||||
- Sergio Bertolin <sbertolin@solidgear.es>
|
||||
- Sergio Bertolín <sbertolin@solidgear.es>
|
||||
- Simon Könnecke <simonkoennecke@gmail.com>
|
||||
- Sjors van der Pluijm <sjors@desjors.nl>
|
||||
- Stefan Herbrechtsmeier <stefan@herbrechtsmeier.net>
|
||||
- Stefan Rado <owncloud@sradonia.net>
|
||||
- Stefan Schneider <stefan.schneider@squareweave.com.au>
|
||||
- Stefan Weil <sw@weilnetz.de>
|
||||
- Steffen Lindner <mail@steffen-lindner.de>
|
||||
- Stephan Müller <mail@stephanmueller.eu>
|
||||
- Stephan Peijnik <speijnik@anexia-it.com>
|
||||
- Steven Bühner <buehner@me.com>
|
||||
- Sujith H <sharidasan@owncloud.com>
|
||||
- TheSFReader <TheSFReader@gmail.com>
|
||||
- Thibaut GRIDEL <tgridel@free.fr>
|
||||
- Thomas Citharel <tcit@tcit.fr>
|
||||
- Thomas Ebert <thomas.ebert@usability.de>
|
||||
- Thomas Müller <thomas.mueller@tmit.eu>
|
||||
- Thomas Pulzer <t.pulzer@kniel.de>
|
||||
- Thomas Schmidt <tschmidt@suse.de>
|
||||
- Thomas Tanghus <thomas@tanghus.net>
|
||||
- Tigran Mkrtchyan <tigran.mkrtchyan@desy.de>
|
||||
- Tim Dettrick <t.dettrick@uq.edu.au>
|
||||
- Tobia De Koninck <tobia@ledfan.be>
|
||||
- Tobias Brunner <tobias@tobru.ch>
|
||||
- Tobias Kaminsky <tobias@kaminsky.me>
|
||||
- Tom Needham <tom@owncloud.com>
|
||||
- Torben Dannhauer <torben@dannhauer.de>
|
||||
- Ujjwal Bhardwaj <ujjwalb1996@gmail.com>
|
||||
- Victor Dubiniuk <dubiniuk@owncloud.com>
|
||||
- Viktor Szépe <viktor@szepe.net>
|
||||
- Vincent Chan <plus.vincchan@gmail.com>
|
||||
- Vincent Cloutier <vincent1cloutier@gmail.com>
|
||||
- Vincent Petry <pvince81@owncloud.com>
|
||||
- Vinicius Cubas Brand <vinicius@eita.org.br>
|
||||
- Volkan Gezer <volkangezer@gmail.com>
|
||||
- William Pain <pain.william@gmail.com>
|
||||
- Xuanwo <xuanwo@yunify.com>
|
||||
- adrien <adrien.waksberg@believedigital.com>
|
||||
- alexweirig <alex.weirig@technolink.lu>
|
||||
- bline <scottbeck@gmail.com>
|
||||
- brumsel <brumsel@losecatcher.de>
|
||||
- cetra3 <peter@parashift.com.au>
|
||||
- cmeh <cmeh@users.noreply.github.com>
|
||||
- coderkun <olli@coderkun.de>
|
||||
- dartcafe <github@dartcafe.de>
|
||||
- dampfklon <me@dampfklon.de>
|
||||
- davidgumberg <davidnoizgumberg@gmail.com>
|
||||
- davitol <dtoledo@solidgear.es>
|
||||
- derkostka <sebastian.kostka@gmail.com>
|
||||
- duritong <peter.meier+github@immerda.ch>
|
||||
- eduardo <eduardo@vnexu.net>
|
||||
- fabian <fabian@web2.0-apps.de>
|
||||
- felixboehm <felix@webhippie.de>
|
||||
- goodkiller <markopraakli@gmail.com>
|
||||
- helix84 <helix84@centrum.sk>
|
||||
- hkjolhede <hkjolhede@gmail.com>
|
||||
- iamfool <praveenraonp@gmail.com>
|
||||
- ideaship <ideaship@users.noreply.github.com>
|
||||
- j-ed <juergen@eisfair.org>
|
||||
- jknockaert <jasper@knockaert.nl>
|
||||
- josh4trunks <joshruehlig@gmail.com>
|
||||
- justin-sleep <justin@quarterfull.com>
|
||||
- karakayasemi <karakayasemi@itu.edu.tr>
|
||||
- macjohnny <estebanmarin@gmx.ch>
|
||||
- marc0s <marcos@tenak.net>
|
||||
- martin-rueegg <martin.rueegg@metaworx.ch>
|
||||
- martin.mattel@diemattels.at <martin.mattel@diemattels.at>
|
||||
- michag86 <micha_g@arcor.de>
|
||||
- mmccarn <mmccarn-github@mmsionline.us>
|
||||
- nhirokinet <nhirokinet@nhiroki.net>
|
||||
- nishiki <nishiki@yaegashi.fr>
|
||||
- noveens <noveen.sachdeva@research.iiit.ac.in>
|
||||
- oparoz <owncloud@interfasys.ch>
|
||||
- phisch <git@philippschaffrath.de>
|
||||
- rakekniven <mark.ziegler@rakekniven.de>
|
||||
- root "root@oc.(none)"
|
||||
- root <root@localhost.localdomain>
|
||||
- root <root@oc.(none)>
|
||||
- scambra <sergio@entrecables.com>
|
||||
- scolebrook <scolebrook@mac.com>
|
||||
- shkdee <louis.traynard@m4x.org>
|
||||
- sualko <klaus@jsxc.org>
|
||||
- tbartenstein <tbartenstein@users.noreply.github.com>
|
||||
- tbelau666 <thomas.belau@gmx.de>
|
||||
- tux-rampage <tux-rampage@users.noreply.github.com>
|
||||
- unclejamal3000 <andreas.pramhaas@posteo.de>
|
||||
- v1r0x <vinzenz.rosenkranz@gmail.com>
|
||||
- vkuimov "vkuimov@nextcloud"
|
||||
- voxsim "Simon Vocella"
|
||||
- voxsim <Simon Vocella>
|
||||
|
||||
With help from many libraries and frameworks including:
|
||||
Open Collaboration Services
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
Changelog
|
||||
=========
|
||||
|
||||
The change log is at [https://nextcloud.com/changelog/](https://nextcloud.com/changelog/).
|
||||
@@ -1,9 +0,0 @@
|
||||
In the Nextcloud community, participants from all over the world come together to create Free Software for a free internet. This is made possible by the support, hard work and enthusiasm of thousands of people, including those who create and use Nextcloud software.
|
||||
|
||||
Our code of conduct offers some guidance to ensure Nextcloud participants can cooperate effectively in a positive and inspiring atmosphere, and to explain how together we can strengthen and support each other.
|
||||
|
||||
The Code of Conduct is shared by all contributors and users who engage with the Nextcloud team and its community services. It presents a summary of the shared values and “common sense” thinking in our community.
|
||||
|
||||
You can find our full code of conduct on our website: https://nextcloud.com/code-of-conduct/
|
||||
|
||||
Please, keep our CoC in mind when you contribute! That way, everyone can be a part of our community in a productive, positive, creative and fun way.
|
||||
+19
-37
@@ -1,6 +1,6 @@
|
||||
## Submitting issues
|
||||
|
||||
If you have questions about how to install or use Nextcloud, please direct these to our [forum][forum]. We are also available on [IRC][irc].
|
||||
If you have questions about how to install or use ownCloud, please direct these to the [mailing list][mailinglist] or our [forum][forum]. We are also available on [IRC][irc].
|
||||
|
||||
### Short version
|
||||
|
||||
@@ -11,58 +11,40 @@ If you have questions about how to install or use Nextcloud, please direct these
|
||||
- Go to one of the repositories, click "issues" and type any word in the top search/command bar.
|
||||
- You can also filter by appending e. g. "state:open" to the search string.
|
||||
- More info on [search syntax within github](https://help.github.com/articles/searching-issues)
|
||||
* This repository ([server](https://github.com/nextcloud/server/issues)) is *only* for issues within the Nextcloud Server code. This also includes the apps: files, encryption, external storage, sharing, deleted files, versions, LDAP, and WebDAV Auth
|
||||
* __SECURITY__: Report any potential security bug to us via [our HackerOne page](https://hackerone.com/nextcloud) or security@nextcloud.com following our [security policy](https://nextcloud.com/security/) instead of filing an issue in our bug tracker.
|
||||
* The issues in other components should be reported in their respective repositories: You will find them in our [GitHub Organization](https://github.com/nextcloud/)
|
||||
* This repository ([core](https://github.com/owncloud/core/issues)) is *only* for issues within the ownCloud core code. This also includes the apps: files, encryption, external storage, sharing, deleted files, versions, LDAP, and WebDAV Auth
|
||||
* __SECURITY__: Report any potential security bug to us via [our HackerOne page](https://hackerone.com/owncloud) or security@owncloud.com following our [security policy](https://owncloud.org/security/) instead of filing an issue in our bug tracker
|
||||
* The issues in other components should be reported in their respective repositories:
|
||||
- [Android client](https://github.com/owncloud/android/issues)
|
||||
- [iOS client](https://github.com/owncloud/ios/issues)
|
||||
- [Desktop client](https://github.com/owncloud/client/issues)
|
||||
- [Documentation](https://github.com/owncloud/documentation/issues)
|
||||
- [ownCloud apps](https://github.com/owncloud/core/wiki/Maintainers#apps-repo)
|
||||
|
||||
* Report the issue using our [template][template], it includes all the information we need to track down the issue.
|
||||
|
||||
Help us to maximize the effort we can spend fixing issues and adding new features, by not reporting duplicate issues.
|
||||
|
||||
[template]: https://raw.githubusercontent.com/nextcloud/server/master/issue_template.md
|
||||
[forum]: https://help.nextcloud.com/
|
||||
[irc]: https://webchat.freenode.net/?channels=nextcloud
|
||||
[template]: https://raw.github.com/owncloud/core/master/issue_template.md
|
||||
[mailinglist]: https://mailman.owncloud.org/mailman/listinfo/owncloud
|
||||
[forum]: https://forum.owncloud.org/
|
||||
[irc]: https://webchat.freenode.net/?channels=owncloud&uio=d4
|
||||
|
||||
## Contributing to Source Code
|
||||
|
||||
Thanks for wanting to contribute source code to Nextcloud. That's great!
|
||||
Thanks for wanting to contribute source code to ownCloud. That's great!
|
||||
|
||||
Please read the [Developer Manuals][devmanual] to learn how to create your first application or how to test the Nextcloud code with PHPUnit.
|
||||
Before we're able to merge your code into the ownCloud core, you need to sign our [Contributor Agreement][agreement].
|
||||
|
||||
### Tests
|
||||
Please read the [Developer Manuals][devmanual] to learn how to create your first application or how to test the ownCloud code with PHPUnit.
|
||||
|
||||
In order to constantly increase the quality of our software we can no longer accept pull request which submit un-tested code.
|
||||
It is a must have that changed and added code segments are unit tested.
|
||||
In some areas unit testing is hard (aka almost impossible) as of today - in these areas refactoring WHILE fixing a bug is encouraged to enable unit testing.
|
||||
|
||||
### Sign your work
|
||||
|
||||
We use the Developer Certificate of Origin (DCO) as a additional safeguard
|
||||
for the Nextcloud project. This is a well established and widely used
|
||||
mechanism to assure contributors have confirmed their right to license
|
||||
their contribution under the project's license.
|
||||
Please read [contribute/developer-certificate-of-origin][dcofile].
|
||||
If you can certify it, then just add a line to every git commit message:
|
||||
|
||||
````
|
||||
Signed-off-by: Random J Developer <random@developer.example.org>
|
||||
````
|
||||
|
||||
Use your real name (sorry, no pseudonyms or anonymous contributions).
|
||||
If you set your `user.name` and `user.email` git configs, you can sign your
|
||||
commit automatically with `git commit -s`. You can also use git [aliases](https://git-scm.com/book/tr/v2/Git-Basics-Git-Aliases)
|
||||
like `git config --global alias.ci 'commit -s'`. Now you can commit with
|
||||
`git ci` and the commit will be signed.
|
||||
|
||||
### Apply a license
|
||||
|
||||
In case you are not sure how to add or update the license header correctly please have a look at [contribute/HowToApplyALicense.md][applyalicense]
|
||||
|
||||
[devmanual]: https://docs.nextcloud.org/server/12/developer_manual/
|
||||
[dcofile]: https://github.com/nextcloud/server/blob/master/contribute/developer-certificate-of-origin
|
||||
[applyalicense]: https://github.com/nextcloud/server/blob/master/contribute/HowToApplyALicense.md
|
||||
[agreement]: https://owncloud.org/about/contributor-agreement/
|
||||
[devmanual]: https://owncloud.org/dev
|
||||
|
||||
## Translations
|
||||
Please submit translations via [Transifex][transifex].
|
||||
|
||||
[transifex]: https://www.transifex.com/nextcloud
|
||||
[transifex]: https://www.transifex.com/projects/p/owncloud/
|
||||
|
||||
+3
-3
@@ -1,5 +1,5 @@
|
||||
Files in Nextcloud are licensed under the Affero General Public License version 3,
|
||||
the text of which can be found in COPYING, or any later version of the AGPL,
|
||||
Files in ownCloud are licensed under the Affero General Public License version 3,
|
||||
the text of which can be found in COPYING-AGPL, or any later version of the AGPL,
|
||||
unless otherwise noted.
|
||||
|
||||
Licensing of components:
|
||||
@@ -12,4 +12,4 @@ Licensing of components:
|
||||
All unmodified files from these and other sources retain their original copyright
|
||||
and license notices: see the relevant individual files.
|
||||
|
||||
Attribution information for Nextcloud is contained in the AUTHORS file.
|
||||
Attribution information for ownCloud is contained in the AUTHORS file.
|
||||
|
||||
@@ -1,67 +1,47 @@
|
||||
# Nextcloud Server
|
||||
[](https://scrutinizer-ci.com/g/nextcloud/server/?branch=master)
|
||||
[](https://codecov.io/gh/nextcloud/server)
|
||||
[](https://bestpractices.coreinfrastructure.org/projects/209)
|
||||
[](https://webchat.freenode.net/?channels=nextcloud)
|
||||
[](https://webchat.freenode.net/?channels=nextcloud-dev)
|
||||
# ownCloud Core
|
||||
|
||||
**A safe home for all your data.**
|
||||
[](https://ci.owncloud.org/job/server-master-linux/)
|
||||
[](https://scrutinizer-ci.com/g/owncloud/core/)
|
||||
[](https://codeclimate.com/github/owncloud/core)
|
||||
[](https://scan.coverity.com/projects/owncloud-core)
|
||||
[](https://www.versioneye.com/user/projects/54f4a2384f3108959a000a16)
|
||||
[](https://www.versioneye.com/user/projects/54d1f76f3ca0840b190000c0)
|
||||
|
||||

|
||||
**[ownCloud](http://ownCloud.org) gives you freedom and control over your own data.
|
||||
A personal cloud which runs on your own server.**
|
||||
|
||||

|
||||
|
||||
## Why is this so awesome?
|
||||
|
||||
* :file_folder: **Access your Data** You can store your files, contacts, calendars and more on a server of your choosing.
|
||||
* :package: **Sync your Data** You keep your files, contacts, calendars and more synchronized amongst your devices.
|
||||
* :arrows_counterclockwise: **Share your Data** …by giving others access to the stuff you want them to see or to collaborate with.
|
||||
* :rocket: **Expandable with dozens of Apps** ...like [Calendar](https://github.com/nextcloud/calendar), [Contacts](https://github.com/nextcloud/contacts), [Mail](https://github.com/nextcloud/mail) and all those you can discover in our [App Store](https://apps.nextcloud.com)
|
||||
* :lock: **Security** with our encryption mechanisms, [HackerOne bounty program](https://hackerone.com/nextcloud) and two-factor authentication.
|
||||
* :arrows_counterclockwise: **Share your Data** You share your data with others, and give them access to your latest photo galleries, your calendar or anything else you want them to see.
|
||||
* :rocket: **Expandable with dozens of Apps** ...like Calendar, Contacts, Mail or News.
|
||||
* :cloud: **All Benefits of the Cloud** ...on your own Server.
|
||||
* :lock: **Encryption** You can encrypt data in transit with secure https connections. You can enable the encryption app to encrypt data on storage for improved security and privacy.
|
||||
* ...
|
||||
|
||||
*You want to learn more about how you can use Nextcloud to access, share and protect your files, calendars, contacts, communication & more at home and at your Enterprise?* [**Learn about all our Features**](https://nextcloud.com/features).
|
||||
|
||||
## Get your Nextcloud
|
||||
|
||||
- [**Install** a server by yourself on your own hardware or by using one of our ready to use **Appliances**](https://nextcloud.com/install/#instructions-server)
|
||||
- [Buy one of the awesome **devices** coming with a preinstalled Nextcloud](https://nextcloud.com/devices/)
|
||||
- [Find a service **provider** who is hosting Nextcloud for you or your company](https://nextcloud.com/providers/)
|
||||
|
||||
*Enterprise? Public Sector or Education user? You may want to have a look into the [**Enterprise Support Subscription**](https://nextcloud.com/enterprise/) provided by the Nextcloud GmbH*
|
||||
|
||||
## Get in touch
|
||||
|
||||
* :clipboard: [Forum](https://help.nextcloud.com)
|
||||
* :busts_in_silhouette: [Facebook](https://facebook.com/nextclouders)
|
||||
* :hatching_chick: [Twitter](https://twitter.com/Nextclouders)
|
||||
* :elephant: [Mastodon](https://mastodon.xyz/@nextcloud)
|
||||
|
||||
[…learn more about how to get support for Nextcloud here!](https://nextcloud.com/support)
|
||||
## Installation instructions
|
||||
https://doc.owncloud.org/server/9.0/developer_manual/app/index.html
|
||||
|
||||
## Contribution Guidelines
|
||||
https://owncloud.org/contribute/
|
||||
|
||||
All contributions to this repository from June, 16 2016 on are considered to be
|
||||
licensed under the AGPLv3 or any later version.
|
||||
## Support
|
||||
Learn about the different ways you can get support for ownCloud: https://owncloud.org/support/
|
||||
|
||||
Nextcloud doesn't require a CLA (Contributor License Agreement).
|
||||
The copyright belongs to all the individual contributors. Therefore we recommend
|
||||
that every contributor adds following line to the header of a file, if they
|
||||
changed it substantially:
|
||||
## Get in touch
|
||||
* :clipboard: [Forum](https://forum.owncloud.org)
|
||||
* :envelope: [Mailing list](https://mailman.owncloud.org/mailman/listinfo)
|
||||
* :hash: [IRC channel](https://webchat.freenode.net/?channels=owncloud)
|
||||
* :busts_in_silhouette: [Facebook] (https://facebook.com/ownclouders)
|
||||
* :hatching_chick: [Twitter](https://twitter.com/ownClouders)
|
||||
|
||||
```
|
||||
@copyright Copyright (c) <year>, <your name> (<your email address>)
|
||||
```
|
||||
## Important notice on translations
|
||||
Please submit translations via Transifex:
|
||||
https://www.transifex.com/projects/p/owncloud/
|
||||
|
||||
Please read the [Code of Conduct](https://nextcloud.com/community/code-of-conduct/). This document offers some guidance to ensure Nextcloud participants can cooperate effectively in a positive and inspiring atmosphere, and to explain how together we can strengthen and support each other.
|
||||
[](https://www.transifex.com/projects/p/owncloud/)
|
||||
|
||||
Please review the [guidelines for contributing](https://github.com/nextcloud/server/blob/master/CONTRIBUTING.md) to this repository.
|
||||
|
||||
More information how to contribute: [https://nextcloud.com/contribute/](https://nextcloud.com/contribute/)
|
||||
|
||||
## Running master checkouts
|
||||
|
||||
Third-party components are handled as git submodules which have to be initialized first. So aside from the regular git checkout invoking `git submodule update --init` or a similar command is needed, for details see Git documentation.
|
||||
|
||||
Several apps that are included by default in regular releases such as [firstrunwizard](https://github.com/nextcloud/firstrunwizard) or [gallery](https://github.com/nextcloud/gallery) are missing in `master` and have to be installed manually.
|
||||
|
||||
That aside Git checkouts can be handled the same as release archives.
|
||||
|
||||
Note they should never be used on production systems.
|
||||
For more detailed information about translations:
|
||||
http://doc.owncloud.org/server/9.0/developer_manual/core/translation.html
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2016 Bjoern Schiessle <bjoern@schiessle.org>
|
||||
* @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
|
||||
*
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
* @author Lukas Reschke <lukas@statuscode.ch>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
$app = new \OCA\AdminAudit\AppInfo\Application();
|
||||
$app->register();
|
||||
@@ -1,16 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<info>
|
||||
<id>admin_audit</id>
|
||||
<name>Auditing / Logging</name>
|
||||
<description>Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions.</description>
|
||||
<licence>AGPL</licence>
|
||||
<author>Nextcloud</author>
|
||||
<version>1.3.0</version>
|
||||
<namespace>AdminAudit</namespace>
|
||||
<dependencies>
|
||||
<nextcloud min-version="13" max-version="13" />
|
||||
</dependencies>
|
||||
<types>
|
||||
<logging/>
|
||||
</types>
|
||||
</info>
|
||||
@@ -1,7 +0,0 @@
|
||||
<?php
|
||||
|
||||
// autoload.php @generated by Composer
|
||||
|
||||
require_once __DIR__ . '/composer/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInitAdminAudit::getLoader();
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"config" : {
|
||||
"vendor-dir": ".",
|
||||
"optimize-autoloader": true,
|
||||
"classmap-authoritative": true,
|
||||
"autoloader-suffix": "AdminAudit"
|
||||
},
|
||||
"autoload" : {
|
||||
"psr-4": {
|
||||
"OCA\\AdminAudit\\": "../lib/"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,444 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Composer.
|
||||
*
|
||||
* (c) Nils Adermann <naderman@naderman.de>
|
||||
* Jordi Boggiano <j.boggiano@seld.be>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Composer\Autoload;
|
||||
|
||||
/**
|
||||
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
|
||||
*
|
||||
* $loader = new \Composer\Autoload\ClassLoader();
|
||||
*
|
||||
* // register classes with namespaces
|
||||
* $loader->add('Symfony\Component', __DIR__.'/component');
|
||||
* $loader->add('Symfony', __DIR__.'/framework');
|
||||
*
|
||||
* // activate the autoloader
|
||||
* $loader->register();
|
||||
*
|
||||
* // to enable searching the include path (eg. for PEAR packages)
|
||||
* $loader->setUseIncludePath(true);
|
||||
*
|
||||
* In this example, if you try to use a class in the Symfony\Component
|
||||
* namespace or one of its children (Symfony\Component\Console for instance),
|
||||
* the autoloader will first look for the class under the component/
|
||||
* directory, and it will then fallback to the framework/ directory if not
|
||||
* found before giving up.
|
||||
*
|
||||
* This class is loosely based on the Symfony UniversalClassLoader.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Jordi Boggiano <j.boggiano@seld.be>
|
||||
* @see http://www.php-fig.org/psr/psr-0/
|
||||
* @see http://www.php-fig.org/psr/psr-4/
|
||||
*/
|
||||
class ClassLoader
|
||||
{
|
||||
// PSR-4
|
||||
private $firstCharsPsr4 = array();
|
||||
private $prefixLengthsPsr4 = array(); // For BC with legacy static maps
|
||||
private $prefixDirsPsr4 = array();
|
||||
private $fallbackDirsPsr4 = array();
|
||||
|
||||
// PSR-0
|
||||
private $prefixesPsr0 = array();
|
||||
private $fallbackDirsPsr0 = array();
|
||||
|
||||
private $useIncludePath = false;
|
||||
private $classMap = array();
|
||||
private $classMapAuthoritative = false;
|
||||
private $missingClasses = array();
|
||||
private $apcuPrefix;
|
||||
|
||||
public function getPrefixes()
|
||||
{
|
||||
if (!empty($this->prefixesPsr0)) {
|
||||
return call_user_func_array('array_merge', $this->prefixesPsr0);
|
||||
}
|
||||
|
||||
return array();
|
||||
}
|
||||
|
||||
public function getPrefixesPsr4()
|
||||
{
|
||||
return $this->prefixDirsPsr4;
|
||||
}
|
||||
|
||||
public function getFallbackDirs()
|
||||
{
|
||||
return $this->fallbackDirsPsr0;
|
||||
}
|
||||
|
||||
public function getFallbackDirsPsr4()
|
||||
{
|
||||
return $this->fallbackDirsPsr4;
|
||||
}
|
||||
|
||||
public function getClassMap()
|
||||
{
|
||||
return $this->classMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $classMap Class to filename map
|
||||
*/
|
||||
public function addClassMap(array $classMap)
|
||||
{
|
||||
if ($this->classMap) {
|
||||
$this->classMap = array_merge($this->classMap, $classMap);
|
||||
} else {
|
||||
$this->classMap = $classMap;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-0 directories for a given prefix, either
|
||||
* appending or prepending to the ones previously set for this prefix.
|
||||
*
|
||||
* @param string $prefix The prefix
|
||||
* @param array|string $paths The PSR-0 root directories
|
||||
* @param bool $prepend Whether to prepend the directories
|
||||
*/
|
||||
public function add($prefix, $paths, $prepend = false)
|
||||
{
|
||||
if (!$prefix) {
|
||||
if ($prepend) {
|
||||
$this->fallbackDirsPsr0 = array_merge(
|
||||
(array) $paths,
|
||||
$this->fallbackDirsPsr0
|
||||
);
|
||||
} else {
|
||||
$this->fallbackDirsPsr0 = array_merge(
|
||||
$this->fallbackDirsPsr0,
|
||||
(array) $paths
|
||||
);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$first = $prefix[0];
|
||||
if (!isset($this->prefixesPsr0[$first][$prefix])) {
|
||||
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
|
||||
|
||||
return;
|
||||
}
|
||||
if ($prepend) {
|
||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||
(array) $paths,
|
||||
$this->prefixesPsr0[$first][$prefix]
|
||||
);
|
||||
} else {
|
||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||
$this->prefixesPsr0[$first][$prefix],
|
||||
(array) $paths
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-4 directories for a given namespace, either
|
||||
* appending or prepending to the ones previously set for this namespace.
|
||||
*
|
||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||
* @param array|string $paths The PSR-4 base directories
|
||||
* @param bool $prepend Whether to prepend the directories
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function addPsr4($prefix, $paths, $prepend = false)
|
||||
{
|
||||
if (!$prefix) {
|
||||
// Register directories for the root namespace.
|
||||
if ($prepend) {
|
||||
$this->fallbackDirsPsr4 = array_merge(
|
||||
(array) $paths,
|
||||
$this->fallbackDirsPsr4
|
||||
);
|
||||
} else {
|
||||
$this->fallbackDirsPsr4 = array_merge(
|
||||
$this->fallbackDirsPsr4,
|
||||
(array) $paths
|
||||
);
|
||||
}
|
||||
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
|
||||
// Register directories for a new namespace.
|
||||
if ('\\' !== substr($prefix, -1)) {
|
||||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||
}
|
||||
$this->firstCharsPsr4[$prefix[0]] = true;
|
||||
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
||||
} elseif ($prepend) {
|
||||
// Prepend directories for an already registered namespace.
|
||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||
(array) $paths,
|
||||
$this->prefixDirsPsr4[$prefix]
|
||||
);
|
||||
} else {
|
||||
// Append directories for an already registered namespace.
|
||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||
$this->prefixDirsPsr4[$prefix],
|
||||
(array) $paths
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-0 directories for a given prefix,
|
||||
* replacing any others previously set for this prefix.
|
||||
*
|
||||
* @param string $prefix The prefix
|
||||
* @param array|string $paths The PSR-0 base directories
|
||||
*/
|
||||
public function set($prefix, $paths)
|
||||
{
|
||||
if (!$prefix) {
|
||||
$this->fallbackDirsPsr0 = (array) $paths;
|
||||
} else {
|
||||
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-4 directories for a given namespace,
|
||||
* replacing any others previously set for this namespace.
|
||||
*
|
||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||
* @param array|string $paths The PSR-4 base directories
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function setPsr4($prefix, $paths)
|
||||
{
|
||||
if (!$prefix) {
|
||||
$this->fallbackDirsPsr4 = (array) $paths;
|
||||
} else {
|
||||
if ('\\' !== substr($prefix, -1)) {
|
||||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||
}
|
||||
$this->firstCharsPsr4[$prefix[0]] = true;
|
||||
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns on searching the include path for class files.
|
||||
*
|
||||
* @param bool $useIncludePath
|
||||
*/
|
||||
public function setUseIncludePath($useIncludePath)
|
||||
{
|
||||
$this->useIncludePath = $useIncludePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Can be used to check if the autoloader uses the include path to check
|
||||
* for classes.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function getUseIncludePath()
|
||||
{
|
||||
return $this->useIncludePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns off searching the prefix and fallback directories for classes
|
||||
* that have not been registered with the class map.
|
||||
*
|
||||
* @param bool $classMapAuthoritative
|
||||
*/
|
||||
public function setClassMapAuthoritative($classMapAuthoritative)
|
||||
{
|
||||
$this->classMapAuthoritative = $classMapAuthoritative;
|
||||
}
|
||||
|
||||
/**
|
||||
* Should class lookup fail if not found in the current class map?
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isClassMapAuthoritative()
|
||||
{
|
||||
return $this->classMapAuthoritative;
|
||||
}
|
||||
|
||||
/**
|
||||
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
|
||||
*
|
||||
* @param string|null $apcuPrefix
|
||||
*/
|
||||
public function setApcuPrefix($apcuPrefix)
|
||||
{
|
||||
$this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* The APCu prefix in use, or null if APCu caching is not enabled.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getApcuPrefix()
|
||||
{
|
||||
return $this->apcuPrefix;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers this instance as an autoloader.
|
||||
*
|
||||
* @param bool $prepend Whether to prepend the autoloader or not
|
||||
*/
|
||||
public function register($prepend = false)
|
||||
{
|
||||
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregisters this instance as an autoloader.
|
||||
*/
|
||||
public function unregister()
|
||||
{
|
||||
spl_autoload_unregister(array($this, 'loadClass'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the given class or interface.
|
||||
*
|
||||
* @param string $class The name of the class
|
||||
* @return bool|null True if loaded, null otherwise
|
||||
*/
|
||||
public function loadClass($class)
|
||||
{
|
||||
if ($file = $this->findFile($class)) {
|
||||
includeFile($file);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the path to the file where the class is defined.
|
||||
*
|
||||
* @param string $class The name of the class
|
||||
*
|
||||
* @return string|false The path if found, false otherwise
|
||||
*/
|
||||
public function findFile($class)
|
||||
{
|
||||
// class map lookup
|
||||
if (isset($this->classMap[$class])) {
|
||||
return $this->classMap[$class];
|
||||
}
|
||||
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
|
||||
return false;
|
||||
}
|
||||
if (null !== $this->apcuPrefix) {
|
||||
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
|
||||
if ($hit) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
$file = $this->findFileWithExtension($class, '.php');
|
||||
|
||||
// Search for Hack files if we are running on HHVM
|
||||
if (false === $file && defined('HHVM_VERSION')) {
|
||||
$file = $this->findFileWithExtension($class, '.hh');
|
||||
}
|
||||
|
||||
if (null !== $this->apcuPrefix) {
|
||||
apcu_add($this->apcuPrefix.$class, $file);
|
||||
}
|
||||
|
||||
if (false === $file) {
|
||||
// Remember that this class does not exist.
|
||||
$this->missingClasses[$class] = true;
|
||||
}
|
||||
|
||||
return $file;
|
||||
}
|
||||
|
||||
private function findFileWithExtension($class, $ext)
|
||||
{
|
||||
// PSR-4 lookup
|
||||
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
|
||||
|
||||
$first = $class[0];
|
||||
if (isset($this->firstCharsPsr4[$first]) || isset($this->prefixLengthsPsr4[$first])) {
|
||||
$subPath = $class;
|
||||
while (false !== $lastPos = strrpos($subPath, '\\')) {
|
||||
$subPath = substr($subPath, 0, $lastPos);
|
||||
$search = $subPath.'\\';
|
||||
if (isset($this->prefixDirsPsr4[$search])) {
|
||||
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
|
||||
foreach ($this->prefixDirsPsr4[$search] as $dir) {
|
||||
if (file_exists($file = $dir . $pathEnd)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-4 fallback dirs
|
||||
foreach ($this->fallbackDirsPsr4 as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 lookup
|
||||
if (false !== $pos = strrpos($class, '\\')) {
|
||||
// namespaced class name
|
||||
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
|
||||
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
|
||||
} else {
|
||||
// PEAR-like class name
|
||||
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
|
||||
}
|
||||
|
||||
if (isset($this->prefixesPsr0[$first])) {
|
||||
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
|
||||
if (0 === strpos($class, $prefix)) {
|
||||
foreach ($dirs as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 fallback dirs
|
||||
foreach ($this->fallbackDirsPsr0 as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 include paths.
|
||||
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Scope isolated include.
|
||||
*
|
||||
* Prevents access to $this/self from included files.
|
||||
*/
|
||||
function includeFile($file)
|
||||
{
|
||||
include $file;
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
|
||||
Copyright (c) Nils Adermann, Jordi Boggiano
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is furnished
|
||||
to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
<?php
|
||||
|
||||
// autoload_classmap.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = $vendorDir;
|
||||
|
||||
return array(
|
||||
'OCA\\AdminAudit\\Actions\\Action' => $baseDir . '/../lib/Actions/Action.php',
|
||||
'OCA\\AdminAudit\\Actions\\AppManagement' => $baseDir . '/../lib/Actions/AppManagement.php',
|
||||
'OCA\\AdminAudit\\Actions\\Auth' => $baseDir . '/../lib/Actions/Auth.php',
|
||||
'OCA\\AdminAudit\\Actions\\Console' => $baseDir . '/../lib/Actions/Console.php',
|
||||
'OCA\\AdminAudit\\Actions\\Files' => $baseDir . '/../lib/Actions/Files.php',
|
||||
'OCA\\AdminAudit\\Actions\\GroupManagement' => $baseDir . '/../lib/Actions/GroupManagement.php',
|
||||
'OCA\\AdminAudit\\Actions\\Sharing' => $baseDir . '/../lib/Actions/Sharing.php',
|
||||
'OCA\\AdminAudit\\Actions\\Trashbin' => $baseDir . '/../lib/Actions/Trashbin.php',
|
||||
'OCA\\AdminAudit\\Actions\\UserManagement' => $baseDir . '/../lib/Actions/UserManagement.php',
|
||||
'OCA\\AdminAudit\\Actions\\Versions' => $baseDir . '/../lib/Actions/Versions.php',
|
||||
'OCA\\AdminAudit\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php',
|
||||
);
|
||||
@@ -1,9 +0,0 @@
|
||||
<?php
|
||||
|
||||
// autoload_namespaces.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = $vendorDir;
|
||||
|
||||
return array(
|
||||
);
|
||||
@@ -1,10 +0,0 @@
|
||||
<?php
|
||||
|
||||
// autoload_psr4.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = $vendorDir;
|
||||
|
||||
return array(
|
||||
'OCA\\AdminAudit\\' => array($baseDir . '/../lib'),
|
||||
);
|
||||
@@ -1,43 +0,0 @@
|
||||
<?php
|
||||
|
||||
// autoload_real.php @generated by Composer
|
||||
|
||||
class ComposerAutoloaderInitAdminAudit
|
||||
{
|
||||
private static $loader;
|
||||
|
||||
public static function loadClassLoader($class)
|
||||
{
|
||||
if ('Composer\Autoload\ClassLoader' === $class) {
|
||||
require __DIR__ . '/ClassLoader.php';
|
||||
}
|
||||
}
|
||||
|
||||
public static function getLoader()
|
||||
{
|
||||
if (null !== self::$loader) {
|
||||
return self::$loader;
|
||||
}
|
||||
|
||||
spl_autoload_register(array('ComposerAutoloaderInitAdminAudit', 'loadClassLoader'), true, true);
|
||||
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
||||
spl_autoload_unregister(array('ComposerAutoloaderInitAdminAudit', 'loadClassLoader'));
|
||||
|
||||
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
||||
if ($useStaticLoader) {
|
||||
require_once __DIR__ . '/autoload_static.php';
|
||||
|
||||
call_user_func(\Composer\Autoload\ComposerStaticInitAdminAudit::getInitializer($loader));
|
||||
} else {
|
||||
$classMap = require __DIR__ . '/autoload_classmap.php';
|
||||
if ($classMap) {
|
||||
$loader->addClassMap($classMap);
|
||||
}
|
||||
}
|
||||
|
||||
$loader->setClassMapAuthoritative(true);
|
||||
$loader->register(true);
|
||||
|
||||
return $loader;
|
||||
}
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
<?php
|
||||
|
||||
// autoload_static.php @generated by Composer
|
||||
|
||||
namespace Composer\Autoload;
|
||||
|
||||
class ComposerStaticInitAdminAudit
|
||||
{
|
||||
public static $firstCharsPsr4 = array (
|
||||
'O' => true,
|
||||
);
|
||||
|
||||
public static $prefixDirsPsr4 = array (
|
||||
'OCA\\AdminAudit\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/../lib',
|
||||
),
|
||||
);
|
||||
|
||||
public static $classMap = array (
|
||||
'OCA\\AdminAudit\\Actions\\Action' => __DIR__ . '/..' . '/../lib/Actions/Action.php',
|
||||
'OCA\\AdminAudit\\Actions\\AppManagement' => __DIR__ . '/..' . '/../lib/Actions/AppManagement.php',
|
||||
'OCA\\AdminAudit\\Actions\\Auth' => __DIR__ . '/..' . '/../lib/Actions/Auth.php',
|
||||
'OCA\\AdminAudit\\Actions\\Console' => __DIR__ . '/..' . '/../lib/Actions/Console.php',
|
||||
'OCA\\AdminAudit\\Actions\\Files' => __DIR__ . '/..' . '/../lib/Actions/Files.php',
|
||||
'OCA\\AdminAudit\\Actions\\GroupManagement' => __DIR__ . '/..' . '/../lib/Actions/GroupManagement.php',
|
||||
'OCA\\AdminAudit\\Actions\\Sharing' => __DIR__ . '/..' . '/../lib/Actions/Sharing.php',
|
||||
'OCA\\AdminAudit\\Actions\\Trashbin' => __DIR__ . '/..' . '/../lib/Actions/Trashbin.php',
|
||||
'OCA\\AdminAudit\\Actions\\UserManagement' => __DIR__ . '/..' . '/../lib/Actions/UserManagement.php',
|
||||
'OCA\\AdminAudit\\Actions\\Versions' => __DIR__ . '/..' . '/../lib/Actions/Versions.php',
|
||||
'OCA\\AdminAudit\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php',
|
||||
);
|
||||
|
||||
public static function getInitializer(ClassLoader $loader)
|
||||
{
|
||||
return \Closure::bind(function () use ($loader) {
|
||||
$loader->firstCharsPsr4 = ComposerStaticInitAdminAudit::$firstCharsPsr4;
|
||||
$loader->prefixDirsPsr4 = ComposerStaticInitAdminAudit::$prefixDirsPsr4;
|
||||
$loader->classMap = ComposerStaticInitAdminAudit::$classMap;
|
||||
|
||||
}, null, ClassLoader::class);
|
||||
}
|
||||
}
|
||||
@@ -1,90 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch>
|
||||
*
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
* @author Lukas Reschke <lukas@statuscode.ch>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\AdminAudit\Actions;
|
||||
|
||||
use OCP\ILogger;
|
||||
|
||||
class Action {
|
||||
/** @var ILogger */
|
||||
private $logger;
|
||||
|
||||
/**
|
||||
* @param ILogger $logger
|
||||
*/
|
||||
public function __construct(ILogger $logger) {
|
||||
$this->logger = $logger;
|
||||
}
|
||||
|
||||
/**
|
||||
* Log a single action with a log level of info
|
||||
*
|
||||
* @param string $text
|
||||
* @param array $params
|
||||
* @param array $elements
|
||||
* @param bool $obfuscateParameters
|
||||
*/
|
||||
public function log($text,
|
||||
array $params,
|
||||
array $elements,
|
||||
$obfuscateParameters = false) {
|
||||
foreach($elements as $element) {
|
||||
if(!isset($params[$element])) {
|
||||
if ($obfuscateParameters) {
|
||||
$this->logger->critical(
|
||||
'$params["'.$element.'"] was missing.',
|
||||
['app' => 'admin_audit']
|
||||
);
|
||||
} else {
|
||||
$this->logger->critical(
|
||||
sprintf(
|
||||
'$params["'.$element.'"] was missing. Transferred value: %s',
|
||||
print_r($params, true)
|
||||
),
|
||||
['app' => 'admin_audit']
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
$replaceArray = [];
|
||||
foreach($elements as $element) {
|
||||
if($params[$element] instanceof \DateTime) {
|
||||
$params[$element] = $params[$element]->format('Y-m-d H:i:s');
|
||||
}
|
||||
$replaceArray[] = $params[$element];
|
||||
}
|
||||
|
||||
$this->logger->info(
|
||||
vsprintf(
|
||||
$text,
|
||||
$replaceArray
|
||||
),
|
||||
[
|
||||
'app' => 'admin_audit'
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2017 Joas Schilling <coding@schilljs.com>
|
||||
*
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\AdminAudit\Actions;
|
||||
|
||||
class AppManagement extends Action {
|
||||
|
||||
/**
|
||||
* @param string $appName
|
||||
*/
|
||||
public function enableApp($appName) {
|
||||
$this->log('App "%s" enabled',
|
||||
['app' => $appName],
|
||||
['app']
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $appName
|
||||
* @param string[] $groups
|
||||
*/
|
||||
public function enableAppForGroups($appName, array $groups) {
|
||||
$this->log('App "%s" enabled for groups: %s',
|
||||
['app' => $appName, 'groups' => implode(', ', $groups)],
|
||||
['app', 'groups']
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $appName
|
||||
*/
|
||||
public function disableApp($appName) {
|
||||
$this->log('App "%s" disabled',
|
||||
['app' => $appName],
|
||||
['app']
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch>
|
||||
*
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
* @author Lukas Reschke <lukas@statuscode.ch>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\AdminAudit\Actions;
|
||||
|
||||
/**
|
||||
* Class Auth logs all auth related actions
|
||||
*
|
||||
* @package OCA\AdminAudit\Actions
|
||||
*/
|
||||
class Auth extends Action {
|
||||
public function loginAttempt(array $params) {
|
||||
$this->log(
|
||||
'Login attempt: "%s"',
|
||||
$params,
|
||||
[
|
||||
'uid',
|
||||
],
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
public function loginSuccessful(array $params) {
|
||||
$this->log(
|
||||
'Login successful: "%s"',
|
||||
$params,
|
||||
[
|
||||
'uid',
|
||||
],
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
public function logout(array $params) {
|
||||
$this->log(
|
||||
'Logout occurred',
|
||||
[],
|
||||
[]
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2017 Joas Schilling <coding@schilljs.com>
|
||||
*
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\AdminAudit\Actions;
|
||||
|
||||
|
||||
class Console extends Action {
|
||||
/**
|
||||
* @param $arguments
|
||||
*/
|
||||
public function runCommand($arguments) {
|
||||
if ($arguments[1] === '_completion') {
|
||||
// Don't log autocompletion
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove `./occ`
|
||||
array_shift($arguments);
|
||||
|
||||
$this->log('Console command executed: %s',
|
||||
['arguments' => implode(' ', $arguments)],
|
||||
['arguments']
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,166 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch>
|
||||
*
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
* @author Lukas Reschke <lukas@statuscode.ch>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\AdminAudit\Actions;
|
||||
|
||||
/**
|
||||
* Class Files logs the actions to files
|
||||
*
|
||||
* @package OCA\AdminAudit\Actions
|
||||
*/
|
||||
class Files extends Action {
|
||||
/**
|
||||
* Logs file read actions
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function read(array $params) {
|
||||
$this->log(
|
||||
'File accessed: "%s"',
|
||||
$params,
|
||||
[
|
||||
'path',
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs rename actions of files
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function rename(array $params) {
|
||||
$this->log(
|
||||
'File renamed: "%s" to "%s"',
|
||||
$params,
|
||||
[
|
||||
'oldpath',
|
||||
'newpath',
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs creation of files
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function create(array $params) {
|
||||
if ($params['path'] === '/' || $params['path'] === '' || $params['path'] === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->log(
|
||||
'File created: "%s"',
|
||||
$params,
|
||||
[
|
||||
'path',
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs copying of files
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function copy(array $params) {
|
||||
$this->log(
|
||||
'File copied: "%s" to "%s"',
|
||||
$params,
|
||||
[
|
||||
'oldpath',
|
||||
'newpath',
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs writing of files
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function write(array $params) {
|
||||
if ($params['path'] === '/' || $params['path'] === '' || $params['path'] === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->log(
|
||||
'File written to: "%s"',
|
||||
$params,
|
||||
[
|
||||
'path',
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs update of files
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function update(array $params) {
|
||||
$this->log(
|
||||
'File updated: "%s"',
|
||||
$params,
|
||||
[
|
||||
'path',
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs deletions of files
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function delete(array $params) {
|
||||
$this->log(
|
||||
'File deleted: "%s"',
|
||||
$params,
|
||||
[
|
||||
'path',
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs preview access to a file
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function preview(array $params) {
|
||||
$this->log(
|
||||
'Preview accessed: "%s" (width: "%s", height: "%s" crop: "%s", mode: "%s")',
|
||||
$params,
|
||||
[
|
||||
'path',
|
||||
'width',
|
||||
'height',
|
||||
'crop',
|
||||
'mode'
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,107 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2016 Bjoern Schiessle <bjoern@schiessle.org>
|
||||
*
|
||||
* @author Bjoern Schiessle <bjoern@schiessle.org>
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
* @author Lukas Reschke <lukas@statuscode.ch>
|
||||
* @author Roger Szabo <roger.szabo@web.de>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\AdminAudit\Actions;
|
||||
|
||||
|
||||
use OCP\IGroup;
|
||||
use OCP\IUser;
|
||||
|
||||
/**
|
||||
* Class GroupManagement logs all group manager related events
|
||||
*
|
||||
* @package OCA\AdminAudit\Actions
|
||||
*/
|
||||
class GroupManagement extends Action {
|
||||
|
||||
/**
|
||||
* log add user to group event
|
||||
*
|
||||
* @param IGroup $group
|
||||
* @param IUser $user
|
||||
*/
|
||||
public function addUser(IGroup $group, IUser $user) {
|
||||
$this->log('User "%s" added to group "%s"',
|
||||
[
|
||||
'group' => $group->getGID(),
|
||||
'user' => $user->getUID()
|
||||
],
|
||||
[
|
||||
'user', 'group'
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* log remove user from group event
|
||||
*
|
||||
* @param IGroup $group
|
||||
* @param IUser $user
|
||||
*/
|
||||
public function removeUser(IGroup $group, IUser $user) {
|
||||
$this->log('User "%s" removed from group "%s"',
|
||||
[
|
||||
'group' => $group->getGID(),
|
||||
'user' => $user->getUID()
|
||||
],
|
||||
[
|
||||
'user', 'group'
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* log create group to group event
|
||||
*
|
||||
* @param IGroup $group
|
||||
*/
|
||||
public function createGroup(IGroup $group) {
|
||||
$this->log('Group created: "%s"',
|
||||
[
|
||||
'group' => $group->getGID()
|
||||
],
|
||||
[
|
||||
'group'
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* log delete group to group event
|
||||
*
|
||||
* @param IGroup $group
|
||||
*/
|
||||
public function deleteGroup(IGroup $group) {
|
||||
$this->log('Group deleted: "%s"',
|
||||
[
|
||||
'group' => $group->getGID()
|
||||
],
|
||||
[
|
||||
'group'
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,195 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch>
|
||||
*
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
* @author Lukas Reschke <lukas@statuscode.ch>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\AdminAudit\Actions;
|
||||
|
||||
|
||||
use OCP\Share;
|
||||
|
||||
/**
|
||||
* Class Sharing logs the sharing actions
|
||||
*
|
||||
* @package OCA\AdminAudit\Actions
|
||||
*/
|
||||
class Sharing extends Action {
|
||||
/**
|
||||
* Logs sharing of data
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function shared(array $params) {
|
||||
if($params['shareType'] === Share::SHARE_TYPE_LINK) {
|
||||
$this->log(
|
||||
'The %s "%s" with ID "%s" has been shared via link with permissions "%s" (Share ID: %s)',
|
||||
$params,
|
||||
[
|
||||
'itemType',
|
||||
'itemTarget',
|
||||
'itemSource',
|
||||
'permissions',
|
||||
'id',
|
||||
]
|
||||
);
|
||||
} elseif($params['shareType'] === Share::SHARE_TYPE_USER) {
|
||||
$this->log(
|
||||
'The %s "%s" with ID "%s" has been shared to the user "%s" with permissions "%s" (Share ID: %s)',
|
||||
$params,
|
||||
[
|
||||
'itemType',
|
||||
'itemTarget',
|
||||
'itemSource',
|
||||
'shareWith',
|
||||
'permissions',
|
||||
'id',
|
||||
]
|
||||
);
|
||||
} elseif($params['shareType'] === Share::SHARE_TYPE_GROUP) {
|
||||
$this->log(
|
||||
'The %s "%s" with ID "%s" has been shared to the group "%s" with permissions "%s" (Share ID: %s)',
|
||||
$params,
|
||||
[
|
||||
'itemType',
|
||||
'itemTarget',
|
||||
'itemSource',
|
||||
'shareWith',
|
||||
'permissions',
|
||||
'id',
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs unsharing of data
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function unshare(array $params) {
|
||||
if($params['shareType'] === Share::SHARE_TYPE_LINK) {
|
||||
$this->log(
|
||||
'The %s "%s" with ID "%s" has been unshared (Share ID: %s)',
|
||||
$params,
|
||||
[
|
||||
'itemType',
|
||||
'fileTarget',
|
||||
'itemSource',
|
||||
'id',
|
||||
]
|
||||
);
|
||||
} elseif($params['shareType'] === Share::SHARE_TYPE_USER) {
|
||||
$this->log(
|
||||
'The %s "%s" with ID "%s" has been unshared from the user "%s" (Share ID: %s)',
|
||||
$params,
|
||||
[
|
||||
'itemType',
|
||||
'fileTarget',
|
||||
'itemSource',
|
||||
'shareWith',
|
||||
'id',
|
||||
]
|
||||
);
|
||||
} elseif($params['shareType'] === Share::SHARE_TYPE_GROUP) {
|
||||
$this->log(
|
||||
'The %s "%s" with ID "%s" has been unshared from the group "%s" (Share ID: %s)',
|
||||
$params,
|
||||
[
|
||||
'itemType',
|
||||
'fileTarget',
|
||||
'itemSource',
|
||||
'shareWith',
|
||||
'id',
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs the updating of permission changes for shares
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function updatePermissions(array $params) {
|
||||
$this->log(
|
||||
'The permissions of the shared %s "%s" with ID "%s" have been changed to "%s"',
|
||||
$params,
|
||||
[
|
||||
'itemType',
|
||||
'path',
|
||||
'itemSource',
|
||||
'permissions',
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs the password changes for a share
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function updatePassword(array $params) {
|
||||
$this->log(
|
||||
'The password of the publicly shared %s "%s" with ID "%s" has been changed',
|
||||
$params,
|
||||
[
|
||||
'itemType',
|
||||
'token',
|
||||
'itemSource',
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs the expiration date changes for a share
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function updateExpirationDate(array $params) {
|
||||
$this->log(
|
||||
'The expiration date of the publicly shared %s with ID "%s" has been changed to "%s"',
|
||||
$params,
|
||||
[
|
||||
'itemType',
|
||||
'itemSource',
|
||||
'date',
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs access of shared files
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function shareAccessed(array $params) {
|
||||
$this->log(
|
||||
'The shared %s with the token "%s" by "%s" has been accessed.',
|
||||
$params,
|
||||
[
|
||||
'itemType',
|
||||
'token',
|
||||
'uidOwner',
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2016 Bjoern Schiessle <bjoern@schiessle.org>
|
||||
*
|
||||
* @author Bjoern Schiessle <bjoern@schiessle.org>
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\AdminAudit\Actions;
|
||||
|
||||
|
||||
class Trashbin extends Action {
|
||||
|
||||
public function delete($params) {
|
||||
$this->log('File "%s" deleted from trash bin.',
|
||||
['path' => $params['path']], ['path']
|
||||
);
|
||||
}
|
||||
|
||||
public function restore($params) {
|
||||
$this->log('File "%s" restored from trash bin.',
|
||||
['path' => $params['filePath']], ['path']
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,113 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch>
|
||||
*
|
||||
* @author Bjoern Schiessle <bjoern@schiessle.org>
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
* @author Lukas Reschke <lukas@statuscode.ch>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\AdminAudit\Actions;
|
||||
|
||||
|
||||
use OCP\IUser;
|
||||
|
||||
/**
|
||||
* Class UserManagement logs all user management related actions.
|
||||
*
|
||||
* @package OCA\AdminAudit\Actions
|
||||
*/
|
||||
class UserManagement extends Action {
|
||||
/**
|
||||
* Log creation of users
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function create(array $params) {
|
||||
$this->log(
|
||||
'User created: "%s"',
|
||||
$params,
|
||||
[
|
||||
'uid',
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Log deletion of users
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function delete(array $params) {
|
||||
$this->log(
|
||||
'User deleted: "%s"',
|
||||
$params,
|
||||
[
|
||||
'uid',
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Log enabling of users
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function change(array $params) {
|
||||
switch($params['feature']) {
|
||||
case 'enabled':
|
||||
$this->log(
|
||||
$params['value'] === 'true' ? 'User enabled: "%s"' : 'User disabled: "%s"',
|
||||
['user' => $params['user']->getUID()],
|
||||
[
|
||||
'user',
|
||||
]
|
||||
);
|
||||
break;
|
||||
case 'eMailAddress':
|
||||
$this->log(
|
||||
'Email address changed for user %s',
|
||||
['user' => $params['user']->getUID()],
|
||||
[
|
||||
'user',
|
||||
]
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Logs changing of the user scope
|
||||
*
|
||||
* @param IUser $user
|
||||
*/
|
||||
public function setPassword(IUser $user) {
|
||||
if($user->getBackendClassName() === 'Database') {
|
||||
$this->log(
|
||||
'Password of user "%s" has been changed',
|
||||
[
|
||||
'user' => $user->getUID(),
|
||||
],
|
||||
[
|
||||
'user',
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Bjoern Schiessle <bjoern@schiessle.org>
|
||||
*
|
||||
* @author Bjoern Schiessle <bjoern@schiessle.org>
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\AdminAudit\Actions;
|
||||
|
||||
|
||||
class Versions extends Action {
|
||||
|
||||
public function rollback($params) {
|
||||
$this->log('Version "%s" of "%s" was restored.',
|
||||
[
|
||||
'version' => $params['revision'],
|
||||
'path' => $params['path']
|
||||
],
|
||||
['version', 'path']
|
||||
);
|
||||
}
|
||||
|
||||
public function delete($params) {
|
||||
$this->log('Version "%s" was deleted.',
|
||||
['path' => $params['path']],
|
||||
['path']
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,221 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2017 Joas Schilling <coding@schilljs.com>
|
||||
*
|
||||
* @author Bjoern Schiessle <bjoern@schiessle.org>
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\AdminAudit\AppInfo;
|
||||
|
||||
use OC\Files\Filesystem;
|
||||
use OC\Files\Node\File;
|
||||
use OC\Group\Manager;
|
||||
use OC\User\Session;
|
||||
use OCA\AdminAudit\Actions\AppManagement;
|
||||
use OCA\AdminAudit\Actions\Auth;
|
||||
use OCA\AdminAudit\Actions\Console;
|
||||
use OCA\AdminAudit\Actions\Files;
|
||||
use OCA\AdminAudit\Actions\GroupManagement;
|
||||
use OCA\AdminAudit\Actions\Sharing;
|
||||
use OCA\AdminAudit\Actions\Trashbin;
|
||||
use OCA\AdminAudit\Actions\UserManagement;
|
||||
use OCA\AdminAudit\Actions\Versions;
|
||||
use OCP\App\ManagerEvent;
|
||||
use OCP\AppFramework\App;
|
||||
use OCP\Console\ConsoleEvent;
|
||||
use OCP\IGroupManager;
|
||||
use OCP\ILogger;
|
||||
use OCP\IPreview;
|
||||
use OCP\IUserSession;
|
||||
use OCP\Util;
|
||||
use Symfony\Component\EventDispatcher\GenericEvent;
|
||||
|
||||
class Application extends App {
|
||||
|
||||
public function __construct() {
|
||||
parent::__construct('admin_audit');
|
||||
}
|
||||
|
||||
public function register() {
|
||||
$this->registerHooks();
|
||||
}
|
||||
|
||||
/**
|
||||
* Register hooks in order to log them
|
||||
*/
|
||||
protected function registerHooks() {
|
||||
$logger = $this->getContainer()->getServer()->getLogger();
|
||||
|
||||
$this->userManagementHooks($logger);
|
||||
$this->groupHooks($logger);
|
||||
$this->authHooks($logger);
|
||||
|
||||
$this->consoleHooks($logger);
|
||||
$this->appHooks($logger);
|
||||
|
||||
$this->sharingHooks($logger);
|
||||
|
||||
$this->fileHooks($logger);
|
||||
$this->trashbinHooks($logger);
|
||||
$this->versionsHooks($logger);
|
||||
}
|
||||
|
||||
protected function userManagementHooks(ILogger $logger) {
|
||||
$userActions = new UserManagement($logger);
|
||||
|
||||
Util::connectHook('OC_User', 'post_createUser', $userActions, 'create');
|
||||
Util::connectHook('OC_User', 'post_deleteUser', $userActions, 'delete');
|
||||
Util::connectHook('OC_User', 'changeUser', $userActions, 'change');
|
||||
|
||||
/** @var IUserSession|Session $userSession */
|
||||
$userSession = $this->getContainer()->getServer()->getUserSession();
|
||||
$userSession->listen('\OC\User', 'postSetPassword', [$userActions, 'setPassword']);
|
||||
}
|
||||
|
||||
protected function groupHooks(ILogger $logger) {
|
||||
$groupActions = new GroupManagement($logger);
|
||||
|
||||
/** @var IGroupManager|Manager $groupManager */
|
||||
$groupManager = $this->getContainer()->getServer()->getGroupManager();
|
||||
$groupManager->listen('\OC\Group', 'postRemoveUser', [$groupActions, 'removeUser']);
|
||||
$groupManager->listen('\OC\Group', 'postAddUser', [$groupActions, 'addUser']);
|
||||
$groupManager->listen('\OC\Group', 'postDelete', [$groupActions, 'deleteGroup']);
|
||||
$groupManager->listen('\OC\Group', 'postCreate', [$groupActions, 'createGroup']);
|
||||
}
|
||||
|
||||
protected function sharingHooks(ILogger $logger) {
|
||||
$shareActions = new Sharing($logger);
|
||||
|
||||
Util::connectHook('OCP\Share', 'post_shared', $shareActions, 'shared');
|
||||
Util::connectHook('OCP\Share', 'post_unshare', $shareActions, 'unshare');
|
||||
Util::connectHook('OCP\Share', 'post_update_permissions', $shareActions, 'updatePermissions');
|
||||
Util::connectHook('OCP\Share', 'post_update_password', $shareActions, 'updatePassword');
|
||||
Util::connectHook('OCP\Share', 'post_set_expiration_date', $shareActions, 'updateExpirationDate');
|
||||
Util::connectHook('OCP\Share', 'share_link_access', $shareActions, 'shareAccessed');
|
||||
}
|
||||
|
||||
protected function authHooks(ILogger $logger) {
|
||||
$authActions = new Auth($logger);
|
||||
|
||||
Util::connectHook('OC_User', 'pre_login', $authActions, 'loginAttempt');
|
||||
Util::connectHook('OC_User', 'post_login', $authActions, 'loginSuccessful');
|
||||
Util::connectHook('OC_User', 'logout', $authActions, 'logout');
|
||||
}
|
||||
|
||||
protected function appHooks(ILogger $logger) {
|
||||
|
||||
$eventDispatcher = $this->getContainer()->getServer()->getEventDispatcher();
|
||||
$eventDispatcher->addListener(ManagerEvent::EVENT_APP_ENABLE, function(ManagerEvent $event) use ($logger) {
|
||||
$appActions = new AppManagement($logger);
|
||||
$appActions->enableApp($event->getAppID());
|
||||
});
|
||||
$eventDispatcher->addListener(ManagerEvent::EVENT_APP_ENABLE_FOR_GROUPS, function(ManagerEvent $event) use ($logger) {
|
||||
$appActions = new AppManagement($logger);
|
||||
$appActions->enableAppForGroups($event->getAppID(), $event->getGroups());
|
||||
});
|
||||
$eventDispatcher->addListener(ManagerEvent::EVENT_APP_DISABLE, function(ManagerEvent $event) use ($logger) {
|
||||
$appActions = new AppManagement($logger);
|
||||
$appActions->disableApp($event->getAppID());
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
protected function consoleHooks(ILogger $logger) {
|
||||
$eventDispatcher = $this->getContainer()->getServer()->getEventDispatcher();
|
||||
$eventDispatcher->addListener(ConsoleEvent::EVENT_RUN, function(ConsoleEvent $event) use ($logger) {
|
||||
$appActions = new Console($logger);
|
||||
$appActions->runCommand($event->getArguments());
|
||||
});
|
||||
}
|
||||
|
||||
protected function fileHooks(ILogger $logger) {
|
||||
$fileActions = new Files($logger);
|
||||
$eventDispatcher = $this->getContainer()->getServer()->getEventDispatcher();
|
||||
$eventDispatcher->addListener(
|
||||
IPreview::EVENT,
|
||||
function(GenericEvent $event) use ($fileActions) {
|
||||
/** @var File $file */
|
||||
$file = $event->getSubject();
|
||||
$fileActions->preview([
|
||||
'path' => substr($file->getInternalPath(), 5),
|
||||
'width' => $event->getArguments()['width'],
|
||||
'height' => $event->getArguments()['height'],
|
||||
'crop' => $event->getArguments()['crop'],
|
||||
'mode' => $event->getArguments()['mode']
|
||||
]);
|
||||
}
|
||||
);
|
||||
|
||||
Util::connectHook(
|
||||
Filesystem::CLASSNAME,
|
||||
Filesystem::signal_post_rename,
|
||||
$fileActions,
|
||||
'rename'
|
||||
);
|
||||
Util::connectHook(
|
||||
Filesystem::CLASSNAME,
|
||||
Filesystem::signal_post_create,
|
||||
$fileActions,
|
||||
'create'
|
||||
);
|
||||
Util::connectHook(
|
||||
Filesystem::CLASSNAME,
|
||||
Filesystem::signal_post_copy,
|
||||
$fileActions,
|
||||
'copy'
|
||||
);
|
||||
Util::connectHook(
|
||||
Filesystem::CLASSNAME,
|
||||
Filesystem::signal_post_write,
|
||||
$fileActions,
|
||||
'write'
|
||||
);
|
||||
Util::connectHook(
|
||||
Filesystem::CLASSNAME,
|
||||
Filesystem::signal_post_update,
|
||||
$fileActions,
|
||||
'update'
|
||||
);
|
||||
Util::connectHook(
|
||||
Filesystem::CLASSNAME,
|
||||
Filesystem::signal_read,
|
||||
$fileActions,
|
||||
'read'
|
||||
);
|
||||
Util::connectHook(
|
||||
Filesystem::CLASSNAME,
|
||||
Filesystem::signal_delete,
|
||||
$fileActions,
|
||||
'delete'
|
||||
);
|
||||
}
|
||||
|
||||
protected function versionsHooks(ILogger $logger) {
|
||||
$versionsActions = new Versions($logger);
|
||||
Util::connectHook('\OCP\Versions', 'rollback', $versionsActions, 'rollback');
|
||||
Util::connectHook('\OCP\Versions', 'delete',$versionsActions, 'delete');
|
||||
}
|
||||
|
||||
protected function trashbinHooks(ILogger $logger) {
|
||||
$trashActions = new Trashbin($logger);
|
||||
Util::connectHook('\OCP\Trashbin', 'preDelete', $trashActions, 'delete');
|
||||
Util::connectHook('\OCA\Files_Trashbin\Trashbin', 'post_restore', $trashActions, 'restore');
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"directory": "js/vendor"
|
||||
}
|
||||
@@ -0,0 +1,322 @@
|
||||
<?php
|
||||
/**
|
||||
* @author Joas Schilling <nickvergessen@owncloud.com>
|
||||
*
|
||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Comments\Activity;
|
||||
|
||||
use OCP\Activity\IExtension;
|
||||
use OCP\Activity\IManager;
|
||||
use OCP\Comments\ICommentsManager;
|
||||
use OCP\Comments\NotFoundException;
|
||||
use OCP\IL10N;
|
||||
use OCP\IURLGenerator;
|
||||
use OCP\L10N\IFactory;
|
||||
|
||||
/**
|
||||
* Class Extension
|
||||
*
|
||||
* @package OCA\Comments\Activity
|
||||
*/
|
||||
class Extension implements IExtension {
|
||||
const APP_NAME = 'comments';
|
||||
|
||||
const ADD_COMMENT_SUBJECT = 'add_comment_subject';
|
||||
const ADD_COMMENT_MESSAGE = 'add_comment_message';
|
||||
|
||||
/** @var IFactory */
|
||||
protected $languageFactory;
|
||||
|
||||
/** @var IManager */
|
||||
protected $activityManager;
|
||||
|
||||
/** @var ICommentsManager */
|
||||
protected $commentsManager;
|
||||
|
||||
/** @var IURLGenerator */
|
||||
protected $URLGenerator;
|
||||
|
||||
/**
|
||||
* @param IFactory $languageFactory
|
||||
* @param IManager $activityManager
|
||||
* @param ICommentsManager $commentsManager
|
||||
* @param IURLGenerator $URLGenerator
|
||||
*/
|
||||
public function __construct(IFactory $languageFactory, IManager $activityManager, ICommentsManager $commentsManager, IURLGenerator $URLGenerator) {
|
||||
$this->languageFactory = $languageFactory;
|
||||
$this->activityManager = $activityManager;
|
||||
$this->commentsManager = $commentsManager;
|
||||
$this->URLGenerator = $URLGenerator;
|
||||
}
|
||||
|
||||
protected function getL10N($languageCode = null) {
|
||||
return $this->languageFactory->get(self::APP_NAME, $languageCode);
|
||||
}
|
||||
|
||||
/**
|
||||
* The extension can return an array of additional notification types.
|
||||
* If no additional types are to be added false is to be returned
|
||||
*
|
||||
* @param string $languageCode
|
||||
* @return array|false
|
||||
*/
|
||||
public function getNotificationTypes($languageCode) {
|
||||
$l = $this->getL10N($languageCode);
|
||||
|
||||
return array(
|
||||
self::APP_NAME => (string) $l->t('<strong>Comments</strong> for files'),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* For a given method additional types to be displayed in the settings can be returned.
|
||||
* In case no additional types are to be added false is to be returned.
|
||||
*
|
||||
* @param string $method
|
||||
* @return array|false
|
||||
*/
|
||||
public function getDefaultTypes($method) {
|
||||
return $method === self::METHOD_STREAM ? [self::APP_NAME] : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* A string naming the css class for the icon to be used can be returned.
|
||||
* If no icon is known for the given type false is to be returned.
|
||||
*
|
||||
* @param string $type
|
||||
* @return string|false
|
||||
*/
|
||||
public function getTypeIcon($type) {
|
||||
switch ($type) {
|
||||
case self::APP_NAME:
|
||||
return 'icon-comment';
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* The extension can translate a given message to the requested languages.
|
||||
* If no translation is available false is to be returned.
|
||||
*
|
||||
* @param string $app
|
||||
* @param string $text
|
||||
* @param array $params
|
||||
* @param boolean $stripPath
|
||||
* @param boolean $highlightParams
|
||||
* @param string $languageCode
|
||||
* @return string|false
|
||||
*/
|
||||
public function translate($app, $text, $params, $stripPath, $highlightParams, $languageCode) {
|
||||
if ($app !== self::APP_NAME) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$l = $this->getL10N($languageCode);
|
||||
|
||||
if ($this->activityManager->isFormattingFilteredObject()) {
|
||||
$translation = $this->translateShort($text, $l, $params);
|
||||
if ($translation !== false) {
|
||||
return $translation;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->translateLong($text, $l, $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $text
|
||||
* @param IL10N $l
|
||||
* @param array $params
|
||||
* @return bool|string
|
||||
*/
|
||||
protected function translateShort($text, IL10N $l, array $params) {
|
||||
|
||||
switch ($text) {
|
||||
case self::ADD_COMMENT_SUBJECT:
|
||||
if ($this->authorIsCurrentUser($params[0])) {
|
||||
return (string) $l->t('You commented');
|
||||
}
|
||||
return (string) $l->t('%1$s commented', $params);
|
||||
case self::ADD_COMMENT_MESSAGE:
|
||||
return $this->convertParameterToComment($params[0], 120);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $text
|
||||
* @param IL10N $l
|
||||
* @param array $params
|
||||
* @return bool|string
|
||||
*/
|
||||
protected function translateLong($text, IL10N $l, array $params) {
|
||||
|
||||
switch ($text) {
|
||||
case self::ADD_COMMENT_SUBJECT:
|
||||
if ($this->authorIsCurrentUser($params[0])) {
|
||||
return (string) $l->t('You commented on %2$s', $params);
|
||||
}
|
||||
return (string) $l->t('%1$s commented on %2$s', $params);
|
||||
case self::ADD_COMMENT_MESSAGE:
|
||||
return $this->convertParameterToComment($params[0]);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the author is the current user
|
||||
*
|
||||
* @param string $user Parameter e.g. `<user display-name="admin">admin</user>`
|
||||
* @return bool
|
||||
*/
|
||||
protected function authorIsCurrentUser($user) {
|
||||
try {
|
||||
return strip_tags($user) === $this->activityManager->getCurrentUserId();
|
||||
} catch (\UnexpectedValueException $e) {
|
||||
// FIXME this is awkward, but we have no access to the current user in emails
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The extension can define the type of parameters for translation
|
||||
*
|
||||
* Currently known types are:
|
||||
* * file => will strip away the path of the file and add a tooltip with it
|
||||
* * username => will add the avatar of the user
|
||||
*
|
||||
* @param string $app
|
||||
* @param string $text
|
||||
* @return array|false
|
||||
*/
|
||||
public function getSpecialParameterList($app, $text) {
|
||||
if ($app === self::APP_NAME) {
|
||||
switch ($text) {
|
||||
case self::ADD_COMMENT_SUBJECT:
|
||||
return [
|
||||
0 => 'username',
|
||||
1 => 'file',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* The extension can define the parameter grouping by returning the index as integer.
|
||||
* In case no grouping is required false is to be returned.
|
||||
*
|
||||
* @param array $activity
|
||||
* @return integer|false
|
||||
*/
|
||||
public function getGroupParameter($activity) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* The extension can define additional navigation entries. The array returned has to contain two keys 'top'
|
||||
* and 'apps' which hold arrays with the relevant entries.
|
||||
* If no further entries are to be added false is no be returned.
|
||||
*
|
||||
* @return array|false
|
||||
*/
|
||||
public function getNavigation() {
|
||||
$l = $this->getL10N();
|
||||
return [
|
||||
'apps' => [],
|
||||
'top' => [
|
||||
self::APP_NAME => [
|
||||
'id' => self::APP_NAME,
|
||||
'name' => (string) $l->t('Comments'),
|
||||
'url' => $this->URLGenerator->linkToRoute('activity.Activities.showList', ['filter' => self::APP_NAME]),
|
||||
],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* The extension can check if a custom filter (given by a query string like filter=abc) is valid or not.
|
||||
*
|
||||
* @param string $filterValue
|
||||
* @return boolean
|
||||
*/
|
||||
public function isFilterValid($filterValue) {
|
||||
return $filterValue === self::APP_NAME;
|
||||
}
|
||||
|
||||
/**
|
||||
* The extension can filter the types based on the filter if required.
|
||||
* In case no filter is to be applied false is to be returned unchanged.
|
||||
*
|
||||
* @param array $types
|
||||
* @param string $filter
|
||||
* @return array|false
|
||||
*/
|
||||
public function filterNotificationTypes($types, $filter) {
|
||||
if ($filter === self::APP_NAME) {
|
||||
return array_intersect($types, [self::APP_NAME]);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* For a given filter the extension can specify the sql query conditions including parameters for that query.
|
||||
* In case the extension does not know the filter false is to be returned.
|
||||
* The query condition and the parameters are to be returned as array with two elements.
|
||||
* E.g. return array('`app` = ? and `message` like ?', array('mail', 'ownCloud%'));
|
||||
*
|
||||
* @param string $filter
|
||||
* @return array|false
|
||||
*/
|
||||
public function getQueryForFilter($filter) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $parameter
|
||||
* @return string
|
||||
*/
|
||||
protected function convertParameterToComment($parameter, $maxLength = 0) {
|
||||
if (preg_match('/^\<parameter\>(\d*)\<\/parameter\>$/', $parameter, $matches)) {
|
||||
try {
|
||||
$comment = $this->commentsManager->get((int) $matches[1]);
|
||||
$message = $comment->getMessage();
|
||||
$message = str_replace("\n", '<br />', str_replace(['<', '>'], ['<', '>'], $message));
|
||||
|
||||
if ($maxLength && isset($message[$maxLength + 20])) {
|
||||
$findSpace = strpos($message, ' ', $maxLength);
|
||||
if ($findSpace !== false && $findSpace < $maxLength + 20) {
|
||||
return substr($message, 0, $findSpace) . '…';
|
||||
}
|
||||
return substr($message, 0, $maxLength + 20) . '…';
|
||||
}
|
||||
|
||||
return $message;
|
||||
} catch (NotFoundException $e) {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
<?php
|
||||
/**
|
||||
* @author Joas Schilling <nickvergessen@owncloud.com>
|
||||
*
|
||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Comments\Activity;
|
||||
|
||||
use OCP\Activity\IManager;
|
||||
use OCP\App\IAppManager;
|
||||
use OCP\Comments\CommentsEvent;
|
||||
use OCP\Files\Config\IMountProviderCollection;
|
||||
use OCP\Files\IRootFolder;
|
||||
use OCP\Files\Node;
|
||||
use OCP\IUser;
|
||||
use OCP\IUserSession;
|
||||
use OCP\Share;
|
||||
|
||||
class Listener {
|
||||
/** @var IManager */
|
||||
protected $activityManager;
|
||||
/** @var IUserSession */
|
||||
protected $session;
|
||||
/** @var \OCP\App\IAppManager */
|
||||
protected $appManager;
|
||||
/** @var \OCP\Files\Config\IMountProviderCollection */
|
||||
protected $mountCollection;
|
||||
/** @var \OCP\Files\IRootFolder */
|
||||
protected $rootFolder;
|
||||
|
||||
/**
|
||||
* Listener constructor.
|
||||
*
|
||||
* @param IManager $activityManager
|
||||
* @param IUserSession $session
|
||||
* @param IAppManager $appManager
|
||||
* @param IMountProviderCollection $mountCollection
|
||||
* @param IRootFolder $rootFolder
|
||||
*/
|
||||
public function __construct(IManager $activityManager,
|
||||
IUserSession $session,
|
||||
IAppManager $appManager,
|
||||
IMountProviderCollection $mountCollection,
|
||||
IRootFolder $rootFolder) {
|
||||
$this->activityManager = $activityManager;
|
||||
$this->session = $session;
|
||||
$this->appManager = $appManager;
|
||||
$this->mountCollection = $mountCollection;
|
||||
$this->rootFolder = $rootFolder;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param CommentsEvent $event
|
||||
*/
|
||||
public function commentEvent(CommentsEvent $event) {
|
||||
if ($event->getComment()->getObjectType() !== 'files'
|
||||
|| !in_array($event->getEvent(), [CommentsEvent::EVENT_ADD])
|
||||
|| !$this->appManager->isInstalled('activity')) {
|
||||
// Comment not for file, not adding a comment or no activity-app enabled (save the energy)
|
||||
return;
|
||||
}
|
||||
|
||||
// Get all mount point owners
|
||||
$cache = $this->mountCollection->getMountCache();
|
||||
$mounts = $cache->getMountsForFileId($event->getComment()->getObjectId());
|
||||
if (empty($mounts)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$users = [];
|
||||
foreach ($mounts as $mount) {
|
||||
$owner = $mount->getUser()->getUID();
|
||||
$ownerFolder = $this->rootFolder->getUserFolder($owner);
|
||||
$nodes = $ownerFolder->getById($event->getComment()->getObjectId());
|
||||
if (!empty($nodes)) {
|
||||
/** @var Node $node */
|
||||
$node = array_shift($nodes);
|
||||
$path = $node->getPath();
|
||||
if (strpos($path, '/' . $owner . '/files/') === 0) {
|
||||
$path = substr($path, strlen('/' . $owner . '/files'));
|
||||
}
|
||||
// Get all users that have access to the mount point
|
||||
$users = array_merge($users, Share::getUsersSharingFile($path, $owner, true, true));
|
||||
}
|
||||
}
|
||||
|
||||
$actor = $this->session->getUser();
|
||||
if ($actor instanceof IUser) {
|
||||
$actor = $actor->getUID();
|
||||
} else {
|
||||
$actor = '';
|
||||
}
|
||||
|
||||
$activity = $this->activityManager->generateEvent();
|
||||
$activity->setApp(Extension::APP_NAME)
|
||||
->setType(Extension::APP_NAME)
|
||||
->setAuthor($actor)
|
||||
->setObject($event->getComment()->getObjectType(), $event->getComment()->getObjectId())
|
||||
->setMessage(Extension::ADD_COMMENT_MESSAGE, [
|
||||
$event->getComment()->getId(),
|
||||
]);
|
||||
|
||||
foreach ($users as $user => $path) {
|
||||
$activity->setAffectedUser($user);
|
||||
|
||||
$activity->setSubject(Extension::ADD_COMMENT_SUBJECT, [
|
||||
$actor,
|
||||
$path,
|
||||
]);
|
||||
$this->activityManager->publish($activity);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,9 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
||||
*
|
||||
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
* @author Lukas Reschke <lukas@statuscode.ch>
|
||||
* @author Joas Schilling <nickvergessen@owncloud.com>
|
||||
* @author Vincent Petry <pvince81@owncloud.com>
|
||||
*
|
||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
@@ -28,35 +25,29 @@ $eventDispatcher->addListener(
|
||||
'OCA\Files::loadAdditionalScripts',
|
||||
function() {
|
||||
\OCP\Util::addScript('oc-backbone-webdav');
|
||||
\OCP\Util::addScript('comments', 'merged');
|
||||
\OCP\Util::addStyle('comments', 'autocomplete');
|
||||
\OCP\Util::addScript('comments', 'app');
|
||||
\OCP\Util::addScript('comments', 'commentmodel');
|
||||
\OCP\Util::addScript('comments', 'commentcollection');
|
||||
\OCP\Util::addScript('comments', 'commentsummarymodel');
|
||||
\OCP\Util::addScript('comments', 'commentstabview');
|
||||
\OCP\Util::addScript('comments', 'filesplugin');
|
||||
\OCP\Util::addStyle('comments', 'comments');
|
||||
}
|
||||
);
|
||||
|
||||
$eventDispatcher->addListener(\OCP\Comments\CommentsEntityEvent::EVENT_ENTITY, function(\OCP\Comments\CommentsEntityEvent $event) {
|
||||
$event->addEntityCollection('files', function($name) {
|
||||
$nodes = \OC::$server->getUserFolder()->getById(intval($name));
|
||||
return !empty($nodes);
|
||||
});
|
||||
});
|
||||
|
||||
$notificationManager = \OC::$server->getNotificationManager();
|
||||
$notificationManager->registerNotifier(
|
||||
function() {
|
||||
$application = new \OCP\AppFramework\App('comments');
|
||||
return $application->getContainer()->query(\OCA\Comments\Notification\Notifier::class);
|
||||
},
|
||||
function () {
|
||||
$l = \OC::$server->getL10N('comments');
|
||||
return ['id' => 'comments', 'name' => $l->t('Comments')];
|
||||
}
|
||||
);
|
||||
|
||||
$commentsManager = \OC::$server->getCommentsManager();
|
||||
$commentsManager->registerEventHandler(function () {
|
||||
$activityManager = \OC::$server->getActivityManager();
|
||||
$activityManager->registerExtension(function() {
|
||||
$application = new \OCP\AppFramework\App('comments');
|
||||
/** @var \OCA\Comments\EventHandler $handler */
|
||||
$handler = $application->getContainer()->query(\OCA\Comments\EventHandler::class);
|
||||
return $handler;
|
||||
/** @var \OCA\Comments\Activity\Extension $extension */
|
||||
$extension = $application->getContainer()->query('OCA\Comments\Activity\Extension');
|
||||
return $extension;
|
||||
});
|
||||
|
||||
$managerListener = function(\OCP\Comments\CommentsEvent $event) use ($activityManager) {
|
||||
$application = new \OCP\AppFramework\App('comments');
|
||||
/** @var \OCA\Comments\Activity\Listener $listener */
|
||||
$listener = $application->getContainer()->query('OCA\Comments\Activity\Listener');
|
||||
$listener->commentEvent($event);
|
||||
};
|
||||
|
||||
$eventDispatcher->addListener(\OCP\Comments\CommentsEvent::EVENT_ADD, $managerListener);
|
||||
|
||||
@@ -4,34 +4,13 @@
|
||||
<name>Comments</name>
|
||||
<description>Files app plugin to add comments to files</description>
|
||||
<licence>AGPL</licence>
|
||||
<author>Arthur Schiwon</author>
|
||||
<author>Vincent Petry</author>
|
||||
<author>Arthur Shiwon, Vincent Petry</author>
|
||||
<default_enable/>
|
||||
<version>1.3.0</version>
|
||||
<version>0.2</version>
|
||||
<dependencies>
|
||||
<nextcloud min-version="13" max-version="13" />
|
||||
<owncloud min-version="9.0" max-version="9.0" />
|
||||
</dependencies>
|
||||
<types>
|
||||
<logging/>
|
||||
</types>
|
||||
|
||||
<activity>
|
||||
<settings>
|
||||
<setting>OCA\Comments\Activity\Setting</setting>
|
||||
</settings>
|
||||
|
||||
<filters>
|
||||
<filter>OCA\Comments\Activity\Filter</filter>
|
||||
</filters>
|
||||
|
||||
<providers>
|
||||
<provider>OCA\Comments\Activity\Provider</provider>
|
||||
</providers>
|
||||
</activity>
|
||||
|
||||
<collaboration>
|
||||
<plugins>
|
||||
<plugin type="autocomplete-sort">OCA\Comments\Collaboration\CommentersSorter</plugin>
|
||||
</plugins>
|
||||
</collaboration>
|
||||
</info>
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
||||
*
|
||||
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
|
||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
||||
*
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
return [
|
||||
'routes' => [
|
||||
['name' => 'Notifications#view', 'url' => '/notifications/view/{id}', 'verb' => 'GET'],
|
||||
]
|
||||
];
|
||||
@@ -1,7 +0,0 @@
|
||||
<?php
|
||||
|
||||
// autoload.php @generated by Composer
|
||||
|
||||
require_once __DIR__ . '/composer/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInitComments::getLoader();
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"config" : {
|
||||
"vendor-dir": ".",
|
||||
"optimize-autoloader": true,
|
||||
"classmap-authoritative": true,
|
||||
"autoloader-suffix": "Comments"
|
||||
},
|
||||
"autoload" : {
|
||||
"psr-4": {
|
||||
"OCA\\Comments\\": "../lib/"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,444 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Composer.
|
||||
*
|
||||
* (c) Nils Adermann <naderman@naderman.de>
|
||||
* Jordi Boggiano <j.boggiano@seld.be>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Composer\Autoload;
|
||||
|
||||
/**
|
||||
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
|
||||
*
|
||||
* $loader = new \Composer\Autoload\ClassLoader();
|
||||
*
|
||||
* // register classes with namespaces
|
||||
* $loader->add('Symfony\Component', __DIR__.'/component');
|
||||
* $loader->add('Symfony', __DIR__.'/framework');
|
||||
*
|
||||
* // activate the autoloader
|
||||
* $loader->register();
|
||||
*
|
||||
* // to enable searching the include path (eg. for PEAR packages)
|
||||
* $loader->setUseIncludePath(true);
|
||||
*
|
||||
* In this example, if you try to use a class in the Symfony\Component
|
||||
* namespace or one of its children (Symfony\Component\Console for instance),
|
||||
* the autoloader will first look for the class under the component/
|
||||
* directory, and it will then fallback to the framework/ directory if not
|
||||
* found before giving up.
|
||||
*
|
||||
* This class is loosely based on the Symfony UniversalClassLoader.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Jordi Boggiano <j.boggiano@seld.be>
|
||||
* @see http://www.php-fig.org/psr/psr-0/
|
||||
* @see http://www.php-fig.org/psr/psr-4/
|
||||
*/
|
||||
class ClassLoader
|
||||
{
|
||||
// PSR-4
|
||||
private $firstCharsPsr4 = array();
|
||||
private $prefixLengthsPsr4 = array(); // For BC with legacy static maps
|
||||
private $prefixDirsPsr4 = array();
|
||||
private $fallbackDirsPsr4 = array();
|
||||
|
||||
// PSR-0
|
||||
private $prefixesPsr0 = array();
|
||||
private $fallbackDirsPsr0 = array();
|
||||
|
||||
private $useIncludePath = false;
|
||||
private $classMap = array();
|
||||
private $classMapAuthoritative = false;
|
||||
private $missingClasses = array();
|
||||
private $apcuPrefix;
|
||||
|
||||
public function getPrefixes()
|
||||
{
|
||||
if (!empty($this->prefixesPsr0)) {
|
||||
return call_user_func_array('array_merge', $this->prefixesPsr0);
|
||||
}
|
||||
|
||||
return array();
|
||||
}
|
||||
|
||||
public function getPrefixesPsr4()
|
||||
{
|
||||
return $this->prefixDirsPsr4;
|
||||
}
|
||||
|
||||
public function getFallbackDirs()
|
||||
{
|
||||
return $this->fallbackDirsPsr0;
|
||||
}
|
||||
|
||||
public function getFallbackDirsPsr4()
|
||||
{
|
||||
return $this->fallbackDirsPsr4;
|
||||
}
|
||||
|
||||
public function getClassMap()
|
||||
{
|
||||
return $this->classMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $classMap Class to filename map
|
||||
*/
|
||||
public function addClassMap(array $classMap)
|
||||
{
|
||||
if ($this->classMap) {
|
||||
$this->classMap = array_merge($this->classMap, $classMap);
|
||||
} else {
|
||||
$this->classMap = $classMap;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-0 directories for a given prefix, either
|
||||
* appending or prepending to the ones previously set for this prefix.
|
||||
*
|
||||
* @param string $prefix The prefix
|
||||
* @param array|string $paths The PSR-0 root directories
|
||||
* @param bool $prepend Whether to prepend the directories
|
||||
*/
|
||||
public function add($prefix, $paths, $prepend = false)
|
||||
{
|
||||
if (!$prefix) {
|
||||
if ($prepend) {
|
||||
$this->fallbackDirsPsr0 = array_merge(
|
||||
(array) $paths,
|
||||
$this->fallbackDirsPsr0
|
||||
);
|
||||
} else {
|
||||
$this->fallbackDirsPsr0 = array_merge(
|
||||
$this->fallbackDirsPsr0,
|
||||
(array) $paths
|
||||
);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$first = $prefix[0];
|
||||
if (!isset($this->prefixesPsr0[$first][$prefix])) {
|
||||
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
|
||||
|
||||
return;
|
||||
}
|
||||
if ($prepend) {
|
||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||
(array) $paths,
|
||||
$this->prefixesPsr0[$first][$prefix]
|
||||
);
|
||||
} else {
|
||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||
$this->prefixesPsr0[$first][$prefix],
|
||||
(array) $paths
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-4 directories for a given namespace, either
|
||||
* appending or prepending to the ones previously set for this namespace.
|
||||
*
|
||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||
* @param array|string $paths The PSR-4 base directories
|
||||
* @param bool $prepend Whether to prepend the directories
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function addPsr4($prefix, $paths, $prepend = false)
|
||||
{
|
||||
if (!$prefix) {
|
||||
// Register directories for the root namespace.
|
||||
if ($prepend) {
|
||||
$this->fallbackDirsPsr4 = array_merge(
|
||||
(array) $paths,
|
||||
$this->fallbackDirsPsr4
|
||||
);
|
||||
} else {
|
||||
$this->fallbackDirsPsr4 = array_merge(
|
||||
$this->fallbackDirsPsr4,
|
||||
(array) $paths
|
||||
);
|
||||
}
|
||||
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
|
||||
// Register directories for a new namespace.
|
||||
if ('\\' !== substr($prefix, -1)) {
|
||||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||
}
|
||||
$this->firstCharsPsr4[$prefix[0]] = true;
|
||||
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
||||
} elseif ($prepend) {
|
||||
// Prepend directories for an already registered namespace.
|
||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||
(array) $paths,
|
||||
$this->prefixDirsPsr4[$prefix]
|
||||
);
|
||||
} else {
|
||||
// Append directories for an already registered namespace.
|
||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||
$this->prefixDirsPsr4[$prefix],
|
||||
(array) $paths
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-0 directories for a given prefix,
|
||||
* replacing any others previously set for this prefix.
|
||||
*
|
||||
* @param string $prefix The prefix
|
||||
* @param array|string $paths The PSR-0 base directories
|
||||
*/
|
||||
public function set($prefix, $paths)
|
||||
{
|
||||
if (!$prefix) {
|
||||
$this->fallbackDirsPsr0 = (array) $paths;
|
||||
} else {
|
||||
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-4 directories for a given namespace,
|
||||
* replacing any others previously set for this namespace.
|
||||
*
|
||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||
* @param array|string $paths The PSR-4 base directories
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function setPsr4($prefix, $paths)
|
||||
{
|
||||
if (!$prefix) {
|
||||
$this->fallbackDirsPsr4 = (array) $paths;
|
||||
} else {
|
||||
if ('\\' !== substr($prefix, -1)) {
|
||||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||
}
|
||||
$this->firstCharsPsr4[$prefix[0]] = true;
|
||||
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns on searching the include path for class files.
|
||||
*
|
||||
* @param bool $useIncludePath
|
||||
*/
|
||||
public function setUseIncludePath($useIncludePath)
|
||||
{
|
||||
$this->useIncludePath = $useIncludePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Can be used to check if the autoloader uses the include path to check
|
||||
* for classes.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function getUseIncludePath()
|
||||
{
|
||||
return $this->useIncludePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns off searching the prefix and fallback directories for classes
|
||||
* that have not been registered with the class map.
|
||||
*
|
||||
* @param bool $classMapAuthoritative
|
||||
*/
|
||||
public function setClassMapAuthoritative($classMapAuthoritative)
|
||||
{
|
||||
$this->classMapAuthoritative = $classMapAuthoritative;
|
||||
}
|
||||
|
||||
/**
|
||||
* Should class lookup fail if not found in the current class map?
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isClassMapAuthoritative()
|
||||
{
|
||||
return $this->classMapAuthoritative;
|
||||
}
|
||||
|
||||
/**
|
||||
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
|
||||
*
|
||||
* @param string|null $apcuPrefix
|
||||
*/
|
||||
public function setApcuPrefix($apcuPrefix)
|
||||
{
|
||||
$this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* The APCu prefix in use, or null if APCu caching is not enabled.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getApcuPrefix()
|
||||
{
|
||||
return $this->apcuPrefix;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers this instance as an autoloader.
|
||||
*
|
||||
* @param bool $prepend Whether to prepend the autoloader or not
|
||||
*/
|
||||
public function register($prepend = false)
|
||||
{
|
||||
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregisters this instance as an autoloader.
|
||||
*/
|
||||
public function unregister()
|
||||
{
|
||||
spl_autoload_unregister(array($this, 'loadClass'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the given class or interface.
|
||||
*
|
||||
* @param string $class The name of the class
|
||||
* @return bool|null True if loaded, null otherwise
|
||||
*/
|
||||
public function loadClass($class)
|
||||
{
|
||||
if ($file = $this->findFile($class)) {
|
||||
includeFile($file);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the path to the file where the class is defined.
|
||||
*
|
||||
* @param string $class The name of the class
|
||||
*
|
||||
* @return string|false The path if found, false otherwise
|
||||
*/
|
||||
public function findFile($class)
|
||||
{
|
||||
// class map lookup
|
||||
if (isset($this->classMap[$class])) {
|
||||
return $this->classMap[$class];
|
||||
}
|
||||
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
|
||||
return false;
|
||||
}
|
||||
if (null !== $this->apcuPrefix) {
|
||||
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
|
||||
if ($hit) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
$file = $this->findFileWithExtension($class, '.php');
|
||||
|
||||
// Search for Hack files if we are running on HHVM
|
||||
if (false === $file && defined('HHVM_VERSION')) {
|
||||
$file = $this->findFileWithExtension($class, '.hh');
|
||||
}
|
||||
|
||||
if (null !== $this->apcuPrefix) {
|
||||
apcu_add($this->apcuPrefix.$class, $file);
|
||||
}
|
||||
|
||||
if (false === $file) {
|
||||
// Remember that this class does not exist.
|
||||
$this->missingClasses[$class] = true;
|
||||
}
|
||||
|
||||
return $file;
|
||||
}
|
||||
|
||||
private function findFileWithExtension($class, $ext)
|
||||
{
|
||||
// PSR-4 lookup
|
||||
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
|
||||
|
||||
$first = $class[0];
|
||||
if (isset($this->firstCharsPsr4[$first]) || isset($this->prefixLengthsPsr4[$first])) {
|
||||
$subPath = $class;
|
||||
while (false !== $lastPos = strrpos($subPath, '\\')) {
|
||||
$subPath = substr($subPath, 0, $lastPos);
|
||||
$search = $subPath.'\\';
|
||||
if (isset($this->prefixDirsPsr4[$search])) {
|
||||
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
|
||||
foreach ($this->prefixDirsPsr4[$search] as $dir) {
|
||||
if (file_exists($file = $dir . $pathEnd)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-4 fallback dirs
|
||||
foreach ($this->fallbackDirsPsr4 as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 lookup
|
||||
if (false !== $pos = strrpos($class, '\\')) {
|
||||
// namespaced class name
|
||||
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
|
||||
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
|
||||
} else {
|
||||
// PEAR-like class name
|
||||
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
|
||||
}
|
||||
|
||||
if (isset($this->prefixesPsr0[$first])) {
|
||||
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
|
||||
if (0 === strpos($class, $prefix)) {
|
||||
foreach ($dirs as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 fallback dirs
|
||||
foreach ($this->fallbackDirsPsr0 as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 include paths.
|
||||
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Scope isolated include.
|
||||
*
|
||||
* Prevents access to $this/self from included files.
|
||||
*/
|
||||
function includeFile($file)
|
||||
{
|
||||
include $file;
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
|
||||
Copyright (c) Nils Adermann, Jordi Boggiano
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is furnished
|
||||
to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
<?php
|
||||
|
||||
// autoload_classmap.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = $vendorDir;
|
||||
|
||||
return array(
|
||||
'OCA\\Comments\\Activity\\Filter' => $baseDir . '/../lib/Activity/Filter.php',
|
||||
'OCA\\Comments\\Activity\\Listener' => $baseDir . '/../lib/Activity/Listener.php',
|
||||
'OCA\\Comments\\Activity\\Provider' => $baseDir . '/../lib/Activity/Provider.php',
|
||||
'OCA\\Comments\\Activity\\Setting' => $baseDir . '/../lib/Activity/Setting.php',
|
||||
'OCA\\Comments\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php',
|
||||
'OCA\\Comments\\Collaboration\\CommentersSorter' => $baseDir . '/../lib/Collaboration/CommentersSorter.php',
|
||||
'OCA\\Comments\\Controller\\Notifications' => $baseDir . '/../lib/Controller/Notifications.php',
|
||||
'OCA\\Comments\\EventHandler' => $baseDir . '/../lib/EventHandler.php',
|
||||
'OCA\\Comments\\JSSettingsHelper' => $baseDir . '/../lib/JSSettingsHelper.php',
|
||||
'OCA\\Comments\\Notification\\Listener' => $baseDir . '/../lib/Notification/Listener.php',
|
||||
'OCA\\Comments\\Notification\\Notifier' => $baseDir . '/../lib/Notification/Notifier.php',
|
||||
);
|
||||
@@ -1,9 +0,0 @@
|
||||
<?php
|
||||
|
||||
// autoload_namespaces.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = $vendorDir;
|
||||
|
||||
return array(
|
||||
);
|
||||
@@ -1,10 +0,0 @@
|
||||
<?php
|
||||
|
||||
// autoload_psr4.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = $vendorDir;
|
||||
|
||||
return array(
|
||||
'OCA\\Comments\\' => array($baseDir . '/../lib'),
|
||||
);
|
||||
@@ -1,43 +0,0 @@
|
||||
<?php
|
||||
|
||||
// autoload_real.php @generated by Composer
|
||||
|
||||
class ComposerAutoloaderInitComments
|
||||
{
|
||||
private static $loader;
|
||||
|
||||
public static function loadClassLoader($class)
|
||||
{
|
||||
if ('Composer\Autoload\ClassLoader' === $class) {
|
||||
require __DIR__ . '/ClassLoader.php';
|
||||
}
|
||||
}
|
||||
|
||||
public static function getLoader()
|
||||
{
|
||||
if (null !== self::$loader) {
|
||||
return self::$loader;
|
||||
}
|
||||
|
||||
spl_autoload_register(array('ComposerAutoloaderInitComments', 'loadClassLoader'), true, true);
|
||||
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
||||
spl_autoload_unregister(array('ComposerAutoloaderInitComments', 'loadClassLoader'));
|
||||
|
||||
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
||||
if ($useStaticLoader) {
|
||||
require_once __DIR__ . '/autoload_static.php';
|
||||
|
||||
call_user_func(\Composer\Autoload\ComposerStaticInitComments::getInitializer($loader));
|
||||
} else {
|
||||
$classMap = require __DIR__ . '/autoload_classmap.php';
|
||||
if ($classMap) {
|
||||
$loader->addClassMap($classMap);
|
||||
}
|
||||
}
|
||||
|
||||
$loader->setClassMapAuthoritative(true);
|
||||
$loader->register(true);
|
||||
|
||||
return $loader;
|
||||
}
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
<?php
|
||||
|
||||
// autoload_static.php @generated by Composer
|
||||
|
||||
namespace Composer\Autoload;
|
||||
|
||||
class ComposerStaticInitComments
|
||||
{
|
||||
public static $firstCharsPsr4 = array (
|
||||
'O' => true,
|
||||
);
|
||||
|
||||
public static $prefixDirsPsr4 = array (
|
||||
'OCA\\Comments\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/../lib',
|
||||
),
|
||||
);
|
||||
|
||||
public static $classMap = array (
|
||||
'OCA\\Comments\\Activity\\Filter' => __DIR__ . '/..' . '/../lib/Activity/Filter.php',
|
||||
'OCA\\Comments\\Activity\\Listener' => __DIR__ . '/..' . '/../lib/Activity/Listener.php',
|
||||
'OCA\\Comments\\Activity\\Provider' => __DIR__ . '/..' . '/../lib/Activity/Provider.php',
|
||||
'OCA\\Comments\\Activity\\Setting' => __DIR__ . '/..' . '/../lib/Activity/Setting.php',
|
||||
'OCA\\Comments\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php',
|
||||
'OCA\\Comments\\Collaboration\\CommentersSorter' => __DIR__ . '/..' . '/../lib/Collaboration/CommentersSorter.php',
|
||||
'OCA\\Comments\\Controller\\Notifications' => __DIR__ . '/..' . '/../lib/Controller/Notifications.php',
|
||||
'OCA\\Comments\\EventHandler' => __DIR__ . '/..' . '/../lib/EventHandler.php',
|
||||
'OCA\\Comments\\JSSettingsHelper' => __DIR__ . '/..' . '/../lib/JSSettingsHelper.php',
|
||||
'OCA\\Comments\\Notification\\Listener' => __DIR__ . '/..' . '/../lib/Notification/Listener.php',
|
||||
'OCA\\Comments\\Notification\\Notifier' => __DIR__ . '/..' . '/../lib/Notification/Notifier.php',
|
||||
);
|
||||
|
||||
public static function getInitializer(ClassLoader $loader)
|
||||
{
|
||||
return \Closure::bind(function () use ($loader) {
|
||||
$loader->firstCharsPsr4 = ComposerStaticInitComments::$firstCharsPsr4;
|
||||
$loader->prefixDirsPsr4 = ComposerStaticInitComments::$prefixDirsPsr4;
|
||||
$loader->classMap = ComposerStaticInitComments::$classMap;
|
||||
|
||||
}, null, ClassLoader::class);
|
||||
}
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
/**
|
||||
* based upon apps/comments/js/vendor/At.js/dist/css/jquery.atwho.css,
|
||||
* only changed colors and font-weight
|
||||
*/
|
||||
|
||||
.atwho-view {
|
||||
position:absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
display: none;
|
||||
margin-top: 18px;
|
||||
background: $color-main-background;
|
||||
color: $color-main-text;
|
||||
border: 1px solid $color-border;
|
||||
border-radius: $border-radius;
|
||||
box-shadow: 0 0 5px $color-box-shadow;
|
||||
min-width: 120px;
|
||||
z-index: 11110 !important;
|
||||
}
|
||||
|
||||
.atwho-view .atwho-header {
|
||||
padding: 5px;
|
||||
margin: 5px;
|
||||
cursor: pointer;
|
||||
border-bottom: solid 1px $color-border;
|
||||
color: $color-main-text;
|
||||
font-size: 11px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.atwho-view .atwho-header .small {
|
||||
color: $color-main-text;
|
||||
float: right;
|
||||
padding-top: 2px;
|
||||
margin-right: -5px;
|
||||
font-size: 12px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.atwho-view .atwho-header:hover {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.atwho-view .cur {
|
||||
background: $color-primary;
|
||||
color: $color-primary-text;
|
||||
}
|
||||
.atwho-view .cur small {
|
||||
color: $color-primary-text;
|
||||
}
|
||||
.atwho-view strong {
|
||||
color: $color-main-text;
|
||||
font-weight: normal;
|
||||
}
|
||||
.atwho-view .cur strong {
|
||||
color: $color-primary-text;
|
||||
font-weight: normal;
|
||||
}
|
||||
.atwho-view ul {
|
||||
/* width: 100px; */
|
||||
list-style:none;
|
||||
padding:0;
|
||||
margin:auto;
|
||||
max-height: 200px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
.atwho-view ul li {
|
||||
display: block;
|
||||
padding: 5px 10px;
|
||||
border-bottom: 1px solid $color-border;
|
||||
cursor: pointer;
|
||||
}
|
||||
.atwho-view small {
|
||||
font-size: smaller;
|
||||
color: $color-main-text;
|
||||
font-weight: normal;
|
||||
}
|
||||
+33
-118
@@ -8,181 +8,95 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#commentsTabView .emptycontent {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
#commentsTabView .newCommentForm {
|
||||
position: relative;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
#commentsTabView .newCommentForm .message {
|
||||
width: calc(100% - 81px); /* 36 (left margin) + 30 (right padding) + 15 (right padding of surrounding box) */
|
||||
margin-left: 36px;
|
||||
padding-right: 30px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
#commentsTabView .newCommentForm .submit {
|
||||
position: absolute;
|
||||
bottom: 0px;
|
||||
right: 8px;
|
||||
width: 30px;
|
||||
margin: 0;
|
||||
padding: 7px 9px;
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
opacity: .3;
|
||||
}
|
||||
#commentsTabView .newCommentForm .submit:not(:disabled):hover,
|
||||
#commentsTabView .newCommentForm .submit:not(:disabled):focus {
|
||||
opacity: 1;
|
||||
width: 90%;
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
#commentsTabView .newCommentForm .submitLoading {
|
||||
background-position: left;
|
||||
|
||||
/* Match rules for '#commentsTabView .newCommentForm .submit' to place the
|
||||
loading icon at the same position as the confirm icon */
|
||||
position: absolute;
|
||||
bottom: 0px;
|
||||
right: 8px;
|
||||
width: 30px;
|
||||
margin: 0;
|
||||
padding: 7px 9px;
|
||||
|
||||
/* Match rules for 'input[type="submit"]' to place the loading icon at the
|
||||
same position as the confirm icon */
|
||||
min-height: 34px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
#commentsTabView .newCommentForm .cancel {
|
||||
margin-right: 6px;
|
||||
#commentsTabView .comment {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
#commentsTabView .newCommentForm div.message {
|
||||
resize: none;
|
||||
}
|
||||
|
||||
#commentsTabView .newCommentForm div.message:empty:before {
|
||||
content: attr(data-placeholder);
|
||||
color: grey;
|
||||
#commentsTabView .comment .avatar {
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
line-height: 28px;
|
||||
}
|
||||
|
||||
#commentsTabView .comment {
|
||||
position: relative;
|
||||
margin-bottom: 30px;
|
||||
word-wrap: break-word;
|
||||
overflow-wrap: break-word;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
#commentsTabView .comment .avatar,
|
||||
.atwho-view-ul * .avatar{
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
line-height: 32px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
#commentsTabView .comment .message .avatar,
|
||||
.atwho-view-ul * .avatar
|
||||
{
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
#activityTabView li.comment.collapsed .activitymessage,
|
||||
#commentsTabView .comment.collapsed .message {
|
||||
white-space: pre-wrap;
|
||||
white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
|
||||
white-space: -webkit-pre-wrap; /*Chrome & Safari */
|
||||
white-space: -pre-wrap; /* Opera 4-6 */
|
||||
white-space: -o-pre-wrap; /* Opera 7 */
|
||||
white-space: pre-wrap; /* css-3 */
|
||||
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
||||
word-break: break-all;
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
#activityTabView li.comment.collapsed .activitymessage,
|
||||
#commentsTabView .comment.collapsed .message {
|
||||
max-height: 70px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#activityTabView li.comment .message-overlay,
|
||||
#commentsTabView .comment .message-overlay {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#activityTabView li.comment.collapsed .message-overlay,
|
||||
#commentsTabView .comment.collapsed .message-overlay {
|
||||
display: block;
|
||||
position: absolute;
|
||||
position: absolute;
|
||||
z-index: 2;
|
||||
height: 50px;
|
||||
pointer-events: none;
|
||||
height: 50px;
|
||||
pointer-events: none;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
bottom: 0;
|
||||
background: -moz-linear-gradient(rgba(255,255,255,0), rgba(255,255,255,1));
|
||||
background: -webkit-linear-gradient(rgba(255,255,255,0), rgba(255,255,255,1));
|
||||
background: -o-linear-gradient(rgba(255,255,255,0), rgba(255,255,255,1));
|
||||
background: -ms-linear-gradient(rgba(255,255,255,0), rgba(255,255,255,1));
|
||||
background: linear-gradient(rgba(255,255,255,0), rgba(255,255,255,1));
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#00FFFFFF', endColorstr='#FFFFFFFF');
|
||||
background-repeat: no-repeat;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
#commentsTabView .authorRow>div:not(.contactsmenu-popover) {
|
||||
#commentsTabView .authorRow>div {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#commentsTabView .authorRow>div.hidden {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
#commentsTabView .comments li .message .avatar-name-wrapper,
|
||||
.atwho-view-ul * .avatar-name-wrapper,
|
||||
#commentsTabView .comment .authorRow {
|
||||
margin-bottom: 5px;
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#commentsTabView .comment:not(.newCommentRow) .message .avatar-name-wrapper:not(.currentUser),
|
||||
#commentsTabView .comment:not(.newCommentRow) .message .avatar-name-wrapper:not(.currentUser) .avatar,
|
||||
#commentsTabView .comment .authorRow .avatar:not(.currentUser),
|
||||
#commentsTabView .comment .authorRow .author:not(.currentUser) {
|
||||
cursor: pointer;
|
||||
#commentsTabView .comment .author {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.atwho-view-ul .avatar-name-wrapper,
|
||||
.atwho-view-ul .avatar-name-wrapper .avatar {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#commentsTabView .comments li .message .atwho-inserted {
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.atwho-view-ul * .avatar-name-wrapper {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#commentsTabView .comment .author,
|
||||
#commentsTabView .comment .date {
|
||||
opacity: .5;
|
||||
}
|
||||
#commentsTabView .comment .date {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
#commentsTabView .comments li .message {
|
||||
padding-left: 40px;
|
||||
display: inline-flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
#commentsTabView .comment .action {
|
||||
opacity: 0;
|
||||
padding: 5px;
|
||||
vertical-align: middle;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
#commentsTabView .comment:hover .action {
|
||||
@@ -193,8 +107,7 @@
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
#commentsTabView .comment .action.delete,
|
||||
#commentsTabView .comment .deleteLoading {
|
||||
#commentsTabView .comment .action.delete {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
}
|
||||
@@ -210,6 +123,8 @@
|
||||
#commentsTabView .message.error {
|
||||
color: #e9322d;
|
||||
border-color: #e9322d;
|
||||
-webkit-box-shadow: 0 0 6px #f8b9b7;
|
||||
-moz-box-shadow: 0 0 6px #f8b9b7;
|
||||
box-shadow: 0 0 6px #f8b9b7;
|
||||
}
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="32" width="32" viewBox="0 0 32 32"><path fill="#000" d="M16 3C7.163 3 0 7.925 0 14s7.163 11 16 11c.5 0 .98-.032 1.47-.063L26 32v-9.406c3.658-2.017 6-5.12 6-8.595 0-6.076-7.164-11-16-11z"/></svg>
|
||||
|
Before Width: | Height: | Size: 243 B |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="32" width="32" viewBox="0 0 32 32"><path fill="#fff" d="M16 3C7.163 3 0 7.925 0 14s7.163 11 16 11c.5 0 .98-.032 1.47-.063L26 32v-9.406c3.658-2.017 6-5.12 6-8.595 0-6.076-7.164-11-16-11z"/></svg>
|
||||
|
Before Width: | Height: | Size: 242 B |
@@ -1,59 +0,0 @@
|
||||
/*
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
* Copyright (c) 2016
|
||||
*
|
||||
* This file is licensed under the Affero General Public License version 3
|
||||
* or later.
|
||||
*
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
(function() {
|
||||
OCA.Comments.ActivityTabViewPlugin = {
|
||||
|
||||
/**
|
||||
* Prepare activity for display
|
||||
*
|
||||
* @param {OCA.Activity.ActivityModel} model for this activity
|
||||
* @param {jQuery} $el jQuery handle for this activity
|
||||
* @param {string} view The view that displayes this activity
|
||||
*/
|
||||
prepareModelForDisplay: function (model, $el, view) {
|
||||
if (model.get('app') !== 'comments' || model.get('type') !== 'comments') {
|
||||
return;
|
||||
}
|
||||
|
||||
if (view === 'ActivityTabView') {
|
||||
$el.addClass('comment');
|
||||
if (model.get('message') && this._isLong(model.get('message'))) {
|
||||
$el.addClass('collapsed');
|
||||
var $overlay = $('<div>').addClass('message-overlay');
|
||||
$el.find('.activitymessage').after($overlay);
|
||||
$el.on('click', this._onClickCollapsedComment);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/*
|
||||
* Copy of CommentsTabView._onClickComment()
|
||||
*/
|
||||
_onClickCollapsedComment: function(ev) {
|
||||
var $row = $(ev.target);
|
||||
if (!$row.is('.comment')) {
|
||||
$row = $row.closest('.comment');
|
||||
}
|
||||
$row.removeClass('collapsed');
|
||||
},
|
||||
|
||||
/*
|
||||
* Copy of CommentsTabView._isLong()
|
||||
*/
|
||||
_isLong: function(message) {
|
||||
return message.length > 250 || (message.match(/\n/g) || []).length > 1;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
})();
|
||||
|
||||
OC.Plugins.register('OCA.Activity.RenderingPlugins', OCA.Comments.ActivityTabViewPlugin);
|
||||
@@ -9,20 +9,7 @@
|
||||
*/
|
||||
|
||||
(function(OC, OCA) {
|
||||
|
||||
_.extend(OC.Files.Client, {
|
||||
PROPERTY_FILEID: '{' + OC.Files.Client.NS_OWNCLOUD + '}id',
|
||||
PROPERTY_MESSAGE: '{' + OC.Files.Client.NS_OWNCLOUD + '}message',
|
||||
PROPERTY_ACTORTYPE: '{' + OC.Files.Client.NS_OWNCLOUD + '}actorType',
|
||||
PROPERTY_ACTORID: '{' + OC.Files.Client.NS_OWNCLOUD + '}actorId',
|
||||
PROPERTY_ISUNREAD: '{' + OC.Files.Client.NS_OWNCLOUD + '}isUnread',
|
||||
PROPERTY_OBJECTID: '{' + OC.Files.Client.NS_OWNCLOUD + '}objectId',
|
||||
PROPERTY_OBJECTTYPE: '{' + OC.Files.Client.NS_OWNCLOUD + '}objectType',
|
||||
PROPERTY_ACTORDISPLAYNAME: '{' + OC.Files.Client.NS_OWNCLOUD + '}actorDisplayName',
|
||||
PROPERTY_CREATIONDATETIME: '{' + OC.Files.Client.NS_OWNCLOUD + '}creationDateTime',
|
||||
PROPERTY_MENTIONS: '{' + OC.Files.Client.NS_OWNCLOUD + '}mentions'
|
||||
});
|
||||
|
||||
var NS_OWNCLOUD = 'http://owncloud.org/ns';
|
||||
/**
|
||||
* @class OCA.Comments.CommentModel
|
||||
* @classdesc
|
||||
@@ -40,16 +27,15 @@
|
||||
},
|
||||
|
||||
davProperties: {
|
||||
'id': OC.Files.Client.PROPERTY_FILEID,
|
||||
'message': OC.Files.Client.PROPERTY_MESSAGE,
|
||||
'actorType': OC.Files.Client.PROPERTY_ACTORTYPE,
|
||||
'actorId': OC.Files.Client.PROPERTY_ACTORID,
|
||||
'actorDisplayName': OC.Files.Client.PROPERTY_ACTORDISPLAYNAME,
|
||||
'creationDateTime': OC.Files.Client.PROPERTY_CREATIONDATETIME,
|
||||
'objectType': OC.Files.Client.PROPERTY_OBJECTTYPE,
|
||||
'objectId': OC.Files.Client.PROPERTY_OBJECTID,
|
||||
'isUnread': OC.Files.Client.PROPERTY_ISUNREAD,
|
||||
'mentions': OC.Files.Client.PROPERTY_MENTIONS
|
||||
'id': '{' + NS_OWNCLOUD + '}id',
|
||||
'message': '{' + NS_OWNCLOUD + '}message',
|
||||
'actorType': '{' + NS_OWNCLOUD + '}actorType',
|
||||
'actorId': '{' + NS_OWNCLOUD + '}actorId',
|
||||
'actorDisplayName': '{' + NS_OWNCLOUD + '}actorDisplayName',
|
||||
'creationDateTime': '{' + NS_OWNCLOUD + '}creationDateTime',
|
||||
'objectType': '{' + NS_OWNCLOUD + '}objectType',
|
||||
'objectId': '{' + NS_OWNCLOUD + '}objectId',
|
||||
'isUnread': '{' + NS_OWNCLOUD + '}isUnread'
|
||||
},
|
||||
|
||||
parse: function(data) {
|
||||
@@ -62,32 +48,11 @@
|
||||
creationDateTime: data.creationDateTime,
|
||||
objectType: data.objectType,
|
||||
objectId: data.objectId,
|
||||
isUnread: (data.isUnread === 'true'),
|
||||
mentions: this._parseMentions(data.mentions)
|
||||
isUnread: (data.isUnread === 'true')
|
||||
};
|
||||
},
|
||||
|
||||
_parseMentions: function(mentions) {
|
||||
if(_.isUndefined(mentions)) {
|
||||
return {};
|
||||
}
|
||||
var result = {};
|
||||
for(var i in mentions) {
|
||||
var mention = mentions[i];
|
||||
if(_.isUndefined(mention.localName) || mention.localName !== 'mention') {
|
||||
continue;
|
||||
}
|
||||
result[i] = {};
|
||||
for (var child = mention.firstChild; child; child = child.nextSibling) {
|
||||
if(_.isUndefined(child.localName) || !child.localName.startsWith('mention')) {
|
||||
continue;
|
||||
}
|
||||
result[i][child.localName] = child.textContent;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
});
|
||||
|
||||
OCA.Comments.CommentModel = CommentModel;
|
||||
})(OC, OCA);
|
||||
|
||||
|
||||
@@ -14,8 +14,7 @@
|
||||
var TEMPLATE =
|
||||
'<ul class="comments">' +
|
||||
'</ul>' +
|
||||
'<div class="emptycontent hidden"><div class="icon-comment"></div>' +
|
||||
'<p>{{emptyResultLabel}}</p></div>' +
|
||||
'<div class="empty hidden">{{emptyResultLabel}}</div>' +
|
||||
'<input type="button" class="showMore hidden" value="{{moreLabel}}"' +
|
||||
' name="show-more" id="show-more" />' +
|
||||
'<div class="loading hidden" style="height: 50px"></div>';
|
||||
@@ -23,18 +22,19 @@
|
||||
var EDIT_COMMENT_TEMPLATE =
|
||||
'<div class="newCommentRow comment" data-id="{{id}}">' +
|
||||
' <div class="authorRow">' +
|
||||
' <div class="avatar currentUser" data-username="{{actorId}}"></div>' +
|
||||
' <div class="author currentUser">{{actorDisplayName}}</div>' +
|
||||
' {{#if avatarEnabled}}' +
|
||||
' <div class="avatar" data-username="{{actorId}}"></div>' +
|
||||
' {{/if}}' +
|
||||
' <div class="author">{{actorDisplayName}}</div>' +
|
||||
'{{#if isEditMode}}' +
|
||||
' <a href="#" class="action delete icon icon-delete has-tooltip" title="{{deleteTooltip}}"></a>' +
|
||||
' <div class="deleteLoading icon-loading-small hidden"></div>'+
|
||||
'{{/if}}' +
|
||||
' </div>' +
|
||||
' <form class="newCommentForm">' +
|
||||
' <div contentEditable="true" class="message" data-placeholder="{{newMessagePlaceholder}}">{{message}}</div>' +
|
||||
' <input class="submit icon-confirm" type="submit" value="" />' +
|
||||
' <textarea class="message" placeholder="{{newMessagePlaceholder}}">{{{message}}}</textarea>' +
|
||||
' <input class="submit" type="submit" value="{{submitText}}" />' +
|
||||
'{{#if isEditMode}}' +
|
||||
' <input class="cancel pull-right" type="button" value="{{cancelText}}" />' +
|
||||
' <input class="cancel" type="button" value="{{cancelText}}" />' +
|
||||
'{{/if}}' +
|
||||
' <div class="submitLoading icon-loading-small hidden"></div>'+
|
||||
' </form>' +
|
||||
@@ -43,12 +43,14 @@
|
||||
var COMMENT_TEMPLATE =
|
||||
'<li class="comment{{#if isUnread}} unread{{/if}}{{#if isLong}} collapsed{{/if}}" data-id="{{id}}">' +
|
||||
' <div class="authorRow">' +
|
||||
' <div class="avatar{{#if isUserAuthor}} currentUser{{/if}}" {{#if actorId}}data-username="{{actorId}}"{{/if}}> </div>' +
|
||||
' <div class="author{{#if isUserAuthor}} currentUser{{/if}}">{{actorDisplayName}}</div>' +
|
||||
' {{#if avatarEnabled}}' +
|
||||
' <div class="avatar" {{#if actorId}}data-username="{{actorId}}"{{/if}}> </div>' +
|
||||
' {{/if}}' +
|
||||
' <div class="author">{{actorDisplayName}}</div>' +
|
||||
'{{#if isUserAuthor}}' +
|
||||
' <a href="#" class="action edit icon icon-rename has-tooltip" title="{{editTooltip}}"></a>' +
|
||||
'{{/if}}' +
|
||||
' <div class="date has-tooltip live-relative-timestamp" data-timestamp="{{timestamp}}" title="{{altDate}}">{{date}}</div>' +
|
||||
' <div class="date has-tooltip" title="{{altDate}}">{{date}}</div>' +
|
||||
' </div>' +
|
||||
' <div class="message">{{{formattedMessage}}}</div>' +
|
||||
'{{#if isLong}}' +
|
||||
@@ -63,7 +65,6 @@
|
||||
/** @lends OCA.Comments.CommentsTabView.prototype */ {
|
||||
id: 'commentsTabView',
|
||||
className: 'tab commentsTabView',
|
||||
_autoCompleteData: undefined,
|
||||
|
||||
events: {
|
||||
'submit .newCommentForm': '_onSubmitComment',
|
||||
@@ -71,11 +72,7 @@
|
||||
'click .action.edit': '_onClickEditComment',
|
||||
'click .action.delete': '_onClickDeleteComment',
|
||||
'click .cancel': '_onClickCloseComment',
|
||||
'click .comment': '_onClickComment',
|
||||
'keyup div.message': '_onTextChange',
|
||||
'change div.message': '_onTextChange',
|
||||
'input div.message': '_onTextChange',
|
||||
'paste div.message': '_onPaste'
|
||||
'click .comment': '_onClickComment'
|
||||
},
|
||||
|
||||
_commentMaxLength: 1000,
|
||||
@@ -86,12 +83,13 @@
|
||||
this.collection.on('request', this._onRequest, this);
|
||||
this.collection.on('sync', this._onEndRequest, this);
|
||||
this.collection.on('add', this._onAddModel, this);
|
||||
this.collection.on('change:message', this._onChangeModel, this);
|
||||
|
||||
this._avatarsEnabled = !!OC.config.enable_avatars;
|
||||
|
||||
this._commentMaxThreshold = this._commentMaxLength * 0.9;
|
||||
|
||||
// TODO: error handling
|
||||
_.bindAll(this, '_onTypeComment', '_initAutoComplete', '_onAutoComplete');
|
||||
_.bindAll(this, '_onTypeComment');
|
||||
},
|
||||
|
||||
template: function(params) {
|
||||
@@ -100,6 +98,7 @@
|
||||
}
|
||||
var currentUser = OC.getCurrentUser();
|
||||
return this._template(_.extend({
|
||||
avatarEnabled: this._avatarsEnabled,
|
||||
actorId: currentUser.uid,
|
||||
actorDisplayName: currentUser.displayName
|
||||
}, params));
|
||||
@@ -111,9 +110,10 @@
|
||||
}
|
||||
var currentUser = OC.getCurrentUser();
|
||||
return this._editCommentTemplate(_.extend({
|
||||
avatarEnabled: this._avatarsEnabled,
|
||||
actorId: currentUser.uid,
|
||||
actorDisplayName: currentUser.displayName,
|
||||
newMessagePlaceholder: t('comments', 'New comment …'),
|
||||
newMessagePlaceholder: t('comments', 'Type in a new comment...'),
|
||||
deleteTooltip: t('comments', 'Delete comment'),
|
||||
submitText: t('comments', 'Post'),
|
||||
cancelText: t('comments', 'Cancel')
|
||||
@@ -126,6 +126,7 @@
|
||||
}
|
||||
|
||||
params = _.extend({
|
||||
avatarEnabled: this._avatarsEnabled,
|
||||
editTooltip: t('comments', 'Edit comment'),
|
||||
isUserAuthor: OC.getCurrentUser().uid === params.actorId,
|
||||
isLong: this._isLong(params.message)
|
||||
@@ -147,10 +148,8 @@
|
||||
setFileInfo: function(fileInfo) {
|
||||
if (fileInfo) {
|
||||
this.model = fileInfo;
|
||||
|
||||
this.render();
|
||||
this._initAutoComplete($('#commentsTabView').find('.newCommentForm .message'));
|
||||
this.collection.setObjectId(this.model.id);
|
||||
this.collection.setObjectId(fileInfo.id);
|
||||
// reset to first page
|
||||
this.collection.reset([], {silent: true});
|
||||
this.nextPage();
|
||||
@@ -163,110 +162,25 @@
|
||||
|
||||
render: function() {
|
||||
this.$el.html(this.template({
|
||||
emptyResultLabel: t('comments', 'No comments yet, start the conversation!'),
|
||||
moreLabel: t('comments', 'More comments …')
|
||||
emptyResultLabel: t('comments', 'No other comments available'),
|
||||
moreLabel: t('comments', 'More comments...')
|
||||
}));
|
||||
this.$el.find('.comments').before(this.editCommentTemplate({}));
|
||||
this.$el.find('.has-tooltip').tooltip();
|
||||
this.$container = this.$el.find('ul.comments');
|
||||
this.$el.find('.avatar').avatar(OC.getCurrentUser().uid, 32);
|
||||
if (this._avatarsEnabled) {
|
||||
this.$el.find('.avatar').avatar(OC.getCurrentUser().uid, 28);
|
||||
}
|
||||
this.delegateEvents();
|
||||
this.$el.find('.message').on('keydown input change', this._onTypeComment);
|
||||
|
||||
autosize(this.$el.find('.newCommentRow .message'))
|
||||
},
|
||||
|
||||
_initAutoComplete: function($target) {
|
||||
var s = this;
|
||||
var limit = 10;
|
||||
if(!_.isUndefined(OC.appConfig.comments)) {
|
||||
limit = OC.appConfig.comments.maxAutoCompleteResults;
|
||||
}
|
||||
$target.atwho({
|
||||
at: '@',
|
||||
limit: limit,
|
||||
callbacks: {
|
||||
remoteFilter: s._onAutoComplete,
|
||||
highlighter: function (li) {
|
||||
// misuse the highlighter callback to instead of
|
||||
// highlighting loads the avatars.
|
||||
var $li = $(li);
|
||||
$li.find('.avatar').avatar(undefined, 32);
|
||||
return $li;
|
||||
},
|
||||
sorter: function (q, items) { return items; }
|
||||
},
|
||||
displayTpl: function (item) {
|
||||
return '<li>'
|
||||
+ '<span class="avatar-name-wrapper">'
|
||||
+ '<div class="avatar" '
|
||||
+ ' data-username="' + escapeHTML(item.id) + '"' // for avatars
|
||||
+ ' data-user="' + escapeHTML(item.id) + '"' // for contactsmenu
|
||||
+ ' data-user-display-name="' + escapeHTML(item.label) + '"></div>'
|
||||
+ ' <strong>' + escapeHTML(item.label) + '</strong>'
|
||||
+ '</span></li>';
|
||||
},
|
||||
insertTpl: function (item) {
|
||||
return ''
|
||||
+ '<span class="avatar-name-wrapper">'
|
||||
+ '<div class="avatar" '
|
||||
+ ' data-username="' + escapeHTML(item.id) + '"' // for avatars
|
||||
+ ' data-user="' + escapeHTML(item.id) + '"' // for contactsmenu
|
||||
+ ' data-user-display-name="' + escapeHTML(item.label) + '"></div>'
|
||||
+ ' <strong>' + escapeHTML(item.label) + '</strong>'
|
||||
+ '</span>';
|
||||
},
|
||||
searchKey: "label"
|
||||
});
|
||||
$target.on('inserted.atwho', function (je, $el) {
|
||||
var editionMode = true;
|
||||
s._postRenderItem(
|
||||
// we need to pass the parent of the inserted element
|
||||
// passing the whole comments form would re-apply and request
|
||||
// avatars from the server
|
||||
$(je.target).find(
|
||||
'div[data-username="' + $el.find('[data-username]').data('username') + '"]'
|
||||
).parent(),
|
||||
editionMode
|
||||
);
|
||||
});
|
||||
},
|
||||
|
||||
_onAutoComplete: function(query, callback) {
|
||||
if(_.isEmpty(query)) {
|
||||
return;
|
||||
}
|
||||
var s = this;
|
||||
if(!_.isUndefined(this._autoCompleteRequestTimer)) {
|
||||
clearTimeout(this._autoCompleteRequestTimer);
|
||||
}
|
||||
this._autoCompleteRequestTimer = _.delay(function() {
|
||||
if(!_.isUndefined(this._autoCompleteRequestCall)) {
|
||||
this._autoCompleteRequestCall.abort();
|
||||
}
|
||||
this._autoCompleteRequestCall = $.get(
|
||||
OC.generateUrl('/autocomplete/get'),
|
||||
{
|
||||
search: query,
|
||||
itemType: 'files',
|
||||
itemId: s.model.get('id'),
|
||||
sorter: 'commenters|share-recipients',
|
||||
limit: OC.appConfig.comments.maxAutoCompleteResults
|
||||
},
|
||||
function (data) {
|
||||
callback(data);
|
||||
}
|
||||
);
|
||||
}, 400);
|
||||
this.$el.find('textarea').on('keyup input change', this._onTypeComment);
|
||||
},
|
||||
|
||||
_formatItem: function(commentModel) {
|
||||
var timestamp = new Date(commentModel.get('creationDateTime')).getTime();
|
||||
var data = _.extend({
|
||||
timestamp: timestamp,
|
||||
date: OC.Util.relativeModifiedDate(timestamp),
|
||||
altDate: OC.Util.formatDate(timestamp),
|
||||
formattedMessage: this._formatMessage(commentModel.get('message'), commentModel.get('mentions'))
|
||||
formattedMessage: this._formatMessage(commentModel.get('message'))
|
||||
}, commentModel.attributes);
|
||||
return data;
|
||||
},
|
||||
@@ -286,7 +200,7 @@
|
||||
_onEndRequest: function(type) {
|
||||
var fileInfoModel = this.model;
|
||||
this._toggleLoading(false);
|
||||
this.$el.find('.emptycontent').toggleClass('hidden', !!this.collection.length);
|
||||
this.$el.find('.empty').toggleClass('hidden', !!this.collection.length);
|
||||
this.$el.find('.showMore').toggleClass('hidden', !this.collection.hasMoreResults());
|
||||
|
||||
if (type !== 'REPORT') {
|
||||
@@ -308,168 +222,33 @@
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* takes care of post-rendering after a new comment was added to the
|
||||
* collection
|
||||
*
|
||||
* @param model
|
||||
* @param collection
|
||||
* @param options
|
||||
* @private
|
||||
*/
|
||||
_onAddModel: function(model, collection, options) {
|
||||
// we need to render it immediately, to ensure that the right
|
||||
// order of comments is kept on opening comments tab
|
||||
var $comment = $(this.commentTemplate(this._formatItem(model)));
|
||||
var $el = $(this.commentTemplate(this._formatItem(model)));
|
||||
if (!_.isUndefined(options.at) && collection.length > 1) {
|
||||
this.$container.find('li').eq(options.at).before($comment);
|
||||
this.$container.find('li').eq(options.at).before($el);
|
||||
} else {
|
||||
this.$container.append($comment);
|
||||
this.$container.append($el);
|
||||
}
|
||||
this._postRenderItem($comment);
|
||||
$('#commentsTabView').find('.newCommentForm div.message').text('').prop('contenteditable', true);
|
||||
|
||||
// we need to update the model, because it consists of client data
|
||||
// only, but the server might add meta data, e.g. about mentions
|
||||
var oldMentions = model.get('mentions');
|
||||
var self = this;
|
||||
model.fetch({
|
||||
success: function (model) {
|
||||
if(_.isEqual(oldMentions, model.get('mentions'))) {
|
||||
// don't attempt to render if unnecessary, avoids flickering
|
||||
return;
|
||||
}
|
||||
var $updated = $(self.commentTemplate(self._formatItem(model)));
|
||||
$comment.html($updated.html());
|
||||
self._postRenderItem($comment);
|
||||
}
|
||||
})
|
||||
|
||||
this._postRenderItem($el);
|
||||
},
|
||||
|
||||
/**
|
||||
* takes care of post-rendering after a new comment was edited
|
||||
*
|
||||
* @param model
|
||||
* @private
|
||||
*/
|
||||
_onChangeModel: function (model) {
|
||||
if(model.get('message').trim() === model.previous('message').trim()) {
|
||||
return;
|
||||
}
|
||||
|
||||
var $form = this.$container.find('.comment[data-id="' + model.id + '"] form');
|
||||
var $row = $form.closest('.comment');
|
||||
var $target = $row.data('commentEl');
|
||||
if(_.isUndefined($target)) {
|
||||
// ignore noise – this is only set after editing a comment and hitting post
|
||||
return;
|
||||
}
|
||||
var self = this;
|
||||
|
||||
// we need to update the model, because it consists of client data
|
||||
// only, but the server might add meta data, e.g. about mentions
|
||||
model.fetch({
|
||||
success: function (model) {
|
||||
$target.removeClass('hidden');
|
||||
$row.remove();
|
||||
|
||||
var $message = $target.find('.message');
|
||||
$message
|
||||
.html(self._formatMessage(model.get('message'), model.get('mentions')))
|
||||
.find('.avatar')
|
||||
.each(function () { $(this).avatar(); });
|
||||
self._postRenderItem($message);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_postRenderItem: function($el, editionMode) {
|
||||
_postRenderItem: function($el) {
|
||||
$el.find('.has-tooltip').tooltip();
|
||||
$el.find('.avatar').each(function() {
|
||||
var $this = $(this);
|
||||
$this.avatar($this.attr('data-username'), 32);
|
||||
});
|
||||
|
||||
var username = $el.find('.avatar').data('username');
|
||||
if (username !== oc_current_user) {
|
||||
$el.find('.authorRow .avatar, .authorRow .author').contactsMenu(
|
||||
username, 0, $el.find('.authorRow'));
|
||||
if(this._avatarsEnabled) {
|
||||
$el.find('.avatar').each(function() {
|
||||
var $this = $(this);
|
||||
$this.avatar($this.attr('data-username'), 28);
|
||||
});
|
||||
}
|
||||
|
||||
var $message = $el.find('.message');
|
||||
if($message.length === 0) {
|
||||
// it is the case when writing a comment and mentioning a person
|
||||
$message = $el;
|
||||
}
|
||||
this._postRenderMessage($message, editionMode);
|
||||
},
|
||||
|
||||
_postRenderMessage: function($el, editionMode) {
|
||||
if (editionMode) {
|
||||
return;
|
||||
}
|
||||
|
||||
$el.find('.avatar').each(function() {
|
||||
var avatar = $(this);
|
||||
var strong = $(this).next();
|
||||
var appendTo = $(this).parent();
|
||||
|
||||
var username = $(this).data('username');
|
||||
if (username !== oc_current_user) {
|
||||
$.merge(avatar, strong).contactsMenu(avatar.data('user'), 0, appendTo);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Convert a message to be displayed in HTML,
|
||||
* converts newlines to <br> tags.
|
||||
*/
|
||||
_formatMessage: function(message, mentions, editMode) {
|
||||
message = escapeHTML(message).replace(/\n/g, '<br/>');
|
||||
|
||||
for(var i in mentions) {
|
||||
if(!mentions.hasOwnProperty(i)) {
|
||||
return;
|
||||
}
|
||||
var mention = '@' + mentions[i].mentionId;
|
||||
|
||||
// escape possible regex characters in the name
|
||||
mention = mention.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
||||
|
||||
var displayName = this._composeHTMLMention(mentions[i].mentionId, mentions[i].mentionDisplayName);
|
||||
|
||||
// replace every mention either at the start of the input or after a whitespace
|
||||
// followed by a non-word character.
|
||||
message = message.replace(new RegExp("(^|\\s)(" + mention + ")\\b", 'g'),
|
||||
function(match, p1) {
|
||||
// to get number of whitespaces (0 vs 1) right
|
||||
return p1+displayName;
|
||||
}
|
||||
);
|
||||
}
|
||||
if(editMode !== true) {
|
||||
message = OCP.Comments.plainToRich(message);
|
||||
}
|
||||
return message;
|
||||
},
|
||||
|
||||
_composeHTMLMention: function(uid, displayName) {
|
||||
var avatar = '<div class="avatar" '
|
||||
+ 'data-username="' + _.escape(uid) + '"'
|
||||
+ ' data-user="' + _.escape(uid) + '"'
|
||||
+ ' data-user-display-name="'
|
||||
+ _.escape(displayName) + '"></div>';
|
||||
|
||||
var isCurrentUser = (uid === OC.getCurrentUser().uid);
|
||||
|
||||
return ''
|
||||
+ '<span class="atwho-inserted" contenteditable="false">'
|
||||
+ '<span class="avatar-name-wrapper' + (isCurrentUser ? ' currentUser' : '') + '">'
|
||||
+ avatar + ' <strong>'+ _.escape(displayName)+'</strong>'
|
||||
+ '</span>'
|
||||
+ '</span>';
|
||||
_formatMessage: function(message) {
|
||||
return escapeHTML(message).replace(/\n/g, '<br/>');
|
||||
},
|
||||
|
||||
nextPage: function() {
|
||||
@@ -494,32 +273,18 @@
|
||||
// spawn form
|
||||
$comment.after($formRow);
|
||||
$formRow.data('commentEl', $comment);
|
||||
$formRow.find('.message').on('keydown input change', this._onTypeComment);
|
||||
$formRow.find('textarea').on('keyup input change', this._onTypeComment);
|
||||
|
||||
// copy avatar element from original to avoid flickering
|
||||
$formRow.find('.avatar:first').replaceWith($comment.find('.avatar:first').clone());
|
||||
$formRow.find('.avatar').replaceWith($comment.find('.avatar').clone());
|
||||
$formRow.find('.has-tooltip').tooltip();
|
||||
|
||||
var $message = $formRow.find('.message');
|
||||
$message
|
||||
.html(this._formatMessage(commentToEdit.get('message'), commentToEdit.get('mentions'), true))
|
||||
.find('.avatar')
|
||||
.each(function () { $(this).avatar(); });
|
||||
var editionMode = true;
|
||||
this._postRenderItem($message, editionMode);
|
||||
|
||||
// Enable autosize
|
||||
autosize($formRow.find('.message'));
|
||||
|
||||
// enable autocomplete
|
||||
this._initAutoComplete($formRow.find('.message'));
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
_onTypeComment: function(ev) {
|
||||
var $field = $(ev.target);
|
||||
var len = $field.text().length;
|
||||
var len = $field.val().length;
|
||||
var $submitButton = $field.data('submitButtonEl');
|
||||
if (!$submitButton) {
|
||||
$submitButton = $field.closest('form').find('.submit');
|
||||
@@ -536,15 +301,6 @@
|
||||
var limitExceeded = (len > this._commentMaxLength);
|
||||
$field.toggleClass('error', limitExceeded);
|
||||
$submitButton.prop('disabled', limitExceeded);
|
||||
|
||||
// Submits form with Enter, but Shift+Enter is a new line. If the
|
||||
// autocomplete popover is being shown Enter does not submit the
|
||||
// form either; it will be handled by At.js which will add the
|
||||
// currently selected item to the message.
|
||||
if (ev.keyCode === 13 && !ev.shiftKey && !$field.atwho('isSelecting')) {
|
||||
$submitButton.click();
|
||||
ev.preventDefault();
|
||||
}
|
||||
},
|
||||
|
||||
_onClickComment: function(ev) {
|
||||
@@ -567,33 +323,23 @@
|
||||
ev.preventDefault();
|
||||
var $comment = $(ev.target).closest('.comment');
|
||||
var commentId = $comment.data('id');
|
||||
var $loading = $comment.find('.deleteLoading');
|
||||
var $commentField = $comment.find('.message');
|
||||
var $submit = $comment.find('.submit');
|
||||
var $cancel = $comment.find('.cancel');
|
||||
var $loading = $comment.find('.submitLoading');
|
||||
|
||||
$commentField.prop('contenteditable', false);
|
||||
$submit.prop('disabled', true);
|
||||
$cancel.prop('disabled', true);
|
||||
$comment.addClass('disabled');
|
||||
$loading.removeClass('hidden');
|
||||
|
||||
this.collection.get(commentId).destroy({
|
||||
success: function() {
|
||||
$comment.data('commentEl').remove();
|
||||
$comment.remove();
|
||||
},
|
||||
error: function() {
|
||||
error: function(msg) {
|
||||
$loading.addClass('hidden');
|
||||
$comment.removeClass('disabled');
|
||||
$commentField.prop('contenteditable', true);
|
||||
$submit.prop('disabled', false);
|
||||
$cancel.prop('disabled', false);
|
||||
|
||||
OC.Notification.showTemporary(t('comments', 'Error occurred while retrieving comment with ID {id}', {id: commentId}));
|
||||
OC.Notification.showTemporary(msg);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
@@ -602,45 +348,6 @@
|
||||
this.nextPage();
|
||||
},
|
||||
|
||||
/**
|
||||
* takes care of updating comment element states after submit (either new
|
||||
* comment or edit).
|
||||
*
|
||||
* @param {OC.Backbone.Model} model
|
||||
* @param {jQuery} $form
|
||||
* @private
|
||||
*/
|
||||
_onSubmitSuccess: function(model, $form) {
|
||||
var $submit = $form.find('.submit');
|
||||
var $loading = $form.find('.submitLoading');
|
||||
|
||||
$submit.removeClass('hidden');
|
||||
$loading.addClass('hidden');
|
||||
},
|
||||
|
||||
_commentBodyHTML2Plain: function($el) {
|
||||
var $comment = $el.clone();
|
||||
|
||||
$comment.find('.avatar-name-wrapper').each(function () {
|
||||
var $this = $(this);
|
||||
var $inserted = $this.parent();
|
||||
$inserted.html('@' + $this.find('.avatar').data('username'));
|
||||
});
|
||||
|
||||
$comment.html(OCP.Comments.richToPlain($comment.html()));
|
||||
|
||||
var oldHtml;
|
||||
var html = $comment.html();
|
||||
do {
|
||||
// replace works one by one
|
||||
oldHtml = html;
|
||||
html = oldHtml.replace("<br>", "\n"); // preserve line breaks
|
||||
} while(oldHtml !== html);
|
||||
$comment.html(html);
|
||||
|
||||
return $comment.text();
|
||||
},
|
||||
|
||||
_onSubmitComment: function(e) {
|
||||
var self = this;
|
||||
var $form = $(e.target);
|
||||
@@ -648,30 +355,40 @@
|
||||
var currentUser = OC.getCurrentUser();
|
||||
var $submit = $form.find('.submit');
|
||||
var $loading = $form.find('.submitLoading');
|
||||
var $commentField = $form.find('.message');
|
||||
var message = $commentField.text().trim();
|
||||
var $textArea = $form.find('textarea');
|
||||
var message = $textArea.val().trim();
|
||||
e.preventDefault();
|
||||
|
||||
if (!message.length || message.length > this._commentMaxLength) {
|
||||
return;
|
||||
}
|
||||
|
||||
$commentField.prop('contenteditable', false);
|
||||
$textArea.prop('disabled', true);
|
||||
$submit.addClass('hidden');
|
||||
$loading.removeClass('hidden');
|
||||
|
||||
message = this._commentBodyHTML2Plain($commentField);
|
||||
if (commentId) {
|
||||
// edit mode
|
||||
var comment = this.collection.get(commentId);
|
||||
comment.save({
|
||||
message: message
|
||||
message: $textArea.val()
|
||||
}, {
|
||||
success: function(model) {
|
||||
self._onSubmitSuccess(model, $form);
|
||||
var $row = $form.closest('.comment');
|
||||
$submit.removeClass('hidden');
|
||||
$loading.addClass('hidden');
|
||||
$row.data('commentEl')
|
||||
.removeClass('hidden')
|
||||
.find('.message')
|
||||
.html(self._formatMessage(model.get('message')));
|
||||
$row.remove();
|
||||
},
|
||||
error: function() {
|
||||
self._onSubmitError($form, commentId);
|
||||
error: function(msg) {
|
||||
$submit.removeClass('hidden');
|
||||
$loading.addClass('hidden');
|
||||
$textArea.prop('disabled', false);
|
||||
|
||||
OC.Notification.showTemporary(msg);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
@@ -680,17 +397,23 @@
|
||||
actorDisplayName: currentUser.displayName,
|
||||
actorType: 'users',
|
||||
verb: 'comment',
|
||||
message: message,
|
||||
message: $textArea.val(),
|
||||
creationDateTime: (new Date()).toUTCString()
|
||||
}, {
|
||||
at: 0,
|
||||
// wait for real creation before adding
|
||||
wait: true,
|
||||
success: function(model) {
|
||||
self._onSubmitSuccess(model, $form);
|
||||
success: function() {
|
||||
$submit.removeClass('hidden');
|
||||
$loading.addClass('hidden');
|
||||
$textArea.val('').prop('disabled', false);
|
||||
},
|
||||
error: function() {
|
||||
self._onSubmitError($form, undefined);
|
||||
error: function(msg) {
|
||||
$submit.removeClass('hidden');
|
||||
$loading.addClass('hidden');
|
||||
$textArea.prop('disabled', false);
|
||||
|
||||
OC.Notification.showTemporary(msg);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -698,51 +421,6 @@
|
||||
return false;
|
||||
},
|
||||
|
||||
/**
|
||||
* takes care of updating the UI after an error on submit (either new
|
||||
* comment or edit).
|
||||
*
|
||||
* @param {jQuery} $form
|
||||
* @param {string|undefined} commentId
|
||||
* @private
|
||||
*/
|
||||
_onSubmitError: function($form, commentId) {
|
||||
$form.find('.submit').removeClass('hidden');
|
||||
$form.find('.submitLoading').addClass('hidden');
|
||||
$form.find('.message').prop('contenteditable', true);
|
||||
|
||||
if(!_.isUndefined(commentId)) {
|
||||
OC.Notification.show(t('comments', 'Error occurred while updating comment with id {id}', {id: commentId}), {type: 'error'});
|
||||
} else {
|
||||
OC.Notification.show(t('comments', 'Error occurred while posting comment'), {type: 'error'});
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* ensures the contenteditable div is really empty, when user removed
|
||||
* all input, so that the placeholder will be shown again
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
_onTextChange: function() {
|
||||
var $message = $('#commentsTabView').find('.newCommentForm div.message');
|
||||
if(!$message.text().trim().length) {
|
||||
$message.empty();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Limit pasting to plain text
|
||||
*
|
||||
* @param e
|
||||
* @private
|
||||
*/
|
||||
_onPaste: function (e) {
|
||||
e.preventDefault();
|
||||
var text = e.originalEvent.clipboardData.getData("text/plain");
|
||||
document.execCommand('insertText', false, text);
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns whether the given message is long and needs
|
||||
* collapsing
|
||||
@@ -754,3 +432,4 @@
|
||||
|
||||
OCA.Comments.CommentsTabView = CommentsTabView;
|
||||
})(OC, OCA);
|
||||
|
||||
|
||||
@@ -9,17 +9,13 @@
|
||||
*/
|
||||
|
||||
(function(OC, OCA) {
|
||||
|
||||
_.extend(OC.Files.Client, {
|
||||
PROPERTY_READMARKER: '{' + OC.Files.Client.NS_OWNCLOUD + '}readMarker'
|
||||
});
|
||||
|
||||
var NS_OWNCLOUD = 'http://owncloud.org/ns';
|
||||
/**
|
||||
* @class OCA.Comments.CommentSummaryModel
|
||||
* @classdesc
|
||||
*
|
||||
* Model containing summary information related to comments
|
||||
* like the read marker.
|
||||
* like the read marker.
|
||||
*
|
||||
*/
|
||||
var CommentSummaryModel = OC.Backbone.Model.extend(
|
||||
@@ -41,7 +37,7 @@
|
||||
_objectId: null,
|
||||
|
||||
davProperties: {
|
||||
'readMarker': OC.Files.Client.PROPERTY_READMARKER
|
||||
'readMarker': '{' + NS_OWNCLOUD + '}readMarker'
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -66,3 +62,4 @@
|
||||
|
||||
OCA.Comments.CommentSummaryModel = CommentSummaryModel;
|
||||
})(OC, OCA);
|
||||
|
||||
|
||||
@@ -11,11 +11,6 @@
|
||||
/* global Handlebars */
|
||||
|
||||
(function() {
|
||||
|
||||
_.extend(OC.Files.Client, {
|
||||
PROPERTY_COMMENTS_UNREAD: '{' + OC.Files.Client.NS_OWNCLOUD + '}comments-unread'
|
||||
});
|
||||
|
||||
var TEMPLATE_COMMENTS_UNREAD =
|
||||
'<a class="action action-comment permanent" title="{{countMessage}}" href="#">' +
|
||||
'<img class="svg" src="{{iconUrl}}"/>' +
|
||||
@@ -44,7 +39,7 @@
|
||||
}
|
||||
return this._commentsUnreadTemplate({
|
||||
count: count,
|
||||
countMessage: n('comments', '%n unread comment', '%n unread comments', count),
|
||||
countMessage: t('comments', '{count} unread comments', {count: count}),
|
||||
iconUrl: OC.imagePath('core', 'actions/comment')
|
||||
});
|
||||
},
|
||||
@@ -57,17 +52,19 @@
|
||||
|
||||
fileList.registerTabView(new OCA.Comments.CommentsTabView('commentsTabView'));
|
||||
|
||||
var NS_OC = 'http://owncloud.org/ns';
|
||||
|
||||
var oldGetWebdavProperties = fileList._getWebdavProperties;
|
||||
fileList._getWebdavProperties = function() {
|
||||
var props = oldGetWebdavProperties.apply(this, arguments);
|
||||
props.push(OC.Files.Client.PROPERTY_COMMENTS_UNREAD);
|
||||
props.push('{' + NS_OC + '}comments-unread');
|
||||
return props;
|
||||
};
|
||||
|
||||
fileList.filesClient.addFileInfoParser(function(response) {
|
||||
var data = {};
|
||||
var props = response.propStat[0].properties;
|
||||
var commentsUnread = props[OC.Files.Client.PROPERTY_COMMENTS_UNREAD];
|
||||
var commentsUnread = props['{' + NS_OC + '}comments-unread'];
|
||||
if (!_.isUndefined(commentsUnread) && commentsUnread !== '') {
|
||||
data.commentsUnread = parseInt(commentsUnread, 10);
|
||||
}
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
[
|
||||
"app.js",
|
||||
"commentmodel.js",
|
||||
"commentcollection.js",
|
||||
"commentsummarymodel.js",
|
||||
"commentstabview.js",
|
||||
"filesplugin.js",
|
||||
"activitytabviewplugin.js",
|
||||
"vendor/Caret.js/dist/jquery.caret.min.js",
|
||||
"vendor/At.js/dist/js/jquery.atwho.min.js"
|
||||
]
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,34 +0,0 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Kommentare",
|
||||
"You commented" : "U het kommentaar gelewer",
|
||||
"%1$s commented" : "%1$s het kommentaar gelewer",
|
||||
"{author} commented" : "{outeur} het kommentaar gelewer",
|
||||
"You commented on %1$s" : "U het op %1$s kommentaar gelewer",
|
||||
"You commented on {file}" : "U het op {lêer} kommentaar gelewer",
|
||||
"%1$s commented on %2$s" : "%1$s het op %2$s kommentaar gelewer",
|
||||
"{author} commented on {file}" : "{outeur} het op {lêer} kommentaar gelewer",
|
||||
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> vir lêers",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Jy is genoem op “{lêer}”, in die kommentaar van 'n gebruiker wat intussen geskrap is.",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{gebruiker} het u in ’n kommentaar oor “{lêer}” genoem",
|
||||
"Files app plugin to add comments to files" : "Lêertoepinprop om kommentaar op lêers te lewer",
|
||||
"Edit comment" : "Wysig kommentaar",
|
||||
"Delete comment" : "Skrap kommentaar",
|
||||
"New comment …" : "Nuwe kommentaar…",
|
||||
"Post" : "Plaas",
|
||||
"Cancel" : "Kanselleer",
|
||||
"[Deleted user]" : "[Geskrapte gebruiker]",
|
||||
"No comments yet, start the conversation!" : "Nog geen kommentaar, begin die gesprek!",
|
||||
"More comments …" : "Nog kommentare …",
|
||||
"Save" : "Bewaar",
|
||||
"Allowed characters {count} of {max}" : "Toegelate karakters {telling} van {maks}",
|
||||
"Error occurred while retrieving comment with ID {id}" : "’n Fout het voorgekom toe kommentaar met ID {id} opgehaal is",
|
||||
"Error occurred while updating comment with id {id}" : "’n Fout het voorgekom toe kommentaar met ID {id} bygewerk is",
|
||||
"Error occurred while posting comment" : "’n Fout het voorgekom toe kommentaar geplaas is",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n ongelese kommentaar","%n ongelese kommentare"],
|
||||
"Comment" : "Kommentaar",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Jy was genoem op \"%s\", in die kommentaar van 'n gebruiker wat intussen geskrap is.",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s het u in ’n kommentaar op “%2$s” genoem"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
@@ -1,32 +0,0 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Kommentare",
|
||||
"You commented" : "U het kommentaar gelewer",
|
||||
"%1$s commented" : "%1$s het kommentaar gelewer",
|
||||
"{author} commented" : "{outeur} het kommentaar gelewer",
|
||||
"You commented on %1$s" : "U het op %1$s kommentaar gelewer",
|
||||
"You commented on {file}" : "U het op {lêer} kommentaar gelewer",
|
||||
"%1$s commented on %2$s" : "%1$s het op %2$s kommentaar gelewer",
|
||||
"{author} commented on {file}" : "{outeur} het op {lêer} kommentaar gelewer",
|
||||
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> vir lêers",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Jy is genoem op “{lêer}”, in die kommentaar van 'n gebruiker wat intussen geskrap is.",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{gebruiker} het u in ’n kommentaar oor “{lêer}” genoem",
|
||||
"Files app plugin to add comments to files" : "Lêertoepinprop om kommentaar op lêers te lewer",
|
||||
"Edit comment" : "Wysig kommentaar",
|
||||
"Delete comment" : "Skrap kommentaar",
|
||||
"New comment …" : "Nuwe kommentaar…",
|
||||
"Post" : "Plaas",
|
||||
"Cancel" : "Kanselleer",
|
||||
"[Deleted user]" : "[Geskrapte gebruiker]",
|
||||
"No comments yet, start the conversation!" : "Nog geen kommentaar, begin die gesprek!",
|
||||
"More comments …" : "Nog kommentare …",
|
||||
"Save" : "Bewaar",
|
||||
"Allowed characters {count} of {max}" : "Toegelate karakters {telling} van {maks}",
|
||||
"Error occurred while retrieving comment with ID {id}" : "’n Fout het voorgekom toe kommentaar met ID {id} opgehaal is",
|
||||
"Error occurred while updating comment with id {id}" : "’n Fout het voorgekom toe kommentaar met ID {id} bygewerk is",
|
||||
"Error occurred while posting comment" : "’n Fout het voorgekom toe kommentaar geplaas is",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n ongelese kommentaar","%n ongelese kommentare"],
|
||||
"Comment" : "Kommentaar",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Jy was genoem op \"%s\", in die kommentaar van 'n gebruiker wat intussen geskrap is.",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s het u in ’n kommentaar op “%2$s” genoem"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -1,25 +1,8 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "تعليقات",
|
||||
"You commented" : "قمت بكتابة تعليق",
|
||||
"%1$s commented" : "%1$s كتب تعليق",
|
||||
"You commented on {file}" : "علقت على {file}",
|
||||
"%1$s commented on %2$s" : "%1$s كتب تعليق على %2$s",
|
||||
"{author} commented on {file}" : "{author} علّق على {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>تعليقات</strong> على الملفات",
|
||||
"Edit comment" : "تعديل التعليق",
|
||||
"Delete comment" : "حذف التعليق",
|
||||
"New comment …" : "تعليق جديد",
|
||||
"Post" : "ارسال",
|
||||
"Cancel" : "إلغاء",
|
||||
"[Deleted user]" : "[مستخدم محذوف]",
|
||||
"No comments yet, start the conversation!" : "لا يوجد تعليقات, ابدأ النقاش الآن!",
|
||||
"More comments …" : "مزيد من التعليقات...",
|
||||
"Save" : "حفظ",
|
||||
"Allowed characters {count} of {max}" : "عدد الأحرف المسموح بها {count} من {max}",
|
||||
"Error occurred while updating comment with id {id}" : "حصل خطأ أثناء تعديل التعليق رقم {id}",
|
||||
"Error occurred while posting comment" : "حصل خطأ أثناء إرسال التعليق",
|
||||
"Comment" : "تعليق"
|
||||
},
|
||||
"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");
|
||||
|
||||
@@ -1,23 +1,6 @@
|
||||
{ "translations": {
|
||||
"Comments" : "تعليقات",
|
||||
"You commented" : "قمت بكتابة تعليق",
|
||||
"%1$s commented" : "%1$s كتب تعليق",
|
||||
"You commented on {file}" : "علقت على {file}",
|
||||
"%1$s commented on %2$s" : "%1$s كتب تعليق على %2$s",
|
||||
"{author} commented on {file}" : "{author} علّق على {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>تعليقات</strong> على الملفات",
|
||||
"Edit comment" : "تعديل التعليق",
|
||||
"Delete comment" : "حذف التعليق",
|
||||
"New comment …" : "تعليق جديد",
|
||||
"Post" : "ارسال",
|
||||
"Cancel" : "إلغاء",
|
||||
"[Deleted user]" : "[مستخدم محذوف]",
|
||||
"No comments yet, start the conversation!" : "لا يوجد تعليقات, ابدأ النقاش الآن!",
|
||||
"More comments …" : "مزيد من التعليقات...",
|
||||
"Save" : "حفظ",
|
||||
"Allowed characters {count} of {max}" : "عدد الأحرف المسموح بها {count} من {max}",
|
||||
"Error occurred while updating comment with id {id}" : "حصل خطأ أثناء تعديل التعليق رقم {id}",
|
||||
"Error occurred while posting comment" : "حصل خطأ أثناء إرسال التعليق",
|
||||
"Comment" : "تعليق"
|
||||
},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
|
||||
}
|
||||
@@ -1,30 +1,8 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentesti",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Comentesti en %1$s",
|
||||
"You commented on {file}" : "Comentesti en {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{autor} comentó en {ficheru}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> pa ficheros",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} mentóte nun comentariu de «{file}»",
|
||||
"Edit comment" : "Editar comentariu",
|
||||
"Delete comment" : "Desaniciar comentariu",
|
||||
"New comment …" : "Comentariu nuevu...",
|
||||
"Post" : "Espublizar",
|
||||
"Cancel" : "Encaboxar",
|
||||
"[Deleted user]" : "[Usuariu desaniciáu]",
|
||||
"No comments yet, start the conversation!" : "Entá nun hai comentarios. ¡Entama una conversación!",
|
||||
"More comments …" : "Más comentarios...",
|
||||
"Save" : "Guardar",
|
||||
"Allowed characters {count} of {max}" : "{count} caráuteres almitíos de {max}",
|
||||
"Error occurred while updating comment with id {id}" : "Asocedió un fallu entrín s'anovaba'l comentariu cola ID {id}",
|
||||
"Error occurred while posting comment" : "Asocedieron fallos entrín s'espublizaba'l comentariu",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentariu ensin lleer","%n comentarios ensin lleer"],
|
||||
"Comment" : "Comentariu",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s mentóte nun comentariu de «%2$s»"
|
||||
"Comment" : "Comentariu"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -1,28 +1,6 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentesti",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Comentesti en %1$s",
|
||||
"You commented on {file}" : "Comentesti en {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{autor} comentó en {ficheru}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> pa ficheros",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} mentóte nun comentariu de «{file}»",
|
||||
"Edit comment" : "Editar comentariu",
|
||||
"Delete comment" : "Desaniciar comentariu",
|
||||
"New comment …" : "Comentariu nuevu...",
|
||||
"Post" : "Espublizar",
|
||||
"Cancel" : "Encaboxar",
|
||||
"[Deleted user]" : "[Usuariu desaniciáu]",
|
||||
"No comments yet, start the conversation!" : "Entá nun hai comentarios. ¡Entama una conversación!",
|
||||
"More comments …" : "Más comentarios...",
|
||||
"Save" : "Guardar",
|
||||
"Allowed characters {count} of {max}" : "{count} caráuteres almitíos de {max}",
|
||||
"Error occurred while updating comment with id {id}" : "Asocedió un fallu entrín s'anovaba'l comentariu cola ID {id}",
|
||||
"Error occurred while posting comment" : "Asocedieron fallos entrín s'espublizaba'l comentariu",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentariu ensin lleer","%n comentarios ensin lleer"],
|
||||
"Comment" : "Comentariu",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s mentóte nun comentariu de «%2$s»"
|
||||
"Comment" : "Comentariu"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Коментари",
|
||||
"You commented" : "Вие коментирахте",
|
||||
"%1$s commented" : "%1$s коментира",
|
||||
"{author} commented" : "{author} коментира",
|
||||
"You commented on %1$s" : "Ти коментира за %1$s",
|
||||
"You commented on {file}" : "Ти коментира за {file}",
|
||||
"%1$s commented on %2$s" : "%1$s коментиран за %2$s",
|
||||
"{author} commented on {file}" : "{author} коментира за {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Коментари</strong> за файлове",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Бяхте споменат/а към “{file}”, в коментар от потребител, който вече е изтрит",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} те спомена в коментар за “{file}”",
|
||||
"Edit comment" : "Редактирай коментра",
|
||||
"Delete comment" : "Изтрий коментар",
|
||||
"New comment …" : "Нов коментар...",
|
||||
"Post" : "Публикация",
|
||||
"Cancel" : "Отказ",
|
||||
"[Deleted user]" : "[Изтрит потребител]",
|
||||
"No comments yet, start the conversation!" : "Все още няма коментари, започнете разговор!",
|
||||
"More comments …" : "Още коментари...",
|
||||
"Save" : "Запазване",
|
||||
"Allowed characters {count} of {max}" : "Позволени символи {count} от {max}",
|
||||
"Error occurred while updating comment with id {id}" : "Възникна грешка по време на обновяване на коментар с код {id}",
|
||||
"Error occurred while posting comment" : "Възникна грешка по време на изпращане на коментар",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n непрочетен коментар","%n непрочетени коментари"],
|
||||
"Comment" : "Коментар",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Бяхте споменат/а на “%s”, в коментар от потребител, който вече е изтрит",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s те спомена в коментар за “%2$s”"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
@@ -1,30 +0,0 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Коментари",
|
||||
"You commented" : "Вие коментирахте",
|
||||
"%1$s commented" : "%1$s коментира",
|
||||
"{author} commented" : "{author} коментира",
|
||||
"You commented on %1$s" : "Ти коментира за %1$s",
|
||||
"You commented on {file}" : "Ти коментира за {file}",
|
||||
"%1$s commented on %2$s" : "%1$s коментиран за %2$s",
|
||||
"{author} commented on {file}" : "{author} коментира за {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Коментари</strong> за файлове",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Бяхте споменат/а към “{file}”, в коментар от потребител, който вече е изтрит",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} те спомена в коментар за “{file}”",
|
||||
"Edit comment" : "Редактирай коментра",
|
||||
"Delete comment" : "Изтрий коментар",
|
||||
"New comment …" : "Нов коментар...",
|
||||
"Post" : "Публикация",
|
||||
"Cancel" : "Отказ",
|
||||
"[Deleted user]" : "[Изтрит потребител]",
|
||||
"No comments yet, start the conversation!" : "Все още няма коментари, започнете разговор!",
|
||||
"More comments …" : "Още коментари...",
|
||||
"Save" : "Запазване",
|
||||
"Allowed characters {count} of {max}" : "Позволени символи {count} от {max}",
|
||||
"Error occurred while updating comment with id {id}" : "Възникна грешка по време на обновяване на коментар с код {id}",
|
||||
"Error occurred while posting comment" : "Възникна грешка по време на изпращане на коментар",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n непрочетен коментар","%n непрочетени коментари"],
|
||||
"Comment" : "Коментар",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Бяхте споменат/а на “%s”, в коментар от потребител, който вече е изтрит",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s те спомена в коментар за “%2$s”"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -1,39 +1,8 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Коментари",
|
||||
"Unknown user" : "Непознат потребител",
|
||||
"New comment …" : "Нов коментар...",
|
||||
"Delete comment" : "Изтрий коментар",
|
||||
"Post" : "Публикация",
|
||||
"Cancel" : "Отказ",
|
||||
"Edit comment" : "Редактирай коментра",
|
||||
"[Deleted user]" : "[Изтрит потребител]",
|
||||
"No comments yet, start the conversation!" : "Все-още няма коментари, започни разговор!",
|
||||
"More comments …" : "Още коментари...",
|
||||
"Save" : "Запазване",
|
||||
"Allowed characters {count} of {max}" : "Позволени символи {count} от {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Възникна грешка по време на извличане на коментар с код {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Възникна грешка по време на обновяване на коментар с код {id}",
|
||||
"Error occurred while posting comment" : "Възникна грешка по време на изпращане на коментар",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n непрочетен коментар","%n непрочетени коментари"],
|
||||
"Comment" : "Коментар",
|
||||
"You commented" : "Вие коментирахте",
|
||||
"%1$s commented" : "%1$s коментира",
|
||||
"{author} commented" : "{author} коментира",
|
||||
"You commented on %1$s" : "Ти коментира за %1$s",
|
||||
"You commented on {file}" : "Ти коментира за {file}",
|
||||
"%1$s commented on %2$s" : "%1$s коментиран за %2$s",
|
||||
"{author} commented on {file}" : "{author} коментира за {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Коментари</strong> за файлове",
|
||||
"A (now) deleted user mentioned you in a comment on “%s”" : "(Токущо) изтрит потребител те коментира в “%s”",
|
||||
"A (now) deleted user mentioned you in a comment on “{file}”" : "(Токущо) изтрит потребител те спомена в коментар за “{file}”",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s те спомена в коментар за “%2$s”",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} те спомена в коментар за “{file}”",
|
||||
"Type in a new comment..." : "Напиши нов коментар...",
|
||||
"No other comments available" : "Няма други коментари",
|
||||
"More comments..." : "Още коментари...",
|
||||
"{count} unread comments" : "{count} непрочетени коментари",
|
||||
"You commented on %2$s" : "Ти коментира за %2$s"
|
||||
"Comment" : "Коментар"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -1,37 +1,6 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Коментари",
|
||||
"Unknown user" : "Непознат потребител",
|
||||
"New comment …" : "Нов коментар...",
|
||||
"Delete comment" : "Изтрий коментар",
|
||||
"Post" : "Публикация",
|
||||
"Cancel" : "Отказ",
|
||||
"Edit comment" : "Редактирай коментра",
|
||||
"[Deleted user]" : "[Изтрит потребител]",
|
||||
"No comments yet, start the conversation!" : "Все-още няма коментари, започни разговор!",
|
||||
"More comments …" : "Още коментари...",
|
||||
"Save" : "Запазване",
|
||||
"Allowed characters {count} of {max}" : "Позволени символи {count} от {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Възникна грешка по време на извличане на коментар с код {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Възникна грешка по време на обновяване на коментар с код {id}",
|
||||
"Error occurred while posting comment" : "Възникна грешка по време на изпращане на коментар",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n непрочетен коментар","%n непрочетени коментари"],
|
||||
"Comment" : "Коментар",
|
||||
"You commented" : "Вие коментирахте",
|
||||
"%1$s commented" : "%1$s коментира",
|
||||
"{author} commented" : "{author} коментира",
|
||||
"You commented on %1$s" : "Ти коментира за %1$s",
|
||||
"You commented on {file}" : "Ти коментира за {file}",
|
||||
"%1$s commented on %2$s" : "%1$s коментиран за %2$s",
|
||||
"{author} commented on {file}" : "{author} коментира за {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Коментари</strong> за файлове",
|
||||
"A (now) deleted user mentioned you in a comment on “%s”" : "(Токущо) изтрит потребител те коментира в “%s”",
|
||||
"A (now) deleted user mentioned you in a comment on “{file}”" : "(Токущо) изтрит потребител те спомена в коментар за “{file}”",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s те спомена в коментар за “%2$s”",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} те спомена в коментар за “{file}”",
|
||||
"Type in a new comment..." : "Напиши нов коментар...",
|
||||
"No other comments available" : "Няма други коментари",
|
||||
"More comments..." : "Още коментари...",
|
||||
"{count} unread comments" : "{count} непрочетени коментари",
|
||||
"You commented on %2$s" : "Ти коментира за %2$s"
|
||||
"Comment" : "Коментар"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -1,32 +1,8 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Comentaris",
|
||||
"You commented" : "Heu comentat",
|
||||
"%1$s commented" : "%1$s ha comentat",
|
||||
"{author} commented" : "{author} ha comentat",
|
||||
"You commented on %1$s" : "Heu comentat a %1$s",
|
||||
"You commented on {file}" : "Heu comentat a {file}",
|
||||
"%1$s commented on %2$s" : "%1$s ha comentat a %2$s",
|
||||
"{author} commented on {file}" : "{author} ha comentat a {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentaris</strong> per arxius",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Has estat mencionat a \"{file}\" en un comentari d'un usuari que ja no existeix",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} us ha nomenat en un comentari de “{file}”",
|
||||
"Edit comment" : "Editar comentari",
|
||||
"Delete comment" : "Esborrar comentari",
|
||||
"New comment …" : "Nou comentari...",
|
||||
"Post" : "Publica",
|
||||
"Cancel" : "Cancel·la",
|
||||
"[Deleted user]" : "[usuari Esborrat]",
|
||||
"No comments yet, start the conversation!" : "Encara no hi ha comentaris. Comenceu la conversa!",
|
||||
"More comments …" : "Més comentaris...",
|
||||
"Save" : "Desa",
|
||||
"Allowed characters {count} of {max}" : "{count} caràcters permesos de {max}",
|
||||
"Error occurred while updating comment with id {id}" : "Hi ha hagut un error en actualitzar el comentari amb id {id}",
|
||||
"Error occurred while posting comment" : "Hi ha hagut un error en publicar el comentari",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentari no llegit","%n comentaris no llegits"],
|
||||
"Comment" : "Comentari",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Has estat mencionat a \"%s\" en un comentari d'un usuari que ja no existeix",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s us ha nomenat en un comentari a “%2$s”"
|
||||
"Comment" : "Comentari"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -1,30 +1,6 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Comentaris",
|
||||
"You commented" : "Heu comentat",
|
||||
"%1$s commented" : "%1$s ha comentat",
|
||||
"{author} commented" : "{author} ha comentat",
|
||||
"You commented on %1$s" : "Heu comentat a %1$s",
|
||||
"You commented on {file}" : "Heu comentat a {file}",
|
||||
"%1$s commented on %2$s" : "%1$s ha comentat a %2$s",
|
||||
"{author} commented on {file}" : "{author} ha comentat a {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentaris</strong> per arxius",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Has estat mencionat a \"{file}\" en un comentari d'un usuari que ja no existeix",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} us ha nomenat en un comentari de “{file}”",
|
||||
"Edit comment" : "Editar comentari",
|
||||
"Delete comment" : "Esborrar comentari",
|
||||
"New comment …" : "Nou comentari...",
|
||||
"Post" : "Publica",
|
||||
"Cancel" : "Cancel·la",
|
||||
"[Deleted user]" : "[usuari Esborrat]",
|
||||
"No comments yet, start the conversation!" : "Encara no hi ha comentaris. Comenceu la conversa!",
|
||||
"More comments …" : "Més comentaris...",
|
||||
"Save" : "Desa",
|
||||
"Allowed characters {count} of {max}" : "{count} caràcters permesos de {max}",
|
||||
"Error occurred while updating comment with id {id}" : "Hi ha hagut un error en actualitzar el comentari amb id {id}",
|
||||
"Error occurred while posting comment" : "Hi ha hagut un error en publicar el comentari",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentari no llegit","%n comentaris no llegits"],
|
||||
"Comment" : "Comentari",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Has estat mencionat a \"%s\" en un comentari d'un usuari que ja no existeix",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s us ha nomenat en un comentari a “%2$s”"
|
||||
"Comment" : "Comentari"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Komentáře",
|
||||
"You commented" : "Okomentovali jste",
|
||||
"%1$s commented" : "%1$s okomentován",
|
||||
"{author} commented" : "{author} okomentoval(a)",
|
||||
"You commented on %1$s" : "Okomentovali jste %1$s",
|
||||
"You commented on {file}" : "Okomentovali jste {file}",
|
||||
"%1$s commented on %2$s" : "%1$s okomentoval %2$s",
|
||||
"{author} commented on {file}" : "{author} okomentoval(a) {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Komentáře</strong> souborů",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Byli jste zmíněni v souboru “{file}”, v komentáři od uživatele, který byl později smazán",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} vás zmínil(a) v komentáři u „{file}“",
|
||||
"Files app plugin to add comments to files" : "Zásuvný modul do aplikace Soubory pro přidávání komentářů k souborům",
|
||||
"Edit comment" : "Upravit komentář",
|
||||
"Delete comment" : "Smazat komentář",
|
||||
"New comment …" : "Nový komentář…",
|
||||
"Post" : "Zveřejnit",
|
||||
"Cancel" : "Storno",
|
||||
"[Deleted user]" : "[Smazaný uživatel]",
|
||||
"No comments yet, start the conversation!" : "Zatím bez komentářů, začněte konverzaci!",
|
||||
"More comments …" : "Více komentářů…",
|
||||
"Save" : "Uložit",
|
||||
"Allowed characters {count} of {max}" : "Povolených znaků {count} z {max}",
|
||||
"Error occurred while retrieving comment with ID {id}" : "Došlo k chybě při načítání komentáře s ID {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Došlo k chybě při aktualizování komentáře s id {id}",
|
||||
"Error occurred while posting comment" : "Došlo k chybě při zveřejňování komentáře",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n nepřečtený komentář","%n nepřečtené komentáře","%n nepřečtených komentářů","%n nepřečtených komentářů"],
|
||||
"Comment" : "Komentář",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Byli jste zmíněni v „%s“, v komentáři od uživatele, který byl později smazán",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s vás zmínil(a) v komentáři u %2$s"
|
||||
},
|
||||
"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;");
|
||||
@@ -1,32 +0,0 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Komentáře",
|
||||
"You commented" : "Okomentovali jste",
|
||||
"%1$s commented" : "%1$s okomentován",
|
||||
"{author} commented" : "{author} okomentoval(a)",
|
||||
"You commented on %1$s" : "Okomentovali jste %1$s",
|
||||
"You commented on {file}" : "Okomentovali jste {file}",
|
||||
"%1$s commented on %2$s" : "%1$s okomentoval %2$s",
|
||||
"{author} commented on {file}" : "{author} okomentoval(a) {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Komentáře</strong> souborů",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Byli jste zmíněni v souboru “{file}”, v komentáři od uživatele, který byl později smazán",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} vás zmínil(a) v komentáři u „{file}“",
|
||||
"Files app plugin to add comments to files" : "Zásuvný modul do aplikace Soubory pro přidávání komentářů k souborům",
|
||||
"Edit comment" : "Upravit komentář",
|
||||
"Delete comment" : "Smazat komentář",
|
||||
"New comment …" : "Nový komentář…",
|
||||
"Post" : "Zveřejnit",
|
||||
"Cancel" : "Storno",
|
||||
"[Deleted user]" : "[Smazaný uživatel]",
|
||||
"No comments yet, start the conversation!" : "Zatím bez komentářů, začněte konverzaci!",
|
||||
"More comments …" : "Více komentářů…",
|
||||
"Save" : "Uložit",
|
||||
"Allowed characters {count} of {max}" : "Povolených znaků {count} z {max}",
|
||||
"Error occurred while retrieving comment with ID {id}" : "Došlo k chybě při načítání komentáře s ID {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Došlo k chybě při aktualizování komentáře s id {id}",
|
||||
"Error occurred while posting comment" : "Došlo k chybě při zveřejňování komentáře",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n nepřečtený komentář","%n nepřečtené komentáře","%n nepřečtených komentářů","%n nepřečtených komentářů"],
|
||||
"Comment" : "Komentář",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Byli jste zmíněni v „%s“, v komentáři od uživatele, který byl později smazán",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s vás zmínil(a) v komentáři u %2$s"
|
||||
},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"
|
||||
}
|
||||
@@ -1,39 +1,22 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"<strong>Comments</strong> for files" : "<strong>Komentáře</strong> souborů",
|
||||
"%1$s commented" : "%1$s okomentován",
|
||||
"%1$s commented on %2$s" : "%1$s okomentoval %2$s",
|
||||
"Comments" : "Komentáře",
|
||||
"Unknown user" : "Neznámý uživatel",
|
||||
"New comment …" : "Nový komentář ...",
|
||||
"Type in a new comment..." : "Zadat nový komentář...",
|
||||
"Delete comment" : "Smazat komentář",
|
||||
"Post" : "Zveřejnit",
|
||||
"Cancel" : "Zrušit",
|
||||
"Edit comment" : "Upravit komentář",
|
||||
"[Deleted user]" : "[Smazaný uživatel]",
|
||||
"No comments yet, start the conversation!" : "Zatím bez komentářů, začněte konverzaci!",
|
||||
"More comments …" : "Více komentářů ...",
|
||||
"Save" : "Uložit",
|
||||
"Allowed characters {count} of {max}" : "Povolených znaků {count} z {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Došlo k chybě při načítání komentáře s id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Došlo k chybě při aktualizování komentáře s id {id}",
|
||||
"Error occurred while posting comment" : "Došlo k chybě při zveřejňování komentáře",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n nepřečtený komentář","%n nepřečtené komentáře","%n nepřečtených komentářů"],
|
||||
"Comment" : "Komentář",
|
||||
"You commented" : "Okomentoval(a) jsi",
|
||||
"%1$s commented" : "%1$s okomentován",
|
||||
"{author} commented" : "{author} okomentoval(a)",
|
||||
"You commented on %1$s" : "Okomentoval(a) jste %1$s",
|
||||
"You commented on {file}" : "Okomentoval(a) jste {file}",
|
||||
"%1$s commented on %2$s" : "%1$s okomentoval %2$s",
|
||||
"{author} commented on {file}" : "{author} okomentoval(a) {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Komentáře</strong> souborů",
|
||||
"A (now) deleted user mentioned you in a comment on “%s”" : "A (now) deleted user mentioned you in a comment on “%s”",
|
||||
"A (now) deleted user mentioned you in a comment on “{file}”" : "Nyní již smazaný uživatel vás zmínil v komentáři u \"{file}\"",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s vás zmínil(a) v komentáři u %2$s",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} vás zmínil v komentáři u “{file}”",
|
||||
"Type in a new comment..." : "Zadat nový komentář...",
|
||||
"No other comments available" : "Nejsou dostupné žádné další komentáře",
|
||||
"More comments..." : "Více komentářů...",
|
||||
"Save" : "Uložit",
|
||||
"Allowed characters {count} of {max}" : "Povolených znaků {count} z {max}",
|
||||
"{count} unread comments" : "{count} nepřečtených komentářů",
|
||||
"You commented on %2$s" : "Okomentoval(a) jsi %2$s"
|
||||
"Comment" : "Komentář",
|
||||
"<strong>Comments</strong> for files" : "<strong>Komentáře</strong> souborů"
|
||||
},
|
||||
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
|
||||
|
||||
@@ -1,37 +1,20 @@
|
||||
{ "translations": {
|
||||
"<strong>Comments</strong> for files" : "<strong>Komentáře</strong> souborů",
|
||||
"%1$s commented" : "%1$s okomentován",
|
||||
"%1$s commented on %2$s" : "%1$s okomentoval %2$s",
|
||||
"Comments" : "Komentáře",
|
||||
"Unknown user" : "Neznámý uživatel",
|
||||
"New comment …" : "Nový komentář ...",
|
||||
"Type in a new comment..." : "Zadat nový komentář...",
|
||||
"Delete comment" : "Smazat komentář",
|
||||
"Post" : "Zveřejnit",
|
||||
"Cancel" : "Zrušit",
|
||||
"Edit comment" : "Upravit komentář",
|
||||
"[Deleted user]" : "[Smazaný uživatel]",
|
||||
"No comments yet, start the conversation!" : "Zatím bez komentářů, začněte konverzaci!",
|
||||
"More comments …" : "Více komentářů ...",
|
||||
"Save" : "Uložit",
|
||||
"Allowed characters {count} of {max}" : "Povolených znaků {count} z {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Došlo k chybě při načítání komentáře s id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Došlo k chybě při aktualizování komentáře s id {id}",
|
||||
"Error occurred while posting comment" : "Došlo k chybě při zveřejňování komentáře",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n nepřečtený komentář","%n nepřečtené komentáře","%n nepřečtených komentářů"],
|
||||
"Comment" : "Komentář",
|
||||
"You commented" : "Okomentoval(a) jsi",
|
||||
"%1$s commented" : "%1$s okomentován",
|
||||
"{author} commented" : "{author} okomentoval(a)",
|
||||
"You commented on %1$s" : "Okomentoval(a) jste %1$s",
|
||||
"You commented on {file}" : "Okomentoval(a) jste {file}",
|
||||
"%1$s commented on %2$s" : "%1$s okomentoval %2$s",
|
||||
"{author} commented on {file}" : "{author} okomentoval(a) {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Komentáře</strong> souborů",
|
||||
"A (now) deleted user mentioned you in a comment on “%s”" : "A (now) deleted user mentioned you in a comment on “%s”",
|
||||
"A (now) deleted user mentioned you in a comment on “{file}”" : "Nyní již smazaný uživatel vás zmínil v komentáři u \"{file}\"",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s vás zmínil(a) v komentáři u %2$s",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} vás zmínil v komentáři u “{file}”",
|
||||
"Type in a new comment..." : "Zadat nový komentář...",
|
||||
"No other comments available" : "Nejsou dostupné žádné další komentáře",
|
||||
"More comments..." : "Více komentářů...",
|
||||
"Save" : "Uložit",
|
||||
"Allowed characters {count} of {max}" : "Povolených znaků {count} z {max}",
|
||||
"{count} unread comments" : "{count} nepřečtených komentářů",
|
||||
"You commented on %2$s" : "Okomentoval(a) jsi %2$s"
|
||||
"Comment" : "Komentář",
|
||||
"<strong>Comments</strong> for files" : "<strong>Komentáře</strong> souborů"
|
||||
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
|
||||
}
|
||||
@@ -1,32 +1,8 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Kommentarer",
|
||||
"You commented" : "Du kommenterede",
|
||||
"%1$s commented" : "%1$s kommenterede",
|
||||
"{author} commented" : "{author} kommenterede",
|
||||
"You commented on %1$s" : "Du kommenterede %1$s",
|
||||
"You commented on {file}" : "Du kommenterede {file}",
|
||||
"%1$s commented on %2$s" : "%1$s kommenterede %2$s",
|
||||
"{author} commented on {file}" : "{author} kommenterede {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Kommentarer</strong> for filer",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Du blev nævnt i \"{file}”, I en kommentar af en bruger der siden er blevet slettet",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} nævnte dig i en kommentarer på \"{file}\"",
|
||||
"Edit comment" : "Rediger kommentar",
|
||||
"Delete comment" : "Slet kommentar",
|
||||
"New comment …" : "Ny kommentar ...",
|
||||
"Post" : "Indlæg",
|
||||
"Cancel" : "Annullér",
|
||||
"[Deleted user]" : "[Slettet user]",
|
||||
"No comments yet, start the conversation!" : "Ingen kommentarer endnu, start samtalen!",
|
||||
"More comments …" : "Flere kommentarer...",
|
||||
"Save" : "Gem",
|
||||
"Allowed characters {count} of {max}" : "Tilladte tegn {count} af {max}",
|
||||
"Error occurred while updating comment with id {id}" : "Der opstod fejl under opdatering af kommentar med id {id}",
|
||||
"Error occurred while posting comment" : "Der opstod fejl under indsendelse af kommentar",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n ulæst kommentar","%n ulæste kommentarer"],
|
||||
"Comment" : "Kommentér",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Du blev nævnt i \"%s”, I en kommentar af en bruger der er blevet slettet efterfølgende",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s nævnte dig i en kommentarer på “%2$s”"
|
||||
"Comment" : "Kommentér"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -1,30 +1,6 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Kommentarer",
|
||||
"You commented" : "Du kommenterede",
|
||||
"%1$s commented" : "%1$s kommenterede",
|
||||
"{author} commented" : "{author} kommenterede",
|
||||
"You commented on %1$s" : "Du kommenterede %1$s",
|
||||
"You commented on {file}" : "Du kommenterede {file}",
|
||||
"%1$s commented on %2$s" : "%1$s kommenterede %2$s",
|
||||
"{author} commented on {file}" : "{author} kommenterede {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Kommentarer</strong> for filer",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Du blev nævnt i \"{file}”, I en kommentar af en bruger der siden er blevet slettet",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} nævnte dig i en kommentarer på \"{file}\"",
|
||||
"Edit comment" : "Rediger kommentar",
|
||||
"Delete comment" : "Slet kommentar",
|
||||
"New comment …" : "Ny kommentar ...",
|
||||
"Post" : "Indlæg",
|
||||
"Cancel" : "Annullér",
|
||||
"[Deleted user]" : "[Slettet user]",
|
||||
"No comments yet, start the conversation!" : "Ingen kommentarer endnu, start samtalen!",
|
||||
"More comments …" : "Flere kommentarer...",
|
||||
"Save" : "Gem",
|
||||
"Allowed characters {count} of {max}" : "Tilladte tegn {count} af {max}",
|
||||
"Error occurred while updating comment with id {id}" : "Der opstod fejl under opdatering af kommentar med id {id}",
|
||||
"Error occurred while posting comment" : "Der opstod fejl under indsendelse af kommentar",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n ulæst kommentar","%n ulæste kommentarer"],
|
||||
"Comment" : "Kommentér",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Du blev nævnt i \"%s”, I en kommentar af en bruger der er blevet slettet efterfølgende",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s nævnte dig i en kommentarer på “%2$s”"
|
||||
"Comment" : "Kommentér"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -1,34 +1,22 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Kommentare",
|
||||
"You commented" : "Von Dir kommentiert",
|
||||
"%1$s commented" : "%1$s kommentierte",
|
||||
"{author} commented" : "{author} kommentierte",
|
||||
"You commented on %1$s" : "Du hast %1$s kommentiert",
|
||||
"You commented on {file}" : "Du hast {file} kommentiert",
|
||||
"%1$s commented on %2$s" : "%1$s kommentierte %2$s",
|
||||
"{author} commented on {file}" : "{author} hat {file} kommentiert",
|
||||
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Du wurdest in einem Kommentar auf \"{file}\" von einem bereits gelöschten Nutzer erwähnt",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} hat Dich in einem Kommentar zu “{file}” erwähnt ",
|
||||
"Files app plugin to add comments to files" : "Ein Plugin für die Dateien-App zum Kommentieren von Dateien",
|
||||
"Edit comment" : "Kommentar bearbeiten",
|
||||
"%1$s commented" : "%1$s kommentiert",
|
||||
"%1$s commented on %2$s" : "%1$s kommentiert %2$s",
|
||||
"Comments" : "Kommentare",
|
||||
"Type in a new comment..." : "Gebe bitte einen neuen Kommentar ein...",
|
||||
"Delete comment" : "Kommentar löschen",
|
||||
"New comment …" : "Neuer Kommentar …",
|
||||
"Post" : "Speichern",
|
||||
"Cancel" : "Abbrechen",
|
||||
"Edit comment" : "Kommentar bearbeiten",
|
||||
"[Deleted user]" : "[Gelöschter Benutzer]",
|
||||
"No comments yet, start the conversation!" : "Keine Kommentare bisher. Beginne die Diskussion!",
|
||||
"More comments …" : "Weitere Kommentare…",
|
||||
"No other comments available" : "Keine andere Kommentare vorhanden",
|
||||
"More comments..." : "Weitere Kommentare...",
|
||||
"Save" : "Speichern",
|
||||
"Allowed characters {count} of {max}" : "Erlaubte Zeichen {count} von {max}",
|
||||
"Error occurred while retrieving comment with ID {id}" : "Es ist ein Fehler beim Empfangen des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while updating comment with id {id}" : "Es ist ein Fehler beim Aktualisieren des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while posting comment" : "Es ist ein Fehler beim Veröffentlichen des Kommentars aufgetreten",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n ungelesener Kommentar","%n ungelesene Kommentare"],
|
||||
"{count} unread comments" : "{count} ungelesene Kommentare",
|
||||
"Comment" : "Kommentar",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Du wurdest in einem Kommentar auf \"%s\" von einem bereits gelöschten Nutzer erwähnt",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s hat Dich in einem Kommentar zu “%2$s” erwähnt "
|
||||
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -1,32 +1,20 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Kommentare",
|
||||
"You commented" : "Von Dir kommentiert",
|
||||
"%1$s commented" : "%1$s kommentierte",
|
||||
"{author} commented" : "{author} kommentierte",
|
||||
"You commented on %1$s" : "Du hast %1$s kommentiert",
|
||||
"You commented on {file}" : "Du hast {file} kommentiert",
|
||||
"%1$s commented on %2$s" : "%1$s kommentierte %2$s",
|
||||
"{author} commented on {file}" : "{author} hat {file} kommentiert",
|
||||
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Du wurdest in einem Kommentar auf \"{file}\" von einem bereits gelöschten Nutzer erwähnt",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} hat Dich in einem Kommentar zu “{file}” erwähnt ",
|
||||
"Files app plugin to add comments to files" : "Ein Plugin für die Dateien-App zum Kommentieren von Dateien",
|
||||
"Edit comment" : "Kommentar bearbeiten",
|
||||
"%1$s commented" : "%1$s kommentiert",
|
||||
"%1$s commented on %2$s" : "%1$s kommentiert %2$s",
|
||||
"Comments" : "Kommentare",
|
||||
"Type in a new comment..." : "Gebe bitte einen neuen Kommentar ein...",
|
||||
"Delete comment" : "Kommentar löschen",
|
||||
"New comment …" : "Neuer Kommentar …",
|
||||
"Post" : "Speichern",
|
||||
"Cancel" : "Abbrechen",
|
||||
"Edit comment" : "Kommentar bearbeiten",
|
||||
"[Deleted user]" : "[Gelöschter Benutzer]",
|
||||
"No comments yet, start the conversation!" : "Keine Kommentare bisher. Beginne die Diskussion!",
|
||||
"More comments …" : "Weitere Kommentare…",
|
||||
"No other comments available" : "Keine andere Kommentare vorhanden",
|
||||
"More comments..." : "Weitere Kommentare...",
|
||||
"Save" : "Speichern",
|
||||
"Allowed characters {count} of {max}" : "Erlaubte Zeichen {count} von {max}",
|
||||
"Error occurred while retrieving comment with ID {id}" : "Es ist ein Fehler beim Empfangen des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while updating comment with id {id}" : "Es ist ein Fehler beim Aktualisieren des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while posting comment" : "Es ist ein Fehler beim Veröffentlichen des Kommentars aufgetreten",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n ungelesener Kommentar","%n ungelesene Kommentare"],
|
||||
"{count} unread comments" : "{count} ungelesene Kommentare",
|
||||
"Comment" : "Kommentar",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Du wurdest in einem Kommentar auf \"%s\" von einem bereits gelöschten Nutzer erwähnt",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s hat Dich in einem Kommentar zu “%2$s” erwähnt "
|
||||
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -1,34 +1,22 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Kommentare",
|
||||
"You commented" : "Sie haben kommentiert",
|
||||
"%1$s commented" : "%1$s kommentierte",
|
||||
"{author} commented" : "{author} kommentierte",
|
||||
"You commented on %1$s" : "Sie haben %1$s kommentiert",
|
||||
"You commented on {file}" : "Sie haben {file} kommentiert",
|
||||
"%1$s commented on %2$s" : "%1$s kommentierte %2$s",
|
||||
"{author} commented on {file}" : "{author} hat {file} kommentiert",
|
||||
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Sie wurden in einem Kommentar auf \"{file}\" von einem bereits gelöschten Nutzer erwähnt",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} hat Sie in einem Kommentar zu “{file}” erwähnt",
|
||||
"Files app plugin to add comments to files" : "Ein Plugin für die Dateien-App zum Kommentieren von Dateien",
|
||||
"Edit comment" : "Kommentar bearbeiten",
|
||||
"%1$s commented" : "%1$s kommentiert",
|
||||
"%1$s commented on %2$s" : "%1$s kommentierte %2$s",
|
||||
"Comments" : "Kommentare",
|
||||
"Type in a new comment..." : "Neuer Kommentar...",
|
||||
"Delete comment" : "Kommentar löschen",
|
||||
"New comment …" : "Neuer Kommentar …",
|
||||
"Post" : "Speichern",
|
||||
"Cancel" : "Abbrechen",
|
||||
"Edit comment" : "Kommentar bearbeiten",
|
||||
"[Deleted user]" : "[gelöschter Benutzer]",
|
||||
"No comments yet, start the conversation!" : "Keine Kommentare bisher. Beginnen Sie die Diskussion!",
|
||||
"More comments …" : "Weitere Kommentare …",
|
||||
"No other comments available" : "Keine anderen Kommentare verfügbar",
|
||||
"More comments..." : "Weitere Kommentare...",
|
||||
"Save" : "Speichern",
|
||||
"Allowed characters {count} of {max}" : "{count} von {max} Zeichen benutzt",
|
||||
"Error occurred while retrieving comment with ID {id}" : "Es ist ein Fehler beim Empfangen des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while updating comment with id {id}" : "Es ist ein Fehler beim Aktualisieren des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while posting comment" : "Es ist ein Fehler beim Veröffentlichen des Kommentars aufgetreten",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n ungelesener Kommentar","%n ungelesene Kommentare"],
|
||||
"{count} unread comments" : "[count] ungelesene Kommentare",
|
||||
"Comment" : "Kommentar",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Sie wurden in einem Kommentar auf \"%s\" von einem bereits gelöschten Nutzer erwähnt",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s hat Sie in einem Kommentar zu “%2$s” erwähnt."
|
||||
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -1,32 +1,20 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Kommentare",
|
||||
"You commented" : "Sie haben kommentiert",
|
||||
"%1$s commented" : "%1$s kommentierte",
|
||||
"{author} commented" : "{author} kommentierte",
|
||||
"You commented on %1$s" : "Sie haben %1$s kommentiert",
|
||||
"You commented on {file}" : "Sie haben {file} kommentiert",
|
||||
"%1$s commented on %2$s" : "%1$s kommentierte %2$s",
|
||||
"{author} commented on {file}" : "{author} hat {file} kommentiert",
|
||||
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Sie wurden in einem Kommentar auf \"{file}\" von einem bereits gelöschten Nutzer erwähnt",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} hat Sie in einem Kommentar zu “{file}” erwähnt",
|
||||
"Files app plugin to add comments to files" : "Ein Plugin für die Dateien-App zum Kommentieren von Dateien",
|
||||
"Edit comment" : "Kommentar bearbeiten",
|
||||
"%1$s commented" : "%1$s kommentiert",
|
||||
"%1$s commented on %2$s" : "%1$s kommentierte %2$s",
|
||||
"Comments" : "Kommentare",
|
||||
"Type in a new comment..." : "Neuer Kommentar...",
|
||||
"Delete comment" : "Kommentar löschen",
|
||||
"New comment …" : "Neuer Kommentar …",
|
||||
"Post" : "Speichern",
|
||||
"Cancel" : "Abbrechen",
|
||||
"Edit comment" : "Kommentar bearbeiten",
|
||||
"[Deleted user]" : "[gelöschter Benutzer]",
|
||||
"No comments yet, start the conversation!" : "Keine Kommentare bisher. Beginnen Sie die Diskussion!",
|
||||
"More comments …" : "Weitere Kommentare …",
|
||||
"No other comments available" : "Keine anderen Kommentare verfügbar",
|
||||
"More comments..." : "Weitere Kommentare...",
|
||||
"Save" : "Speichern",
|
||||
"Allowed characters {count} of {max}" : "{count} von {max} Zeichen benutzt",
|
||||
"Error occurred while retrieving comment with ID {id}" : "Es ist ein Fehler beim Empfangen des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while updating comment with id {id}" : "Es ist ein Fehler beim Aktualisieren des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while posting comment" : "Es ist ein Fehler beim Veröffentlichen des Kommentars aufgetreten",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n ungelesener Kommentar","%n ungelesene Kommentare"],
|
||||
"{count} unread comments" : "[count] ungelesene Kommentare",
|
||||
"Comment" : "Kommentar",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Sie wurden in einem Kommentar auf \"%s\" von einem bereits gelöschten Nutzer erwähnt",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s hat Sie in einem Kommentar zu “%2$s” erwähnt."
|
||||
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -2,33 +2,12 @@ OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Σχόλια",
|
||||
"You commented" : "Σχολιάσατε",
|
||||
"%1$s commented" : "%1$s σχολίασε",
|
||||
"{author} commented" : "Ο {author} σχολίασε",
|
||||
"You commented on %1$s" : "Σχολιάσατε στο %1$s",
|
||||
"You commented on {file}" : "Σχολιάσατε στο {file}",
|
||||
"%1$s commented on %2$s" : "%1$s σχολίασε στο %2$s",
|
||||
"{author} commented on {file}" : "Ο {author} σχολίασε στο {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Σχόλια</strong> για αρχεία",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Το όνομά σας αναφέρθηκε στο “{file}”, σε σχόλιο ενός χρήστη ο οποίος έχει πλέον διαγραφεί",
|
||||
"{user} mentioned you in a comment on “{file}”" : "Ο {user} σας ανέφερε σε σχόλιο στο “{file}”",
|
||||
"Files app plugin to add comments to files" : "Επέκταση της εφαρμογής αρχείων που επιτρέπει την προσθήκη σχολίων σε αρχεία.",
|
||||
"Edit comment" : "Επεξεργασία σχολίου",
|
||||
"Type in a new comment..." : "Αυτό είναι ένα νέο σχόλιο...",
|
||||
"Delete comment" : "Διαγραφή σχολίου",
|
||||
"New comment …" : "Νέο σχόλιο ...",
|
||||
"Post" : "Δημοσίευση",
|
||||
"Cancel" : "Ακύρωση",
|
||||
"[Deleted user]" : "[Διαγραμμένος χρήστης]",
|
||||
"No comments yet, start the conversation!" : "Δεν υπάρχουν σχόλια, ξεκινήστε την συζήτηση!",
|
||||
"More comments …" : "Περισσότερα σχόλια ...",
|
||||
"Cancel" : "Άκυρο",
|
||||
"Edit comment" : "Επεξεργασία σχολίου",
|
||||
"More comments..." : "Περισσότερα σχόλια...",
|
||||
"Save" : "Αποθήκευση",
|
||||
"Allowed characters {count} of {max}" : "Επιτρεπόμενοι χαρακτήρες {count} από {max}",
|
||||
"Error occurred while retrieving comment with ID {id}" : "Παρουσιάστηκε σφάλμα κατά την ανάκτηση σχολίου με ID {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Ένα σφάλμα προέκυψε κατά την ενημέρωση του σχολίου με το αναγνωριστικό {id}",
|
||||
"Error occurred while posting comment" : "Ένα σφάλμα προέκυψε κατά την δημοσίευση σχολίου",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n αδιάβαστο σχόλιο","%n αδιάβαστα σχόλια"],
|
||||
"Comment" : "Σχόλιο",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Το όνομά σας αναφέρθηκε στο \"%s\", σε σχόλιο ενός χρήστη ο οποίος έχει πλέον διαγραφεί",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s σας ανέφερε σε σχόλιο στο “%2$s”"
|
||||
"Comment" : "Σχόλιο"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -1,32 +1,11 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Σχόλια",
|
||||
"You commented" : "Σχολιάσατε",
|
||||
"%1$s commented" : "%1$s σχολίασε",
|
||||
"{author} commented" : "Ο {author} σχολίασε",
|
||||
"You commented on %1$s" : "Σχολιάσατε στο %1$s",
|
||||
"You commented on {file}" : "Σχολιάσατε στο {file}",
|
||||
"%1$s commented on %2$s" : "%1$s σχολίασε στο %2$s",
|
||||
"{author} commented on {file}" : "Ο {author} σχολίασε στο {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Σχόλια</strong> για αρχεία",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Το όνομά σας αναφέρθηκε στο “{file}”, σε σχόλιο ενός χρήστη ο οποίος έχει πλέον διαγραφεί",
|
||||
"{user} mentioned you in a comment on “{file}”" : "Ο {user} σας ανέφερε σε σχόλιο στο “{file}”",
|
||||
"Files app plugin to add comments to files" : "Επέκταση της εφαρμογής αρχείων που επιτρέπει την προσθήκη σχολίων σε αρχεία.",
|
||||
"Edit comment" : "Επεξεργασία σχολίου",
|
||||
"Type in a new comment..." : "Αυτό είναι ένα νέο σχόλιο...",
|
||||
"Delete comment" : "Διαγραφή σχολίου",
|
||||
"New comment …" : "Νέο σχόλιο ...",
|
||||
"Post" : "Δημοσίευση",
|
||||
"Cancel" : "Ακύρωση",
|
||||
"[Deleted user]" : "[Διαγραμμένος χρήστης]",
|
||||
"No comments yet, start the conversation!" : "Δεν υπάρχουν σχόλια, ξεκινήστε την συζήτηση!",
|
||||
"More comments …" : "Περισσότερα σχόλια ...",
|
||||
"Cancel" : "Άκυρο",
|
||||
"Edit comment" : "Επεξεργασία σχολίου",
|
||||
"More comments..." : "Περισσότερα σχόλια...",
|
||||
"Save" : "Αποθήκευση",
|
||||
"Allowed characters {count} of {max}" : "Επιτρεπόμενοι χαρακτήρες {count} από {max}",
|
||||
"Error occurred while retrieving comment with ID {id}" : "Παρουσιάστηκε σφάλμα κατά την ανάκτηση σχολίου με ID {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Ένα σφάλμα προέκυψε κατά την ενημέρωση του σχολίου με το αναγνωριστικό {id}",
|
||||
"Error occurred while posting comment" : "Ένα σφάλμα προέκυψε κατά την δημοσίευση σχολίου",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n αδιάβαστο σχόλιο","%n αδιάβαστα σχόλια"],
|
||||
"Comment" : "Σχόλιο",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Το όνομά σας αναφέρθηκε στο \"%s\", σε σχόλιο ενός χρήστη ο οποίος έχει πλέον διαγραφεί",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s σας ανέφερε σε σχόλιο στο “%2$s”"
|
||||
"Comment" : "Σχόλιο"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
+10
-21
@@ -1,33 +1,22 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Comments",
|
||||
"You commented" : "You commented",
|
||||
"%1$s commented" : "%1$s commented",
|
||||
"{author} commented" : "{author} commented",
|
||||
"You commented on %1$s" : "You commented on %1$s",
|
||||
"You commented on {file}" : "You commented on {file}",
|
||||
"%1$s commented on %2$s" : "%1$s commented on %2$s",
|
||||
"{author} commented on {file}" : "{author} commented on {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comments</strong> for files",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "You were mentioned on “{file}”, in a comment by a user that has since been deleted",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} mentioned you in a comment on “{file}”",
|
||||
"Edit comment" : "Edit comment",
|
||||
"%1$s commented" : "%1$s commented",
|
||||
"%1$s commented on %2$s" : "%1$s commented on %2$s",
|
||||
"Comments" : "Comments",
|
||||
"Type in a new comment..." : "Type in a new comment...",
|
||||
"Delete comment" : "Delete comment",
|
||||
"New comment …" : "New comment …",
|
||||
"Post" : "Post",
|
||||
"Cancel" : "Cancel",
|
||||
"Edit comment" : "Edit comment",
|
||||
"[Deleted user]" : "[Deleted user]",
|
||||
"No comments yet, start the conversation!" : "No comments yet, start the conversation!",
|
||||
"More comments …" : "More comments …",
|
||||
"No other comments available" : "No other comments available",
|
||||
"More comments..." : "More comments...",
|
||||
"Save" : "Save",
|
||||
"Allowed characters {count} of {max}" : "Allowed characters: {count} of {max}",
|
||||
"Error occurred while retrieving comment with ID {id}" : "Error occurred while retrieving comment with ID {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Error occurred while updating comment with id {id}",
|
||||
"Error occurred while posting comment" : "Error occurred while posting comment",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n unread comment","%n unread comments"],
|
||||
"Allowed characters {count} of {max}" : "Allowed characters {count} of {max}",
|
||||
"{count} unread comments" : "{count} unread comments",
|
||||
"Comment" : "Comment",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "You were mentioned on “%s”, in a comment by a user that has since been deleted",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s mentioned you in a comment on “%2$s”"
|
||||
"<strong>Comments</strong> for files" : "<strong>Comments</strong> for files"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -1,31 +1,20 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Comments",
|
||||
"You commented" : "You commented",
|
||||
"%1$s commented" : "%1$s commented",
|
||||
"{author} commented" : "{author} commented",
|
||||
"You commented on %1$s" : "You commented on %1$s",
|
||||
"You commented on {file}" : "You commented on {file}",
|
||||
"%1$s commented on %2$s" : "%1$s commented on %2$s",
|
||||
"{author} commented on {file}" : "{author} commented on {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comments</strong> for files",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "You were mentioned on “{file}”, in a comment by a user that has since been deleted",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} mentioned you in a comment on “{file}”",
|
||||
"Edit comment" : "Edit comment",
|
||||
"%1$s commented" : "%1$s commented",
|
||||
"%1$s commented on %2$s" : "%1$s commented on %2$s",
|
||||
"Comments" : "Comments",
|
||||
"Type in a new comment..." : "Type in a new comment...",
|
||||
"Delete comment" : "Delete comment",
|
||||
"New comment …" : "New comment …",
|
||||
"Post" : "Post",
|
||||
"Cancel" : "Cancel",
|
||||
"Edit comment" : "Edit comment",
|
||||
"[Deleted user]" : "[Deleted user]",
|
||||
"No comments yet, start the conversation!" : "No comments yet, start the conversation!",
|
||||
"More comments …" : "More comments …",
|
||||
"No other comments available" : "No other comments available",
|
||||
"More comments..." : "More comments...",
|
||||
"Save" : "Save",
|
||||
"Allowed characters {count} of {max}" : "Allowed characters: {count} of {max}",
|
||||
"Error occurred while retrieving comment with ID {id}" : "Error occurred while retrieving comment with ID {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Error occurred while updating comment with id {id}",
|
||||
"Error occurred while posting comment" : "Error occurred while posting comment",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n unread comment","%n unread comments"],
|
||||
"Allowed characters {count} of {max}" : "Allowed characters {count} of {max}",
|
||||
"{count} unread comments" : "{count} unread comments",
|
||||
"Comment" : "Comment",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "You were mentioned on “%s”, in a comment by a user that has since been deleted",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s mentioned you in a comment on “%2$s”"
|
||||
"<strong>Comments</strong> for files" : "<strong>Comments</strong> for files"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
+10
-22
@@ -1,34 +1,22 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Komentoj",
|
||||
"You commented" : "Vi komentis",
|
||||
"%1$s commented" : "%1$s komentis",
|
||||
"{author} commented" : "{author} komentis",
|
||||
"You commented on %1$s" : "Vi komentis %1$s",
|
||||
"You commented on {file}" : "Vi komentis pri {file}",
|
||||
"%1$s commented on %2$s" : "%1$s komentis %2$s",
|
||||
"{author} commented on {file}" : "{author} komentis pri {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Komentoj</strong> por dosieroj",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Vi estis menciita en „{file}“, en komento de uzanto, kiu ekde tiam estis forigita",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} menciis vin en komento pri „{file}“",
|
||||
"Files app plugin to add comments to files" : "Kromprogramo por la aplikaĵo „Dosieroj“ por aldoni komentojn al dosieroj",
|
||||
"Edit comment" : "Redakti komenton",
|
||||
"%1$s commented" : "%1$s komentis",
|
||||
"%1$s commented on %2$s" : "%1$s komentis %2$s",
|
||||
"Comments" : "Komentoj",
|
||||
"Type in a new comment..." : "Tajpu novan komenton...",
|
||||
"Delete comment" : "Forigi komenton",
|
||||
"New comment …" : "Nova komento …",
|
||||
"Post" : "Afiŝi",
|
||||
"Cancel" : "Nuligi",
|
||||
"Edit comment" : "Redakti komenton",
|
||||
"[Deleted user]" : "[Forigita uzanto]",
|
||||
"No comments yet, start the conversation!" : "Neniu komento, ekkonversaciu!",
|
||||
"More comments …" : "Pli da komentoj...",
|
||||
"No other comments available" : "Neniu alia komento disponeblas",
|
||||
"More comments..." : "Pli da komentoj...",
|
||||
"Save" : "Konservi",
|
||||
"Allowed characters {count} of {max}" : "{count} el {max} signoj maksimume",
|
||||
"Error occurred while retrieving comment with ID {id}" : "Eraro dum ricevo de komento kun identigilo {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Eraro dum ĝisdatigo de komento kun identigilo {id}",
|
||||
"Error occurred while posting comment" : "Eraro dum sendo de komento",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n nelegataj komentoj","%n nelegataj komentoj"],
|
||||
"Allowed characters {count} of {max}" : "Permesataj karakteroj: {count} el {max}",
|
||||
"{count} unread comments" : "{count} nelegitaj komentoj",
|
||||
"Comment" : "Komento",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Vi estis menciita en „%s“, en komento de uzanto, kiu ekde tiam estis forigita",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s menciis vin en komento pri „%2$s“"
|
||||
"<strong>Comments</strong> for files" : "<strong>Komentoj</strong> por dosieroj"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
+10
-22
@@ -1,32 +1,20 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Komentoj",
|
||||
"You commented" : "Vi komentis",
|
||||
"%1$s commented" : "%1$s komentis",
|
||||
"{author} commented" : "{author} komentis",
|
||||
"You commented on %1$s" : "Vi komentis %1$s",
|
||||
"You commented on {file}" : "Vi komentis pri {file}",
|
||||
"%1$s commented on %2$s" : "%1$s komentis %2$s",
|
||||
"{author} commented on {file}" : "{author} komentis pri {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Komentoj</strong> por dosieroj",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Vi estis menciita en „{file}“, en komento de uzanto, kiu ekde tiam estis forigita",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} menciis vin en komento pri „{file}“",
|
||||
"Files app plugin to add comments to files" : "Kromprogramo por la aplikaĵo „Dosieroj“ por aldoni komentojn al dosieroj",
|
||||
"Edit comment" : "Redakti komenton",
|
||||
"%1$s commented" : "%1$s komentis",
|
||||
"%1$s commented on %2$s" : "%1$s komentis %2$s",
|
||||
"Comments" : "Komentoj",
|
||||
"Type in a new comment..." : "Tajpu novan komenton...",
|
||||
"Delete comment" : "Forigi komenton",
|
||||
"New comment …" : "Nova komento …",
|
||||
"Post" : "Afiŝi",
|
||||
"Cancel" : "Nuligi",
|
||||
"Edit comment" : "Redakti komenton",
|
||||
"[Deleted user]" : "[Forigita uzanto]",
|
||||
"No comments yet, start the conversation!" : "Neniu komento, ekkonversaciu!",
|
||||
"More comments …" : "Pli da komentoj...",
|
||||
"No other comments available" : "Neniu alia komento disponeblas",
|
||||
"More comments..." : "Pli da komentoj...",
|
||||
"Save" : "Konservi",
|
||||
"Allowed characters {count} of {max}" : "{count} el {max} signoj maksimume",
|
||||
"Error occurred while retrieving comment with ID {id}" : "Eraro dum ricevo de komento kun identigilo {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Eraro dum ĝisdatigo de komento kun identigilo {id}",
|
||||
"Error occurred while posting comment" : "Eraro dum sendo de komento",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n nelegataj komentoj","%n nelegataj komentoj"],
|
||||
"Allowed characters {count} of {max}" : "Permesataj karakteroj: {count} el {max}",
|
||||
"{count} unread comments" : "{count} nelegitaj komentoj",
|
||||
"Comment" : "Komento",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Vi estis menciita en „%s“, en komento de uzanto, kiu ekde tiam estis forigita",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s menciis vin en komento pri „%2$s“"
|
||||
"<strong>Comments</strong> for files" : "<strong>Komentoj</strong> por dosieroj"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -1,34 +1,22 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Has comentado",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> en archivos",
|
||||
"%1$s commented" : "%1$s comentados",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Has comentado en %1$s",
|
||||
"You commented on {file}" : "Has comentado en {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentados en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> para archivos",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Te han mencionado en \"{file}\", en un comentario de un usuario que después ha sido eliminado",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} te mencionó en un comentario en “{file}”",
|
||||
"Files app plugin to add comments to files" : "Plugin de la app de Archivos para añadir comentarios a archivos.",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Comments" : "Comentarios",
|
||||
"Type in a new comment..." : "Ingrese un nuevo comentario...",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"New comment …" : "Nuevo comentario",
|
||||
"Post" : "Publicar",
|
||||
"Cancel" : "Cancelar",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"[Deleted user]" : "[Usuario eliminado]",
|
||||
"No comments yet, start the conversation!" : "¡No hay comentarios, empieza la conversación!",
|
||||
"More comments …" : "Más comentarios ...",
|
||||
"No other comments available" : "No hay otros comentarios disponibles",
|
||||
"More comments..." : "Más comentarios...",
|
||||
"Save" : "Guardar",
|
||||
"Allowed characters {count} of {max}" : "Caracteres permitidos {count} de {max}",
|
||||
"Error occurred while retrieving comment with ID {id}" : "Se ha producido un error al obtener el comentario con ID {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Se ha producido un error al actualizar el comentario con ID {id}",
|
||||
"Error occurred while posting comment" : "Se ha producido un error al enviar el comentario",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentario sin leer","%nComentarios no leídos"],
|
||||
"Comment" : "Comentar",
|
||||
"You were mentioned on “%s”, in a comment by a user that has since been deleted" : "Te han mencionado en \"%s\", en un comentario por un usuario que después ha sido eliminado",
|
||||
"%1$s mentioned you in a comment on “%2$s”" : "%1$s te mencionó en un comentario en “%2$s”"
|
||||
"{count} unread comments" : "{count} comentarios no leídos",
|
||||
"Comment" : "Comentario",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> en archivos"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user