From 45d9cd601aaa8ca3eee91222fe5c3af1c5f9af43 Mon Sep 17 00:00:00 2001
From: Sebastian Stenzel
Date: Mon, 19 Jul 2021 21:20:27 +0200
Subject: [PATCH 01/90] create buildkit via CI
---
.github/workflows/build.yml | 239 +++++----
{src/package => dist}/launcher-linux.sh | 0
{src/package => dist}/launcher-mac.sh | 0
{src/package => dist}/launcher-win.bat | 0
pom.xml | 157 ------
src/package/LICENSE.txt | 674 ------------------------
6 files changed, 131 insertions(+), 939 deletions(-)
rename {src/package => dist}/launcher-linux.sh (100%)
rename {src/package => dist}/launcher-mac.sh (100%)
rename {src/package => dist}/launcher-win.bat (100%)
delete mode 100644 src/package/LICENSE.txt
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 21ef6aca2..af212e19e 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -4,7 +4,7 @@ on:
[push]
jobs:
- build:
+ test:
name: Build and Test
runs-on: ubuntu-latest
if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')"
@@ -13,7 +13,7 @@ jobs:
- uses: actions/setup-java@v1
with:
java-version: 16
- - uses: actions/cache@v1
+ - uses: actions/cache@v2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
@@ -30,120 +30,143 @@ jobs:
env:
CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }}
continue-on-error: true
-### TODO: move to matrix build:
- - name: Assemble buildkit-linux.zip
- run: mvn -B clean package -DskipTests -Plinux
- - name: Upload buildkit-linux.zip
- uses: actions/upload-artifact@v1
- with:
- name: buildkit-linux.zip
- path: target/buildkit-linux.zip
- - name: Assemble buildkit-mac.zip
- run: mvn -B clean package -DskipTests -Pmac
- - name: Upload buildkit-mac.zip
- uses: actions/upload-artifact@v1
- with:
- name: buildkit-mac.zip
- path: target/buildkit-mac.zip
- - name: Assemble buildkit-win.zip
- run: mvn -B clean package -DskipTests -Pwindows
- - name: Upload buildkit-win.zip
- uses: actions/upload-artifact@v1
- with:
- name: buildkit-win.zip
- path: target/buildkit-win.zip
- release:
- name: Draft a Release on GitHub Releases
- runs-on: ubuntu-latest
- needs: build
- if: startsWith(github.ref, 'refs/tags/') && github.repository == 'cryptomator/cryptomator'
+#
+# Buildkit
+#
+
+ buildkit:
+ name: Build buildkit-${{ matrix.profile }}.zip
+ needs: test
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: true
+ matrix:
+ include:
+ - os: ubuntu-latest
+ profile: linux
+ launcher: launcher-linux.sh
+ - os: windows-latest
+ profile: win
+ launcher: launcher-win.bat
+ - os: macOS-latest
+ profile: mac
+ launcher: launcher-mac.sh
steps:
- - uses: actions/checkout@v2
- - name: Download buildkit-linux.zip
- uses: actions/download-artifact@v1
+ - uses: actions/setup-java@v1
with:
- name: buildkit-linux.zip
- path: .
- - name: Download buildkit-mac.zip
- uses: actions/download-artifact@v1
+ java-version: 16
+ - uses: actions/cache@v2
with:
- name: buildkit-mac.zip
- path: .
- - name: Download buildkit-win.zip
- uses: actions/download-artifact@v1
+ path: ~/.m2/repository
+ key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+ restore-keys: |
+ ${{ runner.os }}-maven-
+ - name: Copy .jar files
+ run: mvn -B clean package -DskipTests -P${{ matrix.profile }}
+ shell: bash
+ - name: Archive buildkit-${{ matrix.profile }}.tar.gz
+ run: tar -czf buildkit-${{ matrix.profile }}.tar.gz libs mods ../LICENSE.txt ../dist/${{ matrix.launcher }}
+ shell: bash
+ working-directory: target
+ - name: Upload buildkit-${{ matrix.profile }}.tar.gz
+ uses: actions/upload-artifact@v2
with:
- name: buildkit-win.zip
- path: .
- - name: Create tarball
- run: git archive --prefix="cryptomator-${{ github.ref }}/" -o "cryptomator-${{ github.ref }}.tar.gz" ${{ github.ref }}
- - name: Sign tarball with key 615D449FE6E6A235
- run: |
- echo "${GPG_PRIVATE_KEY}" | gpg --batch --quiet --import
- echo "${GPG_PASSPHRASE}" | gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --detach-sign -a "cryptomator-${{ github.ref }}.tar.gz"
- env:
- GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
- GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
- - name: Create Release
- id: create_release
- uses: actions/create-release@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- tag_name: ${{ github.ref }}
- release_name: ${{ github.ref }}
- body: |
- :construction: Work in Progress
+ name: buildkit-${{ matrix.profile }}.tar.gz
+ path: target/buildkit-${{ matrix.profile }}.tar.gz
+ if-no-files-found: error
- TODO:
- * [ ] add Linux appimage, zsync file and signature file
- * [ ] add Windows installer and signature file
- * [ ] add MacOs disk image and signature file
+ # release:
+ # name: Draft a Release on GitHub Releases
+ # runs-on: ubuntu-latest
+ # needs: test
+ # if: startsWith(github.ref, 'refs/tags/') && github.repository == 'cryptomator/cryptomator'
+ # steps:
+ # - uses: actions/checkout@v2
+ # - name: Download buildkit-linux.zip
+ # uses: actions/download-artifact@v1
+ # with:
+ # name: buildkit-linux.zip
+ # path: .
+ # - name: Download buildkit-mac.zip
+ # uses: actions/download-artifact@v1
+ # with:
+ # name: buildkit-mac.zip
+ # path: .
+ # - name: Download buildkit-win.zip
+ # uses: actions/download-artifact@v1
+ # with:
+ # name: buildkit-win.zip
+ # path: .
+ # - name: Create tarball
+ # run: git archive --prefix="cryptomator-${{ github.ref }}/" -o "cryptomator-${{ github.ref }}.tar.gz" ${{ github.ref }}
+ # - name: Sign tarball with key 615D449FE6E6A235
+ # run: |
+ # echo "${GPG_PRIVATE_KEY}" | gpg --batch --quiet --import
+ # echo "${GPG_PASSPHRASE}" | gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --detach-sign -a "cryptomator-${{ github.ref }}.tar.gz"
+ # env:
+ # GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
+ # GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
+ # - name: Create Release
+ # id: create_release
+ # uses: actions/create-release@v1
+ # env:
+ # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ # with:
+ # tag_name: ${{ github.ref }}
+ # release_name: ${{ github.ref }}
+ # body: |
+ # :construction: Work in Progress
- ## What's new
+ # TODO:
+ # * [ ] add Linux appimage, zsync file and signature file
+ # * [ ] add Windows installer and signature file
+ # * [ ] add MacOs disk image and signature file
- ## Bugfixes
+ # ## What's new
- ## Misc
+ # ## Bugfixes
- ---
+ # ## Misc
- :scroll: A complete list of closed issues is available [here](LINK)
- draft: true
- prerelease: false
- - name: Upload buildkit-linux.zip to GitHub Releases
- uses: actions/upload-release-asset@v1.0.1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: buildkit-linux.zip
- asset_name: buildkit-linux.zip
- asset_content_type: application/zip
- - name: Upload buildkit-mac.zip to GitHub Releases
- uses: actions/upload-release-asset@v1.0.1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: buildkit-mac.zip
- asset_name: buildkit-mac.zip
- asset_content_type: application/zip
- - name: Upload buildkit-win.zip to GitHub Releases
- uses: actions/upload-release-asset@v1.0.1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: buildkit-win.zip
- asset_name: buildkit-win.zip
- asset_content_type: application/zip
- - name: Upload tarball signature to GitHub Releases
- uses: actions/upload-release-asset@v1.0.1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: "cryptomator-${{ github.ref }}.tar.gz.asc"
- asset_name: "cryptomator-${{ github.ref }}.tar.gz.asc"
- asset_content_type: application/octet-stream
+ # ---
+
+ # :scroll: A complete list of closed issues is available [here](LINK)
+ # draft: true
+ # prerelease: false
+ # - name: Upload buildkit-linux.zip to GitHub Releases
+ # uses: actions/upload-release-asset@v1.0.1
+ # env:
+ # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ # with:
+ # upload_url: ${{ steps.create_release.outputs.upload_url }}
+ # asset_path: buildkit-linux.zip
+ # asset_name: buildkit-linux.zip
+ # asset_content_type: application/zip
+ # - name: Upload buildkit-mac.zip to GitHub Releases
+ # uses: actions/upload-release-asset@v1.0.1
+ # env:
+ # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ # with:
+ # upload_url: ${{ steps.create_release.outputs.upload_url }}
+ # asset_path: buildkit-mac.zip
+ # asset_name: buildkit-mac.zip
+ # asset_content_type: application/zip
+ # - name: Upload buildkit-win.zip to GitHub Releases
+ # uses: actions/upload-release-asset@v1.0.1
+ # env:
+ # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ # with:
+ # upload_url: ${{ steps.create_release.outputs.upload_url }}
+ # asset_path: buildkit-win.zip
+ # asset_name: buildkit-win.zip
+ # asset_content_type: application/zip
+ # - name: Upload tarball signature to GitHub Releases
+ # uses: actions/upload-release-asset@v1.0.1
+ # env:
+ # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ # with:
+ # upload_url: ${{ steps.create_release.outputs.upload_url }}
+ # asset_path: "cryptomator-${{ github.ref }}.tar.gz.asc"
+ # asset_name: "cryptomator-${{ github.ref }}.tar.gz.asc"
+ # asset_content_type: application/octet-stream
diff --git a/src/package/launcher-linux.sh b/dist/launcher-linux.sh
similarity index 100%
rename from src/package/launcher-linux.sh
rename to dist/launcher-linux.sh
diff --git a/src/package/launcher-mac.sh b/dist/launcher-mac.sh
similarity index 100%
rename from src/package/launcher-mac.sh
rename to dist/launcher-mac.sh
diff --git a/src/package/launcher-win.bat b/dist/launcher-win.bat
similarity index 100%
rename from src/package/launcher-win.bat
rename to dist/launcher-win.bat
diff --git a/pom.xml b/pom.xml
index 7b571effb..c2fef281d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -307,36 +307,6 @@
org.apache.maven.plugins
maven-surefire-plugin
-
- org.apache.maven.plugins
- maven-resources-plugin
-
-
- copy-resources
- prepare-package
-
- copy-resources
-
-
- ${project.build.directory}
-
-
- ${project.basedir}/src/package
-
- version.txt
- ffi-version.txt
- launcher-mac.sh
- launcher-linux.sh
- launcher-win.bat
- LICENSE.txt
-
- true
-
-
-
-
-
-
org.apache.maven.plugins
maven-dependency-plugin
@@ -350,7 +320,6 @@
runtime
${project.build.directory}/mods
- linux,mac,win
${nonModularGroupIds}
@@ -474,48 +443,6 @@
${cryptomator.integrations.mac.version}
-
-
-
- org.apache.maven.plugins
- maven-assembly-plugin
-
-
- assemble-mac
- package
-
- single
-
-
-
- assembly-mac.xml
-
- false
- buildkit-mac
-
-
-
-
-
- org.apache.maven.plugins
- maven-dependency-plugin
-
-
- copy-mac-libs
- prepare-package
-
- copy-dependencies
-
-
- ${project.build.directory}/mods
- org.openjfx
- mac
-
-
-
-
-
-
@@ -536,48 +463,6 @@
${cryptomator.integrations.linux.version}
-
-
-
- org.apache.maven.plugins
- maven-assembly-plugin
-
-
- assemble-linux
- package
-
- single
-
-
-
- assembly-linux.xml
-
- false
- buildkit-linux
-
-
-
-
-
- org.apache.maven.plugins
- maven-dependency-plugin
-
-
- copy-linux-libs
- prepare-package
-
- copy-dependencies
-
-
- ${project.build.directory}/mods
- org.openjfx
- linux
-
-
-
-
-
-
@@ -597,48 +482,6 @@
${cryptomator.integrations.win.version}
-
-
-
- org.apache.maven.plugins
- maven-assembly-plugin
-
-
- assemble-win
- package
-
- single
-
-
-
- assembly-win.xml
-
- false
- buildkit-win
-
-
-
-
-
- org.apache.maven.plugins
- maven-dependency-plugin
-
-
- copy-win-libs
- prepare-package
-
- copy-dependencies
-
-
- ${project.build.directory}/mods
- org.openjfx
- win
-
-
-
-
-
-
diff --git a/src/package/LICENSE.txt b/src/package/LICENSE.txt
deleted file mode 100644
index 20d40b6bc..000000000
--- a/src/package/LICENSE.txt
+++ /dev/null
@@ -1,674 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-
- Copyright (C)
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- Copyright (C)
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-.
\ No newline at end of file
From edc06898fb7a82916a28901078d11e334d9a0eb2 Mon Sep 17 00:00:00 2001
From: Sebastian Stenzel
Date: Mon, 19 Jul 2021 21:31:52 +0200
Subject: [PATCH 02/90] added missing checkout step
---
.github/workflows/build.yml | 1 +
1 file changed, 1 insertion(+)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index af212e19e..6bd6f7909 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -53,6 +53,7 @@ jobs:
profile: mac
launcher: launcher-mac.sh
steps:
+ - uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
java-version: 16
From f0cee47aeaace308d447f197a3fd029028f5048c Mon Sep 17 00:00:00 2001
From: Sebastian Stenzel
Date: Mon, 19 Jul 2021 21:50:07 +0200
Subject: [PATCH 03/90] let actions/upload-artifact assemble the buildkit
---
.github/workflows/build.yml | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 6bd6f7909..73f880cff 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -67,14 +67,20 @@ jobs:
run: mvn -B clean package -DskipTests -P${{ matrix.profile }}
shell: bash
- name: Archive buildkit-${{ matrix.profile }}.tar.gz
- run: tar -czf buildkit-${{ matrix.profile }}.tar.gz libs mods ../LICENSE.txt ../dist/${{ matrix.launcher }}
+ run: |
+ cp LICENSE.txt target
+ cp dist/${{ matrix.launcher }} target
shell: bash
- working-directory: target
- - name: Upload buildkit-${{ matrix.profile }}.tar.gz
+ - name: Upload buildkit-${{ matrix.profile }}
uses: actions/upload-artifact@v2
with:
- name: buildkit-${{ matrix.profile }}.tar.gz
- path: target/buildkit-${{ matrix.profile }}.tar.gz
+ name: buildkit-${{ matrix.profile }}
+ path: |
+ target/libs
+ target/mods
+ target/LICENSE.txt
+ target/${{ matrix.launcher }}
+ if-no-files-found: error
if-no-files-found: error
# release:
From b7012d7b83f2ec3c52160f029155b8590da7ba5f Mon Sep 17 00:00:00 2001
From: Sebastian Stenzel
Date: Mon, 19 Jul 2021 21:53:12 +0200
Subject: [PATCH 04/90] removed duplicate key
---
.github/workflows/build.yml | 1 -
1 file changed, 1 deletion(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 73f880cff..b222c81d0 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -81,7 +81,6 @@ jobs:
target/LICENSE.txt
target/${{ matrix.launcher }}
if-no-files-found: error
- if-no-files-found: error
# release:
# name: Draft a Release on GitHub Releases
From f1f55fc0ddd6fec8ba51aedb6084cc5acb4a620a Mon Sep 17 00:00:00 2001
From: Sebastian Stenzel
Date: Mon, 19 Jul 2021 22:03:20 +0200
Subject: [PATCH 05/90] include crytomator-*.jar in mods dir
---
.github/workflows/build.yml | 1 +
1 file changed, 1 insertion(+)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index b222c81d0..3e7c03caf 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -70,6 +70,7 @@ jobs:
run: |
cp LICENSE.txt target
cp dist/${{ matrix.launcher }} target
+ cp target/cryptomator-*.jar target/mods
shell: bash
- name: Upload buildkit-${{ matrix.profile }}
uses: actions/upload-artifact@v2
From c79c7459c64c221224c28eb27639bf9cb4136714 Mon Sep 17 00:00:00 2001
From: Sebastian Stenzel
Date: Mon, 19 Jul 2021 23:10:28 +0200
Subject: [PATCH 06/90] create custom runtime image
---
.github/workflows/build.yml | 74 ++++++++++++++++++++++++++++++++++---
1 file changed, 69 insertions(+), 5 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3e7c03caf..ef14da828 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -3,6 +3,14 @@ name: Build
on:
[push]
+env:
+ JAVA_VERSION: 16
+ ADDITIONAL_MODULES: jdk.crypto.ec,jdk.accessibility
+
+defaults:
+ run:
+ shell: bash
+
jobs:
test:
name: Build and Test
@@ -12,7 +20,7 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
- java-version: 16
+ java-version: ${{ env.JAVA_VERSION }}
- uses: actions/cache@v2
with:
path: ~/.m2/repository
@@ -36,7 +44,7 @@ jobs:
#
buildkit:
- name: Build buildkit-${{ matrix.profile }}.zip
+ name: Build buildkit-${{ matrix.profile }}
needs: test
runs-on: ${{ matrix.os }}
strategy:
@@ -56,7 +64,7 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
with:
- java-version: 16
+ java-version: ${{ env.JAVA_VERSION }}
- uses: actions/cache@v2
with:
path: ~/.m2/repository
@@ -65,13 +73,11 @@ jobs:
${{ runner.os }}-maven-
- name: Copy .jar files
run: mvn -B clean package -DskipTests -P${{ matrix.profile }}
- shell: bash
- name: Archive buildkit-${{ matrix.profile }}.tar.gz
run: |
cp LICENSE.txt target
cp dist/${{ matrix.launcher }} target
cp target/cryptomator-*.jar target/mods
- shell: bash
- name: Upload buildkit-${{ matrix.profile }}
uses: actions/upload-artifact@v2
with:
@@ -83,6 +89,64 @@ jobs:
target/${{ matrix.launcher }}
if-no-files-found: error
+#
+# jlink
+#
+
+ jlink:
+ name: Create runtime-${{ matrix.profile }}
+ needs: buildkit
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: true
+ matrix:
+ include:
+ - os: ubuntu-latest
+ profile: linux
+ - os: windows-latest
+ profile: win
+ - os: macOS-latest
+ profile: mac
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-java@v1
+ with:
+ java-version: ${{ env.JAVA_VERSION }}
+ - name: Download buildkit-linux
+ uses: actions/download-artifact@v2
+ with:
+ name: buildkit-${{ matrix.profile }}
+ path: buildkit
+ - name: Run jdeps
+ run: >
+ jmods=`
+ ${JAVA_HOME}/bin/jdeps --module-path buildkit/mods -R --multi-release ${{ env.JAVA_VERSION }} -s buildkit/mods/cryptomator-*.jar
+ | awk -F ' -> ' '{print $2}'
+ | grep -E '^java\.|^jdk\.'
+ | sort
+ | uniq
+ | tr '\n' ','
+ `
+ && echo "REQUIRED_MODULES=${jmods}" >> $GITHUB_ENV
+ working-directory: buildkit
+ - name: Create Runtime Image
+ run: >
+ ${JAVA_HOME}/bin/jlink
+ --verbose
+ --output runtime
+ --module-path "${JAVA_HOME/}/jmods"
+ --add-modules ${{ env.REQUIRED_MODULES }}${{ env.ADDITIONAL_MODULES }}
+ --no-header-files
+ --no-man-pages
+ --strip-debug
+ --compress=1
+ - name: Upload runtime-${{ matrix.profile }}
+ uses: actions/upload-artifact@v2
+ with:
+ name: runtime-${{ matrix.profile }}
+ path: runtime
+ if-no-files-found: error
+
# release:
# name: Draft a Release on GitHub Releases
# runs-on: ubuntu-latest
From 039044ed1af61f4d26e264dcdd4929c5a7b35c39 Mon Sep 17 00:00:00 2001
From: Sebastian Stenzel
Date: Mon, 19 Jul 2021 23:17:20 +0200
Subject: [PATCH 07/90] hard code required modules for now
---
.github/workflows/build.yml | 22 ++--------------------
1 file changed, 2 insertions(+), 20 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index ef14da828..0bae886e4 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -5,7 +5,6 @@ on:
env:
JAVA_VERSION: 16
- ADDITIONAL_MODULES: jdk.crypto.ec,jdk.accessibility
defaults:
run:
@@ -95,7 +94,7 @@ jobs:
jlink:
name: Create runtime-${{ matrix.profile }}
- needs: buildkit
+ needs: test
runs-on: ${{ matrix.os }}
strategy:
fail-fast: true
@@ -112,30 +111,13 @@ jobs:
- uses: actions/setup-java@v1
with:
java-version: ${{ env.JAVA_VERSION }}
- - name: Download buildkit-linux
- uses: actions/download-artifact@v2
- with:
- name: buildkit-${{ matrix.profile }}
- path: buildkit
- - name: Run jdeps
- run: >
- jmods=`
- ${JAVA_HOME}/bin/jdeps --module-path buildkit/mods -R --multi-release ${{ env.JAVA_VERSION }} -s buildkit/mods/cryptomator-*.jar
- | awk -F ' -> ' '{print $2}'
- | grep -E '^java\.|^jdk\.'
- | sort
- | uniq
- | tr '\n' ','
- `
- && echo "REQUIRED_MODULES=${jmods}" >> $GITHUB_ENV
- working-directory: buildkit
- name: Create Runtime Image
run: >
${JAVA_HOME}/bin/jlink
--verbose
--output runtime
--module-path "${JAVA_HOME/}/jmods"
- --add-modules ${{ env.REQUIRED_MODULES }}${{ env.ADDITIONAL_MODULES }}
+ --add-modules java.base,java.desktop,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,jdk.unsupported,jdk.crypto.ec,jdk.accessibility
--no-header-files
--no-man-pages
--strip-debug
From b8642677baa774a73ea952b530d54d0584698fc3 Mon Sep 17 00:00:00 2001
From: Sebastian Stenzel
Date: Mon, 19 Jul 2021 23:32:58 +0200
Subject: [PATCH 08/90] run jlink with default shell on each OS
(bash on mac causes problems with variable substitution)
---
.github/workflows/build.yml | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 0bae886e4..55bb194de 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -6,10 +6,6 @@ on:
env:
JAVA_VERSION: 16
-defaults:
- run:
- shell: bash
-
jobs:
test:
name: Build and Test
@@ -59,6 +55,9 @@ jobs:
- os: macOS-latest
profile: mac
launcher: launcher-mac.sh
+ defaults:
+ run:
+ shell: bash
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
From 0b6529c75dae75a0618decc13e6657a0c14292fd Mon Sep 17 00:00:00 2001
From: Sebastian Stenzel
Date: Mon, 19 Jul 2021 23:39:12 +0200
Subject: [PATCH 09/90] next attempt to create a runtime image
---
.github/workflows/build.yml | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 55bb194de..c8bc7f5f2 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -6,6 +6,10 @@ on:
env:
JAVA_VERSION: 16
+defaults:
+ run:
+ shell: bash
+
jobs:
test:
name: Build and Test
@@ -55,9 +59,6 @@ jobs:
- os: macOS-latest
profile: mac
launcher: launcher-mac.sh
- defaults:
- run:
- shell: bash
steps:
- uses: actions/checkout@v2
- uses: actions/setup-java@v1
@@ -115,7 +116,7 @@ jobs:
${JAVA_HOME}/bin/jlink
--verbose
--output runtime
- --module-path "${JAVA_HOME/}/jmods"
+ --module-path "${JAVA_HOME}/jmods"
--add-modules java.base,java.desktop,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,jdk.unsupported,jdk.crypto.ec,jdk.accessibility
--no-header-files
--no-man-pages
From 6a8f9759550e4e6e7c1fefe85717769089ef6e17 Mon Sep 17 00:00:00 2001
From: Sebastian Stenzel
Date: Mon, 19 Jul 2021 23:57:26 +0200
Subject: [PATCH 10/90] build appimage
---
.github/workflows/build.yml | 78 ++++++++++++++++++
.../appimage/AppDir/bin/cryptomator.sh | 37 +++++++++
.../org.cryptomator.Cryptomator.desktop | 10 +++
.../apps/org.cryptomator.Cryptomator.png | Bin 0 -> 10950 bytes
.../apps/org.cryptomator.Cryptomator.png | Bin 0 -> 23272 bytes
.../apps/org.cryptomator.Cryptomator.svg | 1 +
.../org.cryptomator.Cryptomator.appdata.xml | 69 ++++++++++++++++
7 files changed, 195 insertions(+)
create mode 100755 dist/appimage/resources/appimage/AppDir/bin/cryptomator.sh
create mode 100644 dist/appimage/resources/appimage/AppDir/usr/share/applications/org.cryptomator.Cryptomator.desktop
create mode 100644 dist/appimage/resources/appimage/AppDir/usr/share/icons/hicolor/256x256/apps/org.cryptomator.Cryptomator.png
create mode 100644 dist/appimage/resources/appimage/AppDir/usr/share/icons/hicolor/512x512/apps/org.cryptomator.Cryptomator.png
create mode 100644 dist/appimage/resources/appimage/AppDir/usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg
create mode 100644 dist/appimage/resources/appimage/AppDir/usr/share/metainfo/org.cryptomator.Cryptomator.appdata.xml
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index c8bc7f5f2..fa34b3438 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -129,6 +129,84 @@ jobs:
path: runtime
if-no-files-found: error
+
+
+#
+# Linux AppImage
+#
+
+ linux-appimage:
+ name: Build AppDir
+ runs-on: ubuntu-latest
+ needs: [buildkit, jlink]
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set version
+ id: setversion
+ run: |
+ if [[ $GITHUB_REF == refs/tags/* ]]; then
+ echo "BUILD_VERSION=${GITHUB_REF##*/}" >> $GITHUB_ENV
+ else
+ echo "BUILD_VERSION=SNAPSHOT" >> $GITHUB_ENV
+ fi
+ - name: Download buildkit-linux
+ uses: actions/download-artifact@v2
+ with:
+ name: buildkit-linux
+ path: Cryptomator.AppDir
+ - name: Download buildkit-linux
+ uses: actions/download-artifact@v2
+ with:
+ name: buildkit-linux
+ path: Cryptomator.AppDir/runtime
+ - name: Extract libjffi.so # workaround for https://github.com/cryptomator/cryptomator-linux/issues/27
+ run: |
+ JFFI_NATIVE_JAR=`ls libs/ | grep -e 'jffi-[1-9]\.[0-9]\{1,2\}.[0-9]\{1,2\}-native.jar'`
+ ${JAVA_HOME}/bin/jar -xf libs/${JFFI_NATIVE_JAR} /jni/x86_64-Linux/
+ mv jni/x86_64-Linux/* libs/libjffi.so
+ working-directory: Cryptomator.AppDir
+ - name: Patch Cryptomator.AppDir
+ run: |
+ cp -r dist/appimage/resources/appimage/AppDir/* Cryptomator.AppDir/
+ export REVISION_NO=`git rev-list --count HEAD`
+ envsubst '${REVISION_NO}' < dist/appimage/resources/appimage/AppDir/bin/cryptomator.sh > Cryptomator.AppDir/bin/cryptomator.sh
+ ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/org.cryptomator.Cryptomator.svg
+ ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/Cryptomator.svg
+ ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/.DirIcon
+ ln -s usr/share/applications/org.cryptomator.Cryptomator.desktop Cryptomator.AppDir/Cryptomator.desktop
+ ln -s bin/cryptomator.sh Cryptomator.AppDir/AppRun
+ - name: Download AppImageKit
+ run: |
+ curl -L https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-x86_64.AppImage -o appimagetool.AppImage
+ chmod +x appimagetool.AppImage
+ ./appimagetool.AppImage --appimage-extract
+ - name: Prepare GPG-Agent for signing with key 615D449FE6E6A235
+ run: |
+ echo "${GPG_PRIVATE_KEY}" | gpg --batch --quiet --import
+ echo "${GPG_PASSPHRASE}" | gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --dry-run --sign appdir.tar.gz
+ env:
+ GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
+ GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
+ - name: Build AppImage
+ run: >
+ ./squashfs-root/AppRun Cryptomator.AppDir cryptomator-${{ env.BUILD_VERSION }}-x86_64.AppImage
+ -u 'gh-releases-zsync|cryptomator|cryptomator|latest|cryptomator-*-x86_64.AppImage.zsync'
+ --sign --sign-key=615D449FE6E6A235 --sign-args="--batch --pinentry-mode loopback"
+ - name: Create Detached GPG Signature
+ run: |
+ gpg --batch --quiet --pinentry-mode loopback -u 615D449FE6E6A235 --detach-sign -a cryptomator-${{ env.BUILD_VERSION }}-x86_64.AppImage
+ gpg --batch --quiet --pinentry-mode loopback -u 615D449FE6E6A235 --detach-sign -a cryptomator-${{ env.BUILD_VERSION }}-x86_64.AppImage.zsync
+ - name: Upload AppImage
+ uses: actions/upload-artifact@v2
+ with:
+ name: appimage
+ path: |
+ cryptomator-${{ env.BUILD_VERSION }}-x86_64.AppImage
+ cryptomator-${{ env.BUILD_VERSION }}-x86_64.AppImage.asc
+ cryptomator-${{ env.BUILD_VERSION }}-x86_64.AppImage.zsync
+ cryptomator-${{ env.BUILD_VERSION }}-x86_64.AppImage.zsync.asc
+ if-no-files-found: error
+
# release:
# name: Draft a Release on GitHub Releases
# runs-on: ubuntu-latest
diff --git a/dist/appimage/resources/appimage/AppDir/bin/cryptomator.sh b/dist/appimage/resources/appimage/AppDir/bin/cryptomator.sh
new file mode 100755
index 000000000..4a237c1b2
--- /dev/null
+++ b/dist/appimage/resources/appimage/AppDir/bin/cryptomator.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+cd $(dirname $0)
+
+# determine GTK version
+GTK2_PRESENT=1 # initially false
+GTK3_PRESENT=0 # initially true
+if command -v dpkg &> /dev/null; then # do stuff for debian based things
+ GTK2_PRESENT=`dpkg -l libgtk* | grep -e '\^ii' | grep -e 'libgtk2-*' &> /dev/null; echo $?`
+ GTK3_PRESENT=`dpkg -l libgtk* | grep -e '\^ii' | grep -e 'libgtk-3-*' &> /dev/null; echo $?`
+elif command -v rpm &> /dev/null; then # do stuff for rpm based things (including yum/dnf)
+ GTK2_PRESENT=`rpm -qa | grep -e '\^gtk2-[0-9][0-9]*' &> /dev/null; echo $?`
+ GTK3_PRESENT=`rpm -qa | grep -e '\^gtk3-[0-9][0-9]*' &> /dev/null; echo $?`
+elif command -v pacman &> /dev/null; then # don't forget arch
+ GTK2_PRESENT=`pacman -Qi gtk2 &> /dev/null; echo $?`
+ GTK3_PRESENT=`pacman -Qi gtk3 &> /dev/null; echo $?`
+fi
+
+if [ "$GTK2_PRESENT" -eq 0 ] && [ "$GTK3_PRESENT" -ne 0 ]; then
+ GTK_FLAG="-Djdk.gtk.version=2"
+fi
+
+# workaround for https://github.com/cryptomator/cryptomator-linux/issues/27
+export LD_PRELOAD=libs/libjffi.so
+
+# start Cryptomator
+./runtime/bin/java \
+ -p "mods" \
+ -cp "libs/*" \
+ -Dcryptomator.logDir="~/.local/share/Cryptomator/logs" \
+ -Dcryptomator.mountPointsDir="~/.local/share/Cryptomator/mnt" \
+ -Dcryptomator.settingsPath="~/.config/Cryptomator/settings.json:~/.Cryptomator/settings.json" \
+ -Dcryptomator.ipcPortPath="~/.config/Cryptomator/ipcPort.bin:~/.Cryptomator/ipcPort.bin" \
+ -Dcryptomator.buildNumber="appimage-${REVISION_NO}" \
+ $GTK_FLAG \
+ -Xss2m \
+ -Xmx512m \
+ -m org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator
diff --git a/dist/appimage/resources/appimage/AppDir/usr/share/applications/org.cryptomator.Cryptomator.desktop b/dist/appimage/resources/appimage/AppDir/usr/share/applications/org.cryptomator.Cryptomator.desktop
new file mode 100644
index 000000000..3e1b34830
--- /dev/null
+++ b/dist/appimage/resources/appimage/AppDir/usr/share/applications/org.cryptomator.Cryptomator.desktop
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Name=Cryptomator
+Comment=Cloud Storage Encryption Utility
+Exec=cryptomator %F
+Icon=org.cryptomator.Cryptomator
+Terminal=false
+Type=Application
+Categories=Utility;Security;FileTools;
+StartupWMClass=org.cryptomator.launcher.Cryptomator
+MimeType=application/vnd.cryptomator.encrypted;application/x-vnd.cryptomator.vault-metadata;
diff --git a/dist/appimage/resources/appimage/AppDir/usr/share/icons/hicolor/256x256/apps/org.cryptomator.Cryptomator.png b/dist/appimage/resources/appimage/AppDir/usr/share/icons/hicolor/256x256/apps/org.cryptomator.Cryptomator.png
new file mode 100644
index 0000000000000000000000000000000000000000..e356c35c6fe7928530de7e95be9c29ee9cf3597e
GIT binary patch
literal 10950
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
\ No newline at end of file
diff --git a/dist/appimage/resources/appimage/AppDir/usr/share/metainfo/org.cryptomator.Cryptomator.appdata.xml b/dist/appimage/resources/appimage/AppDir/usr/share/metainfo/org.cryptomator.Cryptomator.appdata.xml
new file mode 100644
index 000000000..ad4af6c70
--- /dev/null
+++ b/dist/appimage/resources/appimage/AppDir/usr/share/metainfo/org.cryptomator.Cryptomator.appdata.xml
@@ -0,0 +1,69 @@
+
+
+
+ org.cryptomator.Cryptomator
+ FSFAP
+ GPL-3.0-or-later
+ Cryptomator
+ Multi-platform client-side encryption tool optimized for cloud storages
+
+
+ Cryptomator offers multi-platform transparent client-side encryption of your files in the cloud.
+
+
+ Features:
+
+ - Works with Dropbox, Google Drive, OneDrive, ownCloud, Nextcloud and any other cloud storage service which synchronizes with a local directory
+ - Open Source means: No backdoors, control is better than trust
+ - Client-side: No accounts, no data shared with any online service
+ - Totally transparent: Just work on the virtual drive as if it were a USB flash drive
+ - AES encryption with 256-bit key length
+ - File names get encrypted
+ - Folder structure gets obfuscated
+ - Use as many vaults in your Dropbox as you want, each having individual passwords
+ - One thousand commits for the security of your data!! :tada:
+
+
+
+ Privacy:
+
+ - 256-bit keys (unlimited strength policy bundled with native binaries)
+ - Scrypt key derivation
+ - Cryptographically secure random numbers for salts, IVs and the masterkey of course
+ - Sensitive data is wiped from the heap asap
+ - Lightweight: Complexity kills security
+
+
+
+ Consistency:
+
+ - HMAC over file contents to recognize changed ciphertext before decryption
+ - I/O operations are transactional and atomic, if the filesystems support it
+ - Each file contains all information needed for decryption (except for the key of course), no common metadata means no Single Point of Failure
+
+
+
+
+ Office
+ Security
+ FileTools
+ Java
+
+ http://cryptomator.org
+ https://github.com/cryptomator/cryptomator/issues
+ https://community.cryptomator.org/c/kb/faq
+ https://community.cryptomator.org/
+ https://cryptomator.org/
+
+ none
+ none
+ none
+ none
+ mild
+
+ Cryptomator
+
+ cryptomator
+
+ org.cryptomator.Cryptomator.desktop
+
From 64fc11eb5f9d3844e6877dd6e180f8a95e349b2b Mon Sep 17 00:00:00 2001
From: Sebastian Stenzel
Date: Tue, 20 Jul 2021 00:01:42 +0200
Subject: [PATCH 11/90] fixing AppImage build
---
.github/workflows/build.yml | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index fa34b3438..52088462c 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -136,7 +136,7 @@ jobs:
#
linux-appimage:
- name: Build AppDir
+ name: Build AppImage
runs-on: ubuntu-latest
needs: [buildkit, jlink]
steps:
@@ -168,6 +168,7 @@ jobs:
- name: Patch Cryptomator.AppDir
run: |
cp -r dist/appimage/resources/appimage/AppDir/* Cryptomator.AppDir/
+ chmod +x Cryptomator.AppDir/runtime/bin/java
export REVISION_NO=`git rev-list --count HEAD`
envsubst '${REVISION_NO}' < dist/appimage/resources/appimage/AppDir/bin/cryptomator.sh > Cryptomator.AppDir/bin/cryptomator.sh
ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/org.cryptomator.Cryptomator.svg
@@ -183,7 +184,7 @@ jobs:
- name: Prepare GPG-Agent for signing with key 615D449FE6E6A235
run: |
echo "${GPG_PRIVATE_KEY}" | gpg --batch --quiet --import
- echo "${GPG_PASSPHRASE}" | gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --dry-run --sign appdir.tar.gz
+ echo "${GPG_PASSPHRASE}" | gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --dry-run --sign Cryptomator.AppDir/AppRun
env:
GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
From 0a421ab9db6fdcc3f53506cfc36dfb35245d48fc Mon Sep 17 00:00:00 2001
From: Sebastian Stenzel
Date: Tue, 20 Jul 2021 00:06:20 +0200
Subject: [PATCH 12/90] download runtime to AppDir/runtime
---
.github/workflows/build.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 52088462c..2c447af77 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -154,10 +154,10 @@ jobs:
with:
name: buildkit-linux
path: Cryptomator.AppDir
- - name: Download buildkit-linux
+ - name: Download runtime-linux
uses: actions/download-artifact@v2
with:
- name: buildkit-linux
+ name: runtime-linux
path: Cryptomator.AppDir/runtime
- name: Extract libjffi.so # workaround for https://github.com/cryptomator/cryptomator-linux/issues/27
run: |
From 01a3d16007ccd0844fdf470936b6c38fa7d2d804 Mon Sep 17 00:00:00 2001
From: Sebastian Stenzel
Date: Tue, 20 Jul 2021 00:23:40 +0200
Subject: [PATCH 13/90] adjust launcher sh
---
dist/appimage/resources/appimage/AppDir/bin/cryptomator.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dist/appimage/resources/appimage/AppDir/bin/cryptomator.sh b/dist/appimage/resources/appimage/AppDir/bin/cryptomator.sh
index 4a237c1b2..69a1b16cd 100755
--- a/dist/appimage/resources/appimage/AppDir/bin/cryptomator.sh
+++ b/dist/appimage/resources/appimage/AppDir/bin/cryptomator.sh
@@ -29,7 +29,7 @@ export LD_PRELOAD=libs/libjffi.so
-Dcryptomator.logDir="~/.local/share/Cryptomator/logs" \
-Dcryptomator.mountPointsDir="~/.local/share/Cryptomator/mnt" \
-Dcryptomator.settingsPath="~/.config/Cryptomator/settings.json:~/.Cryptomator/settings.json" \
- -Dcryptomator.ipcPortPath="~/.config/Cryptomator/ipcPort.bin:~/.Cryptomator/ipcPort.bin" \
+ -Dcryptomator.ipcSocketPath="~/.config/Cryptomator/ipc.socket" \
-Dcryptomator.buildNumber="appimage-${REVISION_NO}" \
$GTK_FLAG \
-Xss2m \
From be44dcd56928aa22f1efa84201beda8f27b86664 Mon Sep 17 00:00:00 2001
From: Sebastian Stenzel
Date: Tue, 20 Jul 2021 10:47:42 +0200
Subject: [PATCH 14/90] added standalone build.sh for manually building
AppImages
---
.github/workflows/build.yml | 10 ++--
dist/appimage/build.sh | 53 ++++++++++++++++++
.../{appimage => }/AppDir/bin/cryptomator.sh | 0
.../org.cryptomator.Cryptomator.desktop | 0
.../apps/org.cryptomator.Cryptomator.png | Bin
.../apps/org.cryptomator.Cryptomator.png | Bin
.../apps/org.cryptomator.Cryptomator.svg | 0
.../org.cryptomator.Cryptomator.appdata.xml | 0
dist/{ => buildkit}/launcher-linux.sh | 0
dist/{ => buildkit}/launcher-mac.sh | 0
dist/{ => buildkit}/launcher-win.bat | 0
11 files changed, 57 insertions(+), 6 deletions(-)
create mode 100755 dist/appimage/build.sh
rename dist/appimage/resources/{appimage => }/AppDir/bin/cryptomator.sh (100%)
rename dist/appimage/resources/{appimage => }/AppDir/usr/share/applications/org.cryptomator.Cryptomator.desktop (100%)
rename dist/appimage/resources/{appimage => }/AppDir/usr/share/icons/hicolor/256x256/apps/org.cryptomator.Cryptomator.png (100%)
rename dist/appimage/resources/{appimage => }/AppDir/usr/share/icons/hicolor/512x512/apps/org.cryptomator.Cryptomator.png (100%)
rename dist/appimage/resources/{appimage => }/AppDir/usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg (100%)
rename dist/appimage/resources/{appimage => }/AppDir/usr/share/metainfo/org.cryptomator.Cryptomator.appdata.xml (100%)
rename dist/{ => buildkit}/launcher-linux.sh (100%)
mode change 100644 => 100755
rename dist/{ => buildkit}/launcher-mac.sh (100%)
mode change 100644 => 100755
rename dist/{ => buildkit}/launcher-win.bat (100%)
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 2c447af77..023e78938 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -12,7 +12,7 @@ defaults:
jobs:
test:
- name: Build and Test
+ name: Compile and Test
runs-on: ubuntu-latest
if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')"
steps:
@@ -75,7 +75,7 @@ jobs:
- name: Archive buildkit-${{ matrix.profile }}.tar.gz
run: |
cp LICENSE.txt target
- cp dist/${{ matrix.launcher }} target
+ cp dist/buildkit/${{ matrix.launcher }} target
cp target/cryptomator-*.jar target/mods
- name: Upload buildkit-${{ matrix.profile }}
uses: actions/upload-artifact@v2
@@ -129,8 +129,6 @@ jobs:
path: runtime
if-no-files-found: error
-
-
#
# Linux AppImage
#
@@ -167,10 +165,10 @@ jobs:
working-directory: Cryptomator.AppDir
- name: Patch Cryptomator.AppDir
run: |
- cp -r dist/appimage/resources/appimage/AppDir/* Cryptomator.AppDir/
+ cp -r dist/appimage/resources/AppDir/* Cryptomator.AppDir/
chmod +x Cryptomator.AppDir/runtime/bin/java
export REVISION_NO=`git rev-list --count HEAD`
- envsubst '${REVISION_NO}' < dist/appimage/resources/appimage/AppDir/bin/cryptomator.sh > Cryptomator.AppDir/bin/cryptomator.sh
+ envsubst '${REVISION_NO}' < dist/appimage/resources/AppDir/bin/cryptomator.sh > Cryptomator.AppDir/bin/cryptomator.sh
ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/org.cryptomator.Cryptomator.svg
ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/Cryptomator.svg
ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/.DirIcon
diff --git a/dist/appimage/build.sh b/dist/appimage/build.sh
new file mode 100755
index 000000000..a5f73a48b
--- /dev/null
+++ b/dist/appimage/build.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+BASEDIR=$(dirname $0)/../..
+REVISION_NO=`git rev-list --count HEAD`
+
+# check preconditions
+if [ -z "${JAVA_HOME}" ]; then echo "JAVA_HOME not set. Run using JAVA_HOME=/path/to/jdk ./build.sh"; exit 1; fi
+command -v mvn >/dev/null 2>&1 || { echo >&2 "mvn not found."; exit 1; }
+command -v curl >/dev/null 2>&1 || { echo >&2 "curl not found."; exit 1; }
+
+# compile
+mvn -B -f${BASEDIR}/pom.xml clean package -DskipTests -Plinux
+
+# prepare AppDir
+mkdir ${BASEDIR}/target/Cryptomator.AppDir
+mv ${BASEDIR}/target/libs ${BASEDIR}/target/Cryptomator.AppDir
+mv ${BASEDIR}/target/mods ${BASEDIR}/target/Cryptomator.AppDir
+mv ${BASEDIR}/LICENSE.txt ${BASEDIR}/target/Cryptomator.AppDir
+cd ${BASEDIR}/target/Cryptomator.AppDir
+
+# add runtime
+${JAVA_HOME}/bin/jlink
+ --output runtime
+ --module-path "${JAVA_HOME}/jmods"
+ --add-modules java.base,java.desktop,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,jdk.unsupported,jdk.crypto.ec,jdk.accessibility
+ --no-header-files
+ --no-man-pages
+ --strip-debug
+ --compress=1
+
+# extract jffi
+JFFI_NATIVE_JAR=`ls libs | grep -e 'jffi-[1-9]\.[0-9]\{1,2\}.[0-9]\{1,2\}-native.jar'`
+${JAVA_HOME}/bin/jar -xf libs/${JFFI_NATIVE_JAR} /jni/x86_64-Linux/
+mv jni/x86_64-Linux/* libs/libjffi.so
+rm -r jni/x86_64-Linux
+
+# finalize AppDir
+envsubst '${REVISION_NO}' < ${BASEDIR}/dist/appimage/resources/AppDir/bin/cryptomator.sh > Cryptomator.AppDir/bin/cryptomator.sh
+ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/org.cryptomator.Cryptomator.svg
+ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/Cryptomator.svg
+ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/.DirIcon
+ln -s usr/share/applications/org.cryptomator.Cryptomator.desktop Cryptomator.AppDir/Cryptomator.desktop
+ln -s bin/cryptomator.sh Cryptomator.AppDir/AppRun
+
+# load AppImageTool
+curl -L https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-x86_64.AppImage -o /tmp/appimagetool.AppImage
+chmod +x /tmp/appimagetool.AppImage
+
+# create AppImage
+/tmp/appimagetool.AppImage \
+ ${BASEDIR}/target/Cryptomator.AppDir \
+ cryptomator-SNAPSHOT-x86_64.AppImage \
+ -u 'gh-releases-zsync|cryptomator|cryptomator|latest|cryptomator-*-x86_64.AppImage.zsync'
\ No newline at end of file
diff --git a/dist/appimage/resources/appimage/AppDir/bin/cryptomator.sh b/dist/appimage/resources/AppDir/bin/cryptomator.sh
similarity index 100%
rename from dist/appimage/resources/appimage/AppDir/bin/cryptomator.sh
rename to dist/appimage/resources/AppDir/bin/cryptomator.sh
diff --git a/dist/appimage/resources/appimage/AppDir/usr/share/applications/org.cryptomator.Cryptomator.desktop b/dist/appimage/resources/AppDir/usr/share/applications/org.cryptomator.Cryptomator.desktop
similarity index 100%
rename from dist/appimage/resources/appimage/AppDir/usr/share/applications/org.cryptomator.Cryptomator.desktop
rename to dist/appimage/resources/AppDir/usr/share/applications/org.cryptomator.Cryptomator.desktop
diff --git a/dist/appimage/resources/appimage/AppDir/usr/share/icons/hicolor/256x256/apps/org.cryptomator.Cryptomator.png b/dist/appimage/resources/AppDir/usr/share/icons/hicolor/256x256/apps/org.cryptomator.Cryptomator.png
similarity index 100%
rename from dist/appimage/resources/appimage/AppDir/usr/share/icons/hicolor/256x256/apps/org.cryptomator.Cryptomator.png
rename to dist/appimage/resources/AppDir/usr/share/icons/hicolor/256x256/apps/org.cryptomator.Cryptomator.png
diff --git a/dist/appimage/resources/appimage/AppDir/usr/share/icons/hicolor/512x512/apps/org.cryptomator.Cryptomator.png b/dist/appimage/resources/AppDir/usr/share/icons/hicolor/512x512/apps/org.cryptomator.Cryptomator.png
similarity index 100%
rename from dist/appimage/resources/appimage/AppDir/usr/share/icons/hicolor/512x512/apps/org.cryptomator.Cryptomator.png
rename to dist/appimage/resources/AppDir/usr/share/icons/hicolor/512x512/apps/org.cryptomator.Cryptomator.png
diff --git a/dist/appimage/resources/appimage/AppDir/usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg b/dist/appimage/resources/AppDir/usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg
similarity index 100%
rename from dist/appimage/resources/appimage/AppDir/usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg
rename to dist/appimage/resources/AppDir/usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg
diff --git a/dist/appimage/resources/appimage/AppDir/usr/share/metainfo/org.cryptomator.Cryptomator.appdata.xml b/dist/appimage/resources/AppDir/usr/share/metainfo/org.cryptomator.Cryptomator.appdata.xml
similarity index 100%
rename from dist/appimage/resources/appimage/AppDir/usr/share/metainfo/org.cryptomator.Cryptomator.appdata.xml
rename to dist/appimage/resources/AppDir/usr/share/metainfo/org.cryptomator.Cryptomator.appdata.xml
diff --git a/dist/launcher-linux.sh b/dist/buildkit/launcher-linux.sh
old mode 100644
new mode 100755
similarity index 100%
rename from dist/launcher-linux.sh
rename to dist/buildkit/launcher-linux.sh
diff --git a/dist/launcher-mac.sh b/dist/buildkit/launcher-mac.sh
old mode 100644
new mode 100755
similarity index 100%
rename from dist/launcher-mac.sh
rename to dist/buildkit/launcher-mac.sh
diff --git a/dist/launcher-win.bat b/dist/buildkit/launcher-win.bat
similarity index 100%
rename from dist/launcher-win.bat
rename to dist/buildkit/launcher-win.bat
From 8d17042456e2485794ac01a4f12344de33a4c32f Mon Sep 17 00:00:00 2001
From: Sebastian Stenzel
Date: Tue, 20 Jul 2021 12:33:35 +0200
Subject: [PATCH 15/90] updated standalone build.sh
[ci skip]
---
dist/appimage/.gitignore | 4 ++++
dist/appimage/build.sh | 25 ++++++++++++-------------
2 files changed, 16 insertions(+), 13 deletions(-)
create mode 100644 dist/appimage/.gitignore
diff --git a/dist/appimage/.gitignore b/dist/appimage/.gitignore
new file mode 100644
index 000000000..1ed40c771
--- /dev/null
+++ b/dist/appimage/.gitignore
@@ -0,0 +1,4 @@
+# created during build
+Cryptomator.AppDir
+*.AppImage
+*.AppImage.zsync
\ No newline at end of file
diff --git a/dist/appimage/build.sh b/dist/appimage/build.sh
index a5f73a48b..5ad764464 100755
--- a/dist/appimage/build.sh
+++ b/dist/appimage/build.sh
@@ -1,6 +1,6 @@
#!/bin/bash
-BASEDIR=$(dirname $0)/../..
+cd $(dirname $0)
REVISION_NO=`git rev-list --count HEAD`
# check preconditions
@@ -9,18 +9,17 @@ command -v mvn >/dev/null 2>&1 || { echo >&2 "mvn not found."; exit 1; }
command -v curl >/dev/null 2>&1 || { echo >&2 "curl not found."; exit 1; }
# compile
-mvn -B -f${BASEDIR}/pom.xml clean package -DskipTests -Plinux
+mvn -B -f../../pom.xml clean package -DskipTests -Plinux
# prepare AppDir
-mkdir ${BASEDIR}/target/Cryptomator.AppDir
-mv ${BASEDIR}/target/libs ${BASEDIR}/target/Cryptomator.AppDir
-mv ${BASEDIR}/target/mods ${BASEDIR}/target/Cryptomator.AppDir
-mv ${BASEDIR}/LICENSE.txt ${BASEDIR}/target/Cryptomator.AppDir
-cd ${BASEDIR}/target/Cryptomator.AppDir
+mkdir Cryptomator.AppDir
+mv ../../target/libs Cryptomator.AppDir
+mv ../../target/mods Cryptomator.AppDir
+cp ../../LICENSE.txt Cryptomator.AppDir
# add runtime
${JAVA_HOME}/bin/jlink
- --output runtime
+ --output Cryptomator.AppDir/runtime
--module-path "${JAVA_HOME}/jmods"
--add-modules java.base,java.desktop,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,jdk.unsupported,jdk.crypto.ec,jdk.accessibility
--no-header-files
@@ -29,13 +28,13 @@ ${JAVA_HOME}/bin/jlink
--compress=1
# extract jffi
-JFFI_NATIVE_JAR=`ls libs | grep -e 'jffi-[1-9]\.[0-9]\{1,2\}.[0-9]\{1,2\}-native.jar'`
-${JAVA_HOME}/bin/jar -xf libs/${JFFI_NATIVE_JAR} /jni/x86_64-Linux/
-mv jni/x86_64-Linux/* libs/libjffi.so
+JFFI_NATIVE_JAR=`ls Cryptomator.AppDir/libs | grep -e 'jffi-[1-9]\.[0-9]\{1,2\}.[0-9]\{1,2\}-native.jar'`
+${JAVA_HOME}/bin/jar -xf Cryptomator.AppDir/libs/${JFFI_NATIVE_JAR} /jni/x86_64-Linux/
+mv jni/x86_64-Linux/* Cryptomator.AppDir/libs/libjffi.so
rm -r jni/x86_64-Linux
# finalize AppDir
-envsubst '${REVISION_NO}' < ${BASEDIR}/dist/appimage/resources/AppDir/bin/cryptomator.sh > Cryptomator.AppDir/bin/cryptomator.sh
+envsubst '${REVISION_NO}' < resources/AppDir/bin/cryptomator.sh > Cryptomator.AppDir/bin/cryptomator.sh
ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/org.cryptomator.Cryptomator.svg
ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/Cryptomator.svg
ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/.DirIcon
@@ -48,6 +47,6 @@ chmod +x /tmp/appimagetool.AppImage
# create AppImage
/tmp/appimagetool.AppImage \
- ${BASEDIR}/target/Cryptomator.AppDir \
+ Cryptomator.AppDir \
cryptomator-SNAPSHOT-x86_64.AppImage \
-u 'gh-releases-zsync|cryptomator|cryptomator|latest|cryptomator-*-x86_64.AppImage.zsync'
\ No newline at end of file
From 18305ca2d61684c78177b927ae5e763cbe612d1d Mon Sep 17 00:00:00 2001
From: Sebastian Stenzel
Date: Tue, 20 Jul 2021 13:51:03 +0200
Subject: [PATCH 16/90] build windows app dir
---
.github/workflows/build.yml | 72 +++++++++++++++++++-
dist/msi/resources/app/Cryptomator.ico | Bin 0 -> 162342 bytes
dist/msi/resources/app/dlls/dokan1.dll | Bin 0 -> 524800 bytes
dist/msi/resources/app/dlls/jnidispatch.dll | Bin 0 -> 246272 bytes
4 files changed, 71 insertions(+), 1 deletion(-)
create mode 100644 dist/msi/resources/app/Cryptomator.ico
create mode 100755 dist/msi/resources/app/dlls/dokan1.dll
create mode 100644 dist/msi/resources/app/dlls/jnidispatch.dll
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 023e78938..0908007f5 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -147,6 +147,7 @@ jobs:
else
echo "BUILD_VERSION=SNAPSHOT" >> $GITHUB_ENV
fi
+ echo "REVISION_NO=`git rev-list --count HEAD`" >> $GITHUB_ENV
- name: Download buildkit-linux
uses: actions/download-artifact@v2
with:
@@ -167,13 +168,14 @@ jobs:
run: |
cp -r dist/appimage/resources/AppDir/* Cryptomator.AppDir/
chmod +x Cryptomator.AppDir/runtime/bin/java
- export REVISION_NO=`git rev-list --count HEAD`
envsubst '${REVISION_NO}' < dist/appimage/resources/AppDir/bin/cryptomator.sh > Cryptomator.AppDir/bin/cryptomator.sh
ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/org.cryptomator.Cryptomator.svg
ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/Cryptomator.svg
ln -s usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.svg Cryptomator.AppDir/.DirIcon
ln -s usr/share/applications/org.cryptomator.Cryptomator.desktop Cryptomator.AppDir/Cryptomator.desktop
ln -s bin/cryptomator.sh Cryptomator.AppDir/AppRun
+ env:
+ REVISION_NO: ${{ env.REVISION_NO }}
- name: Download AppImageKit
run: |
curl -L https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-x86_64.AppImage -o appimagetool.AppImage
@@ -206,6 +208,74 @@ jobs:
cryptomator-${{ env.BUILD_VERSION }}-x86_64.AppImage.zsync.asc
if-no-files-found: error
+#
+# Windows App Dir
+#
+
+ windows-appdir:
+ name: Build App Directory
+ runs-on: windows-latest
+ needs: [buildkit, jlink]
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set version
+ id: setversion
+ run: |
+ if [[ $GITHUB_REF == refs/tags/* ]]; then
+ echo "BUILD_VERSION=${GITHUB_REF##*/}" >> $GITHUB_ENV
+ echo "NUMERIC_VERSION=${GITHUB_REF##*/}" >> $GITHUB_ENV
+ else
+ echo "BUILD_VERSION=SNAPSHOT" >> $GITHUB_ENV
+ echo "NUMERIC_VERSION=99.0.0" >> $GITHUB_ENV
+ fi
+ echo "REVISION_NO=`git rev-list --count HEAD`" >> $GITHUB_ENV
+ - name: Download buildkit-win
+ uses: actions/download-artifact@v2
+ with:
+ name: buildkit-win
+ path: buildkit
+ - name: Download runtime-win
+ uses: actions/download-artifact@v2
+ with:
+ name: runtime-win
+ path: runtime
+ - name: Create app directory
+ run: >
+ "${JAVA_HOME}\bin\jpackage"
+ --verbose
+ --type app-image
+ --runtime-image runtime
+ --input buildkit/libs
+ --module-path buildkit/mods
+ --dest app
+ --name Cryptomator
+ --vendor "Skymatic GmbH"
+ --copyright "(C) 2016 - 2021 Skymatic GmbH"
+ --app-version "${{ env.NUMERIC_VERSION }}.${{ env.REVISION_NO }}"
+ --icon dist/msi/resources/app/Cryptomator.ico
+ --java-options "-Dfile.encoding=`"utf-8`""
+ --java-options "-Dcryptomator.logDir=`"~/AppData/Roaming/Cryptomator`""
+ --java-options "-Dcryptomator.settingsPath=`"~/AppData/Roaming/Cryptomator/settings.json`""
+ --java-options "-Dcryptomator.ipcPortPath=`"~/AppData/Roaming/Cryptomator/ipcPort.bin`""
+ --java-options "-Dcryptomator.keychainPath=`"~/AppData/Roaming/Cryptomator/keychain.json`""
+ --java-options "-Dcryptomator.mountPointsDir=`"~/Cryptomator`""
+ --java-options "-Dcryptomator.showTrayIcon=true"
+ --java-options "-Dcryptomator.buildNumber=`"msi-${{ env.REVISION_NO }}`""
+ --java-options "-Xss2m"
+ --java-options "-Xmx256m"
+ --module org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator
+ shell: bash
+ - name: Patch app directory
+ run: |
+ cp dist/msi/resources/app/dlls/* app/Cryptomator/
+ shell: bash
+ - name: Upload app directory
+ uses: actions/upload-artifact@v2
+ with:
+ name: win-appdir
+ path: app/Cryptomator
+ if-no-files-found: error
+
# release:
# name: Draft a Release on GitHub Releases
# runs-on: ubuntu-latest
diff --git a/dist/msi/resources/app/Cryptomator.ico b/dist/msi/resources/app/Cryptomator.ico
new file mode 100644
index 0000000000000000000000000000000000000000..7d1d8be880abb6680387d2a67b814a0bd38368c4
GIT binary patch
literal 162342
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
literal 0
HcmV?d00001
diff --git a/dist/msi/resources/app/dlls/dokan1.dll b/dist/msi/resources/app/dlls/dokan1.dll
new file mode 100755
index 0000000000000000000000000000000000000000..badc12b2ad424a7045097df3a5ed25df72b1f135
GIT binary patch
literal 524800
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