浏览代码

Merge branch 'master' of https://github.com/wekan/wekan into new-search

John R. Supplee 4 年之前
父节点
当前提交
7ad1171c5f

+ 40 - 0
CHANGELOG.md

@@ -1,3 +1,43 @@
+# v4.87 2021-01-26 Wekan release
+
+This release fixes the following bugs:
+
+- [Reject by default LDAP connections not authorized via CA trust store](https://github.com/wekan/wekan/pull/3483).
+  Thanks to robert-scheck.
+- [Handle '\n' line breaks in PEM-encoded SSL/TLS certificates](https://github.com/wekan/wekan/pull/3485).
+  Thanks to robert-scheck.
+
+and adds the following improvements
+
+- [Try parallel build of releases, does it work](https://github.com/wekan/wekan/commit/be238ac7439ce38b4403d9a611dec9bb421a856f).
+  Thanks to xet7.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
+# v4.86 2021-01-25 Wekan release
+
+This release adds the following improvements:
+
+- [Added PWA related category, orientation, screenshots, maskable icon and
+  IARC rating ID](https://github.com/wekan/wekan/commit/027771b3021a709d9049015e7d7e6faccf1ad7f3).
+  Thanks to xet7.
+- [Added PWA related monochrome icon](https://github.com/wekan/wekan/commit/2977f7cf47626b429159cb7b7496919c07ece914).
+  Thanks to xet7.
+- [Mention Wekan GitHub Discussions at readme](https://github.com/wekan/wekan/commit/4c0bd359f921ae0ea722f78946fcc1168e8b939e).
+  Thanks to xet7.
+
+and adds the following updates:
+
+- [Use Node 12.20.1 in rebuild-wekan.sh](https://github.com/wekan/wekan/commit/37d76e9e061d31c11fca8e704e9b4c54f17c0023).
+  Thanks to xet7.
+
+and fixes the following bugs:
+
+- [Move call to URL search to onRendered](https://github.com/wekan/wekan/pull/3478).
+  Thanks to jrsupplee.
+
+Thanks to above GitHub users for their contributions and translators for their translations.
+
 # v4.85 2021-01-23 Wekan release
 # v4.85 2021-01-23 Wekan release
 
 
 This release adds the following new features:
 This release adds the following new features:

+ 3 - 6
README.md

@@ -20,13 +20,12 @@ New English strings of new features can be added as PRs to edge branch file weka
 
 
 ## [Wekan feature requests and bugs](https://github.com/wekan/wekan/issues)
 ## [Wekan feature requests and bugs](https://github.com/wekan/wekan/issues)
 
 
-Please add most of your questions as GitHub issue: [Wekan feature requests and bugs](https://github.com/wekan/wekan/issues).
+Please add most of your questions as GitHub issue: [Wekan Feature Requests and Bugs](https://github.com/wekan/wekan/issues).
 It's better than at chat where details get lost when chat scrolls up.
 It's better than at chat where details get lost when chat scrolls up.
 
 
 ## Chat
 ## Chat
 
 
-[![Wekan Chat][vanila_badge]][wekan_chat] - Most Wekan community and developers are here. Works on webbrowser
-and PWA app that can be added as icon on Android and bookmark on iOS, used like native app.
+[Discussions][discussions] - Wekan Community GitHub Discussions, that are not [Feature Requests and Bugs](https://github.com/wekan/wekan/issues).
 
 
 [Wekan IRC FAQ](https://github.com/wekan/wekan/wiki/IRC-FAQ)
 [Wekan IRC FAQ](https://github.com/wekan/wekan/wiki/IRC-FAQ)
 
 
@@ -114,8 +113,6 @@ with [Meteor](https://www.meteor.com).
 [translate_wekan]: https://www.transifex.com/wekan/wekan/
 [translate_wekan]: https://www.transifex.com/wekan/wekan/
 [open_source]: https://en.wikipedia.org/wiki/Open-source_software
 [open_source]: https://en.wikipedia.org/wiki/Open-source_software
 [free_software]: https://en.wikipedia.org/wiki/Free_software
 [free_software]: https://en.wikipedia.org/wiki/Free_software
-[vanila_badge]: https://vanila.io/img/join-chat-button2.png
-[wekan_chat]: https://community.vanila.io/wekan
-
+[discussions]: https://github.com/wekan/wekan/discussions
 
 
 [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fwekan%2Fwekan.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fwekan%2Fwekan?ref=badge_large)
 [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fwekan%2Fwekan.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fwekan%2Fwekan?ref=badge_large)

+ 1 - 1
Stackerfile.yml

@@ -1,5 +1,5 @@
 appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
 appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
-appVersion: "v4.85.0"
+appVersion: "v4.87.0"
 files:
 files:
   userUploads:
   userUploads:
     - README.md
     - README.md

+ 4 - 4
i18n/de.i18n.json

@@ -902,7 +902,7 @@
   "operator-number-expected": "Operator „__operator__“ erwartete eine Zahl, bekam aber „__value__“",
   "operator-number-expected": "Operator „__operator__“ erwartete eine Zahl, bekam aber „__value__“",
   "heading-notes": "Bemerkungen",
   "heading-notes": "Bemerkungen",
   "globalSearch-instructions-heading": "Hinweise zur Suche",
   "globalSearch-instructions-heading": "Hinweise zur Suche",
-  "globalSearch-instructions-description": "Suchanfragen können Operatoren enthalten, um die Suche zu verfeinern. Operatoren bestehen aus ihrem Namen und ihrem Wert, getrennt durch einen Doppelpunkt. Beispielsweise würde die Operatorangabe `list:Blockiert` die Suche beschränken auf Karten in einer Liste namens *Blockiert*. Wenn der Wet Leerschritte oder andere Spezialzeichen enthält, muss er in Anführungszeichen gesetzt sein (z.B. `__operator_list__:\"Im Review\"`).",
+  "globalSearch-instructions-description": "Suchanfragen können Operatoren enthalten, um die Suche zu verfeinern. Operatoren bestehen aus ihrem Namen und ihrem Wert, getrennt durch einen Doppelpunkt. Beispielsweise würde die Operatorangabe `Liste:Blockiert` die Suche beschränken auf Karten in einer Liste namens *Blockiert*. Wenn der Wert Leerschritte oder andere Spezialzeichen enthält, muss er in Anführungszeichen gesetzt sein (z.B. `__operator_list__:\"Im Review\"`).",
   "globalSearch-instructions-operators": "Mögliche Operatoren:",
   "globalSearch-instructions-operators": "Mögliche Operatoren:",
   "globalSearch-instructions-operator-board": "`__operator_board__:Titel` – Karten in Boards mit dem angegebenen Titel",
   "globalSearch-instructions-operator-board": "`__operator_board__:Titel` – Karten in Boards mit dem angegebenen Titel",
   "globalSearch-instructions-operator-list": "`__operator_list__:Titel` – Karten in Listen, auf die der angegebene Titel passt",
   "globalSearch-instructions-operator-list": "`__operator_list__:Titel` – Karten in Listen, auf die der angegebene Titel passt",
@@ -910,12 +910,12 @@
   "globalSearch-instructions-operator-label": "`__operator_label__:Farbe` `__operator_label__:Name` – Karten, die ein Label haben, auf das die angegebene Farbe oder Name passt",
   "globalSearch-instructions-operator-label": "`__operator_label__:Farbe` `__operator_label__:Name` – Karten, die ein Label haben, auf das die angegebene Farbe oder Name passt",
   "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__Label` – Kurzform von `__operator_label__:Label`",
   "globalSearch-instructions-operator-hash": "`__operator_label_abbrev__Label` – Kurzform von `__operator_label__:Label`",
   "globalSearch-instructions-operator-user": "`__operator_user__:Nutzername` – Karten, für die der angegebene Nutzer ein *Mitglied* oder ein *Zugewiesener* ist",
   "globalSearch-instructions-operator-user": "`__operator_user__:Nutzername` – Karten, für die der angegebene Nutzer ein *Mitglied* oder ein *Zugewiesener* ist",
-  "globalSearch-instructions-operator-at": "`__operator_user_abbrev__Nutzername` – Kurzform von `user:Nutzername`",
+  "globalSearch-instructions-operator-at": "`__operator_user_abbrev__Nutzername` – Kurzform von `Nutzer:Nutzername`",
   "globalSearch-instructions-operator-member": "`__operator_member__:Nutzername` – Karten, für die der angegebene Nutzer ein *Mitglied* ist",
   "globalSearch-instructions-operator-member": "`__operator_member__:Nutzername` – Karten, für die der angegebene Nutzer ein *Mitglied* ist",
-  "globalSearch-instructions-operator-assignee": "`__operator_member__:Nutzername` – Karten, für die der angegebene Nutzer ein *Zugewiesener* ist",
+  "globalSearch-instructions-operator-assignee": "`__operator_assignee__:Nutzername` – Karten, für die der angegebene Nutzer ein *Zugewiesener* ist",
   "globalSearch-instructions-notes-1": "Mehrere Operatoren können angegeben werden.",
   "globalSearch-instructions-notes-1": "Mehrere Operatoren können angegeben werden.",
   "globalSearch-instructions-notes-2": "Gleichartige Operatoren werden Oder-verknüpft. Karten, für die eine Bedingung zutrifft, werden ausgegeben.\n`__operator_list__:Verfügbar __operator_list__:Blockiert` würde alle Karten ausgeben, die in irgendwelchen Listen mit den Namen *Verfügbar* oder *Blockiert* stehen.",
   "globalSearch-instructions-notes-2": "Gleichartige Operatoren werden Oder-verknüpft. Karten, für die eine Bedingung zutrifft, werden ausgegeben.\n`__operator_list__:Verfügbar __operator_list__:Blockiert` würde alle Karten ausgeben, die in irgendwelchen Listen mit den Namen *Verfügbar* oder *Blockiert* stehen.",
-  "globalSearch-instructions-notes-3": "Verschiedenartige Operatoren werden Und-verknüpft. Karten, für die alle Bedingungen zutreffen, werden ausgegeben.\n`__operator_list__:Verfügbar __operator_label__:red` würde alle Karten ausgeben, die in der Liste *Verfügbar* mit einem *roten* Label stehen.",
+  "globalSearch-instructions-notes-3": "Verschiedenartige Operatoren werden Und-verknüpft. Karten, für die alle Bedingungen zutreffen, werden ausgegeben.\n`__operator_list__:Verfügbar __operator_label__:rot` würde alle Karten ausgeben, die in der Liste *Verfügbar* mit einem *roten* Label stehen.",
   "globalSearch-instructions-notes-4": "Bei Suchen in Texten ist die Groß-/Kleinschreibung egal.",
   "globalSearch-instructions-notes-4": "Bei Suchen in Texten ist die Groß-/Kleinschreibung egal.",
   "globalSearch-instructions-notes-5": "Zur Zeit werden keine archivierten Karten gefunden.",
   "globalSearch-instructions-notes-5": "Zur Zeit werden keine archivierten Karten gefunden.",
   "link-to-search": "Link auf diese Suche",
   "link-to-search": "Link auf diese Suche",

+ 2 - 2
i18n/fr.i18n.json

@@ -601,8 +601,8 @@
   "minutes": "minutes",
   "minutes": "minutes",
   "seconds": "secondes",
   "seconds": "secondes",
   "show-field-on-card": "Afficher ce champ sur la carte",
   "show-field-on-card": "Afficher ce champ sur la carte",
-  "automatically-field-on-card": "Add field to new cards",
-  "always-field-on-card": "Add field to all cards",
+  "automatically-field-on-card": "Ajouter le champ aux cartes nouvellement créées",
+  "always-field-on-card": "Ajouter le champ à toutes les cartes",
   "showLabel-field-on-card": "Indiquer l'étiquette du champ sur la mini-carte",
   "showLabel-field-on-card": "Indiquer l'étiquette du champ sur la mini-carte",
   "yes": "Oui",
   "yes": "Oui",
   "no": "Non",
   "no": "Non",

+ 2 - 2
i18n/he.i18n.json

@@ -601,8 +601,8 @@
   "minutes": "דקות",
   "minutes": "דקות",
   "seconds": "שניות",
   "seconds": "שניות",
   "show-field-on-card": "הצגת שדה זה בכרטיס",
   "show-field-on-card": "הצגת שדה זה בכרטיס",
-  "automatically-field-on-card": "Add field to new cards",
-  "always-field-on-card": "Add field to all cards",
+  "automatically-field-on-card": "הוספת שדה לכרטיסים חדשים",
+  "always-field-on-card": "הוספת שדה לכל הכרטיסים",
   "showLabel-field-on-card": "הצגת תווית של השדה בכרטיס מוקטן",
   "showLabel-field-on-card": "הצגת תווית של השדה בכרטיס מוקטן",
   "yes": "כן",
   "yes": "כן",
   "no": "לא",
   "no": "לא",

+ 7 - 7
i18n/pl.i18n.json

@@ -601,8 +601,8 @@
   "minutes": "minut",
   "minutes": "minut",
   "seconds": "sekund",
   "seconds": "sekund",
   "show-field-on-card": "Pokaż te pole na karcie",
   "show-field-on-card": "Pokaż te pole na karcie",
-  "automatically-field-on-card": "Add field to new cards",
-  "always-field-on-card": "Add field to all cards",
+  "automatically-field-on-card": "Dodaj pole do nowych kart",
+  "always-field-on-card": "Dodaj pole do wszystkich kart",
   "showLabel-field-on-card": "Pokaż pole etykiety w minikarcie",
   "showLabel-field-on-card": "Pokaż pole etykiety w minikarcie",
   "yes": "Tak",
   "yes": "Tak",
   "no": "Nie",
   "no": "Nie",
@@ -896,10 +896,10 @@
   "operator-assignee-abbrev": "p",
   "operator-assignee-abbrev": "p",
   "operator-is": "jest",
   "operator-is": "jest",
   "operator-due": "wykonania",
   "operator-due": "wykonania",
-  "operator-created": "created",
-  "operator-modified": "modified",
+  "operator-created": "stworzono",
+  "operator-modified": "zmodyfikowano",
   "operator-unknown-error": "%s nie jest operatorem",
   "operator-unknown-error": "%s nie jest operatorem",
-  "operator-number-expected": "operator __operator__ expected a number, got '__value__'",
+  "operator-number-expected": "operator __operator__ oczekiwał wartości cyfrowej, otrzymał '__value__'",
   "heading-notes": "Notatki",
   "heading-notes": "Notatki",
   "globalSearch-instructions-heading": "Instrukcja wyszukiwania",
   "globalSearch-instructions-heading": "Instrukcja wyszukiwania",
   "globalSearch-instructions-description": "W wyszukiwanym ciągu można umieszczać specjalne klucze, aby doprecyzować zapytanie. Klucz składa się z operatora i argumentu, rozdzielonych dwukropkiem. Na przykład klucz `lista:Wstrzymane` zawęża wyszukiwanie do kart znajdujących się na listach o nazwie *Wstrzymane*. Jeśli argument zawiera spacje lub znaki specjalne, należy go umieścić w cudzysłowie, np. `__operator_list__:\"Do uzgodnienia\"`.",
   "globalSearch-instructions-description": "W wyszukiwanym ciągu można umieszczać specjalne klucze, aby doprecyzować zapytanie. Klucz składa się z operatora i argumentu, rozdzielonych dwukropkiem. Na przykład klucz `lista:Wstrzymane` zawęża wyszukiwanie do kart znajdujących się na listach o nazwie *Wstrzymane*. Jeśli argument zawiera spacje lub znaki specjalne, należy go umieścić w cudzysłowie, np. `__operator_list__:\"Do uzgodnienia\"`.",
@@ -921,6 +921,6 @@
   "link-to-search": "Link do tego wyszukiwania",
   "link-to-search": "Link do tego wyszukiwania",
   "excel-font": "Arial",
   "excel-font": "Arial",
   "number": "Numer",
   "number": "Numer",
-  "label-colors": "Label Colors",
-  "label-names": "Label Names"
+  "label-colors": "Kolory etykiet",
+  "label-names": "Nazwy etykiet"
 }
 }

+ 1 - 1
package-lock.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "wekan",
   "name": "wekan",
-  "version": "v4.85.0",
+  "version": "v4.87.0",
   "lockfileVersion": 1,
   "lockfileVersion": 1,
   "requires": true,
   "requires": true,
   "dependencies": {
   "dependencies": {

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "wekan",
   "name": "wekan",
-  "version": "v4.85.0",
+  "version": "v4.87.0",
   "description": "Open-Source kanban",
   "description": "Open-Source kanban",
   "private": true,
   "private": true,
   "scripts": {
   "scripts": {

+ 2 - 2
packages/wekan-ldap/server/ldap.js

@@ -19,7 +19,7 @@ export default class LDAP {
       idle_timeout                       : this.constructor.settings_get('LDAP_IDLE_TIMEOUT'),
       idle_timeout                       : this.constructor.settings_get('LDAP_IDLE_TIMEOUT'),
       encryption                         : this.constructor.settings_get('LDAP_ENCRYPTION'),
       encryption                         : this.constructor.settings_get('LDAP_ENCRYPTION'),
       ca_cert                            : this.constructor.settings_get('LDAP_CA_CERT'),
       ca_cert                            : this.constructor.settings_get('LDAP_CA_CERT'),
-      reject_unauthorized                : this.constructor.settings_get('LDAP_REJECT_UNAUTHORIZED') || false,
+      reject_unauthorized                : this.constructor.settings_get('LDAP_REJECT_UNAUTHORIZED') || true,
       Authentication                     : this.constructor.settings_get('LDAP_AUTHENTIFICATION'),
       Authentication                     : this.constructor.settings_get('LDAP_AUTHENTIFICATION'),
       Authentication_UserDN              : this.constructor.settings_get('LDAP_AUTHENTIFICATION_USERDN'),
       Authentication_UserDN              : this.constructor.settings_get('LDAP_AUTHENTIFICATION_USERDN'),
       Authentication_Password            : this.constructor.settings_get('LDAP_AUTHENTIFICATION_PASSWORD'),
       Authentication_Password            : this.constructor.settings_get('LDAP_AUTHENTIFICATION_PASSWORD'),
@@ -100,7 +100,7 @@ export default class LDAP {
 
 
     if (this.options.ca_cert && this.options.ca_cert !== '') {
     if (this.options.ca_cert && this.options.ca_cert !== '') {
       // Split CA cert into array of strings
       // Split CA cert into array of strings
-      const chainLines = this.constructor.settings_get('LDAP_CA_CERT').split('\n');
+      const chainLines = this.constructor.settings_get('LDAP_CA_CERT').replace(/\\n/g,'\n').split('\n');
       let cert         = [];
       let cert         = [];
       const ca         = [];
       const ca         = [];
       chainLines.forEach((line) => {
       chainLines.forEach((line) => {

+ 2 - 2
public/api/wekan.html

@@ -1524,7 +1524,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
 	  	<ul class="toc-list-h1">
 	  	<ul class="toc-list-h1">
         
         
           <li>
           <li>
-            <a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v4.85">Wekan REST API v4.85</a>
+            <a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v4.87">Wekan REST API v4.87</a>
             
             
           </li>
           </li>
         
         
@@ -1982,7 +1982,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
     <div class="page-wrapper">
     <div class="page-wrapper">
       <div class="dark-box"></div>
       <div class="dark-box"></div>
       <div class="content">
       <div class="content">
-        <h1 id="wekan-rest-api">Wekan REST API v4.85</h1>
+        <h1 id="wekan-rest-api">Wekan REST API v4.87</h1>
 <blockquote>
 <blockquote>
 <p>Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.</p>
 <p>Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.</p>
 </blockquote>
 </blockquote>

+ 1 - 1
public/api/wekan.yml

@@ -1,7 +1,7 @@
 swagger: '2.0'
 swagger: '2.0'
 info:
 info:
   title: Wekan REST API
   title: Wekan REST API
-  version: v4.85
+  version: v4.87
   description: |
   description: |
     The REST API allows you to control and extend Wekan with ease.
     The REST API allows you to control and extend Wekan with ease.
 
 

二进制
public/maskable_icon.png


二进制
public/monochrome-icon-512x512.png


二进制
public/screenshot1.webp


二进制
public/screenshot2.webp


+ 28 - 1
public/site.webmanifest

@@ -26,10 +26,37 @@
             "src": "/StoreLogo.scale-100.png",
             "src": "/StoreLogo.scale-100.png",
             "sizes": "50x50",
             "sizes": "50x50",
             "type": "image/png"
             "type": "image/png"
+        },
+        {
+            "src": "/maskable_icon.png",
+            "sizes": "474x474",
+            "type": "image/png",
+            "purpose": "maskable"
+        },
+        {
+            "src": "/monochrome-icon-512x512.png",
+            "sizes": "512x512",
+            "type": "image/png",
+            "purpose": "monochrome"
         }
         }
     ],
     ],
+    "screenshots" : [
+      {
+        "src": "/screenshot1.webp",
+        "sizes": "1280x720",
+        "type": "image/webp"
+      },
+      {
+        "src": "/screenshot2.webp",
+        "sizes": "1280x720",
+        "type": "image/webp"
+      }
+    ],
     "theme_color": "#ffffff",
     "theme_color": "#ffffff",
     "background_color": "#ffffff",
     "background_color": "#ffffff",
     "start_url": "/sign-in",
     "start_url": "/sign-in",
-    "display": "standalone"
+    "display": "standalone",
+    "orientation": "any",
+    "categories": ["productivity"],
+    "iarc_rating_id": "70d7c4a4-3e5a-4714-a7dc-fa006613ba96"
 }
 }

+ 1 - 1
rebuild-wekan.sh

@@ -28,7 +28,7 @@ do
 			#curl -0 -L https://npmjs.org/install.sh | sudo sh
 			#curl -0 -L https://npmjs.org/install.sh | sudo sh
 			#sudo chown -R $(id -u):$(id -g) $HOME/.npm
 			#sudo chown -R $(id -u):$(id -g) $HOME/.npm
 			sudo npm -g install n
 			sudo npm -g install n
-			sudo n 12.20.0
+			sudo n 12.20.1
 			#curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
 			#curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
 			#sudo apt-get install -y nodejs
 			#sudo apt-get install -y nodejs
 		elif [[ "$OSTYPE" == "darwin"* ]]; then
 		elif [[ "$OSTYPE" == "darwin"* ]]; then

+ 10 - 1
releases/release-bundle.sh

@@ -1,7 +1,16 @@
 cd ~/repos/wekan
 cd ~/repos/wekan
+sudo apt -y install parallel
 ./releases/rebuild-release.sh
 ./releases/rebuild-release.sh
 #./releases/delete-phantomjs.sh
 #./releases/delete-phantomjs.sh
 cd ~/repos/wekan/.build
 cd ~/repos/wekan/.build
 zip -r wekan-$1.zip bundle
 zip -r wekan-$1.zip bundle
-scp wekan-$1.zip x2:/var/snap/wekan/common/releases.wekan.team/
+
+{
+    scp wekan-$1.zip x2:/var/snap/wekan/common/releases.wekan.team/
+    scp wekan-$1.zip a:/home/wekan/repos/ && ssh a ' sudo npm -g install npm' && ssh a './maintainer-make-release.sh $1' && scp a:/home/wekan/repos/wekan-$1-arm64.zip . && scp wekan-$1-arm64.zip x2:/var/snap/wekan/common/releases.wekan.team/raspi3/
+    scp wekan-$1.zip s:/home/linux1/ && ssh s 'sudo npm -g install npm ' && ssh s './maintainer-make-release.sh $1' && scp s:/home/linux1/wekan-$1-s390x.zip . && scp wekan-$1-s390x.zip x2:/var/snap/wekan/common/releases.wekan.team/s390x/
+    scp wekan-$1.zip openpower:/home/ubuntu/ && ssh openpower './maintainer-make-release.sh $1' && scp openpower:/home/ubuntu/wekan-$1-ppc64le.zip . && scp wekan-$1-ppc64le.zip x2:/var/snap/wekan/common/releases.wekan.team/ppc64le/
+    sudo systemctl enable sandstorm && sudo sandstorm start && rm -rf ~/sandbuild && sudo mkdir -p /usr/local/lib/node_modules/fibers/.node-gyp && mkdir -p ~/sandbuild && cp -pR ~/repos/wekan ~/sandbuild/ && rm -rf ~/sandbuild/wekan/.meteor-spk && cd ~/sandbuild/wekan/.build/bundle/programs/server && npm install node-gyp node-pre-gyp fibers && cd ~/sandbuild/wekan && meteor-spk pack wekan-$1.spk && spk publish wekan-$1.spk && cd ~/repos/wekan && sudo sandstorm stop && sudo systemctl disable sandstorm && cd ~/repos/wekan
+} | parallel -k
+
 cd ..
 cd ..

+ 2 - 2
sandstorm-pkgdef.capnp

@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
     appTitle = (defaultText = "Wekan"),
     appTitle = (defaultText = "Wekan"),
     # The name of the app as it is displayed to the user.
     # The name of the app as it is displayed to the user.
 
 
-    appVersion = 485,
+    appVersion = 487,
     # Increment this for every release.
     # Increment this for every release.
 
 
-    appMarketingVersion = (defaultText = "4.85.0~2021-01-23"),
+    appMarketingVersion = (defaultText = "4.87.0~2021-01-26"),
     # Human-readable presentation of the app version.
     # Human-readable presentation of the app version.
 
 
     minUpgradableAppVersion = 0,
     minUpgradableAppVersion = 0,