Compare commits
150 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e5447b5beb | ||
|
|
94946c76db | ||
|
|
0fd793d4a6 | ||
|
|
bb07a790d9 | ||
|
|
af12973a5f | ||
|
|
61cd31b44a | ||
|
|
d6c1fc85fb | ||
|
|
9c79aabdef | ||
|
|
ad74cf9a83 | ||
|
|
29faf92d73 | ||
|
|
21100f7cbc | ||
|
|
4a44ac168c | ||
|
|
82ab76c4e4 | ||
|
|
568e25a817 | ||
|
|
0b90bc0464 | ||
|
|
aa1d76b780 | ||
|
|
ed19515885 | ||
|
|
4e0f7d443f | ||
|
|
fd89e9a1e2 | ||
|
|
690d9803af | ||
|
|
58cd94e636 | ||
|
|
bd337320e3 | ||
|
|
8b6c86a305 | ||
|
|
b16cc929de | ||
|
|
6a6c22d34d | ||
|
|
81e3474f84 | ||
|
|
9b8b1bf5c8 | ||
|
|
385468d4b2 | ||
|
|
4585411400 | ||
|
|
1f3e1dce1c | ||
|
|
cdb2647cbf | ||
|
|
871b07ca70 | ||
|
|
9ce279b68a | ||
|
|
b009c287c4 | ||
|
|
4bbd96de14 | ||
|
|
aa5c1837fc | ||
|
|
e44d6555fa | ||
|
|
ad5d8430e9 | ||
|
|
5743354315 | ||
|
|
a79d9f58ca | ||
|
|
958e4e08d9 | ||
|
|
edf1615942 | ||
|
|
60f66a63ae | ||
|
|
e9749e31a4 | ||
|
|
678466109f | ||
|
|
490d682934 | ||
|
|
1bcf989189 | ||
|
|
33fc880b44 | ||
|
|
83e5d2025b | ||
|
|
8ca35d977e | ||
|
|
9bd0af6ef2 | ||
|
|
29da163107 | ||
|
|
f027f7c9f9 | ||
|
|
f3b8d29bc7 | ||
|
|
16a58db75d | ||
|
|
22c3ce1c1e | ||
|
|
1646e7b461 | ||
|
|
f53d24a703 | ||
|
|
fb260d6560 | ||
|
|
4658c0ba84 | ||
|
|
0d77d7d850 | ||
|
|
24f80f14bd | ||
|
|
095ca9e6d2 | ||
|
|
35cb8dac79 | ||
|
|
cd682817cb | ||
|
|
04afaa1fe6 | ||
|
|
60f3b7781e | ||
|
|
c626033445 | ||
|
|
76687ce8fd | ||
|
|
7c987281cc | ||
|
|
91dd481f1a | ||
|
|
7b725f04e0 | ||
|
|
0b776d2be2 | ||
|
|
7960aca617 | ||
|
|
da4b016b7c | ||
|
|
c82491ebe3 | ||
|
|
025e4a600a | ||
|
|
cb52e36e08 | ||
|
|
f8b7d5bc84 | ||
|
|
0b703ed518 | ||
|
|
19aa80116f | ||
|
|
faa5b2ef54 | ||
|
|
0778b2178f | ||
|
|
4f0a8995c2 | ||
|
|
b5e5985fcb | ||
|
|
705990291b | ||
|
|
364e02bdb0 | ||
|
|
981d94c139 | ||
|
|
14ccfe831a | ||
|
|
0e31d6fe57 | ||
|
|
79128c51b7 | ||
|
|
abf75cc80d | ||
|
|
dd3e6a6ad0 | ||
|
|
aaf4b1d2be | ||
|
|
9c6c6d82f0 | ||
|
|
a559513912 | ||
|
|
741231f3df | ||
|
|
6cb5bdf2d1 | ||
|
|
104941e4bb | ||
|
|
d7fb1ebc51 | ||
|
|
c4fec24b23 | ||
|
|
59595152c7 | ||
|
|
5644fcb332 | ||
|
|
d4322ed003 | ||
|
|
046e19465f | ||
|
|
28ccaff866 | ||
|
|
0a36214189 | ||
|
|
5901a0f983 | ||
|
|
7825cf7f86 | ||
|
|
d65611bcb7 | ||
|
|
c5f17a7f77 | ||
|
|
4637ce7526 | ||
|
|
c3ed9a9d65 | ||
|
|
6da0650c61 | ||
|
|
031f7c48a3 | ||
|
|
abb57d6202 | ||
|
|
1e309b71a6 | ||
|
|
5a159d49d0 | ||
|
|
1cc082cec5 | ||
|
|
149bfa9001 | ||
|
|
f660f923a3 | ||
|
|
f7c4030463 | ||
|
|
55c0cbde36 | ||
|
|
3deb08a7fc | ||
|
|
594b13ed6a | ||
|
|
9cda48e0a6 | ||
|
|
03117c0dcf | ||
|
|
96dab4ff84 | ||
|
|
7dfb6c300f | ||
|
|
9a75fa5db5 | ||
|
|
2272cb6c3a | ||
|
|
e909add969 | ||
|
|
33ea9ba00e | ||
|
|
f86fcc94d8 | ||
|
|
443d8baf3a | ||
|
|
c2e217352f | ||
|
|
555c157cda | ||
|
|
03466431be | ||
|
|
9b8115558d | ||
|
|
8344969549 | ||
|
|
eed7fd73a3 | ||
|
|
4c50ba294e | ||
|
|
ec5be0f29a | ||
|
|
f79f4f6783 | ||
|
|
89919b6b33 | ||
|
|
86e0ad4ec6 | ||
|
|
328877c70b | ||
|
|
14fbf1b106 | ||
|
|
5f6236bd73 | ||
|
|
a3968bcc87 |
@@ -12,7 +12,7 @@
|
||||
BasedOnStyle: WebKit
|
||||
|
||||
Standard: Cpp11
|
||||
ColumnLimit: 120
|
||||
ColumnLimit: 0
|
||||
|
||||
# Disable reflow of qdoc comments: indentation rules are different.
|
||||
# Translation comments are also excluded
|
||||
@@ -61,5 +61,3 @@ ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH, forever, Q_FOREVER, QBENCH
|
||||
MaxEmptyLinesToKeep: 2
|
||||
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||
|
||||
SpaceBeforeCpp11BracedList: false
|
||||
Cpp11BracedListStyle: true
|
||||
|
||||
@@ -24,7 +24,7 @@ Checks: '-*,
|
||||
modernize-use-nodiscard,
|
||||
modernize-use-equals-default,
|
||||
modernize-use-noexcept,
|
||||
modernize-use-override,
|
||||
modernize-user-override,
|
||||
modernize-use-nullptr,
|
||||
modernize-use-transparent-functors,
|
||||
modernize-use-uncaught-exceptions,
|
||||
|
||||
30
.drone.yml
@@ -1,17 +1,17 @@
|
||||
kind: pipeline
|
||||
name: qt-5.15
|
||||
name: qt-5.12
|
||||
|
||||
steps:
|
||||
- name: cmake
|
||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-4
|
||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.12-18
|
||||
volumes:
|
||||
- name: build
|
||||
path: /drone/build
|
||||
commands:
|
||||
- cd /drone/build
|
||||
- cmake -DCMAKE_C_COMPILER=gcc-10 -DCMAKE_CXX_COMPILER=g++-10 -DCMAKE_BUILD_TYPE=Debug -DQUICK_COMPILER=ON -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DECM_ENABLE_SANITIZERS=address -DCMAKE_CXX_FLAGS=-Werror ../src
|
||||
- cmake -DCMAKE_C_COMPILER=gcc-10 -DCMAKE_CXX_COMPILER=g++-10 -DCMAKE_BUILD_TYPE=Debug -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DSANITIZE_ADDRESS=ON ../src
|
||||
- name: compile
|
||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-4
|
||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.12-18
|
||||
volumes:
|
||||
- name: build
|
||||
path: /drone/build
|
||||
@@ -19,7 +19,7 @@ steps:
|
||||
- cd /drone/build
|
||||
- make -j$(nproc)
|
||||
- name: test
|
||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-4
|
||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.12-18
|
||||
volumes:
|
||||
- name: build
|
||||
path: /drone/build
|
||||
@@ -27,7 +27,7 @@ steps:
|
||||
- cd /drone/build
|
||||
- useradd -m -s /bin/bash test
|
||||
- chown -R test:test .
|
||||
- su -c 'ASAN_OPTIONS=detect_leaks=0 xvfb-run ctest --output-on-failure' test
|
||||
- su -c 'ASAN_OPTIONS=detect_leaks=0 ctest --output-on-failure' test
|
||||
|
||||
volumes:
|
||||
- name: build
|
||||
@@ -43,19 +43,19 @@ trigger:
|
||||
|
||||
---
|
||||
kind: pipeline
|
||||
name: qt-5.15-clang
|
||||
name: qt-5.12-clang
|
||||
|
||||
steps:
|
||||
- name: cmake
|
||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-4
|
||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.12-18
|
||||
volumes:
|
||||
- name: build
|
||||
path: /drone/build
|
||||
commands:
|
||||
- cd /drone/build
|
||||
- cmake -GNinja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_C_COMPILER=clang-10 -DCMAKE_CXX_COMPILER=clang++-10 -DCMAKE_BUILD_TYPE=Debug -DQUICK_COMPILER=ON -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DECM_ENABLE_SANITIZERS=address -DCMAKE_CXX_FLAGS=-Werror ../src
|
||||
- cmake -GNinja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON DCMAKE_C_COMPILER=clang-10 -DCMAKE_CXX_COMPILER=clang++-10 -DCMAKE_BUILD_TYPE=Debug -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DSANITIZE_ADDRESS=ON ../src
|
||||
- name: compile
|
||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-4
|
||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.12-18
|
||||
volumes:
|
||||
- name: build
|
||||
path: /drone/build
|
||||
@@ -63,7 +63,7 @@ steps:
|
||||
- cd /drone/build
|
||||
- ninja
|
||||
- name: test
|
||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-4
|
||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.12-18
|
||||
volumes:
|
||||
- name: build
|
||||
path: /drone/build
|
||||
@@ -71,9 +71,9 @@ steps:
|
||||
- cd /drone/build
|
||||
- useradd -m -s /bin/bash test
|
||||
- chown -R test:test .
|
||||
- su -c 'ASAN_OPTIONS=detect_leaks=0 xvfb-run ctest --output-on-failure' test
|
||||
- su -c 'ASAN_OPTIONS=detect_leaks=0 ctest --output-on-failure' test
|
||||
- name: clang-tidy
|
||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.15-4
|
||||
image: ghcr.io/nextcloud/continuous-integration-client:client-5.12-18
|
||||
volumes:
|
||||
- name: build
|
||||
path: /drone/build
|
||||
@@ -98,14 +98,14 @@ name: AppImage
|
||||
|
||||
steps:
|
||||
- name: build
|
||||
image: ghcr.io/nextcloud/continuous-integration-client-appimage:client-appimage-3
|
||||
image: ghcr.io/nextcloud/continuous-integration-client-appimage:client-appimage-1
|
||||
environment:
|
||||
CI_UPLOAD_GIT_TOKEN:
|
||||
from_secret: CI_UPLOAD_GIT_TOKEN
|
||||
CI_UPLOAD_GIT_USERNAME:
|
||||
from_secret: CI_UPLOAD_GIT_USERNAME
|
||||
commands:
|
||||
- BUILDNR=$DRONE_BUILD_NUMBER VERSION_SUFFIX=$DRONE_PULL_REQUEST BUILD_UPDATER=ON DESKTOP_CLIENT_ROOT=$DRONE_WORKSPACE /bin/bash -c "./admin/linux/build-appimage.sh"
|
||||
- /bin/bash -c "./admin/linux/build-appimage.sh"
|
||||
- /bin/bash -c "./admin/linux/upload-appimage.sh" || echo "Upload failed, however this is an optional step."
|
||||
trigger:
|
||||
branch:
|
||||
|
||||
5
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,5 +0,0 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Support and Questions
|
||||
url: "https://help.nextcloud.com/"
|
||||
about: "If you have trouble with setting up Nextcloud, please use the forum instead of opening an issue here."
|
||||
35
.github/ISSUE_TEMPLATE/feature.md
vendored
@@ -1,35 +0,0 @@
|
||||
---
|
||||
name: Features
|
||||
about: New functionality
|
||||
labels: 'enhancement'
|
||||
|
||||
---
|
||||
|
||||
<!--
|
||||
Thanks for requesting a feature for Nextcloud!
|
||||
|
||||
This is the **issue tracker of Nextcloud**, please do NOT use this to get answers to your questions or get help for fixing your installation. You can find help debugging your system on our home user forums: https://help.nextcloud.com or, if you use Nextcloud in a large organization, ask our engineers on https://portal.nextcloud.com. See also https://nextcloud.com/support for support options.
|
||||
|
||||
Guidelines for submitting features:
|
||||
|
||||
* Please search the existing features first, it's likely that your feature was already requested or even implemented.
|
||||
- Go to https://github.com/nextcloud and type any word in the top search/command bar. You probably see something like "We couldn’t find any repositories matching ..." then click "Issues" in the left navigation.
|
||||
- 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
|
||||
|
||||
* Please fill in as much of the template below as possible.
|
||||
|
||||
* Also note that we have a https://nextcloud.com/contribute/code-of-conduct/ that applies on Github. To summarize it: be kind. We try our best to be nice, too. If you can't be bothered to be polite, please just don't bother to report issues as we won't feel motivated to help you.
|
||||
-->
|
||||
|
||||
<!--- Please keep the note below for others who read your bug report -->
|
||||
|
||||
### How to use GitHub
|
||||
|
||||
* Please use the 👍 [reaction](https://blog.github.com/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) to show that you want to have the same feature implemented.
|
||||
* Please don't comment if you have no relevant information to add. It's just extra noise for everyone subscribed to this issue.
|
||||
* Subscribe to receive notifications on status change and new comments.
|
||||
|
||||
|
||||
### Feature description
|
||||
Tell us how the feature should work
|
||||
@@ -1,10 +1,3 @@
|
||||
---
|
||||
name: Bugs
|
||||
about: Crashes and other bugs
|
||||
labels: 'bug'
|
||||
|
||||
---
|
||||
|
||||
<!--
|
||||
Thanks for reporting issues back to Nextcloud!
|
||||
|
||||
14
.github/pull_request_template.md
vendored
@@ -1,14 +0,0 @@
|
||||
<!--
|
||||
Thanks for opening a pull request on the Nextcloud desktop client.
|
||||
|
||||
Instead of a Contributor License Agreement (CLA) we use a Developer Certificate of Origin (DCO).
|
||||
https://en.wikipedia.org/wiki/Developer_Certificate_of_Origin
|
||||
|
||||
To accept that DCO, please make sure that you add a line like
|
||||
Signed-off-by: Random Developer <random@developer.example.org>
|
||||
at the end of each commit message.
|
||||
|
||||
This Signed-off-by trailer can be added automatically by git if you pass --signoff or -s to git commit.
|
||||
See also:
|
||||
https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---no-signoff
|
||||
-->
|
||||
46
.github/workflows/command-rebase.yml
vendored
@@ -1,46 +0,0 @@
|
||||
# This workflow is provided via the organization template repository
|
||||
#
|
||||
# https://github.com/nextcloud/.github
|
||||
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
|
||||
|
||||
name: Rebase command
|
||||
|
||||
on:
|
||||
issue_comment:
|
||||
types: created
|
||||
|
||||
jobs:
|
||||
rebase:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
# On pull requests and if the comment starts with `/rebase`
|
||||
if: github.event.issue.pull_request != '' && startsWith(github.event.comment.body, '/rebase')
|
||||
|
||||
steps:
|
||||
- name: Add reaction on start
|
||||
uses: peter-evans/create-or-update-comment@v1
|
||||
with:
|
||||
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||
repository: ${{ github.event.repository.full_name }}
|
||||
comment-id: ${{ github.event.comment.id }}
|
||||
reaction-type: "+1"
|
||||
|
||||
- name: Checkout the latest code
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||
|
||||
- name: Automatic Rebase
|
||||
uses: cirrus-actions/rebase@1.5
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.COMMAND_BOT_PAT }}
|
||||
|
||||
- name: Add reaction on failure
|
||||
uses: peter-evans/create-or-update-comment@v1
|
||||
if: failure()
|
||||
with:
|
||||
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||
repository: ${{ github.event.repository.full_name }}
|
||||
comment-id: ${{ github.event.comment.id }}
|
||||
reaction-type: "-1"
|
||||
24
.github/workflows/needsinfo.yml
vendored
@@ -1,24 +0,0 @@
|
||||
name: 'Close stale needs info issues'
|
||||
on:
|
||||
schedule:
|
||||
- cron: '30 */8 * * *'
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/stale@v3
|
||||
with:
|
||||
operations-per-run: 1500
|
||||
days-before-stale: 28
|
||||
days-before-close: 14
|
||||
days-before-pr-close: -1
|
||||
only-labels: 'needs info'
|
||||
stale-issue-label: 'stale needs info'
|
||||
exempt-issue-labels: 'bug'
|
||||
stale-issue-message: 'This issue has been marked as "needs info" 4 weeks ago.
|
||||
Please take a look again and try to provide the information requested,
|
||||
otherwise the issue will be automatically closed in 2 weeks. Thank you!'
|
||||
close-issue-message: "This bug report is getting automatically closed due to no answer
|
||||
since the issue has been staled. Thank you!"
|
||||
exempt-all-pr-milestones: true
|
||||
13
.github/workflows/needsinfohelper.yaml
vendored
@@ -1,13 +0,0 @@
|
||||
name: Remove Labels
|
||||
|
||||
on: [issue_comment]
|
||||
|
||||
jobs:
|
||||
remove_labels:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions-ecosystem/action-remove-labels@v1
|
||||
if: ${{ ! startsWith(github.event.comment.body, 'This issue has been marked as "needs info" 4 weeks ago.') && ! startsWith(github.event.comment.body, 'This bug report did not receive an update in the last 4 weeks.')}}
|
||||
with:
|
||||
labels: 'needs info'
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
18
.github/workflows/rebase.yml
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
name: Automatic Rebase
|
||||
jobs:
|
||||
rebase:
|
||||
name: Rebase
|
||||
if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/rebase')
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout the latest code
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Automatic Rebase
|
||||
uses: cirrus-actions/rebase@1.3.1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
50
.github/workflows/sonarcloud.yml
vendored
@@ -1,50 +0,0 @@
|
||||
name: SonarCloud analysis
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened]
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
container: ghcr.io/nextcloud/continuous-integration-client:client-5.15-4
|
||||
env:
|
||||
SONAR_SERVER_URL: "https://sonarcloud.io"
|
||||
BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
|
||||
|
||||
- name: Restore cache
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: /cache
|
||||
key: ${{ runner.os }}
|
||||
|
||||
- name: Run build-wrapper
|
||||
run: |
|
||||
mkdir build
|
||||
cd build
|
||||
cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=gcc-10 -DCMAKE_CXX_COMPILER=g++-10 -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DBUILD_COVERAGE=ON
|
||||
build-wrapper-linux-x86-64 --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} make -j 2
|
||||
- name: Run tests
|
||||
run: |
|
||||
cd build
|
||||
useradd -m -s /bin/bash test
|
||||
chown -R test:test .
|
||||
su -c 'xvfb-run ctest --output-on-failure --output-junit testResult.xml' test
|
||||
- name: Generate coverage report
|
||||
run: |
|
||||
cd build
|
||||
su -c 'ctest -T Coverage' test
|
||||
- name: Run sonar-scanner
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
run: |
|
||||
cp sonar-project.properties build
|
||||
cd build
|
||||
sonar-scanner --define sonar.host.url="${{ env.SONAR_SERVER_URL }}" --define sonar.cfamily.build-wrapper-output="${{ env.BUILD_WRAPPER_OUT_DIR }}"
|
||||
5
.github/workflows/stale.yml
vendored
@@ -1,7 +1,7 @@
|
||||
name: 'Close stale issues'
|
||||
on:
|
||||
schedule:
|
||||
- cron: '30 */8 * * *'
|
||||
- cron: '30 1 * * *'
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
@@ -9,7 +9,6 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/stale@v3
|
||||
with:
|
||||
operations-per-run: 1500
|
||||
days-before-stale: 28
|
||||
days-before-close: 14
|
||||
days-before-pr-close: -1
|
||||
@@ -18,6 +17,4 @@ jobs:
|
||||
stale-issue-message: 'This bug report did not receive an update in the last 4 weeks.
|
||||
Please take a look again and update the issue with new details,
|
||||
otherwise the issue will be automatically closed in 2 weeks. Thank you!'
|
||||
close-issue-message: "This bug report is getting automatically closed due to no answer
|
||||
since the issue has been staled. Thank you!"
|
||||
exempt-all-pr-milestones: true
|
||||
|
||||
7
.gitignore
vendored
@@ -181,10 +181,3 @@ CPackOptions.cmake
|
||||
CPackSourceConfig.cmake
|
||||
|
||||
compile_commands.json
|
||||
convert.exe
|
||||
.dir-locals.el
|
||||
*-icon.png
|
||||
*-icon-win-folder.png
|
||||
*-sidebar.png
|
||||
*-w10startmenu.png
|
||||
theme.qrc
|
||||
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[bg_BG]=@APPLICATION_ICON_NAME@
|
||||
Name[bg_BG]=@APPLICATION_NAME@ десктоп клиент за синхронизиране
|
||||
Comment[bg_BG]=@APPLICATION_NAME@ десктоп клиент за синхронизиране
|
||||
GenericName[bg_BG]=Синхронизиране на папка
|
||||
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[cy_GB]=@APPLICATION_ICON_NAME@
|
||||
Name[cy_GB]=@APPLICATION_NAME@ cleient cydweddu bwrdd gwaith
|
||||
Comment[cy_GB]=@APPLICATION_NAME@ cleient cydweddu bwrdd gwaith
|
||||
GenericName[cy_GB]=Cydweddu Ffolder
|
||||
|
||||
@@ -21,7 +21,7 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
|
||||
# Translations
|
||||
Icon[de]=@APPLICATION_ICON_NAME@
|
||||
Name[de]=@APPLICATION_NAME@ Desktop
|
||||
Comment[de]=@APPLICATION_NAME@ Client zur Desktop-Synchronisierung
|
||||
GenericName[de]=Ordner-Synchronisation
|
||||
Icon[de_DE]=@APPLICATION_ICON_NAME@
|
||||
Name[de_DE]=@APPLICATION_NAME@ Client zur Desktop-Synchronisierung
|
||||
Comment[de_DE]=@APPLICATION_NAME@ Client zur Desktop-Synchronisierung
|
||||
GenericName[de_DE]=Ordnersynchronisierung
|
||||
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[en_GB]=@APPLICATION_ICON_NAME@
|
||||
Name[en_GB]=@APPLICATION_NAME@ Desktop
|
||||
Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client
|
||||
GenericName[en_GB]=Folder Sync
|
||||
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[hr]=@APPLICATION_ICON_NAME@
|
||||
Name[hr]=@APPLICATION_NAME@ Desktop
|
||||
Comment[hr]=@APPLICATION_NAME@ klijent za sinkronizaciju računala
|
||||
GenericName[hr]=Sinkronizacija mapa
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
MimeType=application/vnd.@APPLICATION_EXECUTABLE@;
|
||||
Actions=Quit;
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
[Desktop Action Quit]
|
||||
Exec=@APPLICATION_EXECUTABLE@ --quit
|
||||
Name=Quit @APPLICATION_NAME@
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
|
||||
# Translations
|
||||
GenericName[id]=Sinkronisasi Folder
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[ko]=@APPLICATION_ICON_NAME@
|
||||
Name[ko]=@APPLICATION_NAME@ 데스크탑
|
||||
Comment[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트
|
||||
GenericName[ko]=폴더 동기화
|
||||
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[mk]=@APPLICATION_ICON_NAME@
|
||||
Name[mk]=@APPLICATION_NAME@ Десктоп
|
||||
Comment[mk]=@APPLICATION_NAME@ клиент за синхронизација на компјутер
|
||||
GenericName[mk]=Папка за синхронизација
|
||||
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[nb_NO]=@APPLICATION_ICON_NAME@
|
||||
Name[nb_NO]=@APPLICATION_NAME@ skrivebord
|
||||
Comment[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering
|
||||
GenericName[nb_NO]=Mappe synkroinisering
|
||||
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[oc]=@APPLICATION_ICON_NAME@
|
||||
Name[oc]=@APPLICATION_NAME@ Burèu
|
||||
Comment[oc]=@APPLICATION_NAME@ client de sincronizacion
|
||||
GenericName[oc]=Sincro. dossièr
|
||||
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[ro]=@APPLICATION_ICON_NAME@
|
||||
Name[ro]=@Numele_aplicației@ Client de sincronizare pentru PC
|
||||
Comment[ro]=@APPLICATION_NAME@ client de sincronizare pentru desktop
|
||||
GenericName[ro]=Sincronizare director
|
||||
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[ru]=@APPLICATION_ICON_NAME@
|
||||
Name[ru]=@APPLICATION_NAME@ Desktop
|
||||
Comment[ru]=Клиент синхронизации @APPLICATION_NAME@ для ПК
|
||||
GenericName[ru]=Синхронизация папок
|
||||
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[sc]=@NÙMENE_ICONA_APLICATZIONE@
|
||||
Name[sc]=@NÙMENE_APLICATZIONE@ Iscrivania
|
||||
Comment[sc]=@NÙMENE_APLICATZIONE@ cliente de sincronizatzione iscrivania
|
||||
GenericName[sc]=Sincronizadore de cartellas
|
||||
|
||||
@@ -22,6 +22,5 @@ Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
# Translations
|
||||
Icon[sv]=@APPLICATION_ICON_NAME@
|
||||
Name[sv]=@APPLICATION_NAME@ Skrivbord
|
||||
Comment[sv]=@APPLICATION_NAME@ desktopssynkroniseringsklient
|
||||
GenericName[sv]=Mappsynkronisering
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
MimeType=application/vnd.@APPLICATION_EXECUTABLE@;
|
||||
Actions=Quit;
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
[Desktop Action Quit]
|
||||
Exec=@APPLICATION_EXECUTABLE@ --quit
|
||||
Name=Quit @APPLICATION_NAME@
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
|
||||
# Translations
|
||||
Icon[th_TH]=@APPLICATION_ICON_NAME@
|
||||
Name[th_TH]=@APPLICATION_NAME@ เดสก์ท็อป
|
||||
Comment[th_TH]=ไคลเอ็นต์ซิงโครไนซ์ @APPLICATION_NAME@ บนเดสก์ท็อป
|
||||
GenericName[th_TH]=ซิงค์โฟลเดอร์
|
||||
@@ -1,27 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Categories=Utility;X-SuSE-SyncUtility;
|
||||
Type=Application
|
||||
Exec=@APPLICATION_EXECUTABLE@
|
||||
Name=@APPLICATION_NAME@ Desktop
|
||||
Comment=@APPLICATION_NAME@ desktop synchronization client
|
||||
GenericName=Folder Sync
|
||||
Icon=@APPLICATION_ICON_NAME@
|
||||
Keywords=@APPLICATION_NAME@;syncing;file;sharing;
|
||||
X-GNOME-Autostart-Delay=3
|
||||
MimeType=application/vnd.@APPLICATION_EXECUTABLE@;
|
||||
Actions=Quit;
|
||||
|
||||
# Translations
|
||||
|
||||
|
||||
[Desktop Action Quit]
|
||||
Exec=@APPLICATION_EXECUTABLE@ --quit
|
||||
Name=Quit @APPLICATION_NAME@
|
||||
Icon=@APPLICATION_EXECUTABLE@
|
||||
|
||||
|
||||
# Translations
|
||||
Icon[vi]=@APPLICATION_ICON_NAME@
|
||||
Name[vi]=@APPLICATION_NAME@ Máy tính
|
||||
Comment[vi]=Ứng dụng đồng bộ @APPLICATION_NAME@ cho máy tính
|
||||
GenericName[vi]=Đồng bộ thư mục
|
||||
@@ -1,10 +1,12 @@
|
||||
cmake_minimum_required(VERSION 3.6)
|
||||
cmake_minimum_required(VERSION 3.2)
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
cmake_policy(SET CMP0071 NEW) # Enable use of QtQuick compiler/generated code
|
||||
|
||||
project(client)
|
||||
|
||||
include(FeatureSummary)
|
||||
if(UNIT_TESTING)
|
||||
include(CTest)
|
||||
enable_testing()
|
||||
endif()
|
||||
|
||||
set(BIN_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
|
||||
|
||||
@@ -37,19 +39,14 @@ endif()
|
||||
|
||||
set( CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules )
|
||||
|
||||
include(ECMCoverageOption)
|
||||
|
||||
if(NOT CRASHREPORTER_EXECUTABLE)
|
||||
set(CRASHREPORTER_EXECUTABLE "${APPLICATION_EXECUTABLE}_crash_reporter")
|
||||
endif()
|
||||
|
||||
include(Warnings)
|
||||
set(synclib_NAME "${APPLICATION_EXECUTABLE}sync")
|
||||
set(csync_NAME "${APPLICATION_EXECUTABLE}_csync")
|
||||
|
||||
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
||||
add_compile_options(-fdiagnostics-color=always)
|
||||
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
||||
add_compile_options(-fcolor-diagnostics)
|
||||
endif()
|
||||
include(Warnings)
|
||||
|
||||
include(${CMAKE_SOURCE_DIR}/VERSION.cmake)
|
||||
# For config.h
|
||||
@@ -78,9 +75,9 @@ include(GetGitRevisionDescription)
|
||||
get_git_head_revision(GIT_REFSPEC GIT_SHA1)
|
||||
|
||||
add_definitions(
|
||||
-DQT_DISABLE_DEPRECATED_BEFORE=0x000000
|
||||
-DQT_USE_QSTRINGBUILDER
|
||||
-DQT_MESSAGELOGCONTEXT #enable function name and line number in debug output
|
||||
-DQT_DEPRECATED_WARNINGS
|
||||
)
|
||||
|
||||
# if we cannot get it from git, directly try .tag (packages)
|
||||
@@ -97,18 +94,30 @@ endif()
|
||||
message(STATUS "GIT_SHA1 ${GIT_SHA1}")
|
||||
|
||||
set(SYSCONFDIR ${SYSCONF_INSTALL_DIR})
|
||||
set(SHAREDIR ${CMAKE_INSTALL_FULL_DATADIR})
|
||||
set(DATADIR ${DATA_INSTALL_DIR})
|
||||
if(WIN32)
|
||||
set(DATADIR "share")
|
||||
endif(WIN32)
|
||||
set(SHAREDIR ${DATADIR})
|
||||
|
||||
# Build MacOS app bundle if wished
|
||||
if(APPLE AND BUILD_OWNCLOUD_OSX_BUNDLE)
|
||||
message(STATUS "Build MacOS app bundle")
|
||||
set(OWNCLOUD_OSX_BUNDLE "${APPLICATION_NAME}.app")
|
||||
set(LIB_INSTALL_DIR "${APPLICATION_NAME}.app/Contents/MacOS")
|
||||
set(BIN_INSTALL_DIR "${APPLICATION_NAME}.app/Contents/MacOS")
|
||||
#####
|
||||
## handle BUILD_OWNCLOUD_OSX_BUNDLE
|
||||
# BUILD_OWNCLOUD_OSX_BUNDLE was not initialized OR set to true on OSX
|
||||
if(APPLE AND (NOT DEFINED BUILD_OWNCLOUD_OSX_BUNDLE OR BUILD_OWNCLOUD_OSX_BUNDLE))
|
||||
set(BUILD_OWNCLOUD_OSX_BUNDLE ON)
|
||||
set(OWNCLOUD_OSX_BUNDLE "${APPLICATION_EXECUTABLE}.app")
|
||||
set(LIB_INSTALL_DIR "${APPLICATION_EXECUTABLE}.app/Contents/MacOS")
|
||||
set(BIN_INSTALL_DIR "${APPLICATION_EXECUTABLE}.app/Contents/MacOS")
|
||||
|
||||
# BUILD_OWNCLOUD_OSX_BUNDLE was disabled on OSX
|
||||
elseif(APPLE AND NOT BUILD_OWNCLOUD_OSX_BUNDLE)
|
||||
message(FATAL_ERROR "Building in non-bundle mode on OSX is currently not supported. Comment this error out if you want to work on/test it.")
|
||||
|
||||
# any other platform
|
||||
else()
|
||||
set(BUILD_OWNCLOUD_OSX_BUNDLE OFF)
|
||||
endif()
|
||||
|
||||
|
||||
option(QUICK_COMPILER "Use QtQuick compiler to improve performance" OFF)
|
||||
#####
|
||||
|
||||
# this option removes Http authentication, keychain, shibboleth etc and is intended for
|
||||
# external authentication mechanisms
|
||||
@@ -123,8 +132,11 @@ if(NO_MSG_HANDLER)
|
||||
add_definitions(-DNO_MSG_HANDLER=1)
|
||||
endif()
|
||||
|
||||
# this option builds the updater
|
||||
option(BUILD_UPDATER "BUILD_UPDATER" OFF)
|
||||
if(BUILD_UPDATER)
|
||||
message("Compiling with updater")
|
||||
add_definitions(-DBUILD_UPDATER=1)
|
||||
else()
|
||||
message("Compiling without updater")
|
||||
endif()
|
||||
@@ -169,25 +181,19 @@ if(BUILD_CLIENT)
|
||||
find_package(Sparkle)
|
||||
endif()
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
find_package(Inotify REQUIRED)
|
||||
if(UNIX)
|
||||
find_package(INotify REQUIRED)
|
||||
else()
|
||||
find_package(INotify)
|
||||
endif()
|
||||
find_package(Sphinx)
|
||||
find_package(PdfLatex)
|
||||
find_package(OpenSSL 1.1 REQUIRED )
|
||||
|
||||
find_package(ZLIB REQUIRED)
|
||||
|
||||
if(NOT WIN32 AND NOT APPLE)
|
||||
find_package(PkgConfig REQUIRED)
|
||||
pkg_check_modules(CLOUDPROVIDERS cloudproviders IMPORTED_TARGET)
|
||||
|
||||
if(CLOUDPROVIDERS_FOUND)
|
||||
pkg_check_modules(DBUS-1 REQUIRED dbus-1 IMPORTED_TARGET)
|
||||
pkg_check_modules(GIO REQUIRED gio-2.0 IMPORTED_TARGET)
|
||||
pkg_check_modules(GLIB2 REQUIRED glib-2.0 IMPORTED_TARGET)
|
||||
endif()
|
||||
endif()
|
||||
find_package(GLib2)
|
||||
find_package(Gio)
|
||||
find_package(Libcloudproviders)
|
||||
endif()
|
||||
|
||||
if (NOT DEFINED APPLICATION_ICON_NAME)
|
||||
@@ -219,6 +225,8 @@ if (APPLE)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
|
||||
endif()
|
||||
|
||||
include(SanitizerFlags)
|
||||
|
||||
# Handle Translations, pick all client_* files from trans directory.
|
||||
file( GLOB TRANS_FILES ${CMAKE_SOURCE_DIR}/translations/client_*.ts)
|
||||
set(TRANSLATIONS ${TRANS_FILES})
|
||||
@@ -239,8 +247,8 @@ if(BUILD_SHELL_INTEGRATION)
|
||||
add_subdirectory(shell_integration)
|
||||
endif()
|
||||
|
||||
include(CTest)
|
||||
if(BUILD_TESTING)
|
||||
include(CTest)
|
||||
enable_testing()
|
||||
add_subdirectory(test)
|
||||
endif()
|
||||
@@ -255,5 +263,3 @@ elseif(BUILD_CLIENT)
|
||||
install( FILES sync-exclude.lst DESTINATION ${SYSCONFDIR}/${APPLICATION_SHORTNAME} )
|
||||
configure_file(sync-exclude.lst bin/sync-exclude.lst COPYONLY)
|
||||
endif()
|
||||
|
||||
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES INCLUDE_QUIET_PACKAGES)
|
||||
|
||||
@@ -11,8 +11,6 @@ set( APPLICATION_SERVER_URL "" CACHE STRING "URL for the server to use. If enter
|
||||
set( APPLICATION_SERVER_URL_ENFORCE ON ) # If set and APPLICATION_SERVER_URL is defined, the server can only connect to the pre-defined URL
|
||||
set( APPLICATION_REV_DOMAIN "com.nextcloud.desktopclient" )
|
||||
set( APPLICATION_VIRTUALFILE_SUFFIX "nextcloud" CACHE STRING "Virtual file suffix (not including the .)")
|
||||
set( APPLICATION_OCSP_STAPLING_ENABLED OFF )
|
||||
set( APPLICATION_FORBID_BAD_SSL OFF )
|
||||
|
||||
set( LINUX_PACKAGE_SHORTNAME "nextcloud" )
|
||||
set( LINUX_APPLICATION_ID "${APPLICATION_REV_DOMAIN}.${LINUX_PACKAGE_SHORTNAME}")
|
||||
@@ -30,13 +28,10 @@ option( WITH_CRASHREPORTER "Build crashreporter" OFF )
|
||||
#set( CRASHREPORTER_ICON ":/owncloud-icon.png" )
|
||||
|
||||
## Updater options
|
||||
option( BUILD_UPDATER "Build updater" ON )
|
||||
option( BUILD_UPDATER "Build updater" OFF )
|
||||
|
||||
option( WITH_PROVIDERS "Build with providers list" ON )
|
||||
|
||||
option( ENFORCE_VIRTUAL_FILES_SYNC_FOLDER "Enforce use of virtual files sync folder when available" OFF )
|
||||
|
||||
option( DO_NOT_USE_PROXY "Do not use system wide proxy, instead always do a direct connection to server" OFF )
|
||||
|
||||
## Theming options
|
||||
set(NEXTCLOUD_BACKGROUND_COLOR "#0082c9" CACHE STRING "Default Nextcloud background color")
|
||||
|
||||
@@ -4,7 +4,7 @@ The :computer: Nextcloud Desktop Client is a tool to synchronize files from Next
|
||||
with your computer.
|
||||
|
||||
<p align="center">
|
||||
<img src="doc/images/main_dialog_christine.png" alt="Desktop Client on Windows" width="450">
|
||||
<img src="https://nextcloud.com/wp-content/themes/next/assets/img/clients/desktop/macsettings.png?x16328" alt="Desktop Client on Mac OS]">
|
||||
</p>
|
||||
|
||||
## :blue_heart: :tada: Contributing
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
set( MIRALL_VERSION_MAJOR 3 )
|
||||
set( MIRALL_VERSION_MINOR 4 )
|
||||
set( MIRALL_VERSION_PATCH 50 )
|
||||
set( MIRALL_VERSION_MINOR 2 )
|
||||
set( MIRALL_VERSION_PATCH 4 )
|
||||
set( MIRALL_VERSION_YEAR 2021 )
|
||||
set( MIRALL_SOVERSION 0 )
|
||||
|
||||
# Minimum supported server version according to https://docs.nextcloud.com/server/latest/admin_manual/release_schedule.html
|
||||
set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_MAJOR 16)
|
||||
set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_MAJOR 19)
|
||||
set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_MINOR 0)
|
||||
set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_PATCH 0)
|
||||
|
||||
|
||||
@@ -2,88 +2,78 @@
|
||||
|
||||
set -xe
|
||||
|
||||
export APPNAME=${APPNAME:-nextcloud}
|
||||
export BUILD_UPDATER=${BUILD_UPDATER:-OFF}
|
||||
export BUILDNR=${BUILDNR:-0000}
|
||||
export DESKTOP_CLIENT_ROOT=${DESKTOP_CLIENT_ROOT:-/home/user}
|
||||
|
||||
#Set Qt-5.15
|
||||
export QT_BASE_DIR=/opt/qt5.15
|
||||
mkdir /app
|
||||
mkdir /build
|
||||
|
||||
#Set Qt-5.12
|
||||
export QT_BASE_DIR=/opt/qt5.12.10
|
||||
export QTDIR=$QT_BASE_DIR
|
||||
export PATH=$QT_BASE_DIR/bin:$PATH
|
||||
export LD_LIBRARY_PATH=$QT_BASE_DIR/lib/x86_64-linux-gnu:$QT_BASE_DIR/lib:$LD_LIBRARY_PATH
|
||||
export PKG_CONFIG_PATH=$QT_BASE_DIR/lib/pkgconfig:$PKG_CONFIG_PATH
|
||||
|
||||
# Set defaults
|
||||
#Set APPID for .desktop file processing
|
||||
export LINUX_APPLICATION_ID=com.nextcloud.desktopclient.nextcloud
|
||||
|
||||
#set defaults
|
||||
export SUFFIX=${DRONE_PULL_REQUEST:=master}
|
||||
if [ $SUFFIX != "master" ]; then
|
||||
SUFFIX="PR-$SUFFIX"
|
||||
fi
|
||||
if [ "$BUILD_UPDATER" != "OFF" ]; then
|
||||
BUILD_UPDATER=ON
|
||||
fi
|
||||
|
||||
mkdir /app
|
||||
|
||||
# QtKeyChain
|
||||
#QtKeyChain v0.10.0
|
||||
cd /build
|
||||
git clone https://github.com/frankosterfeld/qtkeychain.git
|
||||
cd qtkeychain
|
||||
git checkout v0.10.0
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -G Ninja -D CMAKE_INSTALL_PREFIX=/app/usr ..
|
||||
cmake --build . --target all
|
||||
cmake --build . --target install
|
||||
cmake -D CMAKE_INSTALL_PREFIX=/usr ../
|
||||
make -j4
|
||||
make install
|
||||
|
||||
|
||||
# Build client
|
||||
#Build client
|
||||
cd /build
|
||||
mkdir build-client
|
||||
cd build-client
|
||||
cmake \
|
||||
-G Ninja \
|
||||
-D CMAKE_INSTALL_PREFIX=/app/usr \
|
||||
cmake -D CMAKE_INSTALL_PREFIX=/usr \
|
||||
-D BUILD_TESTING=OFF \
|
||||
-D BUILD_UPDATER=$BUILD_UPDATER \
|
||||
-D MIRALL_VERSION_BUILD=$BUILDNR \
|
||||
-D MIRALL_VERSION_SUFFIX="$VERSION_SUFFIX" \
|
||||
${DESKTOP_CLIENT_ROOT}
|
||||
cmake --build . --target all
|
||||
cmake --build . --target install
|
||||
-D BUILD_UPDATER=ON \
|
||||
-DMIRALL_VERSION_SUFFIX=PR-$DRONE_PULL_REQUEST \
|
||||
-DMIRALL_VERSION_BUILD=$DRONE_BUILD_NUMBER \
|
||||
$DRONE_WORKSPACE
|
||||
make -j4
|
||||
make DESTDIR=/app install
|
||||
|
||||
# Move stuff around
|
||||
cd /app
|
||||
|
||||
mv usr/lib/x86_64-linux-gnu/* usr/lib/
|
||||
mv ./usr/lib/x86_64-linux-gnu/* ./usr/lib/
|
||||
rm -rf ./usr/lib/cmake
|
||||
rm -rf ./usr/include
|
||||
rm -rf ./usr/mkspecs
|
||||
rm -rf ./usr/lib/x86_64-linux-gnu/
|
||||
|
||||
mkdir usr/plugins
|
||||
mv usr/lib/${APPNAME}sync_vfs_suffix.so usr/plugins
|
||||
mv usr/lib/${APPNAME}sync_vfs_xattr.so usr/plugins
|
||||
|
||||
|
||||
rm -rf usr/lib/cmake
|
||||
rm -rf usr/include
|
||||
rm -rf usr/mkspecs
|
||||
rm -rf usr/lib/x86_64-linux-gnu/
|
||||
# Don't bundle nextcloudcmd as we don't run it anyway
|
||||
rm -rf ./usr/bin/nextcloudcmd
|
||||
|
||||
# Don't bundle the explorer extentions as we can't do anything with them in the AppImage
|
||||
rm -rf usr/share/caja-python/
|
||||
rm -rf usr/share/nautilus-python/
|
||||
rm -rf usr/share/nemo-python/
|
||||
rm -rf ./usr/share/caja-python/
|
||||
rm -rf ./usr/share/nautilus-python/
|
||||
rm -rf ./usr/share/nemo-python/
|
||||
|
||||
# Move sync exclude to right location
|
||||
mv usr/etc/*/sync-exclude.lst usr/bin/
|
||||
rm -rf etc
|
||||
mv ./etc/Nextcloud/sync-exclude.lst ./usr/bin/
|
||||
rm -rf ./etc
|
||||
|
||||
# com.nextcloud.desktopclient.nextcloud.desktop
|
||||
DESKTOP_FILE=$(ls /app/usr/share/applications/*.desktop)
|
||||
DESKTOP_FILE=/app/usr/share/applications/${LINUX_APPLICATION_ID}.desktop
|
||||
sed -i -e 's|Icon=nextcloud|Icon=Nextcloud|g' ${DESKTOP_FILE} # Bug in desktop file?
|
||||
cp ./usr/share/icons/hicolor/512x512/apps/Nextcloud.png . # Workaround for linuxeployqt bug, FIXME
|
||||
|
||||
|
||||
# Because distros need to get their shit together
|
||||
cp -R /usr/lib/x86_64-linux-gnu/libssl.so* ./usr/lib/
|
||||
cp -R /usr/lib/x86_64-linux-gnu/libcrypto.so* ./usr/lib/
|
||||
cp -R /lib/x86_64-linux-gnu/libssl.so* ./usr/lib/
|
||||
cp -R /lib/x86_64-linux-gnu/libcrypto.so* ./usr/lib/
|
||||
cp -P /usr/local/lib/libssl.so* ./usr/lib/
|
||||
cp -P /usr/local/lib/libcrypto.so* ./usr/lib/
|
||||
|
||||
@@ -91,23 +81,19 @@ cp -P /usr/local/lib/libcrypto.so* ./usr/lib/
|
||||
cp -P -r /usr/lib/x86_64-linux-gnu/nss ./usr/lib/
|
||||
|
||||
# Use linuxdeployqt to deploy
|
||||
wget --ca-directory=/etc/ssl/certs -c "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage"
|
||||
cd /build
|
||||
wget --ca-directory=/etc/ssl/certs/ -c "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage"
|
||||
chmod a+x linuxdeployqt*.AppImage
|
||||
./linuxdeployqt-continuous-x86_64.AppImage --appimage-extract
|
||||
rm ./linuxdeployqt-continuous-x86_64.AppImage
|
||||
unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH
|
||||
export LD_LIBRARY_PATH=/app/usr/lib/
|
||||
./squashfs-root/AppRun ${DESKTOP_FILE} -bundle-non-qt-libs -qmldir=${DESKTOP_CLIENT_ROOT}/src/gui
|
||||
./squashfs-root/AppRun ${DESKTOP_FILE} -bundle-non-qt-libs -qmldir=$DRONE_WORKSPACE/src/gui
|
||||
|
||||
# Set origin
|
||||
./squashfs-root/usr/bin/patchelf --set-rpath '$ORIGIN/' /app/usr/lib/lib${APPNAME}sync.so.0
|
||||
./squashfs-root/usr/bin/patchelf --set-rpath '$ORIGIN/' /app/usr/lib/libnextcloudsync.so.0
|
||||
|
||||
# Build AppImage
|
||||
./squashfs-root/AppRun ${DESKTOP_FILE} -appimage -updateinformation="gh-releases-zsync|nextcloud-releases|desktop|latest|Nextcloud-*-x86_64.AppImage.zsync"
|
||||
./squashfs-root/AppRun ${DESKTOP_FILE} -appimage
|
||||
|
||||
#move AppImage
|
||||
if [ ! -z "$DRONE_COMMIT" ]
|
||||
then
|
||||
mv Nextcloud*.AppImage Nextcloud-${SUFFIX}-${DRONE_COMMIT}-x86_64.AppImage
|
||||
fi
|
||||
mv *.AppImage ${DESKTOP_CLIENT_ROOT}/
|
||||
mv Nextcloud*.AppImage Nextcloud-${SUFFIX}-${DRONE_COMMIT}-x86_64.AppImage
|
||||
|
||||
@@ -15,10 +15,10 @@ OBS_PROJECT_BETA=home:ivaradi:beta
|
||||
OBS_PACKAGE=nextcloud-desktop
|
||||
|
||||
if test "${DRONE_TARGET_BRANCH}" = "stable-2.6"; then
|
||||
UBUNTU_DISTRIBUTIONS="bionic focal impish jammy"
|
||||
UBUNTU_DISTRIBUTIONS="bionic focal groovy hirsute impish"
|
||||
DEBIAN_DISTRIBUTIONS="buster stretch testing"
|
||||
else
|
||||
UBUNTU_DISTRIBUTIONS="focal impish jammy"
|
||||
UBUNTU_DISTRIBUTIONS="focal groovy hirsute impish"
|
||||
DEBIAN_DISTRIBUTIONS="testing"
|
||||
fi
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@ cd /build
|
||||
|
||||
# AppImage
|
||||
export APPIMAGE=$(readlink -f ./Nextcloud*.AppImage)
|
||||
export UPDATE=$(readlink -f ./Nextcloud*.AppImage.zsync)
|
||||
export BASENAME=$(basename ${APPIMAGE})
|
||||
|
||||
if ! test -e $APPIMAGE ; then
|
||||
@@ -71,7 +70,6 @@ upload_release_asset()
|
||||
{
|
||||
uploadUrl=$1
|
||||
echo $(curl --max-time 900 -u $GIT_USERNAME:$GIT_TOKEN -X POST $uploadUrl --header "Content-Type: application/octet-stream" --upload-file $APPIMAGE)
|
||||
echo $(curl --max-time 900 -u $GIT_USERNAME:$GIT_TOKEN -X POST $uploadUrl --header "Content-Type: application/octet-stream" --upload-file $UPDATE)
|
||||
}
|
||||
|
||||
delete_release_asset()
|
||||
@@ -134,4 +132,4 @@ if [ $TAG_NAME != "master" ]; then
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "AppImage link: $browserDownloadUrl"
|
||||
echo "AppImage link: $browserDownloadUrl"
|
||||
@@ -9,7 +9,7 @@ else()
|
||||
set(MAC_INSTALLER_DO_CUSTOM_BACKGROUND "0")
|
||||
endif()
|
||||
|
||||
find_package(Qt5 5.15 COMPONENTS Core REQUIRED)
|
||||
find_package(Qt5 5.12 COMPONENTS Core REQUIRED)
|
||||
configure_file(create_mac.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/create_mac.sh)
|
||||
configure_file(macosx.pkgproj.cmake ${CMAKE_CURRENT_BINARY_DIR}/macosx.pkgproj)
|
||||
configure_file(pre_install.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/pre_install.sh)
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<key>GID</key>
|
||||
<integer>80</integer>
|
||||
<key>PATH</key>
|
||||
<string>@APPLICATION_NAME@.app</string>
|
||||
<string>@APPLICATION_EXECUTABLE@.app</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>3</integer>
|
||||
<key>PERMISSIONS</key>
|
||||
@@ -695,12 +695,7 @@
|
||||
<key>PROJECT_SETTINGS</key>
|
||||
<dict>
|
||||
<key>ADVANCED_OPTIONS</key>
|
||||
<dict>
|
||||
<key>installer-script.options:hostArchitectures</key>
|
||||
<array>
|
||||
<string>x86_64,arm64</string>
|
||||
</array>
|
||||
</dict>
|
||||
<dict/>
|
||||
<key>BUILD_FORMAT</key>
|
||||
<integer>0</integer>
|
||||
<key>BUILD_PATH</key>
|
||||
|
||||
@@ -1,82 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import sys
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
|
||||
# A general note: We first produce a x86_64 and a arm64 app package
|
||||
# and then merge them together instead of compiling the desktop client
|
||||
# with the CMake option CMAKE_OSX_ARCHITECTURES="x86_64;arm64" because
|
||||
# macdeployqt can not handle universal binaries well. In the future
|
||||
# with Qt6 this might change and this script will become obsolete.
|
||||
|
||||
|
||||
def usage(program_name):
|
||||
print("Creates a universal app package from a x86_64 and a arm64 app package.")
|
||||
print("Usage: {} x86_64_app_file arm64_app_file output_directory".format(program_name))
|
||||
print("Example: {} some_dir/Nextcloud.app some_other_dir/Nextcloud.app output_dir".format(program_name))
|
||||
|
||||
|
||||
def execute(command):
|
||||
return subprocess.check_output(command)
|
||||
|
||||
|
||||
def path_relative_to_package(app_package_file_path, file_path):
|
||||
if file_path.startswith(app_package_file_path):
|
||||
relative_path = file_path[len(app_package_file_path):]
|
||||
if relative_path.startswith("/"):
|
||||
return relative_path[1:]
|
||||
return relative_path
|
||||
return file_path
|
||||
|
||||
|
||||
def is_executable(file_path):
|
||||
output = str(execute(["file", file_path]))
|
||||
if (("Mach-O 64-bit dynamically linked shared library" in output)
|
||||
or ("Mach-O 64-bit executable" in output)):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) != 4:
|
||||
usage(sys.argv[0])
|
||||
sys.exit(1)
|
||||
|
||||
x86_64_app_file = sys.argv[1]
|
||||
if not os.path.exists(x86_64_app_file):
|
||||
print("Can't create universal: Path {} already exists".format(x86_64_app_file))
|
||||
sys.exit(1)
|
||||
arm64_app_file = sys.argv[2]
|
||||
if not os.path.exists(arm64_app_file):
|
||||
print("Can't create universal: Path {} already exists".format(arm64_app_file))
|
||||
sys.exit(1)
|
||||
output_dir = sys.argv[3]
|
||||
|
||||
# Copy the Arm64 variant to the output location if possible
|
||||
if not os.path.exists(output_dir):
|
||||
os.makedirs(output_dir)
|
||||
app_file_name = os.path.basename(arm64_app_file)
|
||||
universal_app_file = os.path.join(output_dir, app_file_name)
|
||||
if os.path.exists(universal_app_file):
|
||||
print("Can't create universal: Path {} already exists".format(universal_app_file))
|
||||
sys.exit(1)
|
||||
|
||||
execute(["cp", "-a", arm64_app_file, output_dir])
|
||||
|
||||
# Now walk through the copied arm64 version and replace the binaries
|
||||
for root, dirs, files in os.walk(universal_app_file):
|
||||
for f in files:
|
||||
absoulte_file_path = os.path.join(root, f)
|
||||
root_relative = path_relative_to_package(universal_app_file, root)
|
||||
x86_64_absolute_path = os.path.join(x86_64_app_file, root_relative, f)
|
||||
arm64_absolute_path = os.path.join(arm64_app_file, root_relative, f)
|
||||
if os.path.islink(absoulte_file_path) or not is_executable(absoulte_file_path):
|
||||
continue
|
||||
try:
|
||||
execute(["lipo", "-create", "-output", absoulte_file_path, arm64_absolute_path, x86_64_absolute_path])
|
||||
except:
|
||||
print("Could not merge {} with {} into {}!".format(arm64_absolute_path, x86_64_absolute_path, absoulte_file_path))
|
||||
|
||||
print("Finished :)")
|
||||
@@ -3,7 +3,7 @@
|
||||
# Always enable the new 10.10 finder plugin if available
|
||||
if [ -x "$(command -v pluginkit)" ]; then
|
||||
# add it to DB. This happens automatically too but we try to push it a bit harder for issue #3463
|
||||
pluginkit -a "/Applications/@APPLICATION_NAME@.app/Contents/PlugIns/FinderSyncExt.appex/"
|
||||
pluginkit -a "/Applications/@APPLICATION_EXECUTABLE@.app/Contents/PlugIns/FinderSyncExt.appex/"
|
||||
# Since El Capitan we need to sleep #4650
|
||||
sleep 10s
|
||||
# enable it
|
||||
|
||||
@@ -2,6 +2,5 @@
|
||||
|
||||
# kill the old version. see issue #2044
|
||||
killall @APPLICATION_EXECUTABLE@
|
||||
killall @APPLICATION_NAME@
|
||||
|
||||
exit 0
|
||||
|
||||
@@ -26,8 +26,6 @@ install(FILES
|
||||
${CMAKE_CURRENT_BINARY_DIR}/make-msi.bat
|
||||
Platform.wxi
|
||||
Nextcloud.wxs
|
||||
RegistryCleanup.vbs
|
||||
RegistryCleanupCustomAction.wxs
|
||||
gui/banner.bmp
|
||||
gui/dialog.bmp
|
||||
DESTINATION msi/)
|
||||
|
||||
@@ -52,12 +52,15 @@
|
||||
<Property Id="INSTALLDIR">
|
||||
<RegistrySearch Id="RegistryInstallDir" Type="raw" Root="HKLM" Key="Software\$(var.AppVendor)\$(var.AppName)" Win64="no" />
|
||||
</Property>
|
||||
<Property Id="WINDOWSRELEASEID">
|
||||
<RegistrySearch Id="RegistryWindowsReleaseId" Type="raw" Root="HKLM" Key="Software\Microsoft\Windows NT\CurrentVersion" Name="ReleaseId"/>
|
||||
</Property>
|
||||
|
||||
<!-- Detect legacy NSIS installation -->
|
||||
<Property Id="NSIS_UNINSTALLEXE">
|
||||
<RegistrySearch Id="RegistryLegacyUninstallString" Type="file" Root="HKLM" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\$(var.AppName)" Name="UninstallString" Win64="no">
|
||||
<FileSearch Id="LegacyUninstallFileName" Name="Uninstall.exe"/>
|
||||
</RegistrySearch>
|
||||
<DirectorySearch Id="LegacyUninstallVersion" Path="[INSTALLDIR]">
|
||||
<FileSearch Name="Uninstall.exe" />
|
||||
</DirectorySearch>
|
||||
</Property>
|
||||
|
||||
<!-- Property to disable update checks -->
|
||||
@@ -76,16 +79,12 @@
|
||||
|
||||
<!-- Uninstall: Remove sync folders from Explorer's Navigation Pane, only effective for the current user (home users) -->
|
||||
<Custom Action="RemoveNavigationPaneEntries" After="RemoveFiles">(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
|
||||
|
||||
<!-- Uninstall: Cleanup the Registry -->
|
||||
<Custom Action="RegistryCleanupCustomAction" After="RemoveFiles">(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
|
||||
|
||||
<!-- Schedule Reboot for the Shell Extensions (in silent installation mode only, or if SCHEDULE_REBOOT argument is set-->
|
||||
<ScheduleReboot After="InstallFinalize">(SCHEDULE_REBOOT=1) OR NOT (UILevel=2)</ScheduleReboot>
|
||||
</InstallExecuteSequence>
|
||||
|
||||
<!-- "Add or Remove" Programs Entries -->
|
||||
<Property Id="APPNAME">$(var.AppName)</Property>
|
||||
<Property Id="ARPPRODUCTICON">$(var.AppIcon)</Property>
|
||||
<Property Id="ARPHELPLINK">$(var.AppHelpLink)</Property>
|
||||
<Property Id="ARPURLINFOABOUT">$(var.AppInfoLink)</Property>
|
||||
@@ -218,5 +217,6 @@
|
||||
<Condition Level="0">(NO_DESKTOP_SHORTCUT=1)</Condition>
|
||||
</Feature>
|
||||
</Feature>
|
||||
<Condition Message="This application only runs on Windows 10, version 1709 or higher!">(VersionNT>=603 AND WINDOWSRELEASEID>=1709)</Condition>
|
||||
</Product>
|
||||
</Wix>
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
On Error goto 0
|
||||
|
||||
Const HKEY_LOCAL_MACHINE = &H80000002
|
||||
|
||||
Const strObjRegistry = "winmgmts:\\.\root\default:StdRegProv"
|
||||
|
||||
Function RegistryDeleteKeyRecursive(regRoot, strKeyPath)
|
||||
Set objRegistry = GetObject(strObjRegistry)
|
||||
objRegistry.EnumKey regRoot, strKeyPath, arrSubkeys
|
||||
If IsArray(arrSubkeys) Then
|
||||
For Each strSubkey In arrSubkeys
|
||||
RegistryDeleteKeyRecursive regRoot, strKeyPath & "\" & strSubkey
|
||||
Next
|
||||
End If
|
||||
objRegistry.DeleteKey regRoot, strKeyPath
|
||||
End Function
|
||||
|
||||
Function RegistryListSubkeys(regRoot, strKeyPath)
|
||||
Set objRegistry = GetObject(strObjRegistry)
|
||||
objRegistry.EnumKey regRoot, strKeyPath, arrSubkeys
|
||||
RegistryListSubkeys = arrSubkeys
|
||||
End Function
|
||||
|
||||
Function GetUserSID()
|
||||
Dim objWshNetwork, objUserAccount
|
||||
|
||||
Set objWshNetwork = CreateObject("WScript.Network")
|
||||
|
||||
Set objUserAccount = GetObject("winmgmts://" & objWshNetwork.UserDomain & "/root/cimv2").Get("Win32_UserAccount.Domain='" & objWshNetwork.ComputerName & "',Name='" & objWshNetwork.UserName & "'")
|
||||
GetUserSID = objUserAccount.SID
|
||||
End Function
|
||||
|
||||
Function RegistryCleanupSyncRootManager()
|
||||
strSyncRootManagerKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SyncRootManager"
|
||||
|
||||
arrSubKeys = RegistryListSubkeys(HKEY_LOCAL_MACHINE, strSyncRootManagerKeyPath)
|
||||
|
||||
If IsArray(arrSubkeys) Then
|
||||
arrSubkeys=Filter(arrSubkeys, Session.Property("APPNAME"))
|
||||
End If
|
||||
If IsArray(arrSubkeys) Then
|
||||
arrSubkeys=Filter(arrSubkeys, GetUserSID())
|
||||
End If
|
||||
|
||||
If IsArray(arrSubkeys) Then
|
||||
For Each strSubkey In arrSubkeys
|
||||
RegistryDeleteKeyRecursive HKEY_LOCAL_MACHINE, strSyncRootManagerKeyPath & "\" & strSubkey
|
||||
Next
|
||||
End If
|
||||
End Function
|
||||
|
||||
Function RegistryCleanup()
|
||||
RegistryCleanupSyncRootManager()
|
||||
End Function
|
||||
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
|
||||
<Fragment>
|
||||
<Binary Id="RegistryCleanup" SourceFile="RegistryCleanup.vbs"/>
|
||||
<CustomAction Id='RegistryCleanupCustomAction' BinaryKey="RegistryCleanup" VBScriptCall="RegistryCleanup" Return="ignore" Execute="immediate"/>
|
||||
</Fragment>
|
||||
</Wix>
|
||||
@@ -17,10 +17,10 @@ Rem Generate collect.wxs
|
||||
if %ERRORLEVEL% neq 0 exit %ERRORLEVEL%
|
||||
|
||||
Rem Compile en-US (https://www.firegiant.com/wix/tutorial/transforms/morphing-installers/)
|
||||
"%WIX%\bin\candle.exe" -dcodepage=1252 -dPlatform=%BuildArch% -arch %BuildArch% -dHarvestAppDir="%HarvestAppDir%" -ext WixUtilExtension NCMsiHelper.wxs WinShellExt.wxs collect.wxs Nextcloud.wxs RegistryCleanupCustomAction.wxs
|
||||
"%WIX%\bin\candle.exe" -dcodepage=1252 -dPlatform=%BuildArch% -arch %BuildArch% -dHarvestAppDir="%HarvestAppDir%" -ext WixUtilExtension NCMsiHelper.wxs WinShellExt.wxs collect.wxs Nextcloud.wxs
|
||||
if %ERRORLEVEL% neq 0 exit %ERRORLEVEL%
|
||||
|
||||
Rem Link MSI package
|
||||
"%WIX%\bin\light.exe" -sw1076 -ext WixUIExtension -ext WixUtilExtension -cultures:en-us NCMsiHelper.wixobj WinShellExt.wixobj collect.wixobj Nextcloud.wixobj RegistryCleanupCustomAction.wixobj -out "@MSI_INSTALLER_FILENAME@"
|
||||
"%WIX%\bin\light.exe" -sw1076 -ext WixUIExtension -ext WixUtilExtension -cultures:en-us NCMsiHelper.wixobj WinShellExt.wixobj collect.wixobj Nextcloud.wixobj -out "@MSI_INSTALLER_FILENAME@"
|
||||
|
||||
exit %ERRORLEVEL%
|
||||
|
||||
46
appveyor.ini
@@ -1,6 +1,7 @@
|
||||
[General]
|
||||
Branch = master
|
||||
ShallowClone = True
|
||||
Command=craft
|
||||
|
||||
# Variables defined here override the default value
|
||||
# The variable names are casesensitive
|
||||
@@ -12,42 +13,33 @@ CreateCache = False
|
||||
# Settings applicable for all Crafts matrices
|
||||
# Settings are Category/key=value
|
||||
# Category is case sensitive
|
||||
|
||||
[GeneralSettings]
|
||||
|
||||
## This is the location of your python installation.
|
||||
## This value must be set.
|
||||
Paths/Python = C:\Python39-x64
|
||||
Paths/Python27 = C:\Python27-x64
|
||||
|
||||
Compile/BuildType = RelWithDebInfo
|
||||
|
||||
Compile/UseNinja = True
|
||||
|
||||
General/EMERGE_PKGDSTDIR=${Variables:APPVEYOR_BUILD_FOLDER}/binaries
|
||||
Paths/python = C:\Python36
|
||||
Paths/python27 = C:\Python27
|
||||
Paths/downloaddir = ${Variables:Root}\downloads
|
||||
ShortPath/Enabled = False
|
||||
ShortPath/EnableJunctions = True
|
||||
ShortPath/JunctionDir = C:\CM-SP\
|
||||
|
||||
; Packager/RepositoryUrl = https://files.kde.org/craft/
|
||||
Packager/PackageType = NullsoftInstallerPackager
|
||||
Packager/RepositoryUrl = http://ftp.acc.umu.se/mirror/kde.org/files/craft/master/
|
||||
|
||||
ContinuousIntegration/Enabled = True
|
||||
|
||||
## This option can be used to override the default make program
|
||||
## change the value to the path of the executable you want to use instead.
|
||||
Compile/MakeProgram = jom
|
||||
|
||||
Packager/CacheDir = ${Variables:Root}\cache
|
||||
Packager/UseCache = ${Variables:UseCache}
|
||||
Packager/CreateCache = ${Variables:CreateCache}
|
||||
Packager/CacheDir = ${Variables:Root}\cache
|
||||
; Packager/RepositoryUrl = https://files.kde.org/craft/
|
||||
Packager/PackageType = PortablePackager
|
||||
Packager/RepositoryUrl = http://ftp.acc.umu.se/mirror/kde.org/files/craft/master/
|
||||
Compile/BuildType = RelWithDebInfo
|
||||
ContinuousIntegration/Enabled = True
|
||||
|
||||
[BlueprintSettings]
|
||||
# don't try to pip install on the ci
|
||||
python-modules.ignored = True
|
||||
nextcloud-client.buildTests = True
|
||||
binary/mysql.useMariaDB = False
|
||||
|
||||
[windows-msvc2019_64-cl]
|
||||
QtSDK/Compiler = msvc2019_64
|
||||
General/ABI = windows-msvc2019_64-cl
|
||||
libs/qt5.version = 5.9.3
|
||||
craft/craft-core.version = master
|
||||
|
||||
[windows-msvc2017_64-cl]
|
||||
General/ABI = windows-msvc2017_64-cl
|
||||
|
||||
[windows-msvc2017_32-cl]
|
||||
General/ABI = windows-msvc2017_32-cl
|
||||
|
||||
44
appveyor.yml
@@ -1,42 +1,50 @@
|
||||
version: '{build}-{branch}'
|
||||
|
||||
image: Visual Studio 2019
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
|
||||
clone_depth: 1
|
||||
clone_depth: 50
|
||||
|
||||
|
||||
init:
|
||||
- ps: |
|
||||
function craft() {
|
||||
cmd /C "echo %PATH%"
|
||||
& "C:\Python39-x64\python.exe" "C:\CraftMaster\CraftMaster\CraftMaster.py" --config "$env:APPVEYOR_BUILD_FOLDER\appveyor.ini" --variables "APPVEYOR_BUILD_FOLDER=$env:APPVEYOR_BUILD_FOLDER" --target $env:TARGET -c $args
|
||||
function craft($target) {
|
||||
& C:\Python36\python.exe "C:\CraftMaster\CraftMaster\CraftMaster.py" --config "$env:APPVEYOR_BUILD_FOLDER\appveyor.ini" --variables "APPVEYOR_BUILD_FOLDER=$env:APPVEYOR_BUILD_FOLDER" --target $target -c $args
|
||||
if($LASTEXITCODE -ne 0) {exit $LASTEXITCODE}
|
||||
}
|
||||
function crafttests() {
|
||||
cmd /C "echo %PATH%"
|
||||
& "C:\Python39-x64\python.exe" "C:\CraftMaster\CraftMaster\CraftMaster.py" --config "$env:APPVEYOR_BUILD_FOLDER\appveyor.ini" --variables "APPVEYOR_BUILD_FOLDER=$env:APPVEYOR_BUILD_FOLDER" --target $env:TARGET -c $args
|
||||
}
|
||||
|
||||
install:
|
||||
- ps: |
|
||||
#use cmd to silence powershell behaviour for stderr
|
||||
& cmd /C "git clone -q --depth=1 https://invent.kde.org/packaging/craftmaster.git C:\CraftMaster\CraftMaster 2>&1"
|
||||
craft --add-blueprint-repository [git]https://github.com/nextcloud/desktop-client-blueprints.git
|
||||
craft craft
|
||||
craft --install-deps nextcloud-client
|
||||
craft nsis
|
||||
& cmd /C "git clone -q --depth=1 git://anongit.kde.org/craftmaster.git C:\CraftMaster\CraftMaster 2>&1"
|
||||
|
||||
craft $env:TARGET -i craft
|
||||
craft $env:TARGET --install-deps owncloud-client
|
||||
|
||||
build_script:
|
||||
- ps: |
|
||||
craft --src-dir $env:APPVEYOR_BUILD_FOLDER nextcloud-client
|
||||
craft $env:TARGET --no-cache --src-dir $env:APPVEYOR_BUILD_FOLDER owncloud-client
|
||||
|
||||
after_build:
|
||||
- ps: |
|
||||
craft $env:TARGET --src-dir $env:APPVEYOR_BUILD_FOLDER --package owncloud-client
|
||||
|
||||
|
||||
on_finish:
|
||||
- ps: |
|
||||
Get-ChildItem $env:USERPROFILE\.craft\* | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name }
|
||||
|
||||
test_script:
|
||||
- ps: |
|
||||
crafttests --test --src-dir $env:APPVEYOR_BUILD_FOLDER nextcloud-client
|
||||
craft $env:TARGET --src-dir $env:APPVEYOR_BUILD_FOLDER --test owncloud-client
|
||||
|
||||
environment:
|
||||
matrix:
|
||||
- TARGET: windows-msvc2019_64-cl
|
||||
- TARGET: windows-msvc2017_32-cl
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||
- TARGET: windows-msvc2017_64-cl
|
||||
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||
|
||||
artifacts:
|
||||
- path: binaries/*
|
||||
|
||||
142
cmake/modules/AddAppIconMacro.cmake
Normal file
@@ -0,0 +1,142 @@
|
||||
SET(WINDRES_EXECUTABLE_BASE ${CMAKE_RC_COMPILER})
|
||||
|
||||
# This macro is taken from kdelibs/cmake/modules/KDE4Macros.cmake.
|
||||
#
|
||||
# Copyright (c) 2006-2009 Alexander Neundorf, <neundorf@kde.org>
|
||||
# Copyright (c) 2006, 2007, Laurent Montel, <montel@kde.org>
|
||||
# Copyright (c) 2007 Matthias Kretz <kretz@kde.org>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file [in KDE repositories].
|
||||
|
||||
|
||||
# adds application icon to target source list
|
||||
# for detailed documentation see the top of FindKDE4Internal.cmake
|
||||
macro (KDE4_ADD_APP_ICON appsources pattern)
|
||||
set (_outfilename ${CMAKE_CURRENT_BINARY_DIR}/${appsources})
|
||||
|
||||
if (WIN32)
|
||||
if(NOT WINCE)
|
||||
find_program(PNG2ICO_EXECUTABLE NAMES png2ico)
|
||||
else(NOT WINCE)
|
||||
find_program(PNG2ICO_EXECUTABLE NAMES png2ico PATHS ${HOST_BINDIR} NO_DEFAULT_PATH )
|
||||
endif(NOT WINCE)
|
||||
find_program(WINDRES_EXECUTABLE NAMES ${WINDRES_EXECUTABLE_BASE})
|
||||
if(MSVC)
|
||||
set(WINDRES_EXECUTABLE TRUE)
|
||||
endif(MSVC)
|
||||
if (PNG2ICO_EXECUTABLE AND WINDRES_EXECUTABLE)
|
||||
string(REPLACE "*" "([0123456789]*)" pattern_rx "${pattern}")
|
||||
file(GLOB files "${pattern}")
|
||||
foreach (it ${files})
|
||||
string(REGEX REPLACE "${pattern_rx}" "\\1" fn "${it}")
|
||||
if (fn MATCHES ".*16.*" )
|
||||
list (APPEND _icons ${it})
|
||||
endif (fn MATCHES ".*16.*")
|
||||
if (fn MATCHES ".*32.*" )
|
||||
list (APPEND _icons ${it})
|
||||
endif (fn MATCHES ".*32.*")
|
||||
if (fn MATCHES ".*48.*" )
|
||||
list (APPEND _icons ${it})
|
||||
endif (fn MATCHES ".*48.*")
|
||||
if (fn MATCHES ".*64.*" )
|
||||
list (APPEND _icons ${it})
|
||||
endif (fn MATCHES ".*64.*")
|
||||
if (fn MATCHES ".*128.*" )
|
||||
list (APPEND _icons ${it})
|
||||
endif (fn MATCHES ".*128.*")
|
||||
if (fn MATCHES ".*256.*" )
|
||||
list (APPEND _icons ${it})
|
||||
endif (fn MATCHES ".*256.*")
|
||||
if (fn MATCHES ".*512.*" )
|
||||
list (APPEND _icons ${it})
|
||||
endif (fn MATCHES ".*512.*")
|
||||
if (fn MATCHES ".*1024.*" )
|
||||
list (APPEND _icons ${it})
|
||||
endif (fn MATCHES ".*1024.*")
|
||||
endforeach (it)
|
||||
if (_icons)
|
||||
add_custom_command(OUTPUT ${_outfilename}.ico ${_outfilename}.rc
|
||||
COMMAND ${PNG2ICO_EXECUTABLE} ARGS --rcfile ${_outfilename}.rc ${_outfilename}.ico ${_icons}
|
||||
DEPENDS ${PNG2ICO_EXECUTABLE} ${_icons}
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
)
|
||||
if (MINGW)
|
||||
add_custom_command(OUTPUT ${_outfilename}_res.o
|
||||
COMMAND ${WINDRES_EXECUTABLE} ARGS -i ${_outfilename}.rc -o ${_outfilename}_res.o --include-dir=${CMAKE_CURRENT_SOURCE_DIR}
|
||||
DEPENDS ${WINDRES_EXECUTABLE} ${_outfilename}.rc
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
)
|
||||
list(APPEND ${appsources} ${_outfilename}_res.o)
|
||||
else(MINGW)
|
||||
list(APPEND ${appsources} ${_outfilename}.rc)
|
||||
endif(MINGW)
|
||||
else(_icons)
|
||||
message(STATUS "Unable to find a related icon that matches pattern ${pattern} for variable ${appsources} - application will not have an application icon!")
|
||||
endif(_icons)
|
||||
else(PNG2ICO_EXECUTABLE AND WINDRES_EXECUTABLE)
|
||||
message(WARNING "Unable to find the png2ico or windres utilities - application will not have an application icon!")
|
||||
endif(PNG2ICO_EXECUTABLE AND WINDRES_EXECUTABLE)
|
||||
endif(WIN32)
|
||||
if (APPLE)
|
||||
file(GLOB_RECURSE files "${pattern}")
|
||||
file(MAKE_DIRECTORY ${appsources}.iconset)
|
||||
|
||||
# List from:
|
||||
# https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Optimizing/Optimizing.html#//apple_ref/doc/uid/TP40012302-CH7-SW4
|
||||
foreach (it ${files})
|
||||
if (it MATCHES ".*icon-16.*")
|
||||
configure_file(${it} ${appsources}.iconset/icon_16x16.png COPYONLY)
|
||||
elseif (it MATCHES ".*icon-32.*")
|
||||
configure_file(${it} ${appsources}.iconset/icon_16x16@2x.png COPYONLY)
|
||||
configure_file(${it} ${appsources}.iconset/icon_32x32.png COPYONLY)
|
||||
elseif (it MATCHES ".*icon-64.*")
|
||||
configure_file(${it} ${appsources}.iconset/icon_32x32@2x.png COPYONLY)
|
||||
elseif (it MATCHES ".*icon-128.*")
|
||||
configure_file(${it} ${appsources}.iconset/icon_128x128.png COPYONLY)
|
||||
elseif (it MATCHES ".*icon-256.*")
|
||||
configure_file(${it} ${appsources}.iconset/icon_128x128@2x.png COPYONLY)
|
||||
configure_file(${it} ${appsources}.iconset/icon_256x256.png COPYONLY)
|
||||
elseif (it MATCHES ".*icon-512.*")
|
||||
configure_file(${it} ${appsources}.iconset/icon_256x256@2x.png COPYONLY)
|
||||
configure_file(${it} ${appsources}.iconset/icon_512x512.png COPYONLY)
|
||||
elseif (it MATCHES ".*icon-1024.*")
|
||||
configure_file(${it} ${appsources}.iconset/icon_512x512@2x.png COPYONLY)
|
||||
endif()
|
||||
endforeach (it)
|
||||
|
||||
# Copy the sidebar icons in the main app bundle for the FinderSync extension to pick.
|
||||
# https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/Finder.html#//apple_ref/doc/uid/TP40014214-CH15-SW15
|
||||
foreach (it ${files})
|
||||
if (it MATCHES ".*sidebar-16.*")
|
||||
configure_file(${it} ${appsources}.iconset/sidebar_16x16.png COPYONLY)
|
||||
elseif (it MATCHES ".*sidebar-32.*")
|
||||
configure_file(${it} ${appsources}.iconset/sidebar_18x18.png COPYONLY)
|
||||
configure_file(${it} ${appsources}.iconset/sidebar_16x16@2x.png COPYONLY)
|
||||
elseif (it MATCHES ".*sidebar-64.*")
|
||||
configure_file(${it} ${appsources}.iconset/sidebar_18x18@2x.png COPYONLY)
|
||||
elseif (it MATCHES ".*sidebar-128.*")
|
||||
configure_file(${it} ${appsources}.iconset/sidebar_32x32.png COPYONLY)
|
||||
elseif (it MATCHES ".*sidebar-256.*")
|
||||
configure_file(${it} ${appsources}.iconset/sidebar_32x32@2x.png COPYONLY)
|
||||
endif()
|
||||
endforeach (it)
|
||||
|
||||
add_custom_command(OUTPUT ${_outfilename}.icns
|
||||
COMMAND echo === Building bundle icns with iconset:
|
||||
COMMAND ls -1 ${appsources}.iconset
|
||||
COMMAND iconutil -c icns -o ${_outfilename}.icns ${appsources}.iconset
|
||||
DEPENDS ${files}
|
||||
)
|
||||
|
||||
# This will register the icon into the bundle
|
||||
set(MACOSX_BUNDLE_ICON_FILE ${appsources}.icns)
|
||||
|
||||
# Append the icns file to the sources list so it will be a dependency to the
|
||||
# main target
|
||||
list(APPEND ${appsources} ${_outfilename}.icns)
|
||||
|
||||
# Install the icon into the Resources dir in the bundle
|
||||
set_source_files_properties(${_outfilename}.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
|
||||
endif(APPLE)
|
||||
endmacro (KDE4_ADD_APP_ICON)
|
||||
@@ -25,5 +25,10 @@ set(GENERIC_LIB_SOVERSION "0")
|
||||
# set -Werror
|
||||
set(CMAKE_ENABLE_WERROR ON)
|
||||
|
||||
# enables folders for targets to be visible in an IDE
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
# Set the default build type to release with debug info
|
||||
if (NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE RelWithDebInfo
|
||||
CACHE STRING
|
||||
"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
|
||||
)
|
||||
endif (NOT CMAKE_BUILD_TYPE)
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
# target does not have the ``WIN32_EXECUTABLE`` property set.
|
||||
# * One of the tools png2ico (See :find-module:`FindPng2Ico`) or
|
||||
# icotool (see :find-module:`FindIcoTool`) is required.
|
||||
# * Supported sizes: 16, 20, 24, 32, 40, 48, 64, 128, 256, 512 and 1024.
|
||||
# * Supported sizes: 16, 24, 32, 48, 64, 128, 256, 512 and 1024.
|
||||
#
|
||||
# Mac OS X notes
|
||||
# * The executable target must have the ``MACOSX_BUNDLE`` property set.
|
||||
@@ -102,12 +102,9 @@ include(CMakeParseArguments)
|
||||
|
||||
function(ecm_add_app_icon appsources)
|
||||
set(options)
|
||||
set(oneValueArgs OUTFILE_BASENAME ICON_INDEX)
|
||||
set(multiValueArgs ICONS SIDEBAR_ICONS RC_DEPENDENCIES)
|
||||
set(oneValueArgs OUTFILE_BASENAME)
|
||||
set(multiValueArgs ICONS SIDEBAR_ICONS)
|
||||
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
||||
if (NOT ARG_ICON_INDEX)
|
||||
set(ARG_ICON_INDEX 1)
|
||||
endif()
|
||||
|
||||
if(NOT ARG_ICONS)
|
||||
message(FATAL_ERROR "No ICONS argument given to ecm_add_app_icon")
|
||||
@@ -141,11 +138,8 @@ function(ecm_add_app_icon appsources)
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
if (WIN32)
|
||||
_ecm_add_app_icon_categorize_icons("${ARG_ICONS}" "icons" "16;20;24;32;40;48;64;128;256;512;1024")
|
||||
else()
|
||||
_ecm_add_app_icon_categorize_icons("${ARG_ICONS}" "icons" "16;24;32;48;64;128;256;512;1024")
|
||||
endif()
|
||||
|
||||
_ecm_add_app_icon_categorize_icons("${ARG_ICONS}" "icons" "16;24;32;48;64;128;256;512;1024")
|
||||
if(ARG_SIDEBAR_ICONS)
|
||||
_ecm_add_app_icon_categorize_icons("${ARG_SIDEBAR_ICONS}" "sidebar_icons" "16;32;64;128;256")
|
||||
endif()
|
||||
@@ -174,10 +168,8 @@ function(ecm_add_app_icon appsources)
|
||||
|
||||
|
||||
set(windows_icons ${icons_at_16px}
|
||||
${icons_at_20px}
|
||||
${icons_at_24px}
|
||||
${icons_at_32px}
|
||||
${icons_at_40px}
|
||||
${icons_at_48px}
|
||||
${icons_at_64px}
|
||||
${icons_at_128px}
|
||||
@@ -212,12 +204,12 @@ function(ecm_add_app_icon appsources)
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
)
|
||||
# this bit's a little hacky to make the dependency stuff work
|
||||
file(WRITE "${_outfilename}.rc.in" "IDI_ICON${ARG_ICON_INDEX} ICON DISCARDABLE \"${_outfilename}.ico\"\n")
|
||||
file(WRITE "${_outfilename}.rc.in" "IDI_ICON1 ICON DISCARDABLE \"${_outfilename}.ico\"\n")
|
||||
add_custom_command(
|
||||
OUTPUT "${_outfilename}.rc"
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
ARGS -E copy "${_outfilename}.rc.in" "${_outfilename}.rc"
|
||||
DEPENDS ${ARG_RC_DEPENDENCIES} "${_outfilename}.ico"
|
||||
DEPENDS "${_outfilename}.ico"
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
|
||||
)
|
||||
endfunction()
|
||||
@@ -234,7 +226,7 @@ function(ecm_add_app_icon appsources)
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
foreach(size 16 20 24 32 40 48 64 128 ${maxSize})
|
||||
foreach(size 16 24 32 48 64 128 ${maxSize})
|
||||
if(NOT icons_at_${size}px)
|
||||
continue()
|
||||
endif()
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
# SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||
#
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
#[=======================================================================[.rst:
|
||||
ECMCoverageOption
|
||||
--------------------
|
||||
|
||||
Allow users to easily enable GCov code coverage support.
|
||||
|
||||
Code coverage allows you to check how much of your codebase is covered by
|
||||
your tests. This module makes it easy to build with support for
|
||||
`GCov <https://gcc.gnu.org/onlinedocs/gcc/Gcov.html>`_.
|
||||
|
||||
When this module is included, a ``BUILD_COVERAGE`` option is added (default
|
||||
OFF). Turning this option on enables GCC's coverage instrumentation, and
|
||||
links against ``libgcov``.
|
||||
|
||||
Note that this will probably break the build if you are not using GCC.
|
||||
|
||||
Since 1.3.0.
|
||||
#]=======================================================================]
|
||||
|
||||
option(BUILD_COVERAGE "Build the project with gcov support" OFF)
|
||||
|
||||
if(BUILD_COVERAGE)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lgcov")
|
||||
endif()
|
||||
@@ -1,169 +0,0 @@
|
||||
# SPDX-FileCopyrightText: 2014 Mathieu Tarral <mathieu.tarral@gmail.com>
|
||||
#
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
#[=======================================================================[.rst:
|
||||
ECMEnableSanitizers
|
||||
-------------------
|
||||
|
||||
Enable compiler sanitizer flags.
|
||||
|
||||
The following sanitizers are supported:
|
||||
|
||||
- Address Sanitizer
|
||||
- Memory Sanitizer
|
||||
- Thread Sanitizer
|
||||
- Leak Sanitizer
|
||||
- Undefined Behaviour Sanitizer
|
||||
|
||||
All of them are implemented in Clang, depending on your version, and
|
||||
there is an work in progress in GCC, where some of them are currently
|
||||
implemented.
|
||||
|
||||
This module will check your current compiler version to see if it
|
||||
supports the sanitizers that you want to enable
|
||||
|
||||
Usage
|
||||
=====
|
||||
|
||||
Simply add::
|
||||
|
||||
include(ECMEnableSanitizers)
|
||||
|
||||
to your ``CMakeLists.txt``. Note that this module is included in
|
||||
KDECompilerSettings, so projects using that module do not need to also
|
||||
include this one.
|
||||
|
||||
The sanitizers are not enabled by default. Instead, you must set
|
||||
``ECM_ENABLE_SANITIZERS`` (either in your ``CMakeLists.txt`` or on the
|
||||
command line) to a semicolon-separated list of sanitizers you wish to enable.
|
||||
The options are:
|
||||
|
||||
- address
|
||||
- memory
|
||||
- thread
|
||||
- leak
|
||||
- undefined
|
||||
- fuzzer
|
||||
|
||||
The sanitizers "address", "memory" and "thread" are mutually exclusive. You
|
||||
cannot enable two of them in the same build.
|
||||
|
||||
"leak" requires the "address" sanitizer.
|
||||
|
||||
.. note::
|
||||
|
||||
To reduce the overhead induced by the instrumentation of the sanitizers, it
|
||||
is advised to enable compiler optimizations (``-O1`` or higher).
|
||||
|
||||
Example
|
||||
=======
|
||||
|
||||
This is an example of usage::
|
||||
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DECM_ENABLE_SANITIZERS='address;leak;undefined' ..
|
||||
|
||||
.. note::
|
||||
|
||||
Most of the sanitizers will require Clang. To enable it, use::
|
||||
|
||||
-DCMAKE_CXX_COMPILER=clang++
|
||||
|
||||
Since 1.3.0.
|
||||
#]=======================================================================]
|
||||
|
||||
# MACRO check_compiler_version
|
||||
#-----------------------------
|
||||
macro (check_compiler_version gcc_required_version clang_required_version msvc_required_version)
|
||||
if (
|
||||
(
|
||||
CMAKE_CXX_COMPILER_ID MATCHES "GNU"
|
||||
AND
|
||||
CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${gcc_required_version}
|
||||
)
|
||||
OR
|
||||
(
|
||||
CMAKE_CXX_COMPILER_ID MATCHES "Clang"
|
||||
AND
|
||||
CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${clang_required_version}
|
||||
)
|
||||
OR
|
||||
(
|
||||
CMAKE_CXX_COMPILER_ID MATCHES "MSVC"
|
||||
AND
|
||||
CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${msvc_required_version}
|
||||
)
|
||||
)
|
||||
# error !
|
||||
message(FATAL_ERROR "You ask to enable the sanitizer ${CUR_SANITIZER},
|
||||
but your compiler ${CMAKE_CXX_COMPILER_ID} version ${CMAKE_CXX_COMPILER_VERSION}
|
||||
does not support it !
|
||||
You should use at least GCC ${gcc_required_version}, Clang ${clang_required_version}
|
||||
or MSVC ${msvc_required_version}
|
||||
(99.99 means not implemented yet)")
|
||||
endif ()
|
||||
endmacro ()
|
||||
|
||||
# MACRO check_compiler_support
|
||||
#------------------------------
|
||||
macro (enable_sanitizer_flags sanitize_option)
|
||||
if (${sanitize_option} MATCHES "address")
|
||||
check_compiler_version("4.8" "3.1" "19.28")
|
||||
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
||||
set(XSAN_COMPILE_FLAGS "-fsanitize=address")
|
||||
else()
|
||||
set(XSAN_COMPILE_FLAGS "-fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls")
|
||||
set(XSAN_LINKER_FLAGS "-fsanitize=address")
|
||||
endif()
|
||||
elseif (${sanitize_option} MATCHES "thread")
|
||||
check_compiler_version("4.8" "3.1" "99.99")
|
||||
set(XSAN_COMPILE_FLAGS "-fsanitize=thread")
|
||||
set(XSAN_LINKER_FLAGS "tsan")
|
||||
elseif (${sanitize_option} MATCHES "memory")
|
||||
check_compiler_version("99.99" "3.1" "99.99")
|
||||
set(XSAN_COMPILE_FLAGS "-fsanitize=memory")
|
||||
elseif (${sanitize_option} MATCHES "leak")
|
||||
check_compiler_version("4.9" "3.4" "99.99")
|
||||
set(XSAN_COMPILE_FLAGS "-fsanitize=leak")
|
||||
set(XSAN_LINKER_FLAGS "lsan")
|
||||
elseif (${sanitize_option} MATCHES "undefined")
|
||||
check_compiler_version("4.9" "3.1" "99.99")
|
||||
set(XSAN_COMPILE_FLAGS "-fsanitize=undefined -fno-omit-frame-pointer -fno-optimize-sibling-calls")
|
||||
elseif (${sanitize_option} MATCHES "fuzzer")
|
||||
check_compiler_version("99.99" "6.0" "99.99")
|
||||
set(XSAN_COMPILE_FLAGS "-fsanitize=fuzzer")
|
||||
else ()
|
||||
message(FATAL_ERROR "Compiler sanitizer option \"${sanitize_option}\" not supported.")
|
||||
endif ()
|
||||
endmacro ()
|
||||
|
||||
if (ECM_ENABLE_SANITIZERS)
|
||||
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
||||
# for each element of the ECM_ENABLE_SANITIZERS list
|
||||
foreach ( CUR_SANITIZER ${ECM_ENABLE_SANITIZERS} )
|
||||
# lowercase filter
|
||||
string(TOLOWER ${CUR_SANITIZER} CUR_SANITIZER)
|
||||
# check option and enable appropriate flags
|
||||
enable_sanitizer_flags ( ${CUR_SANITIZER} )
|
||||
# TODO: GCC will not link pthread library if enabled ASan
|
||||
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${XSAN_COMPILE_FLAGS}" )
|
||||
link_libraries(${XSAN_LINKER_FLAGS})
|
||||
endif()
|
||||
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${XSAN_COMPILE_FLAGS}" )
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
||||
link_libraries(${XSAN_LINKER_FLAGS})
|
||||
endif()
|
||||
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
string(REPLACE "-Wl,--no-undefined" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
|
||||
string(REPLACE "-Wl,--no-undefined" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
|
||||
link_libraries(${XSAN_LINKER_FLAGS})
|
||||
endif ()
|
||||
endforeach()
|
||||
else()
|
||||
message(STATUS "Tried to enable sanitizers (-DECM_ENABLE_SANITIZERS=${ECM_ENABLE_SANITIZERS}), \
|
||||
but compiler (${CMAKE_CXX_COMPILER_ID}) does not have sanitizer support")
|
||||
endif()
|
||||
endif()
|
||||
35
cmake/modules/FindGLib2.cmake
Normal file
@@ -0,0 +1,35 @@
|
||||
# FindGLib2.cmake
|
||||
|
||||
# GLib2_FOUND - System has GLib2
|
||||
# GLib2_INCLUDES - The GLib2 include directories
|
||||
# GLib2_LIBRARIES - The libraries needed to use GLib2
|
||||
# GLib2_DEFINITIONS - Compiler switches required for using GLib2
|
||||
|
||||
find_package(PkgConfig)
|
||||
pkg_check_modules(GLib2 QUIET glib-2.0)
|
||||
set(GLib2_DEFINITIONS ${GLib2_CFLAGS_OTHER})
|
||||
|
||||
find_path(GLib2_INCLUDE_DIR
|
||||
NAMES glib.h glib-object.h
|
||||
HINTS ${GLib2_INCLUDEDIR} ${GLib2_INCLUDE_DIRS}
|
||||
PATH_SUFFIXES glib-2.0)
|
||||
find_path(GLIBCONFIG_INCLUDE_DIR
|
||||
NAMES glibconfig.h
|
||||
HINTS ${LIBDIR} ${LIBRARY_DIRS} ${_GLib2_LIBRARY_DIR}
|
||||
${GLib2_INCLUDEDIR} ${GLib2_INCLUDE_DIRS}
|
||||
${CMAKE_EXTRA_INCLUDES} ${CMAKE_EXTRA_LIBRARIES}
|
||||
PATH_SUFFIXES glib-2.0 glib-2.0/include)
|
||||
list(APPEND GLib2_INCLUDE_DIR ${GLIBCONFIG_INCLUDE_DIR})
|
||||
|
||||
find_library(GLib2_LIBRARY
|
||||
NAMES glib-2.0 libglib-2.0
|
||||
HINTS ${GLib2_LIBDIR} ${GLib2_LIBRARY_DIRS})
|
||||
|
||||
set(GLib2_LIBRARIES ${GLib2_LIBRARY})
|
||||
set(GLib2_INCLUDE_DIRS ${GLib2_INCLUDE_DIR})
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(GLib2 DEFAULT_MSG
|
||||
GLib2_LIBRARY GLib2_INCLUDE_DIR)
|
||||
|
||||
mark_as_advanced(GLib2_INCLUDE_DIR GLib2_LIBRARY)
|
||||
61
cmake/modules/FindGio.cmake
Normal file
@@ -0,0 +1,61 @@
|
||||
# - Try to find Gio
|
||||
# Once done this will define
|
||||
#
|
||||
# GIO_FOUND - system has Gio
|
||||
# GIO_INCLUDE_DIR - the Gio include directory
|
||||
# GIO_LIBRARIES - the libraries needed to use Gio
|
||||
# GIO_DEFINITIONS - Compiler switches required for using Gio
|
||||
|
||||
|
||||
IF (GIO_INCLUDE_DIR AND GIO_LIBRARIES)
|
||||
# in cache already
|
||||
SET(Gio_FIND_QUIETLY TRUE)
|
||||
ELSE (GIO_INCLUDE_DIR AND GIO_LIBRARIES)
|
||||
SET(Gio_FIND_QUIETLY FALSE)
|
||||
ENDIF (GIO_INCLUDE_DIR AND GIO_LIBRARIES)
|
||||
|
||||
IF (NOT WIN32)
|
||||
# use pkg-config to get the directories and then use these values
|
||||
# in the FIND_PATH() and FIND_LIBRARY() calls
|
||||
FIND_PACKAGE(PkgConfig)
|
||||
PKG_CHECK_MODULES(GIO gio-2.0)
|
||||
#MESSAGE(STATUS "DEBUG: Gio include directory = ${GIO_INCLUDE_DIRS}")
|
||||
#MESSAGE(STATUS "DEBUG: Gio link directory = ${GIO_LIBRARY_DIRS}")
|
||||
#MESSAGE(STATUS "DEBUG: Gio CFlags = ${GIO_CFLAGS}")
|
||||
SET(GIO_DEFINITIONS ${GIO_CFLAGS_OTHER})
|
||||
ENDIF (NOT WIN32)
|
||||
|
||||
FIND_PATH(GIO_INCLUDE_DIR gio.h
|
||||
PATHS
|
||||
${GIO_INCLUDEDIR}
|
||||
${GIO_INCLUDE_DIRS}
|
||||
PATH_SUFFIXES glib-2.0/gio/
|
||||
)
|
||||
|
||||
FIND_LIBRARY(_GioLibs NAMES gio-2.0 libgio-2.0
|
||||
PATHS
|
||||
${GIO_LIBDIR}
|
||||
${GIO_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
SET( GIO_LIBRARIES ${_GioLibs} )
|
||||
SET( GIO_INCLUDE_DIRS ${GIO_INCLUDE_DIR} )
|
||||
|
||||
IF (GIO_INCLUDE_DIR AND GIO_LIBRARIES)
|
||||
SET(GIO_FOUND TRUE)
|
||||
ELSE (GIO_INCLUDE_DIR AND GIO_LIBRARIES)
|
||||
SET(GIO_FOUND FALSE)
|
||||
ENDIF (GIO_INCLUDE_DIR AND GIO_LIBRARIES)
|
||||
|
||||
IF (GIO_FOUND)
|
||||
IF (NOT Gio_FIND_QUIETLY)
|
||||
MESSAGE(STATUS "Found Gio libraries: ${GIO_LIBRARIES}")
|
||||
MESSAGE(STATUS "Found Gio includes : ${GIO_INCLUDE_DIR}")
|
||||
ENDIF (NOT Gio_FIND_QUIETLY)
|
||||
ELSE (GIO_FOUND)
|
||||
IF (Gio_FIND_REQUIRED)
|
||||
MESSAGE(STATUS "Could NOT find Gio")
|
||||
ENDIF(Gio_FIND_REQUIRED)
|
||||
ENDIF (GIO_FOUND)
|
||||
|
||||
MARK_AS_ADVANCED(GIO_INCLUDE_DIR _GioLibs)
|
||||
30
cmake/modules/FindINotify.cmake
Normal file
@@ -0,0 +1,30 @@
|
||||
# (c) 2014 Copyright ownCloud GmbH
|
||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
||||
# For details see the accompanying COPYING* file.
|
||||
|
||||
# This module defines
|
||||
# INOTIFY_INCLUDE_DIR, where to find inotify.h, etc.
|
||||
# INOTIFY_LIBRARY_DIR, the directory holding the inotify library.
|
||||
# INOTIFY_FOUND, If false, do not try to use inotify.
|
||||
# also defined, but not for general use are
|
||||
# INOTIFY_LIBRARY, where to find the inotify library.
|
||||
|
||||
find_path(INOTIFY_INCLUDE_DIR sys/inotify.h
|
||||
PATH_SUFFIXES inotify)
|
||||
mark_as_advanced(INOTIFY_INCLUDE_DIR)
|
||||
|
||||
find_library(INOTIFY_LIBRARY inotify PATH_SUFFIXES lib/inotify)
|
||||
|
||||
get_filename_component(INOTIFY_LIBRARY_DIR ${INOTIFY_LIBRARY} PATH)
|
||||
mark_as_advanced(INOTIFY_LIBRARY_DIR)
|
||||
|
||||
# all listed variables are TRUE
|
||||
# handle the QUIETLY and REQUIRED arguments and set INOTIFY_FOUND to TRUE if
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(INOTIFY DEFAULT_MSG INOTIFY_INCLUDE_DIR INOTIFY_LIBRARY_DIR)
|
||||
|
||||
IF(INOTIFY_FOUND)
|
||||
SET(INotify_INCLUDE_DIRS ${INOTIFY_INCLUDE_DIR})
|
||||
SET(INotify_LIBRARY_DIRS ${INOTIFY_LIBRARY_DIR})
|
||||
ENDIF(INOTIFY_FOUND)
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
#.rst:
|
||||
# FindInotify
|
||||
# --------------
|
||||
#
|
||||
# Try to find inotify on this system. This finds:
|
||||
# - libinotify on Unix like systems, or
|
||||
# - the kernel's inotify on Linux systems.
|
||||
#
|
||||
# This will define the following variables:
|
||||
#
|
||||
# ``Inotify_FOUND``
|
||||
# True if inotify is available
|
||||
# ``Inotify_LIBRARIES``
|
||||
# This has to be passed to target_link_libraries()
|
||||
# ``Inotify_INCLUDE_DIRS``
|
||||
# This has to be passed to target_include_directories()
|
||||
#
|
||||
# On Linux, the libraries and include directories are empty,
|
||||
# even though ``Inotify_FOUND`` may be set to TRUE. This is because
|
||||
# no special includes or libraries are needed. On other systems
|
||||
# these may be needed to use inotify.
|
||||
#
|
||||
# Since 5.32.0.
|
||||
|
||||
#=============================================================================
|
||||
# SPDX-FileCopyrightText: 2016 Tobias C. Berner <tcberner@FreeBSD.org>
|
||||
# SPDX-FileCopyrightText: 2017 Adriaan de Groot <groot@kde.org>
|
||||
#
|
||||
# SPDX-License-Identifier: BSD-2-Clause
|
||||
#=============================================================================
|
||||
|
||||
find_path(Inotify_INCLUDE_DIRS sys/inotify.h)
|
||||
|
||||
if(Inotify_INCLUDE_DIRS)
|
||||
# On Linux there is no library to link against, on the BSDs there is.
|
||||
# On the BSD's, inotify is implemented through a library, libinotify.
|
||||
if( CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
set(Inotify_FOUND TRUE)
|
||||
set(Inotify_LIBRARIES "")
|
||||
set(Inotify_INCLUDE_DIRS "")
|
||||
else()
|
||||
find_library(Inotify_LIBRARIES NAMES inotify)
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(Inotify
|
||||
FOUND_VAR
|
||||
Inotify_FOUND
|
||||
REQUIRED_VARS
|
||||
Inotify_LIBRARIES
|
||||
Inotify_INCLUDE_DIRS
|
||||
)
|
||||
mark_as_advanced(Inotify_LIBRARIES Inotify_INCLUDE_DIRS)
|
||||
include(FeatureSummary)
|
||||
set_package_properties(Inotify PROPERTIES
|
||||
URL "https://github.com/libinotify-kqueue/"
|
||||
DESCRIPTION "inotify API on the *BSD family of operating systems."
|
||||
)
|
||||
endif()
|
||||
else()
|
||||
set(Inotify_FOUND FALSE)
|
||||
endif()
|
||||
|
||||
mark_as_advanced(Inotify_LIBRARIES Inotify_INCLUDE_DIRS)
|
||||
22
cmake/modules/FindLibcloudproviders.cmake
Normal file
@@ -0,0 +1,22 @@
|
||||
# FindLibcloudproviders.cmake
|
||||
|
||||
find_path(LIBCLOUDPROVIDERS_INCLUDE_DIR
|
||||
NAMES cloudprovidersproviderexporter.h cloudprovidersaccountexporter.h
|
||||
PATH_SUFFIXES cloudproviders
|
||||
)
|
||||
find_library(LIBCLOUDPROVIDERS_LIBRARY
|
||||
NAMES
|
||||
libcloudproviders
|
||||
cloudproviders
|
||||
HINTS
|
||||
/usr/lib
|
||||
/usr/lib/${CMAKE_ARCH_TRIPLET}
|
||||
/usr/local/lib
|
||||
/opt/local/lib
|
||||
${CMAKE_LIBRARY_PATH}
|
||||
${CMAKE_INSTALL_PREFIX}/lib
|
||||
)
|
||||
|
||||
message("================> ${LIBCLOUDPROVIDERS_LIBRARY}")
|
||||
|
||||
find_package_handle_standard_args(LIBCLOUDPROVIDERS DEFAULT_MSG LIBCLOUDPROVIDERS_INCLUDE_DIR LIBCLOUDPROVIDERS_LIBRARY)
|
||||
@@ -52,8 +52,18 @@ if (SQLite3_FIND_VERSION AND _SQLITE3_VERSION)
|
||||
set(SQLite3_VERSION _SQLITE3_VERSION)
|
||||
endif (SQLite3_FIND_VERSION AND _SQLITE3_VERSION)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(SQLite3 DEFAULT_MSG SQLITE3_LIBRARIES SQLITE3_INCLUDE_DIRS)
|
||||
if (APPLE OR WIN32)
|
||||
set(USE_OUR_OWN_SQLITE3 TRUE)
|
||||
set(SQLITE3_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/src/3rdparty/sqlite3)
|
||||
set(SQLITE3_LIBRARIES "")
|
||||
set(SQLITE3_SOURCE ${SQLITE3_INCLUDE_DIR}/sqlite3.c)
|
||||
MESSAGE(STATUS "Using own sqlite3 from " ${SQLITE3_INCLUDE_DIR})
|
||||
else()
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(SQLite3 DEFAULT_MSG SQLITE3_LIBRARIES SQLITE3_INCLUDE_DIRS)
|
||||
endif()
|
||||
|
||||
|
||||
|
||||
# show the SQLITE3_INCLUDE_DIRS and SQLITE3_LIBRARIES variables only in the advanced view
|
||||
mark_as_advanced(SQLITE3_INCLUDE_DIRS SQLITE3_LIBRARIES)
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
#.rst:
|
||||
# FindSharedMimeInfo
|
||||
# ------------------
|
||||
#
|
||||
# Try to find the shared-mime-info package.
|
||||
#
|
||||
# This will define the following variables:
|
||||
#
|
||||
# ``SharedMimeInfo_FOUND``
|
||||
# True if system has the shared-mime-info package
|
||||
# ``UPDATE_MIME_DATABASE_EXECUTABLE``
|
||||
# The update-mime-database executable
|
||||
#
|
||||
# and the following imported targets:
|
||||
#
|
||||
# ``SharedMimeInfo::UpdateMimeDatabase``
|
||||
# The update-mime-database executable
|
||||
#
|
||||
# The follow macro is available::
|
||||
#
|
||||
# update_xdg_mimetypes(<path>)
|
||||
#
|
||||
# Updates the XDG mime database at install time (unless the ``$DESTDIR``
|
||||
# environment variable is set, in which case it is up to package managers to
|
||||
# perform this task).
|
||||
#
|
||||
# Since pre-1.0.0.
|
||||
|
||||
#=============================================================================
|
||||
# SPDX-FileCopyrightText: 2013-2014 Alex Merry <alex.merry@kdemail.net>
|
||||
# SPDX-FileCopyrightText: 2007 Pino Toscano <toscano.pino@tiscali.it>
|
||||
#
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
#=============================================================================
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/ECMFindModuleHelpersStub.cmake)
|
||||
|
||||
ecm_find_package_version_check(SharedMimeInfo)
|
||||
|
||||
find_program (UPDATE_MIME_DATABASE_EXECUTABLE NAMES update-mime-database)
|
||||
|
||||
if (UPDATE_MIME_DATABASE_EXECUTABLE)
|
||||
execute_process(
|
||||
COMMAND "${UPDATE_MIME_DATABASE_EXECUTABLE}" -v
|
||||
OUTPUT_VARIABLE _smiVersionRaw
|
||||
ERROR_VARIABLE _smiVersionRaw)
|
||||
|
||||
string(REGEX REPLACE "update-mime-database \\([a-zA-Z\\-]+\\) ([0-9]\\.[0-9]+).*"
|
||||
"\\1" SharedMimeInfo_VERSION_STRING "${_smiVersionRaw}")
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(SharedMimeInfo
|
||||
FOUND_VAR
|
||||
SharedMimeInfo_FOUND
|
||||
REQUIRED_VARS
|
||||
UPDATE_MIME_DATABASE_EXECUTABLE
|
||||
VERSION_VAR
|
||||
SharedMimeInfo_VERSION_STRING)
|
||||
|
||||
if(SharedMimeInfo_FOUND AND NOT TARGET SharedMimeInfo::UpdateMimeDatabase)
|
||||
add_executable(SharedMimeInfo::UpdateMimeDatabase IMPORTED)
|
||||
set_target_properties(SharedMimeInfo::UpdateMimeDatabase PROPERTIES
|
||||
IMPORTED_LOCATION "${UPDATE_MIME_DATABASE_EXECUTABLE}"
|
||||
)
|
||||
endif()
|
||||
|
||||
mark_as_advanced(UPDATE_MIME_DATABASE_EXECUTABLE)
|
||||
|
||||
function(UPDATE_XDG_MIMETYPES _path)
|
||||
get_filename_component(_xdgmimeDir "${_path}" NAME)
|
||||
if("${_xdgmimeDir}" STREQUAL packages )
|
||||
get_filename_component(_xdgmimeDir "${_path}" PATH)
|
||||
else()
|
||||
set(_xdgmimeDir "${_path}")
|
||||
endif()
|
||||
|
||||
# Note that targets and most variables are not available to install code
|
||||
install(CODE "
|
||||
set(DESTDIR_VALUE \"\$ENV{DESTDIR}\")
|
||||
if (NOT DESTDIR_VALUE)
|
||||
# under Windows relative paths are used, that's why it runs from CMAKE_INSTALL_PREFIX
|
||||
message(STATUS \"Updating MIME database at \${CMAKE_INSTALL_PREFIX}/${_xdgmimeDir}\")
|
||||
execute_process(COMMAND \"${UPDATE_MIME_DATABASE_EXECUTABLE}\" -n \"${_xdgmimeDir}\"
|
||||
WORKING_DIRECTORY \"\${CMAKE_INSTALL_PREFIX}\")
|
||||
endif (NOT DESTDIR_VALUE)
|
||||
")
|
||||
endfunction()
|
||||
|
||||
include(FeatureSummary)
|
||||
set_package_properties(SharedMimeInfo PROPERTIES
|
||||
URL https://freedesktop.org/wiki/Software/shared-mime-info/
|
||||
DESCRIPTION "A database of common MIME types")
|
||||
253
cmake/modules/GNUInstallDirs.cmake
Normal file
@@ -0,0 +1,253 @@
|
||||
#.rst:
|
||||
# GNUInstallDirs
|
||||
# --------------
|
||||
#
|
||||
# Define GNU standard installation directories
|
||||
#
|
||||
# Provides install directory variables as defined for GNU software:
|
||||
#
|
||||
# ::
|
||||
#
|
||||
# http://www.gnu.org/prep/standards/html_node/Directory-Variables.html
|
||||
#
|
||||
# Inclusion of this module defines the following variables:
|
||||
#
|
||||
# ::
|
||||
#
|
||||
# CMAKE_INSTALL_<dir> - destination for files of a given type
|
||||
# CMAKE_INSTALL_FULL_<dir> - corresponding absolute path
|
||||
#
|
||||
# where <dir> is one of:
|
||||
#
|
||||
# ::
|
||||
#
|
||||
# BINDIR - user executables (bin)
|
||||
# SBINDIR - system admin executables (sbin)
|
||||
# LIBEXECDIR - program executables (libexec)
|
||||
# SYSCONFDIR - read-only single-machine data (etc)
|
||||
# SHAREDSTATEDIR - modifiable architecture-independent data (com)
|
||||
# LOCALSTATEDIR - modifiable single-machine data (var)
|
||||
# LIBDIR - object code libraries (lib or lib64 or lib/<multiarch-tuple> on Debian)
|
||||
# INCLUDEDIR - C header files (include)
|
||||
# OLDINCLUDEDIR - C header files for non-gcc (/usr/include)
|
||||
# DATAROOTDIR - read-only architecture-independent data root (share)
|
||||
# DATADIR - read-only architecture-independent data (DATAROOTDIR)
|
||||
# INFODIR - info documentation (DATAROOTDIR/info)
|
||||
# LOCALEDIR - locale-dependent data (DATAROOTDIR/locale)
|
||||
# MANDIR - man documentation (DATAROOTDIR/man)
|
||||
# DOCDIR - documentation root (DATAROOTDIR/doc/PROJECT_NAME)
|
||||
#
|
||||
# Each CMAKE_INSTALL_<dir> value may be passed to the DESTINATION
|
||||
# options of install() commands for the corresponding file type. If the
|
||||
# includer does not define a value the above-shown default will be used
|
||||
# and the value will appear in the cache for editing by the user. Each
|
||||
# CMAKE_INSTALL_FULL_<dir> value contains an absolute path constructed
|
||||
# from the corresponding destination by prepending (if necessary) the
|
||||
# value of CMAKE_INSTALL_PREFIX.
|
||||
|
||||
#=============================================================================
|
||||
# Copyright 2011 Nikita Krupen'ko <krnekit@gmail.com>
|
||||
# Copyright 2011 Kitware, Inc.
|
||||
#
|
||||
# Distributed under the OSI-approved BSD License (the "License");
|
||||
# see accompanying file Copyright.txt for details.
|
||||
#
|
||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the License for more information.
|
||||
#=============================================================================
|
||||
# (To distribute this file outside of CMake, substitute the full
|
||||
# License text for the above reference.)
|
||||
|
||||
# Installation directories
|
||||
#
|
||||
if(NOT DEFINED CMAKE_INSTALL_BINDIR)
|
||||
set(CMAKE_INSTALL_BINDIR "bin" CACHE PATH "user executables (bin)")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED CMAKE_INSTALL_SBINDIR)
|
||||
set(CMAKE_INSTALL_SBINDIR "sbin" CACHE PATH "system admin executables (sbin)")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED CMAKE_INSTALL_LIBEXECDIR)
|
||||
set(CMAKE_INSTALL_LIBEXECDIR "libexec" CACHE PATH "program executables (libexec)")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED CMAKE_INSTALL_SYSCONFDIR)
|
||||
set(CMAKE_INSTALL_SYSCONFDIR "etc" CACHE PATH "read-only single-machine data (etc)")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED CMAKE_INSTALL_SHAREDSTATEDIR)
|
||||
set(CMAKE_INSTALL_SHAREDSTATEDIR "com" CACHE PATH "modifiable architecture-independent data (com)")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED CMAKE_INSTALL_LOCALSTATEDIR)
|
||||
set(CMAKE_INSTALL_LOCALSTATEDIR "var" CACHE PATH "modifiable single-machine data (var)")
|
||||
endif()
|
||||
|
||||
# We check if the variable was manually set and not cached, in order to
|
||||
# allow projects to set the values as normal variables before including
|
||||
# GNUInstallDirs to avoid having the entries cached or user-editable. It
|
||||
# replaces the "if(NOT DEFINED CMAKE_INSTALL_XXX)" checks in all the
|
||||
# other cases.
|
||||
# If CMAKE_INSTALL_LIBDIR is defined, if _libdir_set is false, then the
|
||||
# variable is a normal one, otherwise it is a cache one.
|
||||
get_property(_libdir_set CACHE CMAKE_INSTALL_LIBDIR PROPERTY TYPE SET)
|
||||
if(NOT DEFINED CMAKE_INSTALL_LIBDIR OR (_libdir_set
|
||||
AND DEFINED _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX
|
||||
AND NOT "${_GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX}" STREQUAL "${CMAKE_INSTALL_PREFIX}"))
|
||||
# If CMAKE_INSTALL_LIBDIR is not defined, it is always executed.
|
||||
# Otherwise:
|
||||
# * if _libdir_set is false it is not executed (meaning that it is
|
||||
# not a cache variable)
|
||||
# * if _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX is not defined it is
|
||||
# not executed
|
||||
# * if _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX and
|
||||
# CMAKE_INSTALL_PREFIX are the same string it is not executed.
|
||||
# _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX is updated after the
|
||||
# execution, of this part of code, therefore at the next inclusion
|
||||
# of the file, CMAKE_INSTALL_LIBDIR is defined, and the 2 strings
|
||||
# are equal, meaning that the if is not executed the code the
|
||||
# second time.
|
||||
|
||||
set(_LIBDIR_DEFAULT "lib")
|
||||
# Override this default 'lib' with 'lib64' iff:
|
||||
# - we are on Linux system but NOT cross-compiling
|
||||
# - we are NOT on debian
|
||||
# - we are on a 64 bits system
|
||||
# reason is: amd64 ABI: http://www.x86-64.org/documentation/abi.pdf
|
||||
# For Debian with multiarch, use 'lib/${CMAKE_LIBRARY_ARCHITECTURE}' if
|
||||
# CMAKE_LIBRARY_ARCHITECTURE is set (which contains e.g. "i386-linux-gnu"
|
||||
# and CMAKE_INSTALL_PREFIX is "/usr"
|
||||
# See http://wiki.debian.org/Multiarch
|
||||
if(DEFINED _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX)
|
||||
set(__LAST_LIBDIR_DEFAULT "lib")
|
||||
# __LAST_LIBDIR_DEFAULT is the default value that we compute from
|
||||
# _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX, not a cache entry for
|
||||
# the value that was last used as the default.
|
||||
# This value is used to figure out whether the user changed the
|
||||
# CMAKE_INSTALL_LIBDIR value manually, or if the value was the
|
||||
# default one. When CMAKE_INSTALL_PREFIX changes, the value is
|
||||
# updated to the new default, unless the user explicitly changed it.
|
||||
endif()
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU)$"
|
||||
AND NOT CMAKE_CROSSCOMPILING)
|
||||
if (EXISTS "/etc/debian_version") # is this a debian system ?
|
||||
if(CMAKE_LIBRARY_ARCHITECTURE)
|
||||
set(_LIBDIR_DEFAULT "lib/${CMAKE_LIBRARY_ARCHITECTURE}")
|
||||
endif()
|
||||
else() # not debian, rely on CMAKE_SIZEOF_VOID_P:
|
||||
if(NOT DEFINED CMAKE_SIZEOF_VOID_P)
|
||||
message(AUTHOR_WARNING
|
||||
"Unable to determine default CMAKE_INSTALL_LIBDIR directory because no target architecture is known. "
|
||||
"Please enable at least one language before including GNUInstallDirs.")
|
||||
else()
|
||||
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
|
||||
set(_LIBDIR_DEFAULT "lib64")
|
||||
if(DEFINED _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX)
|
||||
set(__LAST_LIBDIR_DEFAULT "lib64")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
||||
set(CMAKE_INSTALL_LIBDIR "${_LIBDIR_DEFAULT}" CACHE PATH "object code libraries (${_LIBDIR_DEFAULT})")
|
||||
elseif(DEFINED __LAST_LIBDIR_DEFAULT
|
||||
AND "${__LAST_LIBDIR_DEFAULT}" STREQUAL "${CMAKE_INSTALL_LIBDIR}")
|
||||
set_property(CACHE CMAKE_INSTALL_LIBDIR PROPERTY VALUE "${_LIBDIR_DEFAULT}")
|
||||
endif()
|
||||
endif()
|
||||
# Save for next run
|
||||
set(_GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" CACHE INTERNAL "CMAKE_INSTALL_PREFIX during last run")
|
||||
unset(_libdir_set)
|
||||
unset(__LAST_LIBDIR_DEFAULT)
|
||||
|
||||
|
||||
if(NOT DEFINED CMAKE_INSTALL_INCLUDEDIR)
|
||||
set(CMAKE_INSTALL_INCLUDEDIR "include" CACHE PATH "C header files (include)")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED CMAKE_INSTALL_OLDINCLUDEDIR)
|
||||
set(CMAKE_INSTALL_OLDINCLUDEDIR "/usr/include" CACHE PATH "C header files for non-gcc (/usr/include)")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED CMAKE_INSTALL_DATAROOTDIR)
|
||||
set(CMAKE_INSTALL_DATAROOTDIR "share" CACHE PATH "read-only architecture-independent data root (share)")
|
||||
endif()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Values whose defaults are relative to DATAROOTDIR. Store empty values in
|
||||
# the cache and store the defaults in local variables if the cache values are
|
||||
# not set explicitly. This auto-updates the defaults as DATAROOTDIR changes.
|
||||
|
||||
if(NOT CMAKE_INSTALL_DATADIR)
|
||||
set(CMAKE_INSTALL_DATADIR "" CACHE PATH "read-only architecture-independent data (DATAROOTDIR)")
|
||||
set(CMAKE_INSTALL_DATADIR "${CMAKE_INSTALL_DATAROOTDIR}")
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_INSTALL_INFODIR)
|
||||
set(CMAKE_INSTALL_INFODIR "" CACHE PATH "info documentation (DATAROOTDIR/info)")
|
||||
set(CMAKE_INSTALL_INFODIR "${CMAKE_INSTALL_DATAROOTDIR}/info")
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_INSTALL_LOCALEDIR)
|
||||
set(CMAKE_INSTALL_LOCALEDIR "" CACHE PATH "locale-dependent data (DATAROOTDIR/locale)")
|
||||
set(CMAKE_INSTALL_LOCALEDIR "${CMAKE_INSTALL_DATAROOTDIR}/locale")
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_INSTALL_MANDIR)
|
||||
set(CMAKE_INSTALL_MANDIR "" CACHE PATH "man documentation (DATAROOTDIR/man)")
|
||||
set(CMAKE_INSTALL_MANDIR "${CMAKE_INSTALL_DATAROOTDIR}/man")
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_INSTALL_DOCDIR)
|
||||
set(CMAKE_INSTALL_DOCDIR "" CACHE PATH "documentation root (DATAROOTDIR/doc/PROJECT_NAME)")
|
||||
set(CMAKE_INSTALL_DOCDIR "${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME}")
|
||||
endif()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
mark_as_advanced(
|
||||
CMAKE_INSTALL_BINDIR
|
||||
CMAKE_INSTALL_SBINDIR
|
||||
CMAKE_INSTALL_LIBEXECDIR
|
||||
CMAKE_INSTALL_SYSCONFDIR
|
||||
CMAKE_INSTALL_SHAREDSTATEDIR
|
||||
CMAKE_INSTALL_LOCALSTATEDIR
|
||||
CMAKE_INSTALL_LIBDIR
|
||||
CMAKE_INSTALL_INCLUDEDIR
|
||||
CMAKE_INSTALL_OLDINCLUDEDIR
|
||||
CMAKE_INSTALL_DATAROOTDIR
|
||||
CMAKE_INSTALL_DATADIR
|
||||
CMAKE_INSTALL_INFODIR
|
||||
CMAKE_INSTALL_LOCALEDIR
|
||||
CMAKE_INSTALL_MANDIR
|
||||
CMAKE_INSTALL_DOCDIR
|
||||
)
|
||||
|
||||
# Result directories
|
||||
#
|
||||
foreach(dir
|
||||
BINDIR
|
||||
SBINDIR
|
||||
LIBEXECDIR
|
||||
SYSCONFDIR
|
||||
SHAREDSTATEDIR
|
||||
LOCALSTATEDIR
|
||||
LIBDIR
|
||||
INCLUDEDIR
|
||||
OLDINCLUDEDIR
|
||||
DATAROOTDIR
|
||||
DATADIR
|
||||
INFODIR
|
||||
LOCALEDIR
|
||||
MANDIR
|
||||
DOCDIR
|
||||
)
|
||||
if(NOT IS_ABSOLUTE ${CMAKE_INSTALL_${dir}})
|
||||
set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_${dir}}")
|
||||
else()
|
||||
set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_${dir}}")
|
||||
endif()
|
||||
endforeach()
|
||||
@@ -9,7 +9,7 @@
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>@APPLICATION_NAME@</string>
|
||||
<string>@APPLICATION_EXECUTABLE@</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>@APPLICATION_ICON_NAME@.icns</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
|
||||
37
cmake/modules/SanitizerFlags.cmake
Normal file
@@ -0,0 +1,37 @@
|
||||
# Enable address sanitizer (gcc/clang only)
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||
set(SANITIZERS)
|
||||
set(SANITIZER_EXTRA_FLAGS " -g")
|
||||
|
||||
macro(add_sanitizer_option variable flag help)
|
||||
option(${variable} "Enable ${help}" OFF)
|
||||
if(${variable})
|
||||
list(APPEND SANITIZERS ${flag})
|
||||
string(REPLACE ";" " " optional_args "${ARGN}")
|
||||
if(optional_args)
|
||||
string(APPEND SANITIZER_EXTRA_FLAGS " ${optional_args}")
|
||||
endif()
|
||||
endif()
|
||||
mark_as_advanced(${variable})
|
||||
endmacro()
|
||||
|
||||
add_sanitizer_option(SANITIZE_ADDRESS "address"
|
||||
"AddressSanitizer (detects memory violations, buffer overflows, memory leaks)")
|
||||
add_sanitizer_option(SANITIZE_LEAK "leak"
|
||||
"standalone LeakSanitizer (detects memory leaks only)")
|
||||
add_sanitizer_option(SANITIZE_MEMORY "memory"
|
||||
"MemorySanitizer (detects reads in uninitialized memory)")
|
||||
add_sanitizer_option(SANITIZE_UNDEFINED "undefined"
|
||||
"UndefinedBehaviorSanitizer (detects undefined behavior)"
|
||||
"-fno-sanitize=vptr")
|
||||
add_sanitizer_option(SANITIZE_THREAD "thread"
|
||||
"ThreadSanitizer (detects data races)")
|
||||
|
||||
if(SANITIZERS)
|
||||
string(REPLACE ";" "," SANITIZER_FLAGS "${SANITIZERS}")
|
||||
set(SANITIZER_FLAGS "-fsanitize=${SANITIZER_FLAGS}${SANITIZER_EXTRA_FLAGS}")
|
||||
string(APPEND CMAKE_CXX_FLAGS " ${SANITIZER_FLAGS}")
|
||||
string(APPEND CMAKE_C_FLAGS " ${SANITIZER_FLAGS}")
|
||||
string(APPEND CMAKE_EXE_LINKER_FLAGS " ${SANITIZER_FLAGS}")
|
||||
endif()
|
||||
endif()
|
||||
@@ -5,7 +5,7 @@
|
||||
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||
|
||||
# Use this only for Clang
|
||||
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
if (CMAKE_CXX_COMPILER MATCHES "Clang")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -Wno-long-long -Wno-gnu-zero-variadic-macro-arguments")
|
||||
endif()
|
||||
|
||||
@@ -27,4 +27,7 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
|
||||
endif()
|
||||
|
||||
if(DEFINED MIRALL_FATAL_WARNINGS)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
|
||||
endif(DEFINED MIRALL_FATAL_WARNINGS)
|
||||
endif()
|
||||
|
||||
@@ -29,11 +29,7 @@
|
||||
#cmakedefine APPLICATION_WIZARD_HEADER_TITLE_COLOR "@APPLICATION_WIZARD_HEADER_TITLE_COLOR@"
|
||||
#cmakedefine APPLICATION_WIZARD_USE_CUSTOM_LOGO "@APPLICATION_WIZARD_USE_CUSTOM_LOGO@"
|
||||
#cmakedefine APPLICATION_VIRTUALFILE_SUFFIX "@APPLICATION_VIRTUALFILE_SUFFIX@"
|
||||
#cmakedefine APPLICATION_OCSP_STAPLING_ENABLED "@APPLICATION_OCSP_STAPLING_ENABLED@"
|
||||
#cmakedefine APPLICATION_FORBID_BAD_SSL "@APPLICATION_FORBID_BAD_SSL@"
|
||||
#define APPLICATION_DOTVIRTUALFILE_SUFFIX "." APPLICATION_VIRTUALFILE_SUFFIX
|
||||
#cmakedefine01 ENFORCE_VIRTUAL_FILES_SYNC_FOLDER
|
||||
#cmakedefine DO_NOT_USE_PROXY "@DO_NOT_USE_PROXY@"
|
||||
|
||||
#cmakedefine ZLIB_FOUND @ZLIB_FOUND@
|
||||
|
||||
@@ -42,6 +38,4 @@
|
||||
|
||||
#cmakedefine01 GUI_TESTING
|
||||
|
||||
#cmakedefine BUILD_UPDATER "@BUILD_UPDATER@"
|
||||
|
||||
#endif
|
||||
|
||||
@@ -21,7 +21,7 @@ result, the Nextcloud Client runs on Linux, Windows, and MacOS.
|
||||
The Synchronization Process
|
||||
---------------------------
|
||||
|
||||
The process of synchronization keeps files in two separate repositories the
|
||||
The process of synchronization keeps files in two separate repositories the
|
||||
same. When synchronized:
|
||||
|
||||
- If a file is added to one repository it is copied to the other synchronized repository.
|
||||
@@ -93,7 +93,7 @@ traverses the file tree and compares the modification time of each file with an
|
||||
expected value stored in its database. If the value is not the same, the client
|
||||
determines that the file has been modified in the local repository.
|
||||
|
||||
.. note:: On the local side, the modification time is a good attribute to use for
|
||||
.. note:: On the local side, the modification time is a good attribute to use for
|
||||
detecting changes, because
|
||||
the value does not depend on time shifts and such.
|
||||
|
||||
@@ -122,7 +122,7 @@ Conflict files are always created on the client and never on the server.
|
||||
|
||||
In ownCloud 10.0 we implemented a checksum feature which checks the file integrity on upload and download by computing a checksum after the file transfer finishes.
|
||||
The client queries the server capabilities after login to decide which checksum algorithm to use.
|
||||
Currently, SHA1 is hard-coded in the official server release and can't be changed by the end-user.
|
||||
Currently, SHA1 is hard-coded in the official server release and can't be changed by the end-user.
|
||||
Note that the server additionally also supports MD5 and Adler-32, but the desktop client will always use the checksum algorithm announced in the capabilities:
|
||||
|
||||
::
|
||||
@@ -152,7 +152,7 @@ Conflict files are always created on the client and never on the server.
|
||||
"capabilities":{
|
||||
"core":{
|
||||
"pollinterval":60,
|
||||
"webdav-root":"remote.php/dav"
|
||||
"webdav-root":"remote.php/webdav"
|
||||
},
|
||||
"dav":{
|
||||
"chunking":"1.0"
|
||||
@@ -202,14 +202,14 @@ Conflict files are always created on the client and never on the server.
|
||||
Upload
|
||||
~~~~~~
|
||||
|
||||
A checksum is calculated with the previously negotiated algorithm by the client and sent along with the file in an HTTP Header.
|
||||
A checksum is calculated with the previously negotiated algorithm by the client and sent along with the file in an HTTP Header.
|
||||
```OC-Checksum: [algorithm]:[checksum]```
|
||||
|
||||
.. image:: ./images/checksums/client-activity.png
|
||||
|
||||
During file upload, the server computes SHA1, MD5, and Adler-32 checksums and compares one of them to the checksum supplied by the client.
|
||||
During file upload, the server computes SHA1, MD5, and Adler-32 checksums and compares one of them to the checksum supplied by the client.
|
||||
|
||||
On mismatch, the server returns HTTP Status code 400 (Bad Request) thus signaling the client that the upload failed.
|
||||
On mismatch, the server returns HTTP Status code 400 (Bad Request) thus signaling the client that the upload failed.
|
||||
The server then discards the upload, and the client blacklists the file:
|
||||
|
||||
.. image:: ./images/checksums/testing-checksums.png
|
||||
@@ -223,29 +223,29 @@ Conflict files are always created on the client and never on the server.
|
||||
client.</s:message>
|
||||
</d:error>
|
||||
|
||||
The client retries the upload using exponential back-off.
|
||||
The client retries the upload using exponential back-off.
|
||||
On success (matching checksum) the computed checksums are stored by the server in ``oc_filecache`` alongside the file.
|
||||
|
||||
Chunked Upload
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
Mostly same as above.
|
||||
The checksum of the full file is sent with every chunk of the file.
|
||||
Mostly same as above.
|
||||
The checksum of the full file is sent with every chunk of the file.
|
||||
But the server only compares the checksum after receiving the checksum sent with the last chunk.
|
||||
|
||||
Download
|
||||
~~~~~~~~
|
||||
|
||||
The server sends the checksum in an HTTP header with the file. (same format as above).
|
||||
If no checksum is found in ``oc_filecache`` (freshly mounted external storage) it is computed and stored in ``oc_filecache`` on the first download.
|
||||
The checksum is then provided on all subsequent downloads but not on the first.
|
||||
If no checksum is found in ``oc_filecache`` (freshly mounted external storage) it is computed and stored in ``oc_filecache`` on the first download.
|
||||
The checksum is then provided on all subsequent downloads but not on the first.
|
||||
|
||||
.. _ignored-files-label:
|
||||
|
||||
Ignored Files
|
||||
-------------
|
||||
|
||||
The Nextcloud Client supports the ability to exclude or ignore certain files from the synchronization process.
|
||||
The Nextcloud Client supports the ability to exclude or ignore certain files from the synchronization process.
|
||||
Some system wide file patterns that are used to exclude or ignore files are included with the client by default and the Nextcloud Client provides the ability to add custom patterns.
|
||||
|
||||
By default, the Nextcloud Client ignores the following files:
|
||||
@@ -262,18 +262,18 @@ By default, the Nextcloud Client ignores the following files:
|
||||
If a pattern selected using a checkbox in the `ignoredFilesEditor-label` (or if
|
||||
a line in the exclude file starts with the character ``]`` directly followed by
|
||||
the file pattern), files matching the pattern are considered *fleeting meta
|
||||
data*.
|
||||
data*.
|
||||
|
||||
These files are ignored and *removed* by the client if found in the
|
||||
synchronized folder.
|
||||
synchronized folder.
|
||||
This is suitable for meta files created by some applications that have no sustainable meaning.
|
||||
|
||||
If a pattern ends with the forward slash (``/``) character, only directories are matched.
|
||||
If a pattern ends with the forward slash (``/``) character, only directories are matched.
|
||||
The pattern is only applied for directory components of filenames selected using the checkbox.
|
||||
|
||||
To match filenames against the exclude patterns, the UNIX standard C library
|
||||
function ``fnmatch`` is used.
|
||||
This process checks the filename against the specified pattern using standard shell wildcard pattern matching.
|
||||
function ``fnmatch`` is used.
|
||||
This process checks the filename against the specified pattern using standard shell wildcard pattern matching.
|
||||
For more information, please refer to `The opengroup website
|
||||
<http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_13_01>`_.
|
||||
|
||||
@@ -369,74 +369,3 @@ is renamed or moved.
|
||||
Example:
|
||||
|
||||
<oc:id>00000020oc5cfy6qqizm</oc:id>
|
||||
|
||||
End-to-end Encryption
|
||||
---------------------
|
||||
|
||||
Nextcloud is built around the fundamental assumption that, as you can host your own Nextcloud server, you can trust it with your data. This assumption means data on the Nextcloud server can be provided to users through a browser interface. Users can browse their files online, access their calendars and mail and other data from the respective apps and share and collaboratively edit documents with others including guests and users without an account. While data on the server can be encrypted, this is largely designed to protect it from malicious storage solutions or theft of the whole hardware. System administrators always have access to the data.
|
||||
|
||||
But for a subset of data, this assumption of trust might not hold true. For example, at an enterprise, the documents of the Human Resources department or the financial department are too sensitive to allow system administrators who manage the server, access them. As a private user, you might trust your hosting provider with the vast majority of your data but not with medical records. And even if there is trust in the server administration team, a breach of the server can never entirely be ruled out and for some data, even a tiny risk is unacceptable.
|
||||
|
||||
The Nextcloud End-to-end Encryption feature (E2EE) was designed to offer protection against a full compromise of the server. See for more details our blog about the `threat model for the encryption solutions in Nextcloud`_ and our `webpage about End-to-end Encryption`_. If the end-to-end encryption app is enabled on the server, users can use one of the clients to select a local folder and enable this feature. This will ensure the client encrypts data before it is transmitted to the server.
|
||||
|
||||
The first time E2EE is enabled on a folder in any of the clients, the user is prompted with a private key consisting of 12 security words. The user is strongly recommended to record these somewhere secure as the complete loss of this private key means there is no way to access their data anymore. The key is also securely stored in the device's key storage and can be shown on demand. Making the folder available on a second device requires entering this key. Future versions of Nextcloud clients will be able to display a QR code to simplify the process of adding devices. Sharing with other users will not require any special keys or passwords.
|
||||
|
||||
Encrypting files locally means the server has no access to them. This brings with it a number of limitations:
|
||||
|
||||
* E2EE files can not be accessed or previewed through the web interface
|
||||
* E2EE files can not be edited with Online Office solutions
|
||||
* E2EE files can not be shared with a public link
|
||||
* E2EE files can not be searched, tagged, commented on and have no versioning or trash bin
|
||||
* E2EE files can not be accessed in other Nextcloud Apps. This means they have no chat sidebar, can not be attached to emails or deck cards, shared in Talk rooms and so on
|
||||
* E2EE results in slower syncing of file and works poorly or not at all with large files and large quantities of files
|
||||
|
||||
These limitations are fundamental to how securely implemented end-to-end encryption works. We realize there are some solutions that call their technology 'end-to-end encryption' but with browser access. Reality is that offering browser access to end-to-end encrypted files would essentially negate any of the benefits of end-to-end encryption. Serving a file in the browser means the server needs to be able to read the files. But if the server can read the files, administrator or a malicious attacker who gained access to the server, can too. Decrypting the file in the browser does not solve this security risk in the least, as the javascript code that would be needed to decrypt the file comes FROM the server, and of course a compromised server would simply send modified javascript code which sends a copy of the encryption keys to the attacker without anybody noticing. See for more details our blog about the `threat model for the encryption solutions in Nextcloud`_ and our `webpage about End-to-end Encryption`_.
|
||||
|
||||
The E2EE design of Nextcloud allows for sharing on a per-folder level to individual users (not groups), but, as of early 2021, this feature is still on the road map for implementation in the clients.
|
||||
|
||||
Due to all these limitations that are inherent to true end-to-end encryption, it is only recommended for a small subset of files, in just a small number of folders. Encrypting your entire sync folder is likely to result in poor performance and sync errors and if you do not trust your server at all, Nextcloud is perhaps not the right solution for your use case. You might instead want to use encrypted archives or another solution.
|
||||
|
||||
.. note::
|
||||
* End-to-end Encryption works with Virtual Files (VFS) but only on a per-folder level. Folders with E2EE have to be made available offline in their entirety to access the files, they can not be retrieved on demand in the folder.
|
||||
|
||||
.. _`webpage about End-to-end Encryption`: http://nextcloud.com/endtoend
|
||||
.. _`threat model for the encryption solutions in Nextcloud`: https://nextcloud.com/blog/encryption-in-nextcloud/
|
||||
|
||||
Virtual Files
|
||||
-------------
|
||||
|
||||
.. note::
|
||||
* This feature is currently only available on ``Windows`` by default. ``Linux`` and ``macOS`` implementations are experimental and must be enabled by adding ``showExperimentalOptions=true`` to the ``nextcloud.cfg`` configuration file in the ``App Data`` folder.
|
||||
|
||||
Oftentimes, users are working with a huge amount of files that are big in size. Synchronizing every such file to a device that's running a Nextcloud desktop client is not always possible due to the user's device storage space limitation.
|
||||
Let's assume that your desktop client is connected to a server that has 1TB of data. You want all those files at hand, so you can quickly access any file via the file explorer. Your device has 512GB local storage device.
|
||||
Obviously, it's not possible to synchronize even half of 1TB of data that is on the server. What should you do in this case? Of course, you can just utilize the Selective Sync feature, and keep switching between different folders, in such a way that you only synchronize those folders that you are currently working with.
|
||||
Needless to say, this is far from being convenient.
|
||||
|
||||
That's why, starting from 3.2.0, we are introducing the VFS (Virtual Files) feature. You may have had experience working with a similar feature in other cloud sync clients. This feature is known by different names: Files On-Demand, SmartSync, etc.
|
||||
The VFS does not occupy much space on the user's storage. It just creates placeholders for each file and folder. These files are quite small and only contain metadata needed to display them properly and to fetch the actual file when needed.
|
||||
|
||||
When one tries to open a file, for example by double clicking on a
|
||||
file in the Windows Explorer, one will see that the file gets
|
||||
downloaded and becomes available locally. This can be observed by a
|
||||
small progress-bar popup if the file is large enough.
|
||||
|
||||
As soon as the download is complete, the file will then be opened
|
||||
normally as now it is a real file on the user's storage. It won't
|
||||
disappear, and, from now on, will always be available, unless it is
|
||||
manually dehydrated.
|
||||
|
||||
.. image:: images/vfs_hydration_progress_bar.png
|
||||
:alt: VFS hydration progress bar
|
||||
|
||||
As long as the VFS is enabled, a user can choose to remove files that are no longer needed from the local storage. This can be achieved by right-clicking the file/folder in the explorer, and then, choosing "Free up local space" from the context menu.
|
||||
Alternatively, space can be freed up by right-clicking the sync folder in the Settings dialog. It is also possible to make files always hydrated, or, in other words, always available locally. A user just needs to choose the "Make always available locally" option in the aforementioned context menus.
|
||||
|
||||
.. image:: images/vfs_context_menu_options.png
|
||||
:alt: VFS context menu options
|
||||
|
||||
The VFS can also be disabled if needed, so, the entire folder will then be synced normally. This option is available in the context menu of a sync folder in the Settings dialog. Once disabled, the VFS can also be enabled back by using the same context menu.
|
||||
Files that must be removed from the local storage only, need to be dehydrated via the "Free up local space" option, so, the placeholder will get created in place of real files.
|
||||
|
||||
.. note::
|
||||
* End-to-end Encryption works with Virtual Files (VFS) but only on a per-folder level. Folders with E2EE can be made available offline in their entirety, but the individual files in them can not be retrieved on demand. This is mainly due to two technical reasons. First, the Windows VFS API is not designed for handling encrypted files. Second, while the VFS is designed to deal mostly with large files, E2EE is mostly recommended for use with small files as encrypting and decrypting large files puts large demands on the computer infrastructure.
|
||||
|
||||
@@ -32,9 +32,10 @@ itself. Should the silent update fail, the client offers a manual download.
|
||||
macOS
|
||||
^^^^^
|
||||
|
||||
There is no automatic updater on macOS. If a new update is available,
|
||||
the Nextcloud client initializes a pop-up dialog to alert you of the
|
||||
update and requesting that you update to the latest version manually.
|
||||
If a new update is available, the Nextcloud client initializes a pop-up dialog
|
||||
to alert you of the update and requesting that you update to the latest
|
||||
version. Due to their use of the Sparkle frameworks, this is the default
|
||||
process for macOS applications.
|
||||
|
||||
Linux
|
||||
^^^^^
|
||||
@@ -95,6 +96,14 @@ To prevent automatic updates and disallow manual overrides:
|
||||
.. note:: branded clients have different key names
|
||||
|
||||
|
||||
Preventing Automatic Updates in macOS Environments
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
You can disable the automatic update mechanism, in the macOS operating system,
|
||||
by copying the file
|
||||
``nextcloud.app/Contents/Resources/deny_autoupdate_com.nextcloud.desktopclient.plist``
|
||||
to ``/Library/Preferences/com.nextcloud.desktopclient.plist``.
|
||||
|
||||
Preventing Automatic Updates in Linux Environments
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
|
||||
@@ -184,11 +184,9 @@ Then, in Terminal:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
% echo 'export CMAKE_INSTALL_PREFIX=~/Builds' >> ~/.nextcloud_build_variables
|
||||
# If you want to build a macOS app bundle for distribution
|
||||
% echo 'export BUILD_OWNCLOUD_OSX_BUNDLE=ON' >> ~/.nextcloud_build_variables
|
||||
% echo 'export CMAKE_INSTALL_PREFIX=~/Builds' >> ~/.nextcloud_build_variables
|
||||
|
||||
Replace ``~/Builds`` with a different directory if you'd like the build to end up elsewhere.
|
||||
Replace ``~/Builds`` with a different directory if you'd like the build to end up elsewhere.
|
||||
|
||||
..
|
||||
|
||||
@@ -220,7 +218,7 @@ follow `Windows Installer Build (Cross-Compile)`_ instead.
|
||||
2. Get the QtKeychain_ sources as well as the latest versions of the Nextcloud client
|
||||
from Git as follows
|
||||
|
||||
.. code-block:: bash
|
||||
.. code-block::
|
||||
|
||||
git clone https://github.com/frankosterfeld/qtkeychain.git
|
||||
git clone git://github.com/nextcloud/client.git
|
||||
@@ -261,7 +259,7 @@ follow `Windows Installer Build (Cross-Compile)`_ instead.
|
||||
.. _`Windows Installer Build (Cross-Compile)`:
|
||||
|
||||
Windows Installer (i.e. Deployment) Build (Cross-Compile)
|
||||
---------------------------------------------------------
|
||||
---------------------------------------
|
||||
|
||||
Due to the large number of dependencies, building the client installer for Windows
|
||||
is **currently only officially supported on openSUSE**, by using the MinGW cross compiler.
|
||||
@@ -375,38 +373,6 @@ The following are known cmake parameters:
|
||||
* ``BUILD_WITH_QT4=ON``: Builds using Qt4 (even if Qt5 is found).
|
||||
* ``CMAKE_INSTALL_PREFIX=path``: Set an install prefix. This is mandatory on Mac OS
|
||||
|
||||
Address Sanitizer
|
||||
=================
|
||||
|
||||
You can enable the address sanitizer to detect memory corruptions and other mistakes.
|
||||
The are the following sanitizers are available:
|
||||
|
||||
|
||||
* Address Sanitizer
|
||||
* Leak anitizer
|
||||
* Memory sanitizer
|
||||
* Undefined sanitizer
|
||||
* Threads sanitizer
|
||||
|
||||
You can enable one or more sanitizers through CMake. For example, to
|
||||
enable the address and the undefined sanitizer, execute CMake like
|
||||
``cmake .. -D ECM_ENABLE_SANITIZERS="address;undefined"``.
|
||||
Keep in mind that not all combinations of sanitizers work together, and on some
|
||||
platforms, not all types of sanitizers are available. For example, on Windows there is
|
||||
currently only the address sanitizer available. If you are on Windows, you need to
|
||||
make sure that the linker can find the sanitizer dlls at runtime. If you installed
|
||||
Visual Studio in the standard location, you could find them in
|
||||
**C:/ProgramFiles (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/Llvm/x64/lib/clang/10.0.0/lib/windows**.
|
||||
Make sure you add this location to your path. You may also need to
|
||||
`upgrade your Visual Studio version <https://docs.microsoft.com/en-us/cpp/sanitizers/asan?view=msvc-160#install-the-addresssanitizer>`_.
|
||||
|
||||
.. note:: If you use Visual Studio on Windows, you can enable the
|
||||
sanitizer if you click on **Manage Configurations**, scroll
|
||||
down to the section **CMake Command Arguments** and enter then
|
||||
``-D ECM_ENABLE_SANITIZERS="address"`` in the text input field below.
|
||||
After that, click on **Save and generate CMake cache to load variables**
|
||||
right above the table.
|
||||
|
||||
.. _CMake: http://www.cmake.org/download
|
||||
.. _CSync: http://www.csync.org
|
||||
.. _Client Download Page: https://nextcloud.com/install/#install-clients
|
||||
|
||||
@@ -48,9 +48,9 @@ copyright = u'2013-2021, The Nextcloud developers'
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = '3.4'
|
||||
version = '3.2'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = '3.4.50'
|
||||
release = '3.2.4'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
||||
@@ -33,35 +33,33 @@ Some interesting values that can be set on the configuration file are:
|
||||
+---------------------------------+---------------+--------------------------------------------------------------------------------------------------------+
|
||||
|
||||
|
||||
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| ``[General]`` section |
|
||||
+==================================+===============+=================================================================================================================+
|
||||
| Variable | Default | Meaning |
|
||||
+----------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
| ``chunkSize`` | ``10000000`` (10 MB) | Specifies the chunk size of uploaded files in bytes. |
|
||||
| | | The client will dynamically adjust this size within the maximum and minimum bounds (see below). |
|
||||
+----------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
| ``maxChunkSize`` | ``1000000000`` (1000 MB) | Specifies the maximum chunk size of uploaded files in bytes. |
|
||||
+----------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
| ``minChunkSize`` | ``1000000`` (1 MB) | Specifies the minimum chunk size of uploaded files in bytes. |
|
||||
+----------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
| ``targetChunkUploadDuration`` | ``6000`` (1 minute) | Target duration in milliseconds for chunk uploads. |
|
||||
| | | The client adjusts the chunk size until each chunk upload takes approximately this long. |
|
||||
| | | Set to 0 to disable dynamic chunk sizing. |
|
||||
+----------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
| ``promptDeleteAllFiles`` | ``true`` | If a UI prompt should ask for confirmation if it was detected that all files and folders were deleted. |
|
||||
+----------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
| ``timeout`` | ``300`` | The timeout for network connections in seconds. |
|
||||
+----------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
| ``moveToTrash`` | ``false`` | If non-locally deleted files should be moved to trash instead of deleting them completely. |
|
||||
| | | This option only works on linux |
|
||||
+----------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
| ``showExperimentalOptions`` | ``false`` | Whether to show experimental options that are still undergoing testing in the user interface. |
|
||||
| | | Turning this on does not enable experimental behavior on its own. It does enable user inferface |
|
||||
| | | options that can be used to opt in to experimental features. |
|
||||
+----------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
| ``showMainDialogAsNormalWindow`` | ``false`` | Whether the main dialog should be shown as a normal window even if tray icons are available. |
|
||||
+----------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| ``[General]`` section |
|
||||
+=================================+===============+=================================================================================================================+
|
||||
| Variable | Default | Meaning |
|
||||
+---------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
| ``chunkSize`` | ``10000000`` (10 MB) | Specifies the chunk size of uploaded files in bytes. |
|
||||
| | | The client will dynamically adjust this size within the maximum and minimum bounds (see below). |
|
||||
+---------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
| ``maxChunkSize`` | ``100000000`` (100 MB) | Specifies the maximum chunk size of uploaded files in bytes. |
|
||||
+---------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
| ``minChunkSize`` | ``1000000`` (1 MB) | Specifies the minimum chunk size of uploaded files in bytes. |
|
||||
+---------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
| ``targetChunkUploadDuration`` | ``6000`` (1 minute) | Target duration in milliseconds for chunk uploads. |
|
||||
| | | The client adjusts the chunk size until each chunk upload takes approximately this long. |
|
||||
| | | Set to 0 to disable dynamic chunk sizing. |
|
||||
+---------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
| ``promptDeleteAllFiles`` | ``true`` | If a UI prompt should ask for confirmation if it was detected that all files and folders were deleted. |
|
||||
+---------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
| ``timeout`` | ``300`` | The timeout for network connections in seconds. |
|
||||
+---------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
| ``moveToTrash`` | ``false`` | If non-locally deleted files should be moved to trash instead of deleting them completely. |
|
||||
| | | This option only works on linux |
|
||||
+---------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
| ``showExperimentalOptions`` | ``false`` | Whether to show experimental options that are still undergoing testing in the user interface. |
|
||||
| | | Turning this on does not enable experimental behavior on its own. It does enable user inferface |
|
||||
| | | options that can be used to opt in to experimental features. |
|
||||
+---------------------------------+------------------------+--------------------------------------------------------------------------------------------------------+
|
||||
|
||||
|
||||
+----------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
|
||||
BIN
doc/images/client-12.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
doc/images/client-6.png
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
doc/images/client-7.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
doc/images/client-8.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
doc/images/client-9.png
Normal file
|
After Width: | Height: | Size: 283 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 167 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 267 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 188 KiB |
BIN
doc/images/menu.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 10 KiB |
BIN
doc/images/settings_account.png
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
doc/images/settings_activity.png
Normal file
|
After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 283 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 159 KiB |
|
Before Width: | Height: | Size: 35 KiB |
BIN
doc/images/share-1.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
doc/images/share-2.png
Normal file
|
After Width: | Height: | Size: 189 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 31 KiB |