mirror of
https://github.com/bisq-network/bisq.git
synced 2025-01-18 13:25:14 +01:00
Merge pull request #5431 from ripcurlx/upgrade-javafax-14
Upgrade Java to v11 and JavaFX to v15
This commit is contained in:
commit
469448a218
@ -1,7 +1,6 @@
|
||||
language: java
|
||||
jdk:
|
||||
- openjdk10
|
||||
- openjdk12
|
||||
- openjdk11
|
||||
|
||||
cache:
|
||||
directories:
|
||||
|
17
build.gradle
17
build.gradle
@ -46,11 +46,11 @@ configure(subprojects) {
|
||||
httpcoreVersion = '4.4.13'
|
||||
ioVersion = '2.6'
|
||||
jacksonVersion = '2.12.1'
|
||||
javafxVersion = '11.0.2'
|
||||
javafxVersion = '15'
|
||||
javaxAnnotationVersion = '1.2'
|
||||
jcsvVersion = '1.4.0'
|
||||
jetbrainsAnnotationsVersion = '13.0'
|
||||
jfoenixVersion = '9.0.6'
|
||||
jfoenixVersion = '9.0.10'
|
||||
joptVersion = '5.0.4'
|
||||
jsonsimpleVersion = '1.1.1'
|
||||
jsonrpc4jVersion = '1.6.0.bisq.1'
|
||||
@ -58,17 +58,16 @@ configure(subprojects) {
|
||||
jupiterVersion = '5.7.0'
|
||||
kotlinVersion = '1.3.41'
|
||||
knowmXchangeVersion = '4.4.2'
|
||||
langVersion = '3.8'
|
||||
langVersion = '3.11'
|
||||
logbackVersion = '1.1.11'
|
||||
loggingVersion = '1.2'
|
||||
lombokVersion = '1.18.2'
|
||||
mockitoVersion = '3.0.0'
|
||||
lombokVersion = '1.18.12'
|
||||
mockitoVersion = '3.5.15'
|
||||
netlayerVersion = '8db4a13' // Commit ID from https://github.com/bisq-network/netlayer/commits/externaltor
|
||||
protobufVersion = '3.10.0'
|
||||
protocVersion = protobufVersion
|
||||
pushyVersion = '0.13.2'
|
||||
qrgenVersion = '1.3'
|
||||
sarxosVersion = '0.3.12'
|
||||
slf4jVersion = '1.7.30'
|
||||
sparkVersion = '2.5.2'
|
||||
springBootVersion = '1.5.10.RELEASE'
|
||||
@ -382,9 +381,14 @@ configure(project(':desktop')) {
|
||||
apply plugin: 'com.github.johnrengelman.shadow'
|
||||
apply plugin: 'witness'
|
||||
apply from: '../gradle/witness/gradle-witness.gradle'
|
||||
apply from: 'package/package.gradle'
|
||||
|
||||
version = '1.6.2-SNAPSHOT'
|
||||
|
||||
jar.manifest.attributes(
|
||||
"Implementation-Title": project.name,
|
||||
"Implementation-Version": version)
|
||||
|
||||
mainClassName = 'bisq.desktop.app.BisqAppMain'
|
||||
|
||||
tasks.withType(AbstractArchiveTask) {
|
||||
@ -402,7 +406,6 @@ configure(project(':desktop')) {
|
||||
compile "de.jensd:fontawesomefx-materialdesignfont:$fontawesomefxMaterialdesignfontVersion"
|
||||
compile "com.google.guava:guava:$guavaVersion"
|
||||
compile "com.googlecode.jcsv:jcsv:$jcsvVersion"
|
||||
compile "com.github.sarxos:webcam-capture:$sarxosVersion"
|
||||
compile "org.openjfx:javafx-controls:$javafxVersion:$os"
|
||||
compile "org.openjfx:javafx-fxml:$javafxVersion:$os"
|
||||
compile "org.openjfx:javafx-swing:$javafxVersion:$os"
|
||||
|
@ -167,7 +167,6 @@ public class ReceiptValidatorTest {
|
||||
when(predicates.isEqualPaymentMethods(offer, account)).thenReturn(true);
|
||||
when(predicates.isMatchingCountryCodes(offer, account)).thenReturn(true);
|
||||
when(predicates.isMatchingSepaOffer(offer, account)).thenReturn(false);
|
||||
when(predicates.isMatchingSepaOffer(offer, account)).thenReturn(false);
|
||||
when(predicates.isMatchingSepaInstant(offer, account)).thenReturn(false);
|
||||
when(predicates.isOfferRequireSameOrSpecificBank(offer, account)).thenReturn(false);
|
||||
|
||||
|
@ -68,17 +68,32 @@ public class FeeReceiverSelectorTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetAddress_noValidReceivers() {
|
||||
public void testGetAddress_noValidReceivers_nullFilter() {
|
||||
when(daoFacade.getParamValue(Param.RECIPIENT_BTC_ADDRESS)).thenReturn("default");
|
||||
|
||||
when(filterManager.getFilter()).thenReturn(null);
|
||||
assertEquals("default", FeeReceiverSelector.getAddress(daoFacade, filterManager));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetAddress_noValidReceivers_filterWithNullList() {
|
||||
when(daoFacade.getParamValue(Param.RECIPIENT_BTC_ADDRESS)).thenReturn("default");
|
||||
|
||||
when(filterManager.getFilter()).thenReturn(filterWithReceivers(null));
|
||||
assertEquals("default", FeeReceiverSelector.getAddress(daoFacade, filterManager));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetAddress_noValidReceivers_filterWithEmptyList() {
|
||||
when(daoFacade.getParamValue(Param.RECIPIENT_BTC_ADDRESS)).thenReturn("default");
|
||||
|
||||
when(filterManager.getFilter()).thenReturn(filterWithReceivers(List.of()));
|
||||
assertEquals("default", FeeReceiverSelector.getAddress(daoFacade, filterManager));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetAddress_noValidReceivers_filterWithIllFormedList() {
|
||||
when(daoFacade.getParamValue(Param.RECIPIENT_BTC_ADDRESS)).thenReturn("default");
|
||||
|
||||
when(filterManager.getFilter()).thenReturn(filterWithReceivers(List.of("ill-formed")));
|
||||
assertEquals("default", FeeReceiverSelector.getAddress(daoFacade, filterManager));
|
||||
|
@ -1,661 +0,0 @@
|
||||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
our General Public Licenses are 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.
|
||||
|
||||
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.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing under
|
||||
this license.
|
||||
|
||||
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 Affero 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. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your version
|
||||
supports such interaction) an opportunity to receive the Corresponding
|
||||
Source of your version by providing access to the Corresponding Source
|
||||
from a network server at no charge, through some standard or customary
|
||||
means of facilitating copying of software. This Corresponding Source
|
||||
shall include the Corresponding Source for any work covered by version 3
|
||||
of the GNU General Public License that is incorporated pursuant to the
|
||||
following paragraph.
|
||||
|
||||
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 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 work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU Affero 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 Affero 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 Affero 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 Affero 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.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for the
|
||||
specific requirements.
|
||||
|
||||
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 AGPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
@ -1,167 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Requirements:
|
||||
# - OracleJDK 10 installed
|
||||
# Note: OpenJDK 10 does not have the javapackager util, so must use OracleJDK
|
||||
# Prior to running this script:
|
||||
# - Update version below
|
||||
# - Ensure JAVA_HOME below is pointing to OracleJDK 10 directory
|
||||
|
||||
version=1.6.2-SNAPSHOT
|
||||
version_base=$(echo $version | awk -F'[_-]' '{print $1}')
|
||||
if [ ! -f "$JAVA_HOME/bin/javapackager" ]; then
|
||||
if [ -d "/usr/lib/jvm/jdk-10.0.2" ]; then
|
||||
JAVA_HOME=/usr/lib/jvm/jdk-10.0.2
|
||||
else
|
||||
echo Javapackager not found. Update JAVA_HOME variable to point to OracleJDK.
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
base_dir=$( cd "$(dirname "$0")" ; pwd -P )/../../..
|
||||
src_dir=$base_dir/desktop/package
|
||||
|
||||
cd $base_dir
|
||||
|
||||
set -eu
|
||||
|
||||
echo Installing required packages
|
||||
if [[ -f "/etc/debian_version" ]]; then
|
||||
sudo apt install -y fakeroot rpm
|
||||
elif [[ -f "/etc/redhat-release" ]]; then
|
||||
sudo yum install -y fakeroot rpm-build dpkg perl-Digest-SHA
|
||||
fi
|
||||
|
||||
if [ ! -f "$base_dir/desktop/package/desktop-$version-all.jar" ]; then
|
||||
echo Building application
|
||||
./gradlew :desktop:clean :desktop:build -x test shadowJar
|
||||
jar_file=$base_dir/desktop/build/libs/desktop-$version-all.jar
|
||||
if [ ! -f "$jar_file" ]; then
|
||||
echo No jar file available at $jar_file
|
||||
exit 2
|
||||
fi
|
||||
|
||||
tmp=$base_dir/desktop/build/libs/tmp
|
||||
echo Extracting jar file to $tmp
|
||||
if [ -d "$tmp" ]; then
|
||||
rm -rf $tmp
|
||||
fi
|
||||
mkdir -p $tmp
|
||||
unzip -o -q $jar_file -d $tmp
|
||||
|
||||
echo Deleting problematic module config from extracted jar
|
||||
# Strip out Java 9 module configuration used in the fontawesomefx library as it causes javapackager to stop
|
||||
# because of this existing module information, since it is not used as a module.
|
||||
# Sometimes module-info.class does not exist - TODO check why and if still needed
|
||||
if [ -f "$tmp/module-info.class" ]; then
|
||||
rm -f $tmp/module-info.class
|
||||
fi
|
||||
|
||||
jar_file=$base_dir/desktop/package/desktop-$version-all.jar
|
||||
echo Zipping jar again without module config to $jar_file
|
||||
cd $tmp; zip -r -q -X $jar_file *
|
||||
cd $base_dir; rm -rf $tmp
|
||||
|
||||
echo SHA256 before stripping jar file:
|
||||
shasum -a256 $jar_file | awk '{print $1}'
|
||||
|
||||
echo Making deterministic jar by stripping out parameters and comments that contain dates
|
||||
# Jar file created from https://github.com/ManfredKarrer/tools
|
||||
# TODO Is this step still necessary? Since we are using preserveFileTimestamps and reproducibleFileOrder in build.gradle
|
||||
java -jar $base_dir/desktop/package/tools-1.0.jar $jar_file
|
||||
|
||||
echo SHA256 after stripping jar file:
|
||||
shasum -a256 $jar_file | awk '{print $1}' | tee $base_dir/desktop/package/desktop-$version-all.jar.txt
|
||||
else
|
||||
local_src_dir="/home/$USER/Desktop/build"
|
||||
mkdir -p $local_src_dir
|
||||
cp $base_dir/desktop/package/desktop-$version-all.jar $local_src_dir/desktop-$version-all.jar
|
||||
src_dir=$local_src_dir
|
||||
fi
|
||||
|
||||
chmod o+rx "$src_dir/desktop-$version-all.jar"
|
||||
|
||||
# Remove previously generated packages so we can later determine if they are actually generated successfully
|
||||
if [ -f "$base_dir/desktop/package/linux/bisq-$version.deb" ]; then
|
||||
rm "$base_dir/desktop/package/linux/bisq-$version.deb"
|
||||
fi
|
||||
if [ -f "$base_dir/desktop/package/linux/bisq-$version.rpm" ]; then
|
||||
rm "$base_dir/desktop/package/linux/bisq-$version.rpm"
|
||||
fi
|
||||
|
||||
# TODO: add the license as soon as it is working with our build setup
|
||||
#-BlicenseFile=LICENSE \
|
||||
#-srcfiles package/linux/LICENSE \
|
||||
|
||||
echo Generating deb package
|
||||
$JAVA_HOME/bin/javapackager \
|
||||
-deploy \
|
||||
-BappVersion=$version \
|
||||
-Bcategory=Network \
|
||||
-Bemail=contact@bisq.network \
|
||||
-BlicenseType=GPLv3 \
|
||||
-Bicon=$base_dir/desktop/package/linux/icon.png \
|
||||
-native deb \
|
||||
-name Bisq \
|
||||
-title "A decentralized bitcoin exchange network." \
|
||||
-vendor Bisq \
|
||||
-outdir $base_dir/desktop/package/linux \
|
||||
-srcdir $src_dir \
|
||||
-srcfiles desktop-$version-all.jar \
|
||||
-appclass bisq.desktop.app.BisqAppMain \
|
||||
-BjvmOptions=-Xss1280k \
|
||||
-BjvmOptions=-XX:MaxRAM=4g \
|
||||
-BjvmOptions=-Djava.net.preferIPv4Stack=true \
|
||||
-outfile Bisq-$version \
|
||||
-v
|
||||
|
||||
if [ ! -f "$base_dir/desktop/package/linux/bisq-$version.deb" ]; then
|
||||
echo No deb file found at $base_dir/desktop/package/linux/bisq-$version.deb
|
||||
exit 3
|
||||
fi
|
||||
|
||||
echo Generating rpm package
|
||||
$JAVA_HOME/bin/javapackager \
|
||||
-deploy \
|
||||
-BappVersion="$version_base" \
|
||||
-Bcategory=Network \
|
||||
-Bemail=contact@bisq.network \
|
||||
-BlicenseType=GPLv3 \
|
||||
-Bicon=$base_dir/desktop/package/linux/icon.png \
|
||||
-native rpm \
|
||||
-name Bisq \
|
||||
-title "A decentralized bitcoin exchange network." \
|
||||
-vendor Bisq \
|
||||
-outdir $base_dir/desktop/package/linux \
|
||||
-srcdir $src_dir \
|
||||
-srcfiles desktop-$version-all.jar \
|
||||
-appclass bisq.desktop.app.BisqAppMain \
|
||||
-BjvmOptions=-Xss1280k \
|
||||
-BjvmOptions=-XX:MaxRAM=4g \
|
||||
-BjvmOptions=-Djava.net.preferIPv4Stack=true \
|
||||
-outfile Bisq-$version \
|
||||
-v
|
||||
|
||||
if [ ! -f "$base_dir/desktop/package/linux/bisq-$version_base-1.x86_64.rpm" ]; then
|
||||
echo "No rpm file found at $base_dir/desktop/package/linux/bisq-$version_base-1.x86_64.rpm"
|
||||
exit 3
|
||||
fi
|
||||
|
||||
# FIXME: My Ubuntu somehow also deletes the lower case file
|
||||
# if [ -f "$base_dir/desktop/package/linux/Bisq-$version.deb" ]; then
|
||||
# rm "$base_dir/desktop/package/linux/Bisq-$version.deb"
|
||||
# fi
|
||||
mv $base_dir/desktop/package/linux/bisq-$version.deb $base_dir/desktop/package/linux/Bisq-$version.deb
|
||||
|
||||
echo SHA256 of $base_dir/desktop/package/linux/Bisq-$version.deb:
|
||||
shasum -a256 $base_dir/desktop/package/linux/Bisq-$version.deb | awk '{print $1}' | tee $base_dir/desktop/package/linux/Bisq-$version.deb.txt
|
||||
|
||||
# FIXME: My Ubuntu somehow also deletes the lower case file
|
||||
# if [ -f "$base_dir/desktop/package/linux/Bisq-$version_base-1.x86_64.rpm" ]; then
|
||||
# rm "$base_dir/desktop/package/linux/Bisq-$version_base-1.x86_64.rpm"
|
||||
# fi
|
||||
mv "$base_dir/desktop/package/linux/bisq-$version_base-1.x86_64.rpm" "$base_dir/desktop/package/linux/Bisq-$version.rpm"
|
||||
|
||||
echo SHA256 of $base_dir/desktop/package/linux/Bisq-$version.rpm:
|
||||
shasum -a256 $base_dir/desktop/package/linux/Bisq-$version.rpm | awk '{print $1}' | tee $base_dir/desktop/package/linux/Bisq-$version.rpm.txt
|
||||
|
||||
echo Done!
|
@ -1,79 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Requirements:
|
||||
# - GPG signing key has been created
|
||||
# Prior to running this script:
|
||||
# - Update version below
|
||||
|
||||
version=1.6.2-SNAPSHOT
|
||||
base_dir=$( cd "$(dirname "$0")" ; pwd -P )/../../..
|
||||
package_dir=$base_dir/desktop/package
|
||||
release_dir=$base_dir/desktop/release/$version
|
||||
|
||||
dmg=Bisq-$version.dmg
|
||||
deb=Bisq-$version.deb
|
||||
rpm=Bisq-$version.rpm
|
||||
exe=Bisq-$version.exe
|
||||
|
||||
read -p "Enter email address used for gpg signing: " gpg_user
|
||||
|
||||
echo Creating release directory
|
||||
if [ -d "$release_dir" ]; then
|
||||
rm -fr "$release_dir"
|
||||
fi
|
||||
mkdir -p "$release_dir"
|
||||
|
||||
echo Copying files to release folder
|
||||
# sig key mkarrer
|
||||
cp "$package_dir/F379A1C6.asc" "$release_dir"
|
||||
# sig key cbeams
|
||||
cp "$package_dir/5BC5ED73.asc" "$release_dir"
|
||||
# sig key Christoph Atteneder
|
||||
cp "$package_dir/29CDFD3B.asc" "$release_dir"
|
||||
# signing key
|
||||
cp "$package_dir/signingkey.asc" "$release_dir"
|
||||
if [ -f "$package_dir/macosx/$dmg" ]; then
|
||||
cp "$package_dir/macosx/$dmg" "$release_dir"
|
||||
cp "$package_dir/macosx/$dmg.txt" "$release_dir"
|
||||
fi
|
||||
if [ -f "$package_dir/linux/$deb" ]; then
|
||||
cp "$package_dir/linux/$deb" "$release_dir"
|
||||
cp "$package_dir/linux/$deb.txt" "$release_dir"
|
||||
fi
|
||||
if [ -f "$package_dir/linux/$rpm" ]; then
|
||||
cp "$package_dir/linux/$rpm" "$release_dir"
|
||||
cp "$package_dir/linux/$rpm.txt" "$release_dir"
|
||||
fi
|
||||
if [ -f "$package_dir/windows/$exe" ]; then
|
||||
cp "$package_dir/windows/$exe" "$release_dir"
|
||||
cp "$package_dir/windows/$exe.txt" "$release_dir"
|
||||
fi
|
||||
|
||||
echo Creating signatures
|
||||
if [ -f "$release_dir/$dmg" ]; then
|
||||
gpg --digest-algo SHA256 --local-user $gpg_user --output "$release_dir/$dmg.asc" --detach-sig --armor "$release_dir/$dmg"
|
||||
fi
|
||||
if [ -f "$release_dir/$deb" ]; then
|
||||
gpg --digest-algo SHA256 --local-user $gpg_user --output "$release_dir/$deb.asc" --detach-sig --armor "$release_dir/$deb"
|
||||
fi
|
||||
if [ -f "$release_dir/$rpm" ]; then
|
||||
gpg --digest-algo SHA256 --local-user $gpg_user --output "$release_dir/$rpm.asc" --detach-sig --armor "$release_dir/$rpm"
|
||||
fi
|
||||
if [ -f "$release_dir/$exe" ]; then
|
||||
gpg --digest-algo SHA256 --local-user $gpg_user --output "$release_dir/$exe.asc" --detach-sig --armor "$release_dir/$exe"
|
||||
fi
|
||||
|
||||
echo Verifying signatures
|
||||
if [ -f "$release_dir/$dmg" ]; then
|
||||
gpg --digest-algo SHA256 --verify "$release_dir/$dmg.asc"
|
||||
fi
|
||||
if [ -f "$release_dir/$deb" ]; then
|
||||
gpg --digest-algo SHA256 --verify "$release_dir/$deb.asc"
|
||||
fi
|
||||
if [ -f "$release_dir/$rpm" ]; then
|
||||
gpg --digest-algo SHA256 --verify "$release_dir/$rpm.asc"
|
||||
fi
|
||||
if [ -f "$release_dir/$exe" ]; then
|
||||
gpg --digest-algo SHA256 --verify "$release_dir/$exe.asc"
|
||||
fi
|
||||
|
||||
echo Done!
|
Binary file not shown.
BIN
desktop/package/macosx/Bisq-background.tiff
Normal file
BIN
desktop/package/macosx/Bisq-background.tiff
Normal file
Binary file not shown.
@ -4,14 +4,15 @@ tell application "Finder"
|
||||
set current view of container window to icon view
|
||||
set toolbar visible of container window to false
|
||||
set statusbar visible of container window to false
|
||||
set pathbar visible of container window to false
|
||||
|
||||
-- size of window should match size of background
|
||||
-- size of window should match size of background (1034x641)
|
||||
set the bounds of container window to {400, 100, 1434, 741}
|
||||
|
||||
set theViewOptions to the icon view options of container window
|
||||
set arrangement of theViewOptions to not arranged
|
||||
set icon size of theViewOptions to 128
|
||||
set background picture of theViewOptions to file ".background:background.png"
|
||||
set background picture of theViewOptions to file ".background:background.tiff"
|
||||
|
||||
-- Create alias for install location
|
||||
make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"}
|
||||
|
BIN
desktop/package/macosx/Bisq-volume.icns
Normal file
BIN
desktop/package/macosx/Bisq-volume.icns
Normal file
Binary file not shown.
@ -1,98 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
cd $(dirname $0)/../../
|
||||
|
||||
mkdir -p deploy
|
||||
|
||||
set -e
|
||||
|
||||
version="1.6.2-SNAPSHOT"
|
||||
|
||||
cd ..
|
||||
./gradlew :desktop:build -x test shadowJar
|
||||
cd desktop
|
||||
|
||||
EXE_JAR=build/libs/desktop-$version-all.jar
|
||||
JAR_LIB=build/app/lib
|
||||
|
||||
# we need to strip out Java 9 module configuration used in the fontawesomefx library as it causes the javapackager to stop,
|
||||
# because of this existing module information, although it is not used as a module.
|
||||
echo Unzipping jar to delete module config
|
||||
tmp=build/libs/tmp
|
||||
unzip -o -q $EXE_JAR -d $tmp
|
||||
|
||||
# Sometimes $tmp/module-info.class is not available. TODO check why and if still needed
|
||||
rm -f $tmp/module-info.class
|
||||
|
||||
rm $EXE_JAR
|
||||
echo Zipping jar again without module config
|
||||
cd $tmp; zip -r -q -X "../desktop-$version-all.jar" *
|
||||
cd ../../../; rm -rf $tmp
|
||||
|
||||
echo SHA 256 before stripping jar file:
|
||||
shasum -a256 $EXE_JAR | awk '{print $1}'
|
||||
|
||||
# We make a deterministic jar by stripping out comments with date, etc.
|
||||
# jar file created from https://github.com/ManfredKarrer/tools
|
||||
java -jar ./package/tools-1.0.jar $EXE_JAR
|
||||
|
||||
echo SHA 256 after stripping jar file to get a deterministic jar:
|
||||
shasum -a256 $EXE_JAR | awk '{print $1}' | tee deploy/Bisq-$version.jar.txt
|
||||
|
||||
# zip jar lib for Raspberry Pi
|
||||
echo "Zipping jar lib for raspberry pi"
|
||||
zip -r -X -q "deploy/jar-lib-for-raspberry-pi-$version.zip" $JAR_LIB
|
||||
|
||||
# Set BISQ_VM_PATH as environment var to the directory where your shared folders for virtual box are residing
|
||||
|
||||
vmPath=$BISQ_VM_PATH
|
||||
linux64=$vmPath/vm_shared_ubuntu/desktop
|
||||
linux64Package=$linux64/package/linux
|
||||
win64=$vmPath/vm_shared_windows/desktop
|
||||
win64Package=$win64/package/windows
|
||||
|
||||
rm -rf $linux64Package $win64Package
|
||||
|
||||
mkdir -p $linux64 $win64 $linux64Package $win64Package
|
||||
|
||||
cp $EXE_JAR "deploy/Bisq-$version.jar"
|
||||
|
||||
# copy app jar to VM shared folders
|
||||
cp $EXE_JAR "$linux64Package/../desktop-$version-all.jar"
|
||||
cp $EXE_JAR "$win64Package/../desktop-$version-all.jar"
|
||||
|
||||
# Copy packager scripts to VM. No need to checkout the source as we only are interested in the build scripts.
|
||||
|
||||
cp -r package/linux/. $linux64Package
|
||||
cp -r package/windows/. $win64Package
|
||||
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
JAVA_HOME=$(/usr/libexec/java_home)
|
||||
fi
|
||||
|
||||
# Open jdk does not has the java packager.
|
||||
# JAVA_HOME=/Library/Java/JavaVirtualMachines/oracle_jdk-10.0.2.jdk/Contents/Home
|
||||
|
||||
echo "Using JAVA_HOME: $JAVA_HOME"
|
||||
|
||||
$JAVA_HOME/bin/javapackager \
|
||||
-deploy \
|
||||
-BappVersion=$version \
|
||||
-Bmac.CFBundleIdentifier=io.bisq.CAT \
|
||||
-Bmac.CFBundleName=Bisq \
|
||||
-Bicon=package/macosx/Bisq.icns \
|
||||
-Bruntime="$JAVA_HOME/jre" \
|
||||
-native dmg \
|
||||
-name Bisq \
|
||||
-title "A decentralized bitcoin exchange network." \
|
||||
-vendor Bisq \
|
||||
-outdir deploy \
|
||||
-srcdir deploy \
|
||||
-srcfiles "Bisq-$version.jar" \
|
||||
-appclass bisq.desktop.app.BisqAppMain \
|
||||
-outfile Bisq \
|
||||
-v
|
||||
|
||||
open deploy
|
||||
|
||||
cd package/macosx
|
@ -1,43 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
cd $(dirname $0)/../../
|
||||
|
||||
mkdir -p deploy
|
||||
|
||||
set -e
|
||||
|
||||
version="1.1.5-SNAPSHOT"
|
||||
commithash="ec633f0c3771893b47956b8d05b17c6f3f1919c1"
|
||||
|
||||
cd ..
|
||||
./gradlew :desktop:build -x test shadowJar
|
||||
cd desktop
|
||||
|
||||
EXE_JAR=build/libs/desktop-$version-all.jar
|
||||
JAR_WITH_HASH_NAME=desktop-$version-$commithash-all.jar
|
||||
EXE_JAR_WITH_HASH=build/libs/$JAR_WITH_HASH_NAME
|
||||
DEPLOY_JAR=deploy/$JAR_WITH_HASH_NAME
|
||||
|
||||
# we need to strip out Java 9 module configuration used in the fontawesomefx library as it causes the javapackager to stop,
|
||||
# because of this existing module information, although it is not used as a module.
|
||||
echo Unzipping jar to delete module config
|
||||
tmp=build/libs/tmp
|
||||
unzip -o -q $EXE_JAR -d $tmp
|
||||
|
||||
# Sometimes $tmp/module-info.class is not available. TODO check why and if still needed
|
||||
rm -f $tmp/module-info.class
|
||||
|
||||
rm $EXE_JAR
|
||||
echo Zipping jar again without module config
|
||||
cd $tmp; zip -r -q -X "../$JAR_WITH_HASH_NAME" *
|
||||
cd ../../../; rm -rf $tmp
|
||||
|
||||
cp $EXE_JAR_WITH_HASH $DEPLOY_JAR
|
||||
|
||||
echo Create signature
|
||||
gpg --digest-algo SHA256 --local-user $BISQ_GPG_USER --output $DEPLOY_JAR.asc --detach-sig --armor $DEPLOY_JAR
|
||||
|
||||
echo Verify signatures
|
||||
gpg --digest-algo SHA256 --verify $DEPLOY_JAR{.asc*,}
|
||||
|
||||
open deploy
|
@ -1,43 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
cd $(dirname $0)/../../
|
||||
|
||||
set -e
|
||||
|
||||
version="1.1.5-SNAPSHOT"
|
||||
commithash="ec633f0c3771893b47956b8d05b17c6f3f1919c1"
|
||||
|
||||
cd ..
|
||||
./gradlew :seednode:build -x test shadowJar
|
||||
cd seednode
|
||||
|
||||
mkdir -p deploy
|
||||
|
||||
EXE_JAR=build/libs/seednode-all.jar
|
||||
JAR_WITH_HASH_NAME=seednode-$version-$commithash-all.jar
|
||||
EXE_JAR_WITH_HASH=build/libs/$JAR_WITH_HASH_NAME
|
||||
DEPLOY_JAR=deploy/$JAR_WITH_HASH_NAME
|
||||
|
||||
# we need to strip out Java 9 module configuration used in the fontawesomefx library as it causes the javapackager to stop,
|
||||
# because of this existing module information, although it is not used as a module.
|
||||
echo Unzipping jar to delete module config
|
||||
tmp=build/libs/tmp
|
||||
unzip -o -q $EXE_JAR -d $tmp
|
||||
|
||||
# Sometimes $tmp/module-info.class is not available. TODO check why and if still needed
|
||||
rm -f $tmp/module-info.class
|
||||
|
||||
rm $EXE_JAR
|
||||
echo Zipping jar again without module config
|
||||
cd $tmp; zip -r -q -X "../$JAR_WITH_HASH_NAME" *
|
||||
cd ../../../; rm -rf $tmp
|
||||
|
||||
cp $EXE_JAR_WITH_HASH $DEPLOY_JAR
|
||||
|
||||
echo Create signature
|
||||
gpg --digest-algo SHA256 --local-user $BISQ_GPG_USER --output $DEPLOY_JAR.asc --detach-sig --armor $DEPLOY_JAR
|
||||
|
||||
echo Verify signatures
|
||||
gpg --digest-algo SHA256 --verify $DEPLOY_JAR{.asc*,}
|
||||
|
||||
open deploy
|
@ -10,8 +10,9 @@ target_dir="releases/$version"
|
||||
# Set BISQ_VM_PATH as environment var to the directory where your shared folders for virtual box are residing
|
||||
|
||||
vmPath=$BISQ_VM_PATH
|
||||
linux64=$vmPath/vm_shared_ubuntu/desktop/package/linux
|
||||
win64=$vmPath/vm_shared_windows/desktop/package/windows
|
||||
linux64=$vmPath/vm_shared_ubuntu
|
||||
win64=$vmPath/vm_shared_windows
|
||||
macos=$vmPath/vm_shared_macosx
|
||||
|
||||
deployDir=deploy
|
||||
|
||||
@ -27,17 +28,15 @@ cp "$target_dir/../../package/5BC5ED73.asc" "$target_dir/"
|
||||
cp "$target_dir/../../package/29CDFD3B.asc" "$target_dir/"
|
||||
# signing key
|
||||
cp "$target_dir/../../package/signingkey.asc" "$target_dir/"
|
||||
# hash of jar file
|
||||
cp "deploy/Bisq-$version.jar.txt" "$target_dir/"
|
||||
|
||||
dmg="Bisq-$version.dmg"
|
||||
cp "$deployDir/$dmg" "$target_dir/"
|
||||
cp "$macos/$dmg" "$target_dir/"
|
||||
|
||||
deb="Bisq-$version.deb"
|
||||
deb="bisq_$version-1_amd64.deb"
|
||||
deb64="Bisq-64bit-$version.deb"
|
||||
cp "$linux64/$deb" "$target_dir/$deb64"
|
||||
|
||||
rpm="Bisq-$version.rpm"
|
||||
rpm="bisq-$version-1.x86_64.rpm"
|
||||
rpm64="Bisq-64bit-$version.rpm"
|
||||
cp "$linux64/$rpm" "$target_dir/$rpm64"
|
||||
|
||||
|
16
desktop/package/macosx/macos.entitlements
Normal file
16
desktop/package/macosx/macos.entitlements
Normal file
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.cs.allow-jit</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.disable-executable-page-protection</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.disable-library-validation</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
518
desktop/package/package.gradle
Normal file
518
desktop/package/package.gradle
Normal file
@ -0,0 +1,518 @@
|
||||
import java.time.LocalDateTime
|
||||
import org.apache.tools.ant.taskdefs.condition.Os
|
||||
|
||||
import static groovy.io.FileType.*
|
||||
|
||||
task jpackageSanityChecks {
|
||||
description 'Interactive sanity checks on the version of the code that will be packaged'
|
||||
|
||||
doLast {
|
||||
executeCmd("git --no-pager log -5 --oneline")
|
||||
ant.input(message: "Above you see the current HEAD and its recent history.\n" +
|
||||
"Is this the right commit for packaging? (y=continue, n=abort)",
|
||||
addproperty: "sanity-check-1",
|
||||
validargs: "y,n")
|
||||
if (ant.properties['sanity-check-1'] == 'n') {
|
||||
ant.fail('Aborting')
|
||||
}
|
||||
|
||||
executeCmd("git status --short --branch")
|
||||
ant.input(message: "Above you see any local changes that are not in the remote branch.\n" +
|
||||
"If you have any local changes, please abort, get them merged, get the latest branch and try again.\n" +
|
||||
"Continue with packaging? (y=continue, n=abort)",
|
||||
addproperty: "sanity-check-2",
|
||||
validargs: "y,n")
|
||||
if (ant.properties['sanity-check-2'] == 'n') {
|
||||
ant.fail('Aborting')
|
||||
}
|
||||
|
||||
// TODO Evtl check programmatically in gradle (i.e. fail if below v11)
|
||||
executeCmd("java --version")
|
||||
ant.input(message: "Above you see the installed java version, which will be used to compile and build Bisq.\n" +
|
||||
"Is this java version ok for that? (y=continue, n=abort)",
|
||||
addproperty: "sanity-check-3",
|
||||
validargs: "y,n")
|
||||
if (ant.properties['sanity-check-3'] == 'n') {
|
||||
ant.fail('Aborting')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
task getJavaBinariesDownloadURLs {
|
||||
description 'Find out which JDK will be used for jpackage and prepare to download it'
|
||||
dependsOn 'jpackageSanityChecks'
|
||||
|
||||
doLast {
|
||||
// The build directory will be deleted next time the clean task runs
|
||||
// Therefore, we can use it to store any temp files (separate JDK for jpackage, etc) and resulting build artefacts
|
||||
// We create a temp folder in the build directory which holds all jpackage-related artefacts (not just the final installers)
|
||||
String tempRootDirName = 'temp-' + LocalDateTime.now().format('yyyy.MM.dd-HHmmssSSS')
|
||||
File tempRootDir = new File(project.buildDir, tempRootDirName)
|
||||
tempRootDir.mkdirs()
|
||||
ext.tempRootDir = tempRootDir
|
||||
println "Created temp root folder " + tempRootDir
|
||||
|
||||
File binariesFolderPath = new File(tempRootDir, "binaries")
|
||||
binariesFolderPath.mkdirs()
|
||||
ext.binariesFolderPath = binariesFolderPath
|
||||
|
||||
// TODO Extend script logic to alternatively allow a local (separate, v14+) JDK for jpackage
|
||||
// TODO Another option is to use the local JDK for everything: build jars and use jpackage (but then it has to be v14+)
|
||||
|
||||
// Define the download URLs (and associated binary hashes) for the JDK used to package the installers
|
||||
// These JDKs are independent of what is installed on the building system
|
||||
//
|
||||
// If these specific versions are not hosted by AdoptOpenJDK anymore, or if different versions are desired,
|
||||
// simply update the links and associated hashes below
|
||||
//
|
||||
// See https://adoptopenjdk.net/releases.html?variant=openjdk15&jvmVariant=hotspot for latest download URLs
|
||||
// On the download page linked above, filter as follows to get the binary URL + associated SHA256:
|
||||
// - architecture: x64
|
||||
// - operating system:
|
||||
// -- linux ( -> use the tar.gz JDK link)
|
||||
// -- macOS ( -> use the tar.gz JDK link)
|
||||
// -- windows ( -> use the .zip JDK link)
|
||||
Map jdk15Binaries = [
|
||||
'linux' : 'https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jdk_x64_linux_hotspot_15.0.2_7.tar.gz',
|
||||
'linux-sha256' : '94f20ca8ea97773571492e622563883b8869438a015d02df6028180dd9acc24d',
|
||||
'mac' : 'https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jdk_x64_mac_hotspot_15.0.2_7.tar.gz',
|
||||
'mac-sha256' : 'd358a7ff03905282348c6c80562a4da2e04eb377b60ad2152be4c90f8d580b7f',
|
||||
'windows' : 'https://github.com/AdoptOpenJDK/openjdk15-binaries/releases/download/jdk-15.0.2%2B7/OpenJDK15U-jdk_x64_windows_hotspot_15.0.2_7.zip',
|
||||
'windows-sha256': 'b80dde2b7f8374eff0f1726c1cbdb48fb095fdde21489046d92f7144baff5741'
|
||||
|
||||
// TODO For some reason, using "--runtime-image jdk-11" does NOT work with a v15 jpackage, but works with v14
|
||||
]
|
||||
|
||||
String osKey
|
||||
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
|
||||
osKey = 'windows'
|
||||
} else if (Os.isFamily(Os.FAMILY_MAC)) {
|
||||
osKey = 'mac'
|
||||
} else {
|
||||
osKey = 'linux'
|
||||
}
|
||||
|
||||
ext.jdk15Binary_DownloadURL = jdk15Binaries[osKey]
|
||||
ext.jdk15Binary_SHA256Hash = jdk15Binaries[osKey + '-sha256']
|
||||
}
|
||||
}
|
||||
|
||||
task retrieveAndExtractJavaBinaries {
|
||||
description 'Retrieve necessary Java binaries and extract them'
|
||||
dependsOn 'getJavaBinariesDownloadURLs'
|
||||
|
||||
doLast {
|
||||
File tempRootDir = getJavaBinariesDownloadURLs.property("tempRootDir") as File
|
||||
|
||||
// Folder where the jpackage JDK archive will be downloaded and extracted
|
||||
String jdkForJpackageDirName = "jdk-jpackage"
|
||||
File jdkForJpackageDir = new File(tempRootDir, jdkForJpackageDirName)
|
||||
jdkForJpackageDir.mkdirs()
|
||||
|
||||
String jdkForJpackageArchiveURL = getJavaBinariesDownloadURLs.property('jdk15Binary_DownloadURL')
|
||||
String jdkForJpackageArchiveHash = getJavaBinariesDownloadURLs.property('jdk15Binary_SHA256Hash')
|
||||
String jdkForJpackageArchiveFileName = jdkForJpackageArchiveURL.tokenize('/').last()
|
||||
File jdkForJpackageFile = new File(jdkForJpackageDir, jdkForJpackageArchiveFileName)
|
||||
|
||||
// Download necessary JDK binaries + verify hash
|
||||
ext.downloadAndVerifyArchive(jdkForJpackageArchiveURL, jdkForJpackageArchiveHash, jdkForJpackageFile)
|
||||
|
||||
// Extract them
|
||||
String jpackageBinaryFileName
|
||||
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
|
||||
ext.extractArchiveZip(jdkForJpackageFile, jdkForJpackageDir)
|
||||
jpackageBinaryFileName = 'jpackage.exe'
|
||||
} else {
|
||||
ext.extractArchiveTarGz(jdkForJpackageFile, jdkForJpackageDir)
|
||||
jpackageBinaryFileName = 'jpackage'
|
||||
}
|
||||
|
||||
// Find jpackage in the newly extracted JDK
|
||||
// Don't rely on hardcoded paths to reach it, because the path depends on the version and platform
|
||||
jdkForJpackageDir.traverse(type: FILES, nameFilter: jpackageBinaryFileName) {
|
||||
println 'Using jpackage binary from ' + it
|
||||
ext.jpackageFilePath = it.path
|
||||
}
|
||||
}
|
||||
|
||||
ext.downloadAndVerifyArchive = { String archiveURL, String archiveSHA256, File destinationArchiveFile ->
|
||||
println "Downloading ${archiveURL}"
|
||||
ant.get(src: archiveURL, dest: destinationArchiveFile)
|
||||
println 'Download saved to ' + destinationArchiveFile
|
||||
|
||||
println 'Verifying checksum for downloaded binary ...'
|
||||
ant.jdkHash = archiveSHA256
|
||||
ant.checksum(file: destinationArchiveFile, algorithm: 'SHA-256', property: '${jdkHash}', verifyProperty: 'hashMatches')
|
||||
if (ant.properties['hashMatches'] != 'true') {
|
||||
ant.fail('Checksum mismatch: Downloaded JDK binary has a different checksum than expected')
|
||||
}
|
||||
println 'Checksum verified'
|
||||
}
|
||||
|
||||
ext.extractArchiveTarGz = { File tarGzFile, File destinationDir ->
|
||||
println "Extracting tar.gz ${tarGzFile}"
|
||||
// Gradle's tar extraction preserves permissions (crucial for jpackage to function correctly)
|
||||
copy {
|
||||
from tarTree(resources.gzip(tarGzFile))
|
||||
into destinationDir
|
||||
}
|
||||
println "Extracted to ${destinationDir}"
|
||||
}
|
||||
|
||||
ext.extractArchiveZip = { File zipFile, File destinationDir ->
|
||||
println "Extracting zip ${zipFile}..."
|
||||
ant.unzip(src: zipFile, dest: destinationDir)
|
||||
println "Extracted to ${destinationDir}"
|
||||
}
|
||||
}
|
||||
|
||||
task packageInstallers {
|
||||
description 'Call jpackage to prepare platform-specific binaries for this platform'
|
||||
dependsOn 'retrieveAndExtractJavaBinaries'
|
||||
// Clean all previous artefacts and create a fresh shadowJar for the installers
|
||||
dependsOn rootProject.clean
|
||||
dependsOn ':desktop:shadowJar'
|
||||
|
||||
doLast {
|
||||
String jPackageFilePath = retrieveAndExtractJavaBinaries.property('jpackageFilePath')
|
||||
File binariesFolderPath = file(getJavaBinariesDownloadURLs.property('binariesFolderPath'))
|
||||
|
||||
File tempRootDir = getJavaBinariesDownloadURLs.property("tempRootDir") as File
|
||||
// The jpackageTempDir stores temp files used by jpackage for building the installers
|
||||
// It can be inspected in order to troubleshoot the packaging process
|
||||
File jpackageTempDir = new File(tempRootDir, "jpackage-temp")
|
||||
jpackageTempDir.mkdirs()
|
||||
|
||||
// ALL contents of this folder will be included in the resulting installers
|
||||
// However, the fat jar is the only one we need
|
||||
// Therefore, this location should point to a folder that ONLY contains the fat jar
|
||||
// If later we will need to include other non-jar resources, we can do that by adding --resource-dir to the jpackage opts
|
||||
String fatJarFolderPath = "${project(':desktop').buildDir}/libs/fatJar"
|
||||
String mainJarName = shadowJar.getArchiveFileName().get()
|
||||
|
||||
delete(fatJarFolderPath)
|
||||
mkdir(fatJarFolderPath)
|
||||
copy {
|
||||
from "${project(':desktop').buildDir}/libs/${mainJarName}"
|
||||
into fatJarFolderPath
|
||||
}
|
||||
|
||||
// We convert the fat jar into a deterministic one by stripping out comments with date, etc.
|
||||
// jar file created from https://github.com/ManfredKarrer/tools
|
||||
executeCmd("java -jar \"${project(':desktop').projectDir}/package/tools-1.0.jar\" ${fatJarFolderPath}/${mainJarName}")
|
||||
|
||||
// Store deterministic jar SHA-256
|
||||
ant.checksum(file: "${fatJarFolderPath}/${mainJarName}", algorithm: 'SHA-256')
|
||||
copy {
|
||||
from "${fatJarFolderPath}/${mainJarName}.SHA-256"
|
||||
into binariesFolderPath
|
||||
}
|
||||
|
||||
// TODO For non-modular applications: use jlink to create a custom runtime containing only the modules required
|
||||
|
||||
// See jpackager argument documentation:
|
||||
// https://docs.oracle.com/en/java/javase/15/docs/specs/man/jpackage.html
|
||||
|
||||
// Remove the -SNAPSHOT suffix from the version string (originally defined in build.gradle)
|
||||
// Having it in would have resulted in an invalid version property for several platforms (mac, linux/rpm)
|
||||
String appVersion = version.replaceAll("-SNAPSHOT", "")
|
||||
println "Packaging Bisq version ${appVersion}"
|
||||
|
||||
// zip jar lib for Raspberry Pi only on macOS as there are path issues on Windows and it is only needed once
|
||||
// for the release
|
||||
if (Os.isFamily(Os.FAMILY_MAC)) {
|
||||
println "Zipping jar lib for raspberry pi"
|
||||
ant.zip(basedir: "${project(':desktop').buildDir}/app/lib",
|
||||
destfile: "${binariesFolderPath}/jar-lib-for-raspberry-pi-${appVersion}.zip")
|
||||
}
|
||||
|
||||
String appDescription = 'A decentralized bitcoin exchange network.'
|
||||
String appCopyright = '© 2021 Bisq'
|
||||
String appNameAndVendor = 'Bisq'
|
||||
|
||||
String commonOpts = new String(
|
||||
// Generic options
|
||||
" --dest \"${binariesFolderPath}\"" +
|
||||
" --name ${appNameAndVendor}" +
|
||||
" --description \"${appDescription}\"" +
|
||||
" --app-version ${appVersion}" +
|
||||
" --copyright \"${appCopyright}\"" +
|
||||
" --vendor ${appNameAndVendor}" +
|
||||
" --temp \"${jpackageTempDir}\"" +
|
||||
|
||||
// Options for creating the application image
|
||||
" --input ${fatJarFolderPath}" +
|
||||
|
||||
// Options for creating the application launcher
|
||||
" --main-jar ${mainJarName}" +
|
||||
" --main-class bisq.desktop.app.BisqAppMain" +
|
||||
" --java-options -Xss1280k" +
|
||||
" --java-options -XX:MaxRAM=4g" +
|
||||
" --java-options -Djava.net.preferIPv4Stack=true"
|
||||
// Warning: this will cause guice reflection exceptions and lead to issues with the guice internal cache
|
||||
// resulting in the UI not loading
|
||||
// " --java-options -Djdk.module.illegalAccess=deny" +
|
||||
)
|
||||
|
||||
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
|
||||
// TODO Found no benefit in using --resource-dir "..package/windows", it has the same outcome as opts below
|
||||
String windowsOpts = new String(
|
||||
" --icon \"${project(':desktop').projectDir}/package/windows/Bisq.ico\"" +
|
||||
" --resource-dir \"${project(':desktop').projectDir}/package/windows\"" +
|
||||
" --win-dir-chooser" +
|
||||
" --win-per-user-install" +
|
||||
" --win-menu" +
|
||||
" --win-shortcut"
|
||||
)
|
||||
|
||||
executeCmd(jPackageFilePath + commonOpts + windowsOpts + " --type exe")
|
||||
|
||||
// Set the necessary permissions before calling signtool
|
||||
executeCmd("\"attrib -R \"${binariesFolderPath}/Bisq-${appVersion}.exe\"\"")
|
||||
|
||||
// In addition to the groovy quotes around the string, the entire Windows command must also be surrounded
|
||||
// by quotes, plus each path inside the command has to be quoted as well
|
||||
// Reason for this is that the path to the called executable contains spaces
|
||||
// See https://stackoverflow.com/questions/6376113/how-do-i-use-spaces-in-the-command-prompt/6378038#6378038
|
||||
executeCmd("\"\"C:\\Program Files (x86)\\Windows Kits\\10\\App Certification Kit\\signtool.exe\" sign /v /fd SHA256 /a \"${binariesFolderPath}/Bisq-${appVersion}.exe\"\"")
|
||||
} else if (Os.isFamily(Os.FAMILY_MAC)) {
|
||||
// See https://docs.oracle.com/en/java/javase/14/jpackage/override-jpackage-resources.html
|
||||
// for details of "--resource-dir"
|
||||
|
||||
String macOpts = new String(
|
||||
" --resource-dir \"${project(':desktop').projectDir}/package/macosx\""
|
||||
)
|
||||
|
||||
// Env variable can be set by calling "export BISQ_PACKAGE_SIGNING_IDENTITY='Some value'"
|
||||
// See "man codesign" for details about the expected signing identity
|
||||
String envVariableSigningID = "$System.env.BISQ_PACKAGE_SIGNING_IDENTITY"
|
||||
println "Environment variable BISQ_PACKAGE_SIGNING_IDENTITY is: ${envVariableSigningID}"
|
||||
ant.input(message: "Sign the app using the above signing identity? (y=yes, n=no)",
|
||||
addproperty: "macos-sign-check",
|
||||
validargs: "y,n")
|
||||
if (ant.properties['macos-sign-check'] == 'y') {
|
||||
// Create a temp folder to extract the macos-specific dylibs that need to be signed
|
||||
File tempDylibFolderPath = new File(tempRootDir, "dylibs-to-sign")
|
||||
tempDylibFolderPath.mkdirs()
|
||||
|
||||
// Dylibs relevant for signing (paths relative to the tempDylibFolderPath)
|
||||
String dylibsToSign = new String(
|
||||
" libjavafx_iio.dylib" +
|
||||
" libglass.dylib" +
|
||||
" libjavafx_font.dylib" +
|
||||
" libprism_common.dylib" +
|
||||
" libprism_es2.dylib" +
|
||||
" libdecora_sse.dylib" +
|
||||
" libprism_sw.dylib" +
|
||||
" META-INF/native/libio_grpc_netty_shaded_netty_tcnative_osx_x86_64.jnilib"
|
||||
)
|
||||
|
||||
// macOS step 1: Sign dylibs and replace them in the shadow jar
|
||||
// Extract dylibss for signing
|
||||
executeCmd("cd ${tempDylibFolderPath} &&" +
|
||||
" jar xf ${fatJarFolderPath}/${mainJarName}" +
|
||||
dylibsToSign)
|
||||
// Sign them
|
||||
executeCmd("cd ${tempDylibFolderPath} &&" +
|
||||
" codesign -vvv --options runtime --deep --force --sign \"${envVariableSigningID}\"" +
|
||||
dylibsToSign)
|
||||
|
||||
// Verify signature
|
||||
executeCmd("cd ${tempDylibFolderPath} &&" +
|
||||
" codesign -vvv --deep --strict " + dylibsToSign)
|
||||
|
||||
// Replace unsigned files in jar file
|
||||
executeCmd("cd ${tempDylibFolderPath} &&" +
|
||||
" jar uf ${fatJarFolderPath}/${mainJarName}" +
|
||||
dylibsToSign)
|
||||
|
||||
// macOS step 2: Build app-image using the shadow jar above (containing signed dylibs)
|
||||
// NOTE: licensing file cannot be added at this point only when creating the dmg later
|
||||
executeCmd(jPackageFilePath +
|
||||
commonOpts +
|
||||
macOpts +
|
||||
" --type app-image")
|
||||
|
||||
// macOS step 3: Sign app (hardended runtime)
|
||||
File bisqAppImageFullPath = new File(binariesFolderPath, "Bisq.app")
|
||||
executeCmd("codesign" +
|
||||
" --sign \"${envVariableSigningID}\"" +
|
||||
" --options runtime" +
|
||||
" --entitlements '${project(':desktop').projectDir}/package/macosx/macos.entitlements'" +
|
||||
" --force" +
|
||||
" --verbose" +
|
||||
" ${bisqAppImageFullPath}/Contents/runtime/Contents/MacOS/libjli.dylib")
|
||||
executeCmd("codesign" +
|
||||
" --sign \"${envVariableSigningID}\"" +
|
||||
" --options runtime" +
|
||||
" --entitlements '${project(':desktop').projectDir}/package/macosx/macos.entitlements'" +
|
||||
" --force" +
|
||||
" --verbose" +
|
||||
" ${bisqAppImageFullPath}/Contents/MacOS/Bisq")
|
||||
executeCmd("codesign" +
|
||||
" --sign \"${envVariableSigningID}\"" +
|
||||
" --options runtime" +
|
||||
" --entitlements '${project(':desktop').projectDir}/package/macosx/macos.entitlements'" +
|
||||
" --force" +
|
||||
" --verbose" +
|
||||
" ${bisqAppImageFullPath}")
|
||||
|
||||
// macOS step 4: Package the app-image into a dmg bundle
|
||||
executeCmd(jPackageFilePath +
|
||||
" --dest \"${binariesFolderPath}\"" +
|
||||
" --name ${appNameAndVendor}" +
|
||||
" --description \"${appDescription}\"" +
|
||||
" --app-version ${appVersion}" +
|
||||
" --copyright \"${appCopyright}\"" +
|
||||
" --vendor ${appNameAndVendor}" +
|
||||
" --temp \"${jpackageTempDir}\"" +
|
||||
" --app-image ${bisqAppImageFullPath}" +
|
||||
" --mac-sign" +
|
||||
macOpts +
|
||||
" --type dmg")
|
||||
|
||||
// macOS step 5: Delete unused app image
|
||||
delete(bisqAppImageFullPath)
|
||||
|
||||
// macOS step 6: Sign dmg bundle
|
||||
executeCmd("codesign" +
|
||||
" --sign \"${envVariableSigningID}\"" +
|
||||
" --options runtime" +
|
||||
" --entitlements '${project(':desktop').projectDir}/package/macosx/macos.entitlements'" +
|
||||
" -vvvv" +
|
||||
" --deep" +
|
||||
" '${binariesFolderPath}/Bisq-${appVersion}.dmg'")
|
||||
|
||||
// macOS step 7: Upload for notarization
|
||||
// See https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution/customizing_the_notarization_workflow#3087734
|
||||
String envVariableAcUsername = "$System.env.BISQ_PACKAGE_NOTARIZATION_AC_USERNAME"
|
||||
String envVariableAscProvider = "$System.env.BISQ_PACKAGE_NOTARIZATION_ASC_PROVIDER"
|
||||
// e.g. network.bisq.CAT is used when binaries are built by @ripcurlx
|
||||
String envVariablePrimaryBundleId = "$System.env.BISQ_PRIMARY_BUNDLE_ID"
|
||||
def uploadForNotarizationOutput = executeCmd("xcrun altool --notarize-app" +
|
||||
" --primary-bundle-id '${envVariablePrimaryBundleId}'" +
|
||||
" --username '${envVariableAcUsername}'" +
|
||||
" --password '@keychain:AC_PASSWORD'" +
|
||||
" --asc-provider '${envVariableAscProvider}'" +
|
||||
" --file '${binariesFolderPath}/Bisq-${appVersion}.dmg'")
|
||||
// Response:
|
||||
// No errors uploading '[PATH_TO_BISQ_REPO]/bisq/desktop/build/temp-620637000/binaries/Bisq-1.1.1.dmg'.
|
||||
// RequestUUID = ea8bba77-97b7-4c15-a53f-8bbccf627190
|
||||
def requestUUID = uploadForNotarizationOutput.split('RequestUUID = ')[1].trim()
|
||||
println "Extracted RequestUUID: " + requestUUID
|
||||
|
||||
// Every 1 minute, check the status
|
||||
def notarizationEndedInSuccess = false
|
||||
def notarizationEndedInFailure = false
|
||||
while (!(notarizationEndedInSuccess || notarizationEndedInFailure)) {
|
||||
println "Current time is:"
|
||||
executeCmd('date')
|
||||
println "Waiting for 1 minute..."
|
||||
sleep(1 * 60 * 1000)
|
||||
|
||||
println "Checking notarization status"
|
||||
|
||||
def checkNotarizationStatusOutput = executeCmd("xcrun altool --notarization-info" +
|
||||
" '${requestUUID}'" +
|
||||
" --username '${envVariableAcUsername}'" +
|
||||
" --password '@keychain:AC_PASSWORD'")
|
||||
|
||||
notarizationEndedInSuccess = checkNotarizationStatusOutput.contains('success')
|
||||
notarizationEndedInFailure = checkNotarizationStatusOutput.contains('invalid')
|
||||
}
|
||||
|
||||
if (notarizationEndedInFailure) {
|
||||
ant.fail('Notarization failed, aborting')
|
||||
}
|
||||
|
||||
if (notarizationEndedInSuccess) {
|
||||
println "Notarization was successful"
|
||||
|
||||
// macOS step 8: Staple ticket on dmg
|
||||
executeCmd("xcrun stapler staple" +
|
||||
" '${binariesFolderPath}/Bisq-${appVersion}.dmg'")
|
||||
}
|
||||
|
||||
} else {
|
||||
// If user didn't confirm the optional signing step, then generate a plain non-signed dmg
|
||||
executeCmd(jPackageFilePath + commonOpts + macOpts + " --type dmg")
|
||||
}
|
||||
} else {
|
||||
String linuxOpts = new String(
|
||||
" --icon ${project(':desktop').projectDir}/package/linux/icon.png" +
|
||||
|
||||
// This defines the first part of the resulting packages (the application name)
|
||||
// deb requires lowercase letters, therefore the application name is written in lowercase
|
||||
" --linux-package-name bisq" +
|
||||
|
||||
// This represents the linux package version (revision)
|
||||
// By convention, this is part of the deb/rpm package names, in addition to the software version
|
||||
" --linux-app-release 1" +
|
||||
|
||||
" --linux-menu-group Network" +
|
||||
" --linux-shortcut"
|
||||
)
|
||||
|
||||
// Package deb
|
||||
executeCmd(jPackageFilePath + commonOpts + linuxOpts +
|
||||
" --linux-deb-maintainer noreply@bisq.network" +
|
||||
" --type deb")
|
||||
|
||||
// Clean jpackage temp folder, needs to be empty for the next packaging step (rpm)
|
||||
jpackageTempDir.deleteDir()
|
||||
jpackageTempDir.mkdirs()
|
||||
|
||||
// Package rpm
|
||||
executeCmd(jPackageFilePath + commonOpts + linuxOpts +
|
||||
" --linux-rpm-license-type AGPLv3" + // https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#Good_Licenses
|
||||
" --type rpm")
|
||||
}
|
||||
|
||||
// Env variable can be set by calling "export BISQ_SHARED_FOLDER='Some value'"
|
||||
// This is to copy the final binary/ies to a shared folder for further processing if a VM is used.
|
||||
String envVariableSharedFolder = "$System.env.BISQ_SHARED_FOLDER"
|
||||
println "Environment variable BISQ_SHARED_FOLDER is: ${envVariableSharedFolder}"
|
||||
ant.input(message: "Copy the created binary to a shared folder? (y=yes, n=no)",
|
||||
addproperty: "copy-to-shared-folder",
|
||||
validargs: "y,n")
|
||||
if (ant.properties['copy-to-shared-folder'] == 'y') {
|
||||
copy {
|
||||
from binariesFolderPath
|
||||
into envVariableSharedFolder
|
||||
}
|
||||
executeCmd("open " + envVariableSharedFolder)
|
||||
}
|
||||
|
||||
println "The binaries are ready:"
|
||||
binariesFolderPath.traverse {
|
||||
println it.path
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def executeCmd(String cmd) {
|
||||
String shell
|
||||
String shellArg
|
||||
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
|
||||
shell = 'cmd'
|
||||
shellArg = '/c'
|
||||
} else {
|
||||
shell = 'bash'
|
||||
shellArg = '-c'
|
||||
}
|
||||
|
||||
println "Executing command:\n${cmd}\n"
|
||||
// See "Executing External Processes" section of
|
||||
// http://docs.groovy-lang.org/next/html/documentation/
|
||||
def commands = [shell, shellArg, cmd]
|
||||
def process = commands.execute(null, project.rootDir)
|
||||
def result
|
||||
if (process.waitFor() == 0) {
|
||||
result = process.text
|
||||
println "Command output (stdout):\n${result}"
|
||||
} else {
|
||||
result = process.err.text
|
||||
println "Command output (stderr):\n${result}"
|
||||
}
|
||||
return result
|
||||
}
|
Binary file not shown.
Before Width: | Height: | Size: 9.1 KiB |
@ -1,257 +0,0 @@
|
||||
;This file will be executed next to the application bundle image
|
||||
;I.e. current directory will contain folder Bisq with application files
|
||||
;Note: This file must use UTF-8 encoding with BOM for the unicode custom messages to be displayed properly
|
||||
|
||||
#define SourceDir GetEnv('package_dir') + '\windows'
|
||||
#define AppVersion GetEnv('version')
|
||||
#define FileVersion GetEnv('file_version')
|
||||
#define AppCopyrightYear GetDateTimeString('yyyy', '-', ':')
|
||||
|
||||
[Setup]
|
||||
AppId={{bisq}}
|
||||
AppName=Bisq
|
||||
AppVersion={#AppVersion}
|
||||
AppVerName=Bisq v{#AppVersion}
|
||||
AppPublisher=Bisq
|
||||
AppComments={cm:AppComments}
|
||||
AppCopyright=Copyright (C) {#AppCopyrightYear}
|
||||
AppPublisherURL=https://bisq.network
|
||||
AppSupportURL=https://bisq.community
|
||||
;AppUpdatesURL=https://bisq.network/downloads
|
||||
VersionInfoVersion={#FileVersion}
|
||||
VersionInfoDescription=Bisq Setup
|
||||
VersionInfoCopyright=Copyright (C) {#AppCopyrightYear}
|
||||
DefaultDirName={code:GetDefaultDirName}
|
||||
DefaultGroupName=Bisq
|
||||
DisableStartupPrompt=Yes
|
||||
DisableWelcomePage=No
|
||||
DisableDirPage=No
|
||||
DisableProgramGroupPage=Yes
|
||||
DisableReadyPage=No
|
||||
DisableFinishedPage=No
|
||||
;Optional License
|
||||
LicenseFile=
|
||||
;Windows 7 with Service Pack 1 or above
|
||||
MinVersion=0,6.1.7601
|
||||
OutputBaseFilename=Bisq-{#AppVersion}
|
||||
Compression=lzma
|
||||
SolidCompression=yes
|
||||
PrivilegesRequired=lowest
|
||||
SetupIconFile=Bisq\Bisq.ico
|
||||
UninstallDisplayIcon={app}\Bisq.ico
|
||||
UninstallDisplayName=Bisq
|
||||
WizardImageFile={#SourceDir}\Bisq-setup-image.bmp
|
||||
WizardImageStretch=No
|
||||
WizardSmallImageFile=Bisq-setup-icon.bmp
|
||||
ArchitecturesInstallIn64BitMode=x64
|
||||
ShowLanguageDialog=No
|
||||
|
||||
[Languages]
|
||||
Name: en; MessagesFile: "compiler:Default.isl"
|
||||
Name: de; MessagesFile: "compiler:Languages\German.isl"
|
||||
Name: fr; MessagesFile: "compiler:Languages\French.isl"
|
||||
Name: sp; MessagesFile: "compiler:Languages\Spanish.isl"
|
||||
|
||||
[CustomMessages]
|
||||
en.AppComments=A decentralized bitcoin exchange network
|
||||
en.AppIsRunning=Bisq is running, please close it and run setup again.
|
||||
en.SpecialAppPath=Your default install path appears to have special characters: %1%n%nThis may prevent Bisq from starting. See https://github.com/bisq-network/bisq/issues/3605 for more information.%n%nYou can either cancel this installation and install as a user without special characters in the username, or proceed with this installation using a different install path that does not contain special characters (e.g. %2).
|
||||
de.AppComments=Ein dezentrales bitcoin-Austauschnetz
|
||||
de.AppIsRunning=Bisq läuft, bitte schließen Sie es und führen Sie das Setup erneut aus.
|
||||
de.SpecialAppPath=Ihr Standardinstallationspfad scheint Sonderzeichen zu enthalten: %1%n%nDies kann den Start von Bisq verhindern. Weitere Informationen finden Sie unter https://github.com/bisq-network/bisq/issues/3605.%n%nSie können diese Installation abbrechen und als Benutzer ohne Sonderzeichen im Benutzernamen installieren oder mit dieser Installation fortfahren, indem Sie einen anderen Installationspfad verwenden, der keine Sonderzeichen enthält (z. B. %2).
|
||||
fr.AppComments=Un réseau d’échange bitcoin décentralisé
|
||||
fr.AppIsRunning=Bisq est en cours d'exécution, fermez-le et exécutez à nouveau le programme d'installation.
|
||||
fr.SpecialAppPath=Votre chemin d'installation par défaut semble comporter des caractères spéciaux: %1%n%nCela peut empêcher le démarrage de Bisq. Voir https://github.com/bisq-network/bisq/issues/3605 pour plus d'informations.%n%nVous pouvez annuler cette installation et l'installer en tant qu'utilisateur sans caractères spéciaux dans le nom d'utilisateur ou procéder à cette installation en utilisant un chemin d'installation différent ne contenant pas de caractères spéciaux (par exemple, %2).
|
||||
sp.AppComments=Una red descentralizada de intercambio de bitcoin
|
||||
sp.AppIsRunning=Bisq se está ejecutando, ciérrelo y vuelva a ejecutar la configuración.
|
||||
sp.SpecialAppPath=Su ruta de instalación predeterminada parece tener caracteres especiales: %1%n%nEsto puede evitar que Bisq se inicie. Consulte https://github.com/bisq-network/bisq/issues/3605 para obtener más información.%n%nPuede cancelar esta instalación e instalar como usuario sin caracteres especiales en el nombre de usuario, o continuar con esta instalación utilizando una ruta de instalación diferente que no contenga caracteres especiales (por ejemplo, %2).
|
||||
|
||||
[Files]
|
||||
Source: "Bisq\Bisq.exe"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "Bisq\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
|
||||
|
||||
[Icons]
|
||||
Name: "{group}\Bisq"; Filename: "{app}\Bisq.exe"; IconFilename: "{app}\Bisq.ico"
|
||||
Name: "{userdesktop}\Bisq"; Filename: "{app}\Bisq.exe"; IconFilename: "{app}\Bisq.ico"
|
||||
|
||||
[Run]
|
||||
Filename: "{app}\Bisq.exe"; Description: "{cm:LaunchProgram,Bisq}"; Flags: nowait postinstall skipifsilent
|
||||
|
||||
[Code]
|
||||
procedure DirectoryCopy(SourcePath, DestPath: string);
|
||||
var
|
||||
FindRec: TFindRec;
|
||||
SourceFilePath: string;
|
||||
DestFilePath: string;
|
||||
begin
|
||||
if FindFirst(SourcePath + '\*', FindRec) then
|
||||
begin
|
||||
try
|
||||
repeat
|
||||
if (FindRec.Name <> '.') and (FindRec.Name <> '..') then
|
||||
begin
|
||||
SourceFilePath := SourcePath + '\' + FindRec.Name;
|
||||
DestFilePath := DestPath + '\' + FindRec.Name;
|
||||
if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
|
||||
begin
|
||||
if FileCopy(SourceFilePath, DestFilePath, False) then
|
||||
begin
|
||||
Log(Format('Copied %s to %s', [SourceFilePath, DestFilePath]));
|
||||
end
|
||||
else
|
||||
begin
|
||||
Log(Format('Failed to copy %s to %s', [SourceFilePath, DestFilePath]));
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
if DirExists(DestFilePath) or CreateDir(DestFilePath) then
|
||||
begin
|
||||
Log(Format('Created %s', [DestFilePath]));
|
||||
DirectoryCopy(SourceFilePath, DestFilePath);
|
||||
end
|
||||
else
|
||||
begin
|
||||
Log(Format('Failed to create %s', [DestFilePath]));
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
until not FindNext(FindRec);
|
||||
finally
|
||||
FindClose(FindRec);
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
Log(Format('Failed to list %s', [SourcePath]));
|
||||
end;
|
||||
end;
|
||||
|
||||
//Delete old app directory to prevent issues during update
|
||||
procedure DeleteOldAppDataDirectory;
|
||||
var
|
||||
entry: String;
|
||||
begin
|
||||
entry := ExpandConstant('{localappdata}') + '\Bisq\';
|
||||
if DirExists(entry) then begin
|
||||
DelTree(entry, true, true, true);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure DeleteTorFiles;
|
||||
var
|
||||
mainnetDir: String;
|
||||
torDir: String;
|
||||
hiddenServiceDir: String;
|
||||
hiddenServiceBackupDir : String;
|
||||
begin
|
||||
mainnetDir := ExpandConstant('{userappdata}') + '\Bisq\btc_mainnet';
|
||||
torDir := mainnetDir + '\tor\*';
|
||||
hiddenServiceDir := mainnetDir + '\tor\hiddenservice';
|
||||
hiddenServiceBackupDir := mainnetDir + '\hiddenservice_backup';
|
||||
if DirExists(hiddenServiceDir) then begin
|
||||
if DirExists(hiddenServiceBackupDir) then begin
|
||||
DelTree(hiddenServiceBackupDir, true, true, true);
|
||||
end;
|
||||
CreateDir(hiddenServiceBackupDir);
|
||||
DirectoryCopy(hiddenServiceDir, hiddenServiceBackupDir);
|
||||
DelTree(torDir, false, true, true);
|
||||
CreateDir(hiddenServiceDir);
|
||||
DirectoryCopy(hiddenServiceBackupDir, hiddenServiceDir);
|
||||
end;
|
||||
end;
|
||||
|
||||
function PrepareToInstall(var NeedsRestart: Boolean): String;
|
||||
begin
|
||||
DeleteOldAppDataDirectory;
|
||||
DeleteTorFiles;
|
||||
Result := '';
|
||||
end;
|
||||
|
||||
function IsAppRunning(): Boolean;
|
||||
var
|
||||
FSWbemLocator : Variant;
|
||||
FWMIService : Variant;
|
||||
FWbemObjectSet : Variant;
|
||||
ExecutablePath : String;
|
||||
begin
|
||||
Result := False;
|
||||
ExecutablePath := Format('%s\Bisq\Bisq.exe', [ExpandConstant('{localappdata}')])
|
||||
StringChangeEx(ExecutablePath, '\', '\\', True);
|
||||
try
|
||||
FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');
|
||||
FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
|
||||
FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where ExecutablePath="%s"', [ExecutablePath]));
|
||||
Result := (FWbemObjectSet.Count > 0);
|
||||
FWbemObjectSet := Unassigned;
|
||||
FWMIService := Unassigned;
|
||||
FSWbemLocator := Unassigned;
|
||||
except
|
||||
end;
|
||||
end;
|
||||
|
||||
function isPathSpecial(Path : String): Boolean;
|
||||
var
|
||||
I : Integer;
|
||||
begin
|
||||
Result := not
|
||||
((Length(Path) >= 3) and
|
||||
(Path[1] >= 'A') and (Path[1] <= 'Z') and
|
||||
(Path[2] = ':') and
|
||||
(Path[3] = '\'));
|
||||
if not Result then
|
||||
begin
|
||||
for I := 4 to Length(Path) do
|
||||
begin
|
||||
case Path[I] of
|
||||
'0'..'9', 'A'..'Z', 'a'..'z', '\', ' ', '.', '-', '_', '(', ')':
|
||||
else
|
||||
begin
|
||||
Result := True;
|
||||
Break;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function InitializeSetup(): Boolean;
|
||||
begin
|
||||
Result := True;
|
||||
if IsAppRunning() then begin
|
||||
MsgBox(ExpandConstant('{cm:AppIsRunning}'), mbCriticalError, MB_OK);
|
||||
Result := False;
|
||||
end;
|
||||
end;
|
||||
|
||||
function InitializeUninstall(): Boolean;
|
||||
begin
|
||||
Result := True;
|
||||
if IsAppRunning() then
|
||||
begin
|
||||
MsgBox(ExpandConstant('{cm:AppIsRunning}'), mbCriticalError, MB_OK);
|
||||
Result := False;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure CurPageChanged(CurPageID: Integer);
|
||||
var
|
||||
DefaultAppPath : String;
|
||||
AppPath : String;
|
||||
begin
|
||||
DefaultAppPath := ExpandConstant('{localappdata}');
|
||||
if (CurPageID = wpSelectDir) and isPathSpecial(DefaultAppPath) then
|
||||
begin
|
||||
AppPath := ExpandConstant('{code:GetDefaultDirName}');
|
||||
MsgBox(FmtMessage(CustomMessage('SpecialAppPath'), [DefaultAppPath, AppPath]), mbInformation, MB_OK);
|
||||
end;
|
||||
end;
|
||||
|
||||
function GetDefaultDirName(Param: String): String;
|
||||
begin
|
||||
Result := Format('%s\Bisq', [ExpandConstant('{localappdata}')]);
|
||||
if isPathSpecial(Result) then
|
||||
begin
|
||||
Result := Format('%s\Bisq', [ExpandConstant('{%ProgramW6432}')]);
|
||||
end;
|
||||
end;
|
Binary file not shown.
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 112 KiB |
BIN
desktop/package/windows/images/WixUIDialogBmp.bmp
Normal file
BIN
desktop/package/windows/images/WixUIDialogBmp.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 601 KiB |
165
desktop/package/windows/main.wxs
Normal file
165
desktop/package/windows/main.wxs
Normal file
@ -0,0 +1,165 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
|
||||
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
|
||||
|
||||
<?ifdef JpIsSystemWide ?>
|
||||
<?define JpInstallScope="perMachine"?>
|
||||
<?else?>
|
||||
<?define JpInstallScope="perUser"?>
|
||||
<?endif?>
|
||||
|
||||
<?define JpProductLanguage=1033 ?>
|
||||
<?define JpInstallerVersion=200 ?>
|
||||
<?define JpCompressedMsi=yes ?>
|
||||
|
||||
<?ifdef JpAllowUpgrades ?>
|
||||
<?define JpUpgradeVersionOnlyDetectUpgrade="no"?>
|
||||
<?else?>
|
||||
<?define JpUpgradeVersionOnlyDetectUpgrade="yes"?>
|
||||
<?endif?>
|
||||
<?ifdef JpAllowDowngrades ?>
|
||||
<?define JpUpgradeVersionOnlyDetectDowngrade="no"?>
|
||||
<?else?>
|
||||
<?define JpUpgradeVersionOnlyDetectDowngrade="yes"?>
|
||||
<?endif?>
|
||||
|
||||
<?include $(var.JpConfigDir)/overrides.wxi ?>
|
||||
|
||||
<?define ImageDir="$(var.JpConfigDir)/../../../../package/windows/images"?>
|
||||
|
||||
<Product
|
||||
Id="$(var.JpProductCode)"
|
||||
Name="$(var.JpAppName)"
|
||||
Language="$(var.JpProductLanguage)"
|
||||
Version="$(var.JpAppVersion)"
|
||||
Manufacturer="$(var.JpAppVendor)"
|
||||
UpgradeCode="$(var.JpProductUpgradeCode)">
|
||||
|
||||
<Package
|
||||
Description="$(var.JpAppDescription)"
|
||||
Manufacturer="$(var.JpAppVendor)"
|
||||
InstallerVersion="$(var.JpInstallerVersion)"
|
||||
Compressed="$(var.JpCompressedMsi)"
|
||||
InstallScope="$(var.JpInstallScope)" Platform="x64"
|
||||
/>
|
||||
|
||||
<Media Id="1" Cabinet="Data.cab" EmbedCab="yes" />
|
||||
|
||||
<Upgrade Id="$(var.JpProductUpgradeCode)">
|
||||
<UpgradeVersion
|
||||
OnlyDetect="$(var.JpUpgradeVersionOnlyDetectUpgrade)"
|
||||
Property="JP_UPGRADABLE_FOUND"
|
||||
Maximum="$(var.JpAppVersion)"
|
||||
MigrateFeatures="yes"
|
||||
IncludeMaximum="$(var.JpUpgradeVersionOnlyDetectUpgrade)" />
|
||||
<UpgradeVersion
|
||||
OnlyDetect="$(var.JpUpgradeVersionOnlyDetectDowngrade)"
|
||||
Property="JP_DOWNGRADABLE_FOUND"
|
||||
Minimum="$(var.JpAppVersion)"
|
||||
MigrateFeatures="yes"
|
||||
IncludeMinimum="$(var.JpUpgradeVersionOnlyDetectDowngrade)" />
|
||||
</Upgrade>
|
||||
|
||||
<?ifndef JpAllowUpgrades ?>
|
||||
<CustomAction Id="JpDisallowUpgrade" Error="!(loc.DisallowUpgradeErrorMessage)" />
|
||||
<?endif?>
|
||||
<?ifndef JpAllowDowngrades ?>
|
||||
<CustomAction Id="JpDisallowDowngrade" Error="!(loc.DowngradeErrorMessage)" />
|
||||
<?endif?>
|
||||
|
||||
<!-- Standard required root -->
|
||||
<Directory Id="TARGETDIR" Name="SourceDir"/>
|
||||
|
||||
<Feature Id="DefaultFeature" Title="!(loc.MainFeatureTitle)" Level="1">
|
||||
<ComponentGroupRef Id="Shortcuts"/>
|
||||
<ComponentGroupRef Id="Files"/>
|
||||
<ComponentGroupRef Id="FileAssociations"/>
|
||||
</Feature>
|
||||
|
||||
<?ifdef JpInstallDirChooser ?>
|
||||
<Binary Id="JpCaDll" SourceFile="wixhelper.dll"/>
|
||||
<CustomAction Id="JpCheckInstallDir" BinaryKey="JpCaDll" DllEntry="CheckInstallDir" />
|
||||
<?endif?>
|
||||
|
||||
<CustomAction Id="JpSetARPINSTALLLOCATION" Property="ARPINSTALLLOCATION" Value="[INSTALLDIR]" />
|
||||
|
||||
<?ifdef JpIcon ?>
|
||||
<Property Id="ARPPRODUCTICON" Value="JpARPPRODUCTICON"/>
|
||||
<Icon Id="JpARPPRODUCTICON" SourceFile="$(var.JpIcon)"/>
|
||||
<?endif?>
|
||||
|
||||
<WixVariable Id="WixUIBannerBmp" Value="$(var.ImageDir)/WixUIBannerBmp.bmp" />
|
||||
<WixVariable Id="WixUIDialogBmp" Value="$(var.ImageDir)/WixUIDialogBmp.bmp" />
|
||||
|
||||
<UI>
|
||||
<?ifdef JpInstallDirChooser ?>
|
||||
<Dialog Id="JpInvalidInstallDir" Width="300" Height="85" Title="[ProductName] Setup" NoMinimize="yes">
|
||||
<Control Id="JpInvalidInstallDirYes" Type="PushButton" X="100" Y="55" Width="50" Height="15" Default="no" Cancel="no" Text="Yes">
|
||||
<Publish Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
|
||||
</Control>
|
||||
<Control Id="JpInvalidInstallDirNo" Type="PushButton" X="150" Y="55" Width="50" Height="15" Default="yes" Cancel="yes" Text="No">
|
||||
<Publish Event="NewDialog" Value="InstallDirDlg">1</Publish>
|
||||
</Control>
|
||||
<Control Id="Text" Type="Text" X="25" Y="15" Width="250" Height="30" TabSkip="no">
|
||||
<Text>!(loc.message.install.dir.exist)</Text>
|
||||
</Control>
|
||||
</Dialog>
|
||||
|
||||
<!--
|
||||
Run WixUI_InstallDir dialog in the default install directory.
|
||||
-->
|
||||
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR"/>
|
||||
<UIRef Id="WixUI_InstallDir" />
|
||||
|
||||
<Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="JpCheckInstallDir" Order="3">1</Publish>
|
||||
<Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="JpInvalidInstallDir" Order="5">INSTALLDIR_VALID="0"</Publish>
|
||||
<Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="5">INSTALLDIR_VALID="1"</Publish>
|
||||
|
||||
<?ifndef JpLicenseRtf ?>
|
||||
<!--
|
||||
No license file provided.
|
||||
Override the dialog sequence in built-in dialog set "WixUI_InstallDir"
|
||||
to exclude license dialog.
|
||||
-->
|
||||
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2">1</Publish>
|
||||
<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">1</Publish>
|
||||
<?endif?>
|
||||
|
||||
<?else?>
|
||||
|
||||
<?ifdef JpLicenseRtf ?>
|
||||
<UIRef Id="WixUI_Minimal" />
|
||||
<?endif?>
|
||||
|
||||
<?endif?>
|
||||
<!-- Add launch app configuration -->
|
||||
<Publish Dialog="ExitDialog"
|
||||
Control="Finish"
|
||||
Event="DoAction"
|
||||
Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
|
||||
</UI>
|
||||
|
||||
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Launch $(var.JpAppName)" />
|
||||
<Property Id="WixShellExecTarget" Value="[INSTALLDIR]/$(var.JpAppName).exe" />
|
||||
<CustomAction Id="LaunchApplication"
|
||||
BinaryKey="WixCA"
|
||||
DllEntry="WixShellExec"
|
||||
Impersonate="yes" />
|
||||
|
||||
<?ifdef JpLicenseRtf ?>
|
||||
<WixVariable Id="WixUILicenseRtf" Value="$(var.JpLicenseRtf)"/>
|
||||
<?endif?>
|
||||
|
||||
<InstallExecuteSequence>
|
||||
<Custom Action="JpSetARPINSTALLLOCATION" After="CostFinalize">Not Installed</Custom>
|
||||
<?ifndef JpAllowUpgrades ?>
|
||||
<Custom Action="JpDisallowUpgrade" After="FindRelatedProducts">JP_UPGRADABLE_FOUND</Custom>
|
||||
<?endif?>
|
||||
<?ifndef JpAllowDowngrades ?>
|
||||
<Custom Action="JpDisallowDowngrade" After="FindRelatedProducts">JP_DOWNGRADABLE_FOUND</Custom>
|
||||
<?endif?>
|
||||
<RemoveExistingProducts Before="CostInitialize"/>
|
||||
</InstallExecuteSequence>
|
||||
|
||||
</Product>
|
||||
</Wix>
|
33
desktop/package/windows/overrides.wxi
Normal file
33
desktop/package/windows/overrides.wxi
Normal file
@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Stub by design -->
|
||||
|
||||
<!--
|
||||
overrides.wxi is a placeholder to set/alter WiX variables referenced from default
|
||||
main.wxs file.
|
||||
|
||||
Put custom overrides.wxi in resource directory to replace this default file.
|
||||
|
||||
Override default overrides.wxi if configuring of msi installers through jpackage
|
||||
command line is not sufficient.
|
||||
|
||||
WiX variables referenced from default main.wxs that can be altered in custom overrides.wxi:
|
||||
|
||||
- JpProductLanguage
|
||||
Value of `Language` attribute of `Product` WiX element. Default value is 1033.
|
||||
|
||||
- JpInstallerVersion
|
||||
Value of `InstallerVersion` attribute of `Package` WiX element. Default value is 200.
|
||||
|
||||
- JpCompressedMsi
|
||||
Value of `Compressed` attribute of `Package` WiX element. Default value is `yes`.
|
||||
|
||||
- JpAllowDowngrades
|
||||
Should be defined to enable downgrades and undefined to disable downgrades.
|
||||
Default value is `yes`.
|
||||
|
||||
- JpAllowUpgrades
|
||||
Should be defined to enable upgrades and undefined to disable upgrades.
|
||||
Default value is `yes`.
|
||||
-->
|
||||
<Include>
|
||||
</Include>
|
@ -1,130 +0,0 @@
|
||||
:: Requirements:
|
||||
:: - Inno Setup unicode installed (http://www.jrsoftware.org/isdl.php)
|
||||
:: - OracleJDK 10 installed
|
||||
:: Note: OpenJDK 10 does not have the javapackager util, so must use OracleJDK
|
||||
:: - Sign Tool installed (https://docs.microsoft.com/en-us/windows/win32/seccrypto/signtool)
|
||||
:: Note: Sign Tool is part of Windows 10 SDK (https://go.microsoft.com/fwlink/?LinkID=698771)
|
||||
:: - Code signing certificate installed
|
||||
:: Prior to running this script:
|
||||
:: - Update version below
|
||||
:: - Ensure JAVA_HOME below is pointing to OracleJDK 10 directory
|
||||
|
||||
@echo off
|
||||
|
||||
set version=1.6.2-SNAPSHOT
|
||||
if not exist "%JAVA_HOME%\bin\javapackager.exe" (
|
||||
if not exist "%ProgramFiles%\Java\jdk-10.0.2" (
|
||||
echo Javapackager not found. Update JAVA_HOME variable to point to OracleJDK.
|
||||
exit /B 1
|
||||
)
|
||||
set JAVA_HOME=%ProgramFiles%\Java\jdk-10.0.2
|
||||
)
|
||||
set package_dir=%~dp0..
|
||||
for /F "tokens=1,2,3 delims=.-" %%a in ("%version%") do (
|
||||
set file_version=%%a.%%b.%%c
|
||||
)
|
||||
|
||||
cd %~dp0..\..\..
|
||||
|
||||
if exist "%package_dir%\desktop-%version%-all.jar" (
|
||||
set jar_dir=%package_dir%
|
||||
set jar_file=%package_dir%\desktop-%version%-all.jar
|
||||
set jar_filename=desktop-%version%-all.jar
|
||||
goto PackageJar
|
||||
)
|
||||
|
||||
echo Building application
|
||||
call gradlew.bat :desktop:clean :desktop:build -x test shadowJar
|
||||
if exist "%~dp0..\..\..\desktop\build\libs\desktop-%version%-all.jar" (
|
||||
set jar_dir=%~dp0..\..\..\desktop\build\libs
|
||||
set jar_file=%~dp0..\..\..\desktop\build\libs\desktop-%version%-all.jar
|
||||
set jar_filename=desktop-%version%-all.jar
|
||||
) else (
|
||||
echo No jar file available in %~dp0..\..\..\desktop\build\libs
|
||||
exit /B 2
|
||||
)
|
||||
|
||||
if not exist "%TEMP%\7za920\7za.exe" (
|
||||
echo Downloading 7zip ^(command line version^) to %TEMP% in order to extract the jar
|
||||
powershell -Command "Invoke-WebRequest https://www.7-zip.org/a/7za920.zip -OutFile $env:temp\7za920.zip"
|
||||
powershell -Command "Expand-Archive $env:temp\7za920.zip -DestinationPath $env:temp\7za920 -Force"
|
||||
)
|
||||
|
||||
set tmp_dir=%~dp0..\..\..\desktop\build\libs\tmp
|
||||
echo Extracting jar file to %tmp_dir%
|
||||
if exist "%tmp_dir%" (
|
||||
rmdir /S /Q "%tmp_dir%"
|
||||
)
|
||||
md "%tmp_dir%"
|
||||
"%TEMP%\7za920\7za.exe" x "%jar_file%" -o"%tmp_dir%" -r -y
|
||||
|
||||
echo Deleting problematic module config from extracted jar
|
||||
:: Strip out Java 9 module configuration used in the fontawesomefx library as it causes javapackager to stop
|
||||
:: because of this existing module information, since it is not used as a module.
|
||||
:: Sometimes module-info.class does not exist - TODO check why and if still needed
|
||||
if exist "%tmp_dir%\module-info.class" (
|
||||
del /Q "%tmp_dir%\module-info.class"
|
||||
)
|
||||
|
||||
echo Zipping jar again without module config
|
||||
set jar_file=%package_dir%\%jar_filename%
|
||||
if exist "%jar_file%" (
|
||||
del /Q "%jar_file%"
|
||||
)
|
||||
"%TEMP%\7za920\7za.exe" a -tzip "%jar_file%" "%tmp_dir%\*" -r
|
||||
rmdir /S /Q "%tmp_dir%"
|
||||
|
||||
if exist "%TEMP%\7za920.zip" (
|
||||
echo Removing downloaded files
|
||||
del /Q "%TEMP%\7za920.zip"
|
||||
)
|
||||
|
||||
echo SHA256 before stripping jar file:
|
||||
for /F "delims=" %%h in ('certutil -hashfile "%jar_file%" SHA256 ^| findstr -i -v "SHA256" ^| findstr -i -v "certutil"') do (set hash=%%h)
|
||||
echo %hash%
|
||||
|
||||
echo Making deterministic jar by stripping out parameters and comments that contain dates
|
||||
:: Jar file created from https://github.com/ManfredKarrer/tools
|
||||
:: TODO Is this step still necessary? Since we are using preserveFileTimestamps and reproducibleFileOrder in build.gradle
|
||||
java -jar "%CD%\desktop\package\tools-1.0.jar" "%jar_file%"
|
||||
|
||||
echo SHA256 after stripping jar file:
|
||||
for /F "delims=" %%h in ('certutil -hashfile "%jar_file%" SHA256 ^| findstr -i -v "SHA256" ^| findstr -i -v "certutil"') do (set hash=%%h)
|
||||
echo %hash%
|
||||
echo %hash% > "%package_dir%\%jar_filename%.txt"
|
||||
|
||||
:PackageJar
|
||||
if exist "%package_dir%\windows\Bisq-%version%.exe" (
|
||||
del /Q "%package_dir%\windows\Bisq-%version%.exe"
|
||||
)
|
||||
|
||||
cd desktop
|
||||
|
||||
echo Generating packaged executable
|
||||
call "%JAVA_HOME%\bin\javapackager.exe" -deploy ^
|
||||
-native exe ^
|
||||
-name Bisq ^
|
||||
-title Bisq ^
|
||||
-vendor Bisq ^
|
||||
-outdir "%package_dir%\windows" ^
|
||||
-appclass bisq.desktop.app.BisqAppMain ^
|
||||
-srcdir "%package_dir%" ^
|
||||
-srcfiles %jar_filename% ^
|
||||
-outfile Bisq ^
|
||||
-v
|
||||
|
||||
if not exist "%package_dir%\windows\Bisq-%version%.exe" (
|
||||
echo No exe file found at %package_dir%\windows\Bisq-%version%.exe
|
||||
exit /B 3
|
||||
)
|
||||
|
||||
echo Signing executable with default Code Signing Certificate
|
||||
call "C:\Program Files (x86)\Windows Kits\10\App Certification Kit\signtool.exe" sign /v /fd SHA256 /a "%package_dir%\windows\Bisq-%version%.exe"
|
||||
|
||||
echo SHA256 of %package_dir%\windows\Bisq-%version%.exe:
|
||||
for /F "delims=" %%h in ('certutil -hashfile "%package_dir%\windows\Bisq-%version%.exe" SHA256 ^| findstr -i -v "SHA256" ^| findstr -i -v "certutil"') do (set hash=%%h)
|
||||
echo %hash%
|
||||
echo %hash% > "%package_dir%\windows\Bisq-%version%.exe.txt"
|
||||
|
||||
echo Done!
|
||||
pause
|
@ -1,70 +0,0 @@
|
||||
:: Requirements:
|
||||
:: - GPG installed (https://gpg4win.org/get-gpg4win.html)
|
||||
:: - GPG key has been created
|
||||
:: Prior to running this script:
|
||||
:: - Update version below
|
||||
|
||||
@echo off
|
||||
|
||||
set version=1.6.2-SNAPSHOT
|
||||
set release_dir=%~dp0..\..\..\releases\%version%
|
||||
set package_dir=%~dp0..
|
||||
|
||||
set dmg=Bisq-%version%.dmg
|
||||
set deb=Bisq-%version%.deb
|
||||
set exe=Bisq-%version%.exe
|
||||
|
||||
set /P gpg_user="Enter email address used for gpg signing: "
|
||||
|
||||
echo Creating release directory
|
||||
if exist "%release_dir%" (
|
||||
rmdir /S /Q "%release_dir%"
|
||||
)
|
||||
md "%release_dir%"
|
||||
|
||||
echo Copying files to release folder
|
||||
:: sig key mkarrer
|
||||
xcopy /Y "%~dp0..\F379A1C6.asc" "%release_dir%"
|
||||
:: sig key cbeams
|
||||
xcopy /Y "%~dp0..\5BC5ED73.asc" "%release_dir%"
|
||||
:: sig key Christoph Atteneder
|
||||
xcopy /Y "%~dp0..\29CDFD3B.asc" "%release_dir%"
|
||||
:: signing key
|
||||
xcopy /Y "%~dp0..\signingkey.asc" "%release_dir%"
|
||||
if exist "%package_dir%\macosx\%dmg%" (
|
||||
xcopy /Y "%package_dir%\macosx\%dmg%" "%release_dir%"
|
||||
xcopy /Y "%package_dir%\macosx\%dmg%.txt" "%release_dir%"
|
||||
)
|
||||
if exist "%package_dir%\linux\%deb%" (
|
||||
xcopy /Y "%package_dir%\linux\%deb%" "%release_dir%"
|
||||
xcopy /Y "%package_dir%\linux\%deb%.txt" "%release_dir%"
|
||||
)
|
||||
if exist "%package_dir%\windows\%exe%" (
|
||||
xcopy /Y "%package_dir%\windows\%exe%" "%release_dir%"
|
||||
xcopy /Y "%package_dir%\windows\%exe%.txt" "%release_dir%"
|
||||
)
|
||||
|
||||
echo Creating signatures
|
||||
if exist "%release_dir%\%dmg%" (
|
||||
gpg --digest-algo SHA256 --local-user %gpg_user% --output "%release_dir%\%dmg%.asc" --detach-sig --armor "%release_dir%\%dmg%"
|
||||
)
|
||||
if exist "%release_dir%\%deb%" (
|
||||
gpg --digest-algo SHA256 --local-user %gpg_user% --output "%release_dir%\%deb%.asc" --detach-sig --armor "%release_dir%\%deb%"
|
||||
)
|
||||
if exist "%release_dir%\%exe%" (
|
||||
gpg --digest-algo SHA256 --local-user %gpg_user% --output "%release_dir%\%exe%.asc" --detach-sig --armor "%release_dir%\%exe%"
|
||||
)
|
||||
|
||||
echo Verifying signatures
|
||||
if exist "%release_dir%\%dmg%" (
|
||||
gpg --digest-algo SHA256 --verify "%release_dir%\%dmg%.asc"
|
||||
)
|
||||
if exist "%release_dir%\%deb%" (
|
||||
gpg --digest-algo SHA256 --verify "%release_dir%\%deb%.asc"
|
||||
)
|
||||
if exist "%release_dir%\%exe%" (
|
||||
gpg --digest-algo SHA256 --verify "%release_dir%\%exe%.asc"
|
||||
)
|
||||
|
||||
echo Done!
|
||||
pause
|
@ -133,5 +133,10 @@ public class BisqAppMain extends BisqExecutable {
|
||||
@Override
|
||||
protected void onApplicationStarted() {
|
||||
super.onApplicationStarted();
|
||||
|
||||
// Relevant to have this in the logs, for support cases
|
||||
// This can only be called after JavaFX is initialized, otherwise the version logged will be null
|
||||
// Therefore, calling this as part of onApplicationStarted()
|
||||
log.info("Using JavaFX {}", System.getProperty("javafx.version"));
|
||||
}
|
||||
}
|
||||
|
@ -120,7 +120,6 @@ public class JFXTextFieldSkinBisqStyle<T extends TextField & IFXLabelFloatContro
|
||||
promptText = new Text();
|
||||
promptText.setManaged(false);
|
||||
promptText.getStyleClass().add("text");
|
||||
promptText.setTranslateX(-getSkinnable().getPadding().getLeft());
|
||||
promptText.visibleProperty().bind(linesWrapper.usePromptText);
|
||||
promptText.fontProperty().bind(getSkinnable().fontProperty());
|
||||
promptText.textProperty().bind(getSkinnable().promptTextProperty());
|
||||
|
@ -23,7 +23,6 @@ import bisq.desktop.components.InfoInputTextField;
|
||||
import bisq.desktop.components.InputTextField;
|
||||
import bisq.desktop.main.PriceUtil;
|
||||
import bisq.desktop.main.overlays.popups.Popup;
|
||||
import bisq.desktop.main.overlays.windows.WebCamWindow;
|
||||
import bisq.desktop.util.FormBuilder;
|
||||
import bisq.desktop.util.GUIUtil;
|
||||
import bisq.desktop.util.Layout;
|
||||
@ -90,15 +89,12 @@ public class MobileNotificationsView extends ActivatableView<GridPane, Void> {
|
||||
private final MarketAlerts marketAlerts;
|
||||
private final MobileNotificationService mobileNotificationService;
|
||||
|
||||
private WebCamWindow webCamWindow;
|
||||
private QrCodeReader qrCodeReader;
|
||||
|
||||
private TextField tokenInputTextField;
|
||||
private InputTextField priceAlertHighInputTextField, priceAlertLowInputTextField, marketAlertTriggerInputTextField;
|
||||
private ToggleButton useSoundToggleButton, tradeToggleButton, marketToggleButton, priceToggleButton;
|
||||
private ComboBox<TradeCurrency> currencyComboBox;
|
||||
private ComboBox<PaymentAccount> paymentAccountsComboBox;
|
||||
private Button downloadButton, webCamButton, noWebCamButton, eraseButton, setPriceAlertButton,
|
||||
private Button downloadButton, eraseButton, setPriceAlertButton,
|
||||
removePriceAlertButton, addMarketAlertButton, manageAlertsButton /*,testMsgButton*/;
|
||||
|
||||
private ChangeListener<Boolean> useSoundCheckBoxListener, tradeCheckBoxListener, marketCheckBoxListener,
|
||||
@ -149,8 +145,6 @@ public class MobileNotificationsView extends ActivatableView<GridPane, Void> {
|
||||
// setup
|
||||
tokenInputTextField.textProperty().addListener(tokenInputTextFieldListener);
|
||||
downloadButton.setOnAction(e -> onDownload());
|
||||
webCamButton.setOnAction(e -> onOpenWebCam());
|
||||
noWebCamButton.setOnAction(e -> onNoWebCam());
|
||||
// testMsgButton.setOnAction(e -> onSendTestMsg());
|
||||
eraseButton.setOnAction(e -> onErase());
|
||||
|
||||
@ -203,8 +197,6 @@ public class MobileNotificationsView extends ActivatableView<GridPane, Void> {
|
||||
// setup
|
||||
tokenInputTextField.textProperty().removeListener(tokenInputTextFieldListener);
|
||||
downloadButton.setOnAction(null);
|
||||
webCamButton.setOnAction(null);
|
||||
noWebCamButton.setOnAction(null);
|
||||
//testMsgButton.setOnAction(null);
|
||||
eraseButton.setOnAction(null);
|
||||
|
||||
@ -243,45 +235,6 @@ public class MobileNotificationsView extends ActivatableView<GridPane, Void> {
|
||||
GUIUtil.openWebPage("https://bisq.network/downloads");
|
||||
}
|
||||
|
||||
private void onOpenWebCam() {
|
||||
webCamButton.setDisable(true);
|
||||
log.info("Start WebCamLauncher");
|
||||
new WebCamLauncher(webCam -> {
|
||||
log.info("webCam available");
|
||||
webCamWindow = new WebCamWindow(webCam.getViewSize().width, webCam.getViewSize().height)
|
||||
.onClose(() -> {
|
||||
webCamButton.setDisable(false);
|
||||
qrCodeReader.close();
|
||||
});
|
||||
webCamWindow.show();
|
||||
|
||||
qrCodeReader = new QrCodeReader(webCam, webCamWindow.getImageView(), qrCode -> {
|
||||
log.info("Qr code available");
|
||||
webCamWindow.hide();
|
||||
webCamButton.setDisable(false);
|
||||
reset();
|
||||
tokenInputTextField.setText(qrCode);
|
||||
updateMarketAlertFields();
|
||||
updatePriceAlertFields();
|
||||
});
|
||||
}, throwable -> {
|
||||
if (throwable instanceof NoWebCamFoundException) {
|
||||
new Popup().warning(Res.get("account.notifications.noWebCamFound.warning")).show();
|
||||
webCamButton.setDisable(false);
|
||||
onNoWebCam();
|
||||
} else {
|
||||
log.error(throwable.toString());
|
||||
new Popup().error(throwable.toString()).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void onNoWebCam() {
|
||||
setPairingTokenFieldsVisible();
|
||||
noWebCamButton.setManaged(false);
|
||||
noWebCamButton.setVisible(false);
|
||||
}
|
||||
|
||||
private void onErase() {
|
||||
try {
|
||||
mobileNotificationService.sendEraseMessage();
|
||||
@ -401,18 +354,10 @@ public class MobileNotificationsView extends ActivatableView<GridPane, Void> {
|
||||
Res.get("account.notifications.download.label"),
|
||||
Layout.TWICE_FIRST_ROW_DISTANCE);
|
||||
|
||||
Tuple3<Label, Button, Button> tuple = addTopLabel2Buttons(root, ++gridRow,
|
||||
Res.get("account.notifications.webcam.label"),
|
||||
Res.get("account.notifications.webcam.button"), Res.get("account.notifications.noWebcam.button"), 0);
|
||||
webCamButton = tuple.second;
|
||||
noWebCamButton = tuple.third;
|
||||
|
||||
tokenInputTextField = addInputTextField(root, ++gridRow,
|
||||
Res.get("account.notifications.email.label"));
|
||||
tokenInputTextField.setPromptText(Res.get("account.notifications.email.prompt"));
|
||||
tokenInputTextFieldListener = (observable, oldValue, newValue) -> applyKeyAndToken(newValue);
|
||||
tokenInputTextField.setManaged(false);
|
||||
tokenInputTextField.setVisible(false);
|
||||
|
||||
/*testMsgButton = FormBuilder.addTopLabelButton(root, ++gridRow, Res.get("account.notifications.testMsg.label"),
|
||||
Res.get("account.notifications.testMsg.title")).second;
|
||||
|
@ -1,101 +0,0 @@
|
||||
/*
|
||||
* This file is part of Bisq.
|
||||
*
|
||||
* Bisq is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* Bisq is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with Bisq. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package bisq.desktop.main.account.content.notifications;
|
||||
|
||||
import bisq.common.UserThread;
|
||||
|
||||
import javafx.scene.image.ImageView;
|
||||
import javafx.scene.image.WritableImage;
|
||||
|
||||
import javafx.geometry.Point3D;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
|
||||
|
||||
import com.github.sarxos.webcam.Webcam;
|
||||
import com.google.zxing.BinaryBitmap;
|
||||
import com.google.zxing.LuminanceSource;
|
||||
import com.google.zxing.MultiFormatReader;
|
||||
import com.google.zxing.NotFoundException;
|
||||
import com.google.zxing.Result;
|
||||
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
|
||||
import com.google.zxing.common.HybridBinarizer;
|
||||
import javafx.embed.swing.SwingFXUtils;
|
||||
|
||||
@Slf4j
|
||||
// Must not be UI thread
|
||||
class QrCodeReader extends Thread {
|
||||
private final Webcam webCam;
|
||||
private final ImageView imageView;
|
||||
private final Consumer<String> resultHandler;
|
||||
private boolean isRunning;
|
||||
|
||||
QrCodeReader(Webcam webCam, ImageView imageView, Consumer<String> resultHandler) {
|
||||
this.webCam = webCam;
|
||||
this.imageView = imageView;
|
||||
this.resultHandler = resultHandler;
|
||||
|
||||
start();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
if (!webCam.isOpen())
|
||||
webCam.open();
|
||||
|
||||
isRunning = true;
|
||||
Result result;
|
||||
BufferedImage bufferedImage;
|
||||
while (isRunning) {
|
||||
bufferedImage = webCam.getImage();
|
||||
if (bufferedImage != null) {
|
||||
WritableImage writableImage = SwingFXUtils.toFXImage(bufferedImage, null);
|
||||
imageView.setImage(writableImage);
|
||||
imageView.setRotationAxis(new Point3D(0.0, 1.0, 0.0));
|
||||
imageView.setRotate(180.0);
|
||||
|
||||
LuminanceSource source = new BufferedImageLuminanceSource(bufferedImage);
|
||||
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
|
||||
|
||||
try {
|
||||
result = new MultiFormatReader().decode(bitmap);
|
||||
isRunning = false;
|
||||
String qrCode = result.getText();
|
||||
UserThread.execute(() -> resultHandler.accept(qrCode));
|
||||
} catch (NotFoundException ignore) {
|
||||
// No qr code in image...
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
log.error(t.toString());
|
||||
} finally {
|
||||
webCam.close();
|
||||
}
|
||||
}
|
||||
|
||||
public void close() {
|
||||
isRunning = false;
|
||||
}
|
||||
}
|
@ -1,64 +0,0 @@
|
||||
/*
|
||||
* This file is part of Bisq.
|
||||
*
|
||||
* Bisq is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* Bisq is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with Bisq. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package bisq.desktop.main.account.content.notifications;
|
||||
|
||||
import bisq.common.UserThread;
|
||||
import bisq.common.handlers.ExceptionHandler;
|
||||
|
||||
import java.awt.Dimension;
|
||||
|
||||
import java.util.concurrent.TimeoutException;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
|
||||
|
||||
import com.github.sarxos.webcam.Webcam;
|
||||
|
||||
@Slf4j
|
||||
// Must not be UI thread
|
||||
class WebCamLauncher extends Thread {
|
||||
private final Consumer<Webcam> resultHandler;
|
||||
private final ExceptionHandler exceptionHandler;
|
||||
|
||||
WebCamLauncher(Consumer<Webcam> resultHandler, ExceptionHandler exceptionHandler) {
|
||||
this.resultHandler = resultHandler;
|
||||
this.exceptionHandler = exceptionHandler;
|
||||
|
||||
start();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
Webcam webCam = Webcam.getDefault(1000); // one second timeout - the default is too long
|
||||
if (webCam != null) {
|
||||
Dimension[] sizes = webCam.getViewSizes();
|
||||
Dimension size = sizes[sizes.length - 1]; // the largest size
|
||||
webCam.setViewSize(size);
|
||||
UserThread.execute(() -> resultHandler.accept(webCam));
|
||||
} else {
|
||||
UserThread.execute(() -> exceptionHandler.handleException(new NoWebCamFoundException("No webcam found.")));
|
||||
}
|
||||
} catch (TimeoutException e) {
|
||||
log.error(e.toString());
|
||||
UserThread.execute(() -> exceptionHandler.handleException(e));
|
||||
}
|
||||
}
|
||||
}
|
@ -8,10 +8,13 @@
|
||||
* Update version number in:
|
||||
* [_config.yml](https://github.com/bisq-network/bisq-website/blob/master/_config.yml)
|
||||
|
||||
* Update currency list in [market_currency_selector.html](https://github.com/bisq-network/bisq-website/blob/master/_includes/market_currency_selector.html) (use [MarketsPrintTool](https://github.com/bisq-network/bisq/blob/master/desktop/src/test/java/bisq/desktop/MarketsPrintTool.java)
|
||||
to create HTML content).
|
||||
* Update currency list
|
||||
in [market_currency_selector.html](https://github.com/bisq-network/bisq-website/blob/master/_includes/market_currency_selector.html) (
|
||||
use [MarketsPrintTool](https://github.com/bisq-network/bisq/blob/master/desktop/src/test/java/bisq/desktop/MarketsPrintTool.java)
|
||||
to create HTML content).
|
||||
|
||||
### Bisq maintainers, suggestion for writing release notes
|
||||
|
||||
To be able to create release notes before you make the final release tag, you can temporarily create a local tag and
|
||||
remove it afterwards again.
|
||||
|
||||
@ -30,31 +33,36 @@ Generate list of authors:
|
||||
2. Prepare a short version of the release notes for the in-app update popup
|
||||
|
||||
### Basic preparations
|
||||
For releasing a new Bisq version you'll need Linux, Windows and macOS.
|
||||
You can use a virtualization solution like [VirtualBox](https://www.virtualbox.org/wiki/Downloads) for this purpose.
|
||||
|
||||
For releasing a new Bisq version you'll need Linux, Windows and macOS. You can use a virtualization solution
|
||||
like [VirtualBox](https://www.virtualbox.org/wiki/Downloads) for this purpose.
|
||||
|
||||
#### VirtualBox recommended configuration
|
||||
|
||||
Although performance of VMs might vary based on your hardware configuration following setup works pretty well on macOS.
|
||||
|
||||
Use VirtualBox > 6.1
|
||||
with following configuration:
|
||||
* System > Motherboard > Base Memory: 2048 MB
|
||||
* System > Processor > Processor(s): 2 CPUs
|
||||
* System > Processor > Execution Cap: 90%
|
||||
* Display > Screen > Video Memory: 128 MB
|
||||
* Display > Screen > Scale Factor: 200%
|
||||
* Display > Screen > HiDPI Support: Use unscaled HiDPI Output (checked)
|
||||
* Display > Screen > Acceleration: Enable 3D acceleration (checked)
|
||||
Use VirtualBox > 6.1 with following configuration:
|
||||
|
||||
* System > Motherboard > Base Memory: 4096 MB
|
||||
* System > Processor > Processor(s): 2 CPUs
|
||||
* System > Processor > Execution Cap: 90%
|
||||
* Display > Screen > Video Memory: 128 MB
|
||||
* Display > Screen > Scale Factor: 200%
|
||||
* Display > Screen > HiDPI Support: Use unscaled HiDPI Output (checked)
|
||||
* Display > Screen > Acceleration: Enable 3D acceleration (checked)
|
||||
|
||||
##### Windows VM
|
||||
|
||||
* Windows 10 64bit
|
||||
* Recommended virtual disk size: 55 GB
|
||||
|
||||
##### Linux VM
|
||||
|
||||
* Ubuntu 16.04.4 64bit
|
||||
* Recommended virtual disk size: 25 GB
|
||||
|
||||
##### macOS VM
|
||||
|
||||
* macOS X 10.11 (El Capitan) 64bit
|
||||
* Recommended virtual disk size: 40 GB
|
||||
|
||||
@ -65,46 +73,73 @@ with following configuration:
|
||||
#### For Windows
|
||||
|
||||
* Update AntiVirus Software and virus definitions
|
||||
* Install unicode version of [Inno Tools](http://www.jrsoftware.org/isdl.php)
|
||||
* Install [WiX toolset](https://wixtoolset.org/releases/)
|
||||
* Run full AV system scan
|
||||
|
||||
### Build release
|
||||
|
||||
#### macOS
|
||||
|
||||
1. Make sure all version numbers are updated (update version variables and run [replace_version_number.sh](https://github.com/bisq-network/bisq/blob/master/desktop/package/macosx/replace_version_number.sh)).
|
||||
2. Set environment variable e.g. export BISQ_GPG_USER=manfred@bitsquare.io to ~/.profile file or the like... (one time effort)
|
||||
3. Update [vmPath variable](https://github.com/bisq-network/bisq/blob/b4b5d0bb12c36afbe1aa6611dd8451378df6db8c/desktop/package/macosx/create_app.sh#L42) if necessary
|
||||
4. Run [create_app.sh](https://github.com/bisq-network/bisq/blob/master/desktop/package/macosx/create_app.sh)
|
||||
To be able to generate a signed and notarized binary you have to have an Apple developer account and create the required
|
||||
certificate and provisioning file before running the build.
|
||||
|
||||
Build output expected in deploy directory (opened after successful build process):
|
||||
1. Make sure all version numbers are updated (update version variables and
|
||||
run [replace_version_number.sh](https://github.com/bisq-network/bisq/blob/master/desktop/package/macosx/replace_version_number.sh))
|
||||
.
|
||||
|
||||
1. `Bisq-${NEW_VERSION}.dmg` macOS signed installer
|
||||
2. `Bisq-${NEW_VERSION}.jar` Deterministic fat jar
|
||||
3. `Bisq-${NEW_VERSION}.jar.txt` sha256 sum of deterministic fat jar
|
||||
2. Set environment variables to ~/.profile file or the like... (one time effort)
|
||||
* `BISQ_GPG_USER`: e.g. export BISQ_GPG_USER=manfred@bitsquare.io
|
||||
* `BISQ_SHARED_FOLDER`: shared folder that is used between your VM host and client system
|
||||
* `BISQ_PACKAGE_SIGNING_IDENTITY`: e.g. "Developer ID Application: Christoph Atteneder (WQT93T6D6C)"
|
||||
* `BISQ_PRIMARY_BUNDLE_ID`: e.g. "network.bisq.CAT"
|
||||
* `BISQ_PACKAGE_NOTARIZATION_AC_USERNAME`: your Apple developer email address
|
||||
* `BISQ_PACKAGE_NOTARIZATION_ASC_PROVIDER`: Your developer ID (e.g. WQT93T6D6C)
|
||||
|
||||
The build script also copies over the deterministic fat jar into the shared folders for the other VMs (Windows & Linux).
|
||||
Before building the other binaries install the generated Bisq app on macOS and verify that everything works as expected.
|
||||
3. Run `./gradlew --console=plain packageInstallers`
|
||||
|
||||
Build output expected in shared folder:
|
||||
|
||||
1. `Bisq-${NEW_VERSION}.dmg` macOS notarized and signed installer
|
||||
2. `desktop-${NEW_VERSION}-all.jar.SHA-256` sha256 sum of fat jar
|
||||
3. `jar-lib-for-raspberry-pi-${NEW_VERSION}.zip` Jar libraries for Raspberry Pi
|
||||
|
||||
* Before building the other binaries install the generated Bisq app on macOS and verify that everything works as
|
||||
expected.
|
||||
|
||||
#### Linux
|
||||
|
||||
* Run `desktop/package/linux/package.sh` from the shared VM folder
|
||||
1. Checkout the release tag in your VM
|
||||
|
||||
2. Set environment variables to ~/.profile file or the like... (one time effort)
|
||||
* `BISQ_SHARED_FOLDER`: shared folder that is used between your VM host and client system
|
||||
|
||||
3. Run `./gradlew --console=plain packageInstallers`
|
||||
|
||||
Build output expected:
|
||||
|
||||
1. `Bisq-${NEW_VERSION}.deb` package for distributions that derive from Debian
|
||||
2. `Bisq-${NEW_VERSION}.rpm` package for distributions that derive from Redhat based distros
|
||||
1. `bisq_${NEW_VERSION}-1_amd64.deb` package for distributions that derive from Debian
|
||||
2. `bisq-${NEW_VERSION}-1.x86_64.rpm` package for distributions that derive from Redhat based distros
|
||||
3. `desktop-${NEW_VERSION}-all.jar.SHA-256` sha256 sum of fat jar
|
||||
|
||||
* Install and run generated package
|
||||
|
||||
#### Windows
|
||||
|
||||
* Run `desktop/package/windows/package.bat` from the shared VM folder
|
||||
To be able to generate a signed binary you have to apply and install a developer certificate before running the build.
|
||||
|
||||
1. Checkout the release tag in your VM
|
||||
|
||||
2. Set environment variables to ~/.profile file or the like... (one time effort)
|
||||
* `BISQ_SHARED_FOLDER`: shared folder that is used between your VM host and client system
|
||||
|
||||
3. Run `./gradlew --console=plain packageInstallers`
|
||||
|
||||
Build output expected:
|
||||
|
||||
1. `Bisq-${NEW_VERSION}.exe` Windows unsigned installer
|
||||
2. `Bisq-${NEW_VERSION}.exe.txt` sha256 sum of installer
|
||||
1. `Bisq-${NEW_VERSION}.exe` Windows signed installer
|
||||
2. `desktop-${NEW_VERSION}-all.jar.SHA-256` sha256 sum of fat jar
|
||||
|
||||
* Install and run generated package
|
||||
|
||||
### Sign release on macOS
|
||||
|
||||
@ -116,33 +151,38 @@ Build output expected:
|
||||
2. `5BC5ED73.asc` Sig key of Chris Beams
|
||||
3. `29CDFD3B.asc`Sig key of Christoph Atteneder
|
||||
4. `signingkey.asc` Fingerprint of key that was used for these builds
|
||||
5. `Bisq-${NEW_VERSION}.jar.txt` Sha256 sum of deterministic fat jar
|
||||
6. `Bisq-${NEW_VERSION}.dmg` macOS installer
|
||||
7. `Bisq-${NEW_VERSION}.dmg.asc` Signature for macOS installer
|
||||
8. `Bisq-${NEW_VERSION}.deb` Debian package
|
||||
9. `Bisq-${NEW_VERSION}.deb.asc` Signature for Debian package
|
||||
10. `Bisq-${NEW_VERSION}.rpm` Redhat based distro package
|
||||
11. `Bisq-${NEW_VERSION}.rpm.asc` Signature for Redhat based distro package
|
||||
12. `Bisq-${NEW_VERSION}.exe` Windows installer
|
||||
13. `Bisq-${NEW_VERSION}.exe.asc` Signature for Windows installer
|
||||
5. `Bisq-${NEW_VERSION}.dmg` macOS installer
|
||||
6. `Bisq-${NEW_VERSION}.dmg.asc` Signature for macOS installer
|
||||
7. `Bisq-64bit-${NEW_VERSION}.deb` Debian package
|
||||
8. `Bisq-64bit-${NEW_VERSION}.deb.asc` Signature for Debian package
|
||||
9. `Bisq-64bit-${NEW_VERSION}.rpm` Redhat based distro package
|
||||
10. `Bisq-64bit-${NEW_VERSION}.rpm.asc` Signature for Redhat based distro package
|
||||
11. `Bisq-64bit-${NEW_VERSION}.exe` Windows installer
|
||||
12. `Bisq-64bit-${NEW_VERSION}.exe.asc` Signature for Windows installer
|
||||
|
||||
* Run a AV scan over all files on the Windows VM where the files got copied over.
|
||||
* Run a AV scan over all files on the Windows VM where the files got copied over.
|
||||
|
||||
### Final test
|
||||
|
||||
* Make at least one mainnet test trade with some exotic currency to not interfere with real traders.
|
||||
* Make at least one mainnet test trade with some exotic currency to not interfere with real traders.
|
||||
|
||||
### Tag and push release to master
|
||||
|
||||
If all was successful:
|
||||
|
||||
* commit changes of new version number (update version number for release of e.g. v1.5.0)
|
||||
* create tag for the release
|
||||
* commit changes of new version number (update version number for release of e.g. v1.5.0)
|
||||
* create tag for the release
|
||||
|
||||
```
|
||||
git tag -s v(new version, e.g. 1.5.0) -m"Release v(new version, e.g. 1.5.0)"
|
||||
```
|
||||
* Revert back to SNAPSHOT where necessary (change version variable (e.g. 1.5.0) in shell script [insert_snapshot_version.sh](https://github.com/bisq-network/bisq/blob/master/desktop/package/macosx/insert_snapshot_version.sh) and run it) and commit these changes.
|
||||
* Push all commits to master including the new tag
|
||||
|
||||
* Revert back to SNAPSHOT where necessary (change version variable (e.g. 1.5.0) in shell
|
||||
script [insert_snapshot_version.sh](https://github.com/bisq-network/bisq/blob/master/desktop/package/macosx/insert_snapshot_version.sh)
|
||||
and run it) and commit these changes.
|
||||
|
||||
* Push all commits to master including the new tag
|
||||
|
||||
```
|
||||
git push --tags origin master
|
||||
```
|
||||
@ -151,21 +191,33 @@ If all was successful:
|
||||
|
||||
#### Upload preparations
|
||||
|
||||
* Check the fingerprint of the pgp key which was used for signing in signingkey.asc (e.g. 29CDFD3B for Christoph Atteneder)
|
||||
* Add all files including signingkey.asc and the gpg pub keys to GitHub release page
|
||||
* Check all uploaded files with [virustotal.com](https://www.virustotal.com)
|
||||
* Select the release tag as the source for the GitHub release.
|
||||
* Release on GitHub
|
||||
* Check the fingerprint of the pgp key which was used for signing in signingkey.asc (e.g. 29CDFD3B for Christoph
|
||||
Atteneder)
|
||||
|
||||
* Add all files including signingkey.asc and the gpg pub keys to GitHub release page
|
||||
|
||||
* Check all uploaded files with [virustotal.com](https://www.virustotal.com)
|
||||
|
||||
* Select the release tag as the source for the GitHub release.
|
||||
|
||||
* Release on GitHub
|
||||
|
||||
#### Post GitHub release
|
||||
* Apply “A newer version is already available! Please don’t use this version anymore.” to old GitHub releases.
|
||||
* Merge the webpage PR and check if they got deployed properly.
|
||||
* Start the Alert sender app (CMD + M) remove the old version and send the update message.
|
||||
Check the checkbox for update, set the version number (e.g. 0.9.4) and add the short version of the release notes.
|
||||
* After sending the Update message leave it running for about 1 minute to give time for good propagation.
|
||||
* Make a backup of that alert sender app data directory
|
||||
* To support source code signature verification for Arch Linux download `Source code (tar.gz)`, sign it and
|
||||
upload signature.
|
||||
|
||||
* Apply “A newer version is already available! Please don’t use this version anymore.” to old GitHub releases.
|
||||
|
||||
* Merge the webpage PR and check if they got deployed properly.
|
||||
|
||||
* Start the Alert sender app (CMD + M) remove the old version and send the update message. Check the checkbox for
|
||||
update, set the version number (e.g. 0.9.4) and add the short version of the release notes.
|
||||
|
||||
* After sending the Update message leave it running for about 1 minute to give time for good propagation.
|
||||
|
||||
* Make a backup of that alert sender app data directory
|
||||
|
||||
* To support source code signature verification for Arch Linux download `Source code (tar.gz)`, sign it and upload
|
||||
signature.
|
||||
|
||||
```
|
||||
# sign source code bundle
|
||||
gpg --digest-algo SHA256 --local-user $BISQ_GPG_USER --output bisq-${NEW_VERSION}.tar.gz.asc --detach-sig --armor bisq-${NEW_VERSION}.tar.gz
|
||||
@ -176,9 +228,15 @@ If all was successful:
|
||||
|
||||
### Announce the release
|
||||
|
||||
* Forum
|
||||
* Keybase (#general channel)
|
||||
* Twitter
|
||||
* Optionally reddit /r/Bisq
|
||||
* Notify @freimair so that he can start updating [the Arch User Repository](https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=bisq-git)
|
||||
* Celebrate
|
||||
* Forum
|
||||
|
||||
* Keybase (#general channel)
|
||||
|
||||
* Twitter
|
||||
|
||||
* Optionally reddit /r/Bisq
|
||||
|
||||
* Notify @freimair so that he can start
|
||||
updating [the Arch User Repository](https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=bisq-git)
|
||||
|
||||
* Celebrate
|
||||
|
25
gradle/README.md
Normal file
25
gradle/README.md
Normal file
@ -0,0 +1,25 @@
|
||||
# How to upgrade the Gradle version
|
||||
|
||||
Visit the [Gradle website](https://gradle.org/releases/) and decide the:
|
||||
|
||||
- desired version
|
||||
- desired distribution type
|
||||
- what is the sha256 for the version and type chosen above
|
||||
|
||||
Adjust the following command with tha arguments above and execute it twice:
|
||||
|
||||
./gradlew wrapper --gradle-version 6.6.1 \
|
||||
--distribution-type all \
|
||||
--gradle-distribution-sha256-sum 11657af6356b7587bfb37287b5992e94a9686d5c8a0a1b60b87b9928a2decde5
|
||||
|
||||
The first execution should automatically update:
|
||||
|
||||
- `bisq/gradle/wrapper/gradle-wrapper.properties`
|
||||
|
||||
The second execution should then update:
|
||||
|
||||
- `bisq/gradle/wrapper/gradle-wrapper.jar`
|
||||
- `bisq/gradlew`
|
||||
- `bisq/gradlew.bat`
|
||||
|
||||
The four updated files are ready to be committed.
|
@ -33,7 +33,6 @@ dependencyVerification {
|
||||
'com.github.bisq-network:bitcoinj:65ed08fa5777ea4a08599bdd575e7dc1f4ba2d4d5835472551439d6f6252e68a',
|
||||
'com.github.bisq-network:jsonrpc4j:842b4a660440ef53cd436da2e21c3e1fed939b620a3fc7542307deb3e77fdeb6',
|
||||
'com.github.ravn:jsocks:3c71600af027b2b6d4244e4ad14d98ff2352a379410daebefff5d8cd48d742a4',
|
||||
'com.github.sarxos:webcam-capture:d960b7ea8ec3ddf2df0725ef214c3fccc9699ea7772df37f544e1f8e4fd665f6',
|
||||
'com.google.android:annotations:ba734e1e84c09d615af6a09d33034b4f0442f8772dec120efb376d86a565ae15',
|
||||
'com.google.api.grpc:proto-google-common-protos:bd60cd7a423b00fb824c27bdd0293aaf4781be1daba6ed256311103fb4b84108',
|
||||
'com.google.code.findbugs:jsr305:766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7',
|
||||
@ -48,8 +47,7 @@ dependencyVerification {
|
||||
'com.google.zxing:core:11aae8fd974ab25faa8208be50468eb12349cd239e93e7c797377fa13e381729',
|
||||
'com.google.zxing:javase:0ec23e2ec12664ddd6347c8920ad647bb3b9da290f897a88516014b56cc77eb9',
|
||||
'com.googlecode.jcsv:jcsv:73ca7d715e90c8d2c2635cc284543b038245a34f70790660ed590e157b8714a2',
|
||||
'com.jfoenix:jfoenix:4739e37a05e67c3bc9d5b391a1b93717b5a48fa872992616b0964d3f827f8fe6',
|
||||
'com.nativelibs4java:bridj:101bcd9b6637e6bc16e56deb3daefba62b1f5e8e9e37e1b3e56e3b5860d659cf',
|
||||
'com.jfoenix:jfoenix:8060235fec5eb49617ec8d81d379e8c945f6cc722d0645e97190045100de2084',
|
||||
'commons-codec:commons-codec:61f7a3079e92b9fdd605238d0295af5fd11ac411a0a0af48deace1f6c5ffa072',
|
||||
'commons-io:commons-io:f877d304660ac2a142f3865badfc971dec7ed73c747c7f8d5d2f5139ca736513',
|
||||
'commons-logging:commons-logging:daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636',
|
||||
@ -72,7 +70,7 @@ dependencyVerification {
|
||||
'net.jcip:jcip-annotations:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0',
|
||||
'net.sf.jopt-simple:jopt-simple:df26cc58f235f477db07f753ba5a3ab243ebe5789d9f89ecf68dd62ea9a66c28',
|
||||
'org.apache.commons:commons-compress:5f2df1e467825e4cac5996d44890c4201c000b43c0b23cffc0782d28a0beb9b0',
|
||||
'org.apache.commons:commons-lang3:9375aad1000cdd5bd3068e832de9802094fac1f145655251e141d5d0072fab9a',
|
||||
'org.apache.commons:commons-lang3:4ee380259c068d1dbe9e84ab52186f2acd65de067ec09beff731fca1697fdb16',
|
||||
'org.apache.httpcomponents:httpclient:bc5f065aba5dd815ee559dd24d9bcb797fb102ff9cfa036f5091ebc529bd3b93',
|
||||
'org.apache.httpcomponents:httpcore:e06e89d40943245fcfa39ec537cdbfce3762aecde8f9c597780d2b00c2b43424',
|
||||
'org.bouncycastle:bcpg-jdk15on:dc4f51adfc46583c2543489c82708fef5660202bf264c7cd453f081a117ea536',
|
||||
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
|
||||
distributionSha256Sum=abc10bcedb58806e8654210f96031db541bcd2d6fc3161e81cb0572d6a15e821
|
||||
distributionSha256Sum=11657af6356b7587bfb37287b5992e94a9686d5c8a0a1b60b87b9928a2decde5
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
31
gradlew
vendored
31
gradlew
vendored
@ -82,6 +82,7 @@ esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
@ -129,6 +130,7 @@ fi
|
||||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
@ -154,19 +156,19 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=$((i+1))
|
||||
i=`expr $i + 1`
|
||||
done
|
||||
case $i in
|
||||
(0) set -- ;;
|
||||
(1) set -- "$args0" ;;
|
||||
(2) set -- "$args0" "$args1" ;;
|
||||
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
0) set -- ;;
|
||||
1) set -- "$args0" ;;
|
||||
2) set -- "$args0" "$args1" ;;
|
||||
3) set -- "$args0" "$args1" "$args2" ;;
|
||||
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
@ -175,14 +177,9 @@ save () {
|
||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||
echo " "
|
||||
}
|
||||
APP_ARGS=$(save "$@")
|
||||
APP_ARGS=`save "$@"`
|
||||
|
||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||
|
||||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
||||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
||||
cd "$(dirname "$0")"
|
||||
fi
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
|
25
gradlew.bat
vendored
25
gradlew.bat
vendored
@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
@ -37,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto init
|
||||
if "%ERRORLEVEL%" == "0" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
@ -51,7 +54,7 @@ goto fail
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto init
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
@ -61,28 +64,14 @@ echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:init
|
||||
@rem Get command-line arguments, handling Windows variants
|
||||
|
||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||
|
||||
:win9xME_args
|
||||
@rem Slurp the command line arguments.
|
||||
set CMD_LINE_ARGS=
|
||||
set _SKIP=2
|
||||
|
||||
:win9xME_args_slurp
|
||||
if "x%~1" == "x" goto execute
|
||||
|
||||
set CMD_LINE_ARGS=%*
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
|
Loading…
Reference in New Issue
Block a user