Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5edbd0f31c | ||
|
|
9f0ba0f67e | ||
|
|
4a0ad12f3a | ||
|
|
e52706a48e | ||
|
|
5d4f48662a | ||
|
|
619c589bc8 | ||
|
|
31e18663bd | ||
|
|
2a21b6c142 | ||
|
|
e1cbd3936f | ||
|
|
99c6aa8512 | ||
|
|
2ad863a854 | ||
|
|
c7ba1dea21 | ||
|
|
e4a65b3a23 | ||
|
|
385bf0d023 | ||
|
|
2d4638ab7f | ||
|
|
e40664533d | ||
|
|
f152f8156f | ||
|
|
b206a4e955 | ||
|
|
a18c429fee | ||
|
|
420e3f3586 |
@@ -1,8 +1,5 @@
|
||||
{
|
||||
"presets": [
|
||||
"module:metro-react-native-babel-preset"
|
||||
],
|
||||
"plugins": [
|
||||
"react-native-reanimated/plugin"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
status-im.utils.build/warning-handler
|
||||
status-im.utils.build/get-current-sha
|
||||
status-im.ethereum.resolver/name
|
||||
status-im.chat.constants/spacing-char
|
||||
status-im.chat.constants/arg-wrapping-char
|
||||
status-im.ios.core/init
|
||||
@@ -30,7 +31,7 @@ reagent.dom/dom-node
|
||||
reagent.dom/force-update-all
|
||||
status-im.multiaccounts.create.core/get-new-key-code
|
||||
status-im.ethereum.decode/string
|
||||
status-im.ui.screens.network.views/mainnet?
|
||||
status-im.network.ui.views/mainnet?
|
||||
status-im.data-store.chats/event->string
|
||||
status-im.mailserver.constants/seven-days
|
||||
status-im.mailserver.constants/connection-timeout
|
||||
@@ -64,7 +65,7 @@ mocks.js-dependencies/emoji-picker
|
||||
mocks.js-dependencies/i18n
|
||||
mocks.js-dependencies/qr-code
|
||||
mocks.js-dependencies/svg
|
||||
mocks.js-dependencies/icons
|
||||
mocks.js-dependencies/vector-icons
|
||||
mocks.js-dependencies/webview
|
||||
mocks.js-dependencies/desktop-linking
|
||||
mocks.js-dependencies/desktop-shortcuts
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{:lint-as {status-im.utils.views/defview clojure.core/defn
|
||||
status-im.utils.views/letsubs clojure.core/let
|
||||
reagent.core/with-let clojure.core/let
|
||||
status-im.utils.fx/defn clj-kondo.lint-as/def-catch-all
|
||||
quo.react/with-deps-check clojure.core/fn
|
||||
quo.previews.preview/list-comp clojure.core/for
|
||||
|
||||
@@ -13,7 +13,7 @@ update_configs:
|
||||
update_type: "security"
|
||||
# Keep /mobile/js_files/yarn.lock up to date, batching pull requests weekly
|
||||
- package_manager: "javascript"
|
||||
directory: "/"
|
||||
directory: "/mobile/js_files"
|
||||
update_schedule: "weekly"
|
||||
allowed_updates:
|
||||
- match:
|
||||
|
||||
@@ -2,6 +2,7 @@ CACHED_WEBVIEWS_ENABLED=1
|
||||
DEBUG_WEBVIEW=1
|
||||
DEFAULT_NETWORK=mainnet_rpc
|
||||
DEV_BUILD=1
|
||||
ERC20_CONTRACT_WARNINGS=0
|
||||
ETHEREUM_DEV_CLUSTER=1
|
||||
EXTENSIONS=0
|
||||
FLEET=eth.prod
|
||||
@@ -21,14 +22,6 @@ STATUS_GO_ENABLE_NIMBUS=0
|
||||
KEYCARD_TEST_MENU=0
|
||||
QR_READ_TEST_MENU=1
|
||||
ENABLE_ROOT_ALERT=1
|
||||
ENABLE_REFERRAL_INVITE=1
|
||||
ENABLE_QUO_PREVIEW=1
|
||||
MAX_IMAGES_BATCH=5
|
||||
APN_TOPIC=im.status.ethereum.pr
|
||||
COMMUNITIES_ENABLED=1
|
||||
DATABASE_MANAGEMENT_ENABLED=1
|
||||
DELETE_MESSAGE_ENABLED=1
|
||||
COLLECTIBLES_ENABLED=1
|
||||
COMMANDS_ENABLED=1
|
||||
TWO_MINUTES_SYNCING=1
|
||||
SWAP_ENABLED=1
|
||||
STICKERS_TEST_ENABLED=1
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
DEBUG_WEBVIEW=1
|
||||
DEFAULT_NETWORK=goerli_rpc
|
||||
DEFAULT_NETWORK=testnet_rpc
|
||||
ERC20_CONTRACT_WARNINGS=1
|
||||
ETHEREUM_DEV_CLUSTER=1
|
||||
EXTENSIONS=0
|
||||
FLEET=eth.staging
|
||||
GROUP_CHATS_ENABLED=1
|
||||
LOG_LEVEL=debug
|
||||
LOG_LEVEL=info
|
||||
MAILSERVER_CONFIRMATIONS_ENABLED=0
|
||||
PAIRING_POPUP_DISABLED=1
|
||||
PFS_ENCRYPTION_ENABLED=1
|
||||
@@ -21,14 +22,5 @@ COMMANDS_ENABLED=1
|
||||
KEYCARD_TEST_MENU=1
|
||||
QR_READ_TEST_MENU=1
|
||||
ENABLE_ROOT_ALERT=0
|
||||
MAX_IMAGES_BATCH=5
|
||||
ENABLE_REFERRAL_INVITE=1
|
||||
APN_TOPIC=im.status.ethereum.pr
|
||||
VERIFY_TRANSACTION_CHAIN_ID=5
|
||||
VERIFY_ENS_CHAIN_ID=5
|
||||
TEST_STATEOFUS=1
|
||||
DATABASE_MANAGEMENT_ENABLED=1
|
||||
COMMUNITIES_ENABLED=1
|
||||
COMMUNITIES_MANAGEMENT_ENABLED=1
|
||||
DELETE_MESSAGE_ENABLED=1
|
||||
TWO_MINUTES_SYNCING=1
|
||||
STICKERS_TEST_ENABLED=1
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
CACHED_WEBVIEWS_ENABLED=1
|
||||
DEBUG_WEBVIEW=1
|
||||
DEFAULT_NETWORK=goerli_rpc
|
||||
DEFAULT_NETWORK=mainnet_rpc
|
||||
ERC20_CONTRACT_WARNINGS=0
|
||||
ETHEREUM_DEV_CLUSTER=1
|
||||
EXTENSIONS=0
|
||||
FLEET=eth.prod
|
||||
GROUP_CHATS_ENABLED=1
|
||||
LOG_LEVEL=debug
|
||||
LOG_LEVEL=info
|
||||
MAILSERVER_CONFIRMATIONS_ENABLED=1
|
||||
MAINNET_WARNING_ENABLED=1
|
||||
PFS_ENCRYPTION_ENABLED=1
|
||||
@@ -17,20 +18,8 @@ RPC_NETWORKS_ONLY=0
|
||||
PARTITIONED_TOPIC=0
|
||||
CONTRACT_NODES=1
|
||||
STATUS_GO_ENABLE_NIMBUS=0
|
||||
COMMANDS_ENABLED=1
|
||||
KEYCARD_TEST_MENU=0
|
||||
ENABLE_ROOT_ALERT=1
|
||||
ENABLE_REFERRAL_INVITE=1
|
||||
DISABLE_WALLET_ON_MOBILE_NETWORK=1
|
||||
APN_TOPIC=im.status.ethereum.pr
|
||||
VERIFY_TRANSACTION_CHAIN_ID=5
|
||||
VERIFY_ENS_CHAIN_ID=5
|
||||
TEST_STATEOFUS=1
|
||||
BLANK_PREVIEW=0
|
||||
MAX_IMAGES_BATCH=5
|
||||
DATABASE_MANAGEMENT_ENABLED=1
|
||||
COMMUNITIES_ENABLED=1
|
||||
COMMUNITIES_MANAGEMENT_ENABLED=1
|
||||
DELETE_MESSAGE_ENABLED=1
|
||||
TWO_MINUTES_SYNCING=1
|
||||
ENABLE_QUO_PREVIEW=1
|
||||
STICKERS_TEST_ENABLED=1
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
DEBUG_WEBVIEW=1
|
||||
DEFAULT_NETWORK=mainnet_rpc
|
||||
ERC20_CONTRACT_WARNINGS=0
|
||||
ETHEREUM_DEV_CLUSTER=1
|
||||
EXTENSIONS=0
|
||||
FLEET=eth.prod
|
||||
@@ -12,13 +13,8 @@ PFS_TOGGLE_VISIBLE=1
|
||||
POW_TARGET=0.002
|
||||
POW_TIME=1
|
||||
SNOOPY=0
|
||||
KEYCARD_TEST_MENU=0
|
||||
RPC_NETWORKS_ONLY=0
|
||||
PARTITIONED_TOPIC=0
|
||||
CONTRACT_NODES=1
|
||||
ENABLE_ROOT_ALERT=1
|
||||
MAX_IMAGES_BATCH=5
|
||||
BLANK_PREVIEW=0
|
||||
COMMUNITIES_ENABLED=1
|
||||
DATABASE_MANAGEMENT_ENABLED=1
|
||||
DELETE_MESSAGE_ENABLED=1
|
||||
ENABLE_REFERRAL_INVITE=1
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
DEBUG_WEBVIEW=0
|
||||
DEFAULT_NETWORK=mainnet_rpc
|
||||
ERC20_CONTRACT_WARNINGS=0
|
||||
ETHEREUM_DEV_CLUSTER=0
|
||||
EXTENSIONS=0
|
||||
FLEET=eth.prod
|
||||
@@ -12,10 +13,7 @@ PFS_TOGGLE_VISIBLE=0
|
||||
POW_TARGET=0.002
|
||||
POW_TIME=1
|
||||
SNOOPY=0
|
||||
KEYCARD_TEST_MENU=0
|
||||
RPC_NETWORKS_ONLY=1
|
||||
PARTITIONED_TOPIC=0
|
||||
ENABLE_ROOT_ALERT=1
|
||||
MAX_IMAGES_BATCH=1
|
||||
DELETE_MESSAGE_ENABLED=1
|
||||
COLLECTIBLES_ENABLED=1
|
||||
ENABLE_REFERRAL_INVITE=0
|
||||
|
||||
@@ -94,4 +94,4 @@ suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(<VERSION>\\)? *\\(site=[a-z,_]*
|
||||
suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
|
||||
|
||||
[version]
|
||||
^0.122.0
|
||||
^0.105.0
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
# the repo. Unless a later match takes precedence,
|
||||
# @global-owner1 and @global-owner2 will be requested for
|
||||
# review when someone opens a pull request.
|
||||
* @status-im/status-core
|
||||
|
||||
/ci @jakubgs
|
||||
/fastlane @jakubgs
|
||||
/scripts @jakubgs
|
||||
@@ -22,4 +24,12 @@
|
||||
|
||||
/components @status-im/status-core-ui
|
||||
|
||||
/test/appium/ @churik
|
||||
desktop/ @vkjr
|
||||
modules/react-native-desktop*/ @vkjr
|
||||
modules/react-native-desktop*/ @vkjr
|
||||
|
||||
/doc @oskarth @yenda @jeluard
|
||||
|
||||
/deployment @vkjr
|
||||
|
||||
/test/appium/ @antdanchenko @churik
|
||||
|
||||
@@ -8,9 +8,10 @@ These are just guidelines, not rules. Use your best judgment, and feel free to p
|
||||
|
||||
#### What should I know before I get started?
|
||||
|
||||
* [Mission and Principles](https://status.im/about)
|
||||
* [Mission and Core Values](https://status.im/contribute)
|
||||
* [Principles](https://status.im/contribute/our_principles.html)
|
||||
* [Read our FAQ](https://status.im/docs/FAQs.html)
|
||||
* [Join our Chat](http://join.status.im/chat/public/status-core-dev)
|
||||
* [Developer Introduction](https://status.im/developer_tools/)
|
||||
* [Build Status Yourself](https://status.im/technical/build_status)
|
||||
* [Build Status Yourself](https://status.im/build_status)
|
||||
* [Find issues to work on](https://github.com/status-im/)
|
||||
|
||||
@@ -9,27 +9,46 @@ assignees: ''
|
||||
|
||||
# Bug Report
|
||||
|
||||
## Problem
|
||||
|
||||
## Problem
|
||||
[comment]: # (A problem description)
|
||||
|
||||
An overview of the background required to understand the problem.
|
||||
A problem description.
|
||||
|
||||
#### Expected behavior
|
||||
|
||||
[comment]: # (Describe what you expected to happen. Please include designs if possible.)
|
||||
|
||||
#### Actual behavior
|
||||
|
||||
[comment]: # (Describe what actually happened. Please include screenshots if possible.)
|
||||
|
||||
#### Notes
|
||||
|
||||
For the developer who will be investigating. Is it related to another PR? Tips on where to start?
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
Rules for the future PR to be accepted.
|
||||
|
||||
### Reproduction
|
||||
|
||||
1) Open Status
|
||||
2)
|
||||
[comment]: # (Describe how we can replicate the bug step by step.)
|
||||
|
||||
- Open Status
|
||||
- ...
|
||||
- Step 3, etc.
|
||||
|
||||
### Additional Information
|
||||
|
||||
- Status version: nightly
|
||||
- Operating System: Android, iOS
|
||||
[comment]: # (Please do your best to fill this out.)
|
||||
- Status version: ...
|
||||
[comment]: # (Android or iOS.)
|
||||
- Operating System: <Android|iOS>
|
||||
|
||||
#### Logs
|
||||
|
||||
[comment]: # (Please, add logs/notes if necessary)
|
||||
[comment]: # (if on Android please replicate bug whilst running adb logcat)
|
||||
|
||||
```
|
||||
...
|
||||
```
|
||||
|
||||
@@ -1,77 +0,0 @@
|
||||
---
|
||||
name: Release umbrella issue
|
||||
about: Release Issue
|
||||
title: 'Mobile release '
|
||||
labels: release
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
Issue to manage mobile release <version>
|
||||
|
||||
### Scope
|
||||
[comment]: # (Add milestone from github)
|
||||
https://github.com/status-im/status-mobile/milestone/
|
||||
|
||||
- release notes:
|
||||
- release branch:
|
||||
|
||||
|
||||
### Testing info
|
||||
[comment]: # (TestRail info, added by QA)
|
||||
Main test suite:
|
||||
Upgrade (e2e):
|
||||
|
||||
### Builds in TestFlight and PlayStore to push as a release
|
||||
[comment]: # (Will be added by QA after testing approving of build)
|
||||
|
||||
### Process
|
||||
#### 1) Kick-off
|
||||
- [ ] 1. Translation PRs is merged before cutting branch (Jinho)
|
||||
- [ ] 2. Prepare scope of visible changes based on commits history, started from previous release branch cut ([guide](https://notes.status.im/how-to-prepare-release-notes))
|
||||
- [ ] 3. Update [RELEASES.md](https://github.com/status-im/status-mobile/blob/develop/RELEASES.md) with release notes (make PR based on previous step)
|
||||
- [ ] 4. Create release branch using this [guide](https://github.com/status-im/status-mobile/blob/develop/doc/RELEASE_GUIDE.md), bump VERSION (merge created PR ([example](https://github.com/status-im/status-mobile/pull/12504) ) to develop) and get successful release builds (so, testing can be started)
|
||||
- [ ] 5. Based on release scope, ask for comms (Jonny)
|
||||
- [ ] 6. Make sure that assets (screenshots, video) in stores are up-to-date, more info [here](https://notes.status.im/how-to-update-assets)
|
||||
|
||||
#### 2) Testing
|
||||
[comment]: # (Section will be maintained by QA)
|
||||
- [ ] Dogfooding (add notes, if it was held)
|
||||
- [ ] Regression testing for release candidate build
|
||||
- [ ] Upgrade tests
|
||||
- [ ] Fix known blocker(s) found during regression testing
|
||||
|
||||
##### Blockers
|
||||
[comment]: # (Section for blocker issues; should be fixed and merged by release-manager. Remove if no blockers found)
|
||||
- [ ] 1 blocker:
|
||||
|
||||
=============================================================================================
|
||||
|
||||
- [ ] Cherry-pick fix(es) to the release branch
|
||||
- [ ] Verify fix(es) on new release candidate build
|
||||
- [ ] Retest
|
||||
- [ ] Keep release build forever (button in Jenkins)
|
||||
|
||||
#### 3) Submission
|
||||
|
||||
- [ ] 1. Prepare PR for F-droid build ([instruction]( https://github.com/status-im/status-mobile/blob/develop/doc/FDROID.md))
|
||||
- [ ] 2. Release notes written and added (500 character limit for updates (Android) and PR for [RELEASES.md](https://github.com/status-im/status-mobile/blob/develop/RELEASES.md) is ready to be merged (from 1.3 step)
|
||||
- [ ] 3. Submit beta version for Android (Open Testing in Play Store)
|
||||
- [ ] 4. Submit iOS build to Apple review ([instruction](https://drive.google.com/file/d/10Cl7PBB7TFPkZiVbfzdFGpfMRP9bxXuq/view?usp=sharing), be careful - low quality of audio)
|
||||
- [ ] 5. Play store content reviewed and updated
|
||||
- [ ] 6. Privacy policy reviewed and updated (ask in channel)
|
||||
- [ ] 7. Countries to be excluded (ask in channel)
|
||||
- [ ] 8. Changes to our FAQ made (should be checked and if any changes needed, ask Jakub to made them)
|
||||
|
||||
|
||||
#### 4) Before publishing
|
||||
- [ ] 1. Translations for comms available (marketing, ask in the channel)
|
||||
- [ ] 2. Promotional content ready (marketing, ask in channel)
|
||||
- [ ] 3. Upload builds for DO store, https://dev.status.im/ (Jakub)
|
||||
|
||||
#### 5) At time of publishing
|
||||
- [ ] 1. Notify marketing to push comms and blog post (Jonny + get review on blog from QA team)
|
||||
- [ ] 2. Publish release to app store and playstore
|
||||
- [ ] 3. Final push to update prod site https://status.im/, [instructions](https://github.com/status-im/infra-docs/blob/master/articles/status_release_upload.md) (Jakub - requires credentials to upload)
|
||||
- [ ] 4. Add the link to the post about the release and publish the release: https://github.com/status-im/status-mobile/releases (Jakub)
|
||||
- [ ] 5. Merge PR for updating [RELEASES.md](https://github.com/status-im/status-mobile/blob/develop/RELEASES.md) (from 1.3 step)
|
||||
|
||||
@@ -5,13 +5,12 @@ project-board:
|
||||
min-reviewers: 1
|
||||
tested-pr-label-name: 'Tested - Issues'
|
||||
contributor-column-name: 'CONTRIBUTOR'
|
||||
to-rebase-column-name: 'TO REBASE'
|
||||
review-column-name: 'REVIEW'
|
||||
test-column-name: 'E2E Tests'
|
||||
|
||||
automated-tests:
|
||||
repo-full-name: 'status-im/status-mobile'
|
||||
job-full-name: 'status-mobile/e2e/status-app-prs'
|
||||
repo-full-name: 'status-im/status-react'
|
||||
job-full-name: 'end-to-end-tests/status-app-prs'
|
||||
kickoff-column-name: 'E2E Tests'
|
||||
|
||||
github-team:
|
||||
|
||||
@@ -39,8 +39,8 @@ local.properties
|
||||
.tags*
|
||||
|
||||
# VS Code
|
||||
.vscode/
|
||||
workspace.code-workspace
|
||||
.vscode/ipch/
|
||||
.vscode/settings.json
|
||||
|
||||
# node.js
|
||||
#
|
||||
@@ -95,7 +95,6 @@ doo-index.html
|
||||
|
||||
# Status
|
||||
Statusgo.framework
|
||||
Statusgo.xcframework
|
||||
|
||||
#ios
|
||||
/ios/Pods/
|
||||
@@ -166,12 +165,3 @@ trace.edn
|
||||
|
||||
/app/
|
||||
project.clj
|
||||
|
||||
##appium
|
||||
test/appium/report/
|
||||
result.xml
|
||||
test/appium/tests/users.py
|
||||
|
||||
##node bindings
|
||||
/bin/
|
||||
/lib/
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
module.exports = {
|
||||
bracketSpacing: false,
|
||||
bracketSameLine: true,
|
||||
jsxBracketSameLine: true,
|
||||
singleQuote: true,
|
||||
trailingComma: 'all',
|
||||
tabWidth: 4,
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"files.associations": {
|
||||
"*.android": "groovy",
|
||||
"*.ios": "groovy",
|
||||
"*.linux": "groovy",
|
||||
"*.macos": "groovy",
|
||||
"*.windows": "groovy",
|
||||
"*.nix-cache": "groovy",
|
||||
},
|
||||
}
|
||||
@@ -131,9 +131,9 @@ TODO: update once bug is fixed for Android that causes crash when app is back fr
|
||||
## "react-native-shake": "^3.3.1"
|
||||
|
||||
used to send email to support when phone is shaked
|
||||
## "react-native-lottie-splash-screen": "^1.0.1"
|
||||
## "react-native-splash-screen": "^3.2.0"
|
||||
|
||||
used to make splash screen with lottie animation during initial loading for android, also used as replacement of "react-native-splash-screen" for iOS
|
||||
used to make splash screen during initial loading
|
||||
|
||||
## "react-native-status-keycard": "^2.5.7"
|
||||
|
||||
@@ -160,11 +160,3 @@ fixed because even bugfix version upgrade causes runtime errors with current ver
|
||||
## "web3-utils": "^1.2.1"
|
||||
|
||||
used for some abi encoding primitives
|
||||
|
||||
## "rn-emoji-keyboard": "https://github.com/status-im/rn-emoji-keyboard"
|
||||
|
||||
Used for taking emoji input, for custom emoji thumbnails for community channels
|
||||
|
||||
## "react-native-draggable-flatlist": "https://github.com/computerjazz/react-native-draggable-flatlist"
|
||||
|
||||
A drag-and-drop-enabled FlatList component for React Native
|
||||
@@ -1,4 +1,4 @@
|
||||
.PHONY: nix-add-gcroots clean nix-clean run-metro test release _list _fix-node-perms _tmpdir-mk _tmpdir-rm _install-hooks
|
||||
.PHONY: nix-add-gcroots clean nix-clean run-metro test release _list _fix-node-perms _tmpdir-mk _tmpdir-rm
|
||||
|
||||
help: SHELL := /bin/sh
|
||||
help: ##@other Show this help
|
||||
@@ -32,19 +32,17 @@ ifndef BUILD_TAG
|
||||
export BUILD_TAG := $(shell git rev-parse --short HEAD)
|
||||
endif
|
||||
|
||||
# We don't want to use /run/user/$UID because it runs out of space too easilly.
|
||||
export TMPDIR = /tmp/tmp-status-mobile-$(BUILD_TAG)
|
||||
# This has to be specified for both the Node.JS server process and the Qt process.
|
||||
# We don't want to use /run/user/$UID because it runs out of space too easilly
|
||||
export TMPDIR = /tmp/tmp-status-react-$(BUILD_TAG)
|
||||
# this has to be specified for both the Node.JS server process and the Qt process
|
||||
export REACT_SERVER_PORT ?= 5001
|
||||
# The path can be anything, but home is usually safest.
|
||||
export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore
|
||||
|
||||
# Our custom config is located in nix/nix.conf
|
||||
export NIX_CONF_DIR = $(PWD)/nix
|
||||
# Location of symlinks to derivations that should not be garbage collected
|
||||
export _NIX_GCROOTS = /nix/var/nix/gcroots/per-user/$(USER)/status-mobile
|
||||
export _NIX_GCROOTS = /nix/var/nix/gcroots/per-user/$(USER)/status-react
|
||||
# Defines which variables will be kept for Nix pure shell, use semicolon as divider
|
||||
export _NIX_KEEP ?= TMPDIR,BUILD_ENV,STATUS_GO_SRC_OVERRIDE
|
||||
export _NIX_KEEP ?= TMPDIR,BUILD_ENV,STATUS_GO_SRC_OVERRIDE,NIMBUS_SRC_OVERRIDE
|
||||
|
||||
# Useful for Andoird release builds
|
||||
TMP_BUILD_NUMBER := $(shell ./scripts/version/gen_build_no.sh | cut -c1-10)
|
||||
@@ -59,10 +57,13 @@ endif
|
||||
# Nix targets
|
||||
#----------------
|
||||
|
||||
# WARNING: This has to be located right before all the targets.
|
||||
# WARNING: This has to be located right before the targets
|
||||
ifdef IN_NIX_SHELL
|
||||
SHELL := env bash
|
||||
else
|
||||
SHELL := ./nix/scripts/shell.sh
|
||||
endif
|
||||
|
||||
shell: export TARGET ?= default
|
||||
shell: ##@prepare Enter into a pre-configured shell
|
||||
ifndef IN_NIX_SHELL
|
||||
@ENTER_NIX_SHELL
|
||||
@@ -84,7 +85,7 @@ nix-gc: nix-gc-protected ##@nix Garbage collect all packages older than 20 days
|
||||
nix-store --gc
|
||||
|
||||
nix-clean: export TARGET := default
|
||||
nix-clean: ##@nix Remove all status-mobile build artifacts from /nix/store
|
||||
nix-clean: ##@nix Remove all status-react build artifacts from /nix/store
|
||||
nix/scripts/clean.sh
|
||||
|
||||
nix-purge: SHELL := /bin/sh
|
||||
@@ -126,25 +127,13 @@ _tmpdir-rm: SHELL := /bin/sh
|
||||
_tmpdir-rm: ##@prepare Remove TMPDIR
|
||||
rm -fr "$(TMPDIR)"
|
||||
|
||||
_install-hooks: SHELL := /bin/sh
|
||||
_install-hooks: ##@prepare Create prepare-commit-msg git hook symlink
|
||||
@ln -s -f ../../scripts/hooks/prepare-commit-msg .git/hooks
|
||||
-include _install-hooks
|
||||
|
||||
# Remove directories and ignored files
|
||||
clean: SHELL := /bin/sh
|
||||
clean: _fix-node-perms _tmpdir-rm ##@prepare Remove all output folders
|
||||
git clean -dXf
|
||||
|
||||
# Remove directories, ignored and non-ignored files
|
||||
purge: SHELL := /bin/sh
|
||||
purge: _fix-node-perms _tmpdir-rm ##@prepare Remove all output folders
|
||||
git clean -dxf
|
||||
|
||||
|
||||
watchman-clean: export TARGET := watchman
|
||||
watchman-clean: ##@prepare Delete repo directory from watchman
|
||||
watchman watch-del $${STATUS_MOBILE_HOME}
|
||||
watchman watch-del $${STATUS_REACT_HOME}
|
||||
|
||||
pod-install: export TARGET := ios
|
||||
pod-install: ##@prepare Run 'pod install' to install podfiles and update Podfile.lock
|
||||
@@ -155,67 +144,30 @@ update-fleets: ##@prepare Download up-to-date JSON file with current fleets stat
|
||||
| jq --indent 4 --sort-keys . \
|
||||
> resources/config/fleets.json
|
||||
|
||||
$(KEYSTORE_PATH): export TARGET := keytool
|
||||
$(KEYSTORE_PATH):
|
||||
keystore: export TARGET := keytool
|
||||
keystore: export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore
|
||||
keystore: ##@prepare Generate a Keystore for signing Android APKs
|
||||
@./scripts/generate-keystore.sh
|
||||
|
||||
keystore: $(KEYSTORE_PATH) ##@prepare Generate a Keystore for signing Android APKs
|
||||
|
||||
fdroid-max-watches: SHELL := /bin/sh
|
||||
fdroid-max-watches: ##@prepare Bump max_user_watches to avoid ENOSPC errors
|
||||
sysctl fs.inotify.max_user_watches=524288
|
||||
|
||||
fdroid-nix-dir: SHELL := /bin/sh
|
||||
fdroid-nix-dir: ##@prepare Create /nix directory for F-Droid Vagrant builders
|
||||
mkdir -m 0755 /nix
|
||||
chown vagrant /nix
|
||||
|
||||
fdroid-fix-tmp: SHELL := /bin/sh
|
||||
fdroid-fix-tmp: ##@prepare Fix TMPDIR permissions so Vagrant user is the owner
|
||||
chown -R vagrant "$(TMPDIR)"
|
||||
|
||||
fdroid-build-env: fdroid-max-watches fdroid-nix-dir fdroid-fix-tmp ##@prepare Setup build environment for F-Droud build
|
||||
|
||||
fdroid-pr: export TARGET := android
|
||||
fdroid-pr: ##@prepare Create F-Droid release PR
|
||||
ifndef APK
|
||||
$(error APK env var not defined)
|
||||
endif
|
||||
scripts/fdroid-pr.sh "$(APK)"
|
||||
|
||||
xcode-clean: SHELL := /bin/sh
|
||||
xcode-clean: XCODE_HOME := $(HOME)/Library/Developer/Xcode
|
||||
xcode-clean: ##@prepare Clean XCode derived data and archives
|
||||
rm -fr $(XCODE_HOME)/DerivedData/StatusIm-* $(XCODE_HOME)/Archives/*/StatusIm*
|
||||
|
||||
#----------------
|
||||
# Release builds
|
||||
#----------------
|
||||
release: release-android release-ios ##@build Build release for Android and iOS
|
||||
release: release-android release-ios ##@build build release for Android and iOS
|
||||
|
||||
build-fdroid: export BUILD_ENV = prod
|
||||
build-fdroid: export BUILD_TYPE = release
|
||||
build-fdroid: export ANDROID_ABI_SPLIT = false
|
||||
build-fdroid: export ANDROID_ABI_INCLUDE = armeabi-v7a;arm64-v8a;x86;x86_64
|
||||
build-fdroid: ##@build Build release for F-Droid
|
||||
@scripts/build-android.sh
|
||||
|
||||
build-android: export BUILD_ENV ?= prod
|
||||
build-android: export BUILD_TYPE ?= nightly
|
||||
build-android: export BUILD_NUMBER ?= $(TMP_BUILD_NUMBER)
|
||||
build-android: export ANDROID_ABI_SPLIT ?= false
|
||||
build-android: export ANDROID_ABI_INCLUDE ?= armeabi-v7a;arm64-v8a;x86
|
||||
build-android: ##@build Build unsigned Android APK
|
||||
@scripts/build-android.sh
|
||||
|
||||
release-android: export TARGET := keytool
|
||||
release-android: export TARGET := default
|
||||
release-android: export BUILD_ENV ?= prod
|
||||
release-android: export BUILD_TYPE ?= nightly
|
||||
release-android: export BUILD_NUMBER ?= $(TMP_BUILD_NUMBER)
|
||||
release-android: export KEYSTORE_PATH ?= $(HOME)/.gradle/status-im.keystore
|
||||
release-android: keystore build-android ##@build Build signed Android APK
|
||||
@scripts/sign-android.sh result/app-release-unsigned.apk
|
||||
release-android: export ANDROID_APK_SIGNED ?= true
|
||||
release-android: export ANDROID_ABI_SPLIT ?= false
|
||||
release-android: export ANDROID_ABI_INCLUDE ?= armeabi-v7a;arm64-v8a;x86
|
||||
release-android: keystore ##@build build release for Android
|
||||
scripts/release-android.sh
|
||||
|
||||
release-ios: export TARGET := ios
|
||||
release-ios: export BUILD_ENV ?= prod
|
||||
release-ios: watchman-clean ##@build Build release for iOS release
|
||||
release-ios: watchman-clean ##@build build release for iOS release
|
||||
@git clean -dxf -f target/ios && \
|
||||
$(MAKE) jsbundle-ios && \
|
||||
xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration Release -destination 'generic/platform=iOS' -UseModernBuildSystem=N clean archive
|
||||
@@ -226,7 +178,7 @@ jsbundle-android: export BUILD_ENV ?= prod
|
||||
jsbundle-android: ##@jsbundle Compile JavaScript and Clojurescript into app directory
|
||||
# Call nix-build to build the 'targets.mobile.android.jsbundle' attribute and copy the.js files to the project root
|
||||
nix/scripts/build.sh targets.mobile.android.jsbundle && \
|
||||
mv result/*.js ./
|
||||
mv result/* ./
|
||||
|
||||
jsbundle-ios: export TARGET := ios
|
||||
jsbundle-ios: export BUILD_ENV ?= prod
|
||||
@@ -245,10 +197,6 @@ status-go-ios: SHELL := /bin/sh
|
||||
status-go-ios: ##@status-go Compile status-go for iOS app
|
||||
nix/scripts/build.sh targets.status-go.mobile.ios
|
||||
|
||||
status-go-library: SHELL := /bin/sh
|
||||
status-go-library: ##@status-go Compile status-go for node-js
|
||||
nix/scripts/build.sh targets.status-go.library
|
||||
|
||||
#--------------
|
||||
# Watch, Build & Review changes
|
||||
#--------------
|
||||
@@ -286,30 +234,25 @@ endif
|
||||
lint: export TARGET := clojure
|
||||
lint: ##@test Run code style checks
|
||||
yarn clj-kondo --confg .clj-kondo/config.edn --lint src && \
|
||||
TARGETS=$$(git diff --diff-filter=d --cached --name-only src && echo src) && \
|
||||
clojure -Scp "$$CLASS_PATH" -m cljfmt.main check --indents indentation.edn $$TARGETS
|
||||
clojure -Sdeps '{:deps {cljfmt {:mvn/version "0.6.7"}}}' \
|
||||
-m cljfmt.main check $$(git diff --diff-filter=d --cached --name-only src && echo src) \
|
||||
--indents indentation.edn
|
||||
|
||||
lint-fix: export TARGET := clojure
|
||||
lint-fix: ##@test Run code style checks and fix issues
|
||||
clojure -Scp "$$CLASS_PATH" -m cljfmt.main fix src --indents indentation.edn
|
||||
|
||||
shadow-server: export TARGET := clojure
|
||||
shadow-server:##@ Start shadow-cljs in server mode for watching
|
||||
yarn shadow-cljs server
|
||||
|
||||
test-watch: export TARGET := clojure
|
||||
test-watch: ##@ Watch tests and re-run no changes to cljs files
|
||||
yarn install
|
||||
nodemon --exec 'yarn shadow-cljs compile mocks && yarn shadow-cljs compile test && node --require ./test-resources/override.js target/test/test.js' -e cljs
|
||||
clojure -Sdeps '{:deps {cljfmt {:mvn/version "0.6.7"}}}' \
|
||||
-m cljfmt.main fix src \
|
||||
--indents indentation.edn
|
||||
|
||||
test: export TARGET := clojure
|
||||
test: ##@test Run tests once in NodeJS
|
||||
# Here we creates the gyp bindings for nodejs
|
||||
yarn install
|
||||
yarn shadow-cljs compile mocks && \
|
||||
yarn shadow-cljs compile test && \
|
||||
node --require ./test-resources/override.js target/test/test.js
|
||||
|
||||
coverage: ##@test Run tests once in NodeJS generating coverage
|
||||
@scripts/run-coverage.sh
|
||||
|
||||
#--------------
|
||||
# Other
|
||||
#--------------
|
||||
@@ -336,7 +279,7 @@ android-devices: ##@other Invoke adb devices
|
||||
adb devices
|
||||
|
||||
android-logcat: export TARGET := android-env
|
||||
android-logcat: ##@other Read status-mobile logs from Android phone using adb
|
||||
android-logcat: ##@other Read status-react logs from Android phone using adb
|
||||
adb logcat | grep -e RNBootstrap -e ReactNativeJS -e ReactNative -e StatusModule -e StatusNativeLogs -e 'F DEBUG :' -e 'Go :' -e 'GoLog :' -e 'libc :'
|
||||
|
||||
android-install: export TARGET := android-env
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
# Status - a Mobile Ethereum Operating System
|
||||
|
||||
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png" alt="Get it on Google Play" height="80"/>](https://play.google.com/store/apps/details?id=im.status.ethereum)
|
||||
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" alt="Get it on F-Droid" height="80"/>](https://f-droid.org/packages/im.status.ethereum/)
|
||||
[<img src="doc/github_badge.png" alt="Get it on Github" height="80"/>](https://github.com/status-im/status-mobile/releases)
|
||||
# Status - a Mobile Ethereum Operating System
|
||||
|
||||
Join us in creating a browser, messenger, and gateway to a decentralized world. Status is a free (libre) open source mobile client targeting Android & iOS built entirely on [Ethereum](https://ethereum.org/) technologies. That's right, no middle men and `go-ethereum` running directly on your device.
|
||||
|
||||
@@ -24,10 +21,10 @@ Go straight to the [docs](https://status.im/docs) or [join our chat](https://joi
|
||||
|
||||
- **Developer**
|
||||
Developers are the heart of software and to keep Status beating we need all the help we can get! If you're looking to code in ClojureScript or Golang then Status is the project for you! We use React Native and there is even some Java/Objective-C too!
|
||||
Want to learn more about it? Start by reading our [Developer Introduction](https://status.im/developer_tools/) which guides you through the technology stack and start browsing [beginner issues](https://github.com/status-im/status-mobile/issues?utf8=%E2%9C%93&q=is%3Aopen%20is%3Aissue%20label%3A%22good%20first%20issue%22%20). Then you can read how to [Build Status](https://status.im/technical/build_status/), which talks about managing project dependencies, coding guidelines and testing procedures.
|
||||
Want to learn more about it? Start by reading our [Developer Introduction](https://status.im/developer_tools/) which guides you through the technology stack and start browsing [beginner issues](https://github.com/status-im/status-react/issues?utf8=%E2%9C%93&q=is%3Aopen%20is%3Aissue%20label%3A%22good%20first%20issue%22%20). Then you can read how to [Build Status](https://status.im/technical/build_status/), which talks about managing project dependencies, coding guidelines and testing procedures.
|
||||
|
||||
- **Community Management**
|
||||
Metcalfe's law states that the value of a network is proportional to the square of the number of connected users of the system - without community Status is meaningless. We're looking to create a positive, fun environment to explore new ideas, experiment and grow the Status community. Building a community takes a lot of work but the people you'll meet and long lasting relationships you form will be well worth it, check out our [Mission and Community Principles](https://status.im/about)
|
||||
Metcalfe's law states that the value of a network is proportional to the square of the number of connected users of the system - without community Status is meaningless. We're looking to create a positive, fun environment to explore new ideas, experiment and grow the Status community. Building a community takes a lot of work but the people you'll meet and long lasting relationships you form will be well worth it, check out our [Community Principles](https://status.im/contribute/our_principles.html)
|
||||
|
||||
- **Specification / Documentation**
|
||||
John Dewey once said "Education is not preparation for life; education is life *itself* ". Developers & Designers need guidance and it all starts from documentation and specifications. Our software is only as good as its documentation, head over to our [docs](https://status.im/docs) and see how you can improve what we have.
|
||||
@@ -36,7 +33,7 @@ John Dewey once said "Education is not preparation for life; education is life *
|
||||
Content is King, keeping our blog up to date and informing the community of news helps keep everyone on the same page. [Jump into our chat](https://join.status.im/chat/public/status) and discuss with the team how you can contribute!
|
||||
|
||||
- **Testers**
|
||||
It's bug hunting season! Status is currently under active development and there is sure to be a bunch of learning, [build status from scratch](https://status.im/technical/build_status/) or if an android user check out our [nightly builds](https://status.im/nightly). You can shake your phone to submit bug reports, or start browsing our [Github Issues](https://github.com/status-im/status-mobile/issues). Every bug you find brings Status closer to stable, usable software for everyone to enjoy!
|
||||
It's bug hunting season! Status is currently under active development and there is sure to be a bunch of learning, [build status from scratch](https://status.im/technical/build_status/) or if an android user check out our [nightly builds](https://status.im/nightly). You can shake your phone to submit bug reports, or start browsing our [Github Issues](https://github.com/status-im/status-react/issues). Every bug you find brings Status closer to stable, usable software for everyone to enjoy!
|
||||
|
||||
- **Security**
|
||||
Status is a visual interface to make permanent changes on the Blockchain, it handles crypto-tokens that have real value and allows 3rd party code execution. Security is paramount to its success. You are given permission to break Status as hard as you can, as long as you share your findings with the community!
|
||||
@@ -64,8 +61,10 @@ Feel free to email us at [support@status.im](mailto:support@status.im) or better
|
||||
|
||||
## License
|
||||
|
||||
Licensed under the [Mozilla Public License v2.0](https://github.com/status-im/status-mobile/blob/develop/LICENSE.md)
|
||||
Licensed under the [Mozilla Public License v2.0](https://github.com/status-im/status-react/blob/develop/LICENSE.md)
|
||||
|
||||
## Testing Supported by
|
||||
|
||||
[](https://www.browserstack.com/automate/public-build/SFBWQ3k5R2tnT2t6UGsxU1h1U0g3VFlCNnoxVTRHYWNoTDhsb1laaTJZWT0tLUZMUm5sSVFBSU9qSWM1RUJvK1I3Z3c9PQ==--ad15ae7992b432b33743749d40318952415bd98f)
|
||||
|
||||
[](https://coveralls.io/github/status-im/status-react)
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
# Description
|
||||
|
||||
This document explains some of the steps that are involved in relseases.
|
||||
|
||||
## PlayStore Metadata Updates
|
||||
|
||||
You can update Play Store releae metadata using `fastlane android upload_metadata`.
|
||||
|
||||
But that requires credentials necessary for accessing Play Store API. The simpler way is to edit files contained within [`fastlane/metadata`](metadata) and run the following CI job:
|
||||
|
||||
https://ci.status.im/job/status-tools/job/update-playstore-metadata/
|
||||
@@ -25,7 +25,7 @@ QA process was focused on account creation and login with keycard, and this bug
|
||||
|
||||
# Missing labels for en translation
|
||||
|
||||
https://github.com/status-im/status-mobile/issues/9003
|
||||
https://github.com/status-im/status-react/issues/9003
|
||||
|
||||
## Cause
|
||||
|
||||
@@ -10,6 +10,13 @@ make shell TARGET=android
|
||||
```
|
||||
This step will take a while the first time as it will download all dependencies.
|
||||
|
||||
To build the app, your can simply run on of the following:
|
||||
```
|
||||
make release-android
|
||||
make release-ios
|
||||
```
|
||||
For more `make` targets run `make help`.
|
||||
|
||||
# Development
|
||||
|
||||
There are three steps necessary to start development, in this case for Android:
|
||||
@@ -21,25 +28,6 @@ There are three steps necessary to start development, in this case for Android:
|
||||
The first two will continue watching for changes and keep re-building the app. They need to be ready first.
|
||||
The last one will exit once the app is up and ready.
|
||||
|
||||
You need to have your emulator or real devices running and visible to adb, before you run `make run-android`.
|
||||
|
||||
# Build release
|
||||
|
||||
To build the app, your can simply run on of the following:
|
||||
```
|
||||
make release-android
|
||||
make release-ios
|
||||
```
|
||||
|
||||
For more `make` targets run `make help`.
|
||||
|
||||
# Updating Dependencies
|
||||
|
||||
* `make nix-update-pods` - iOS CocoaPods dependencies (updates `ios/Podfile` and `ios/Podfile.loc`)
|
||||
* `make nix-update-gradle` - Android Gradle/Maven dependencies (updates `nix/deps/gradle/deps.json`)
|
||||
* `make nix-update-clojure` - Clojure Maven dependencies (updates `nix/deps/clojure/deps.json`)
|
||||
* `make nix-update-gems` - Fastlane Ruby dependencies (updates `fastlane/Gemfile.lock` and `fastlane/gemset.nix`)
|
||||
|
||||
# Manual Steps
|
||||
|
||||
There are a few manual steps you might want to do in order to start contributing.
|
||||
@@ -64,7 +52,7 @@ It's recommented that you [add your public SSH key to your GitHub account](https
|
||||
|
||||
## Configure GPG Keys for signing commits
|
||||
|
||||
In order to increase security we require all commits in `status-mobile` repo to be signed with a GPG key.
|
||||
In order to increase security we require all commits in `status-react` repo to be signed with a GPG key.
|
||||
|
||||
Steps:
|
||||
1. [Generate a new GPG key](https://help.github.com/en/github/authenticating-to-github/generating-a-new-gpg-key)
|
||||
@@ -64,9 +64,9 @@ info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this
|
||||
`yarn.lock` is not updated to be in sync with `package.json`.
|
||||
|
||||
## Solution
|
||||
Update yarn.lock file. In order to do this, perform the following steps on a clean `status-mobile` repo:
|
||||
Update yarn.lock file. In order to do this, perform the following steps on a clean `status-react` repo:
|
||||
```
|
||||
cd status-mobile
|
||||
cd status-react
|
||||
yarn install
|
||||
```
|
||||
and don't forget to commit updated `yarn.lock` together with `package.json`.
|
||||
@@ -87,7 +87,7 @@ adb server version (41) doesn't match this client (40); killing...
|
||||
This might cause all kinds of difficult-to-debug errors, e.g.:
|
||||
- not being able to find the device through `adb devices`
|
||||
- `make run-android` throwing `com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: device 'device-id' not found.`
|
||||
- `make run-android` throwing `- Error: Command failed: ./gradlew app:installDebug -PreactNativeDevServerPort=8081 Unable to install /status-mobile/android/app/build/outputs/apk/debug/app-debug.apk com.android.ddmlib.InstallException: EOF`
|
||||
- `make run-android` throwing `- Error: Command failed: ./gradlew app:installDebug -PreactNativeDevServerPort=8081 Unable to install /status-react/android/app/build/outputs/apk/debug/app-debug.apk com.android.ddmlib.InstallException: EOF`
|
||||
- dropped CLJS repl connections (that have been enabled previously with the help of `make android-ports`)
|
||||
|
||||
## Cause
|
||||
@@ -123,13 +123,6 @@ def jscFlavor = 'org.webkit:android-jsc:+'
|
||||
*/
|
||||
def enableHermes = project.ext.react.get("enableHermes", false);
|
||||
|
||||
def getCommitHash = { ->
|
||||
if (project.hasProperty("commitHash")) {
|
||||
return project.commitHash
|
||||
}
|
||||
return "unknown"
|
||||
}
|
||||
|
||||
def getVersionCode = { ->
|
||||
new ByteArrayOutputStream().withStream { stdOut ->
|
||||
if (project.hasProperty("versionCode")) {
|
||||
@@ -186,7 +179,6 @@ android {
|
||||
versionCode getVersionCode()
|
||||
versionName getVersionName()
|
||||
missingDimensionStrategy 'react-native-camera', 'general'
|
||||
manifestPlaceholders = [commitHash: getCommitHash()]
|
||||
/* this needs to be empty if we want APKs split by ABIs */
|
||||
if (!getEnvOrConfig('ANDROID_ABI_SPLIT').toBoolean()) {
|
||||
ndk {
|
||||
@@ -229,6 +221,23 @@ android {
|
||||
jumboMode true
|
||||
javaMaxHeapSize "8g"
|
||||
}
|
||||
signingConfigs {
|
||||
debug {
|
||||
storeFile file('debug.keystore')
|
||||
storePassword 'android'
|
||||
keyAlias 'androiddebugkey'
|
||||
keyPassword 'android'
|
||||
}
|
||||
/* Caution! In production, you need to generate your own keystore file.
|
||||
* See: https://facebook.github.io/react-native/docs/signed-apk-android */
|
||||
release {
|
||||
/* environment variables take precedence over gradle.properties file */
|
||||
storeFile file(getEnvOrConfig('KEYSTORE_PATH').replaceAll("~", System.properties['user.home']))
|
||||
storePassword getEnvOrConfig('KEYSTORE_PASSWORD')
|
||||
keyAlias getEnvOrConfig('KEYSTORE_ALIAS')
|
||||
keyPassword getEnvOrConfig('KEYSTORE_KEY_PASSWORD')
|
||||
}
|
||||
}
|
||||
splits {
|
||||
abi {
|
||||
reset()
|
||||
@@ -237,26 +246,20 @@ android {
|
||||
universalApk true
|
||||
}
|
||||
}
|
||||
signingConfigs {
|
||||
debug {
|
||||
storeFile file('debug.keystore')
|
||||
storePassword 'android'
|
||||
keyAlias 'androiddebugkey'
|
||||
keyPassword 'android'
|
||||
}
|
||||
}
|
||||
buildTypes {
|
||||
debug {
|
||||
applicationIdSuffix ".debug"
|
||||
debuggable true
|
||||
versionNameSuffix "-SNAPSHOT"
|
||||
resValue "string", "build_config_package", "im.status.ethereum"
|
||||
signingConfig signingConfigs.debug
|
||||
resValue "string", "build_config_package", "im.status.ethereum"
|
||||
}
|
||||
release {
|
||||
minifyEnabled enableProguardInReleaseBuilds
|
||||
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
|
||||
signingConfig null
|
||||
if (getEnvOrConfig('ANDROID_APK_SIGNED').toBoolean()) {
|
||||
signingConfig signingConfigs.release
|
||||
}
|
||||
}
|
||||
pr {
|
||||
initWith release
|
||||
@@ -325,7 +328,6 @@ dependencies {
|
||||
|
||||
implementation 'androidx.multidex:multidex:2.0.1' // only needed if minSdkVersion is less than 21 (https://developer.android.com/studio/build/multidex)
|
||||
implementation project(':react-native-dialogs')
|
||||
implementation project(':react-native-blur')
|
||||
// Force using exact RN version instead of relying on gradle dependency resolution
|
||||
// https://docs.gradle.org/current/userguide/introduction_dependency_management.html#sec:dependency_resolution
|
||||
// NOTE: Uncomment if building RN from a fork
|
||||
@@ -333,9 +335,8 @@ dependencies {
|
||||
implementation project(':react-native-status')
|
||||
implementation project(':react-native-status-keycard')
|
||||
implementation 'com.github.status-im:function:0.0.1'
|
||||
implementation 'com.facebook.fresco:fresco:2.2.0'
|
||||
implementation 'com.facebook.fresco:animated-gif:2.2.0'
|
||||
implementation "com.squareup.okhttp3:okhttp-tls:3.12.12"
|
||||
implementation 'com.facebook.fresco:fresco:2.0.0'
|
||||
implementation 'com.facebook.fresco:animated-gif:2.0.0'
|
||||
}
|
||||
|
||||
def getLocalNDKDir = { ->
|
||||
@@ -357,7 +358,7 @@ task hemroidBuild(type: Exec) {
|
||||
def localNdkDir = getLocalNDKDir()
|
||||
def ndkDir = System.env.ANDROID_NDK_ROOT
|
||||
if (localNdkDir != null) {
|
||||
ndkDir = localNdkDir
|
||||
ndkDir = localNdkDir
|
||||
}
|
||||
|
||||
def execPath = "$ndkDir/ndk-build"
|
||||
|
||||
@@ -64,15 +64,3 @@
|
||||
-dontwarn java.nio.file.*
|
||||
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
|
||||
-dontwarn okio.**
|
||||
|
||||
# fast-image
|
||||
|
||||
-keep public class com.dylanvann.fastimage.* {*;}
|
||||
-keep public class com.dylanvann.fastimage.** {*;}
|
||||
-keep public class * implements com.bumptech.glide.module.GlideModule
|
||||
-keep public class com.bumptech.glide.annotation.GlideModule
|
||||
-keep public class * extends com.bumptech.glide.module.AppGlideModule
|
||||
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
|
||||
**[] $VALUES;
|
||||
public *;
|
||||
}
|
||||
@@ -2,10 +2,7 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<!-- These are added by React Native for debug mode, but actually aren't needed in release mode -->
|
||||
<uses-permission tools:node="remove" android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
||||
<!-- Remove licensing permission since we don't license our app and it blocks F-Droid submissions. -->
|
||||
<uses-permission tools:node="remove" android:name="com.android.vending.CHECK_LICENSE"/>
|
||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
||||
|
||||
<application tools:targetApi="28" tools:ignore="GoogleAppIndexingWarning" android:usesCleartextTraffic="true" />
|
||||
</manifest>
|
||||
|
||||
@@ -17,13 +17,18 @@
|
||||
<uses-feature android:name="android.hardware.camera" />
|
||||
<uses-feature android:name="android.hardware.camera.autofocus" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||
android:maxSdkVersion="28" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
|
||||
|
||||
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||
|
||||
<uses-permission android:name="com.android.vending.BILLING" />
|
||||
|
||||
<!-- these permissions should be removed -->
|
||||
<!-- React Native unnecessary permissions (https://github.com/facebook/react-native/issues/5886) -->
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove"/>
|
||||
|
||||
<application
|
||||
tools:replace="android:allowBackup"
|
||||
android:allowBackup="false"
|
||||
@@ -32,8 +37,8 @@
|
||||
android:theme="@style/AppTheme"
|
||||
android:name=".MainApplication"
|
||||
android:largeHeap="true"
|
||||
android:usesCleartextTraffic="true">
|
||||
<meta-data android:name="commitHash" android:value="${commitHash}"/>
|
||||
android:usesCleartextTraffic="true"
|
||||
android:requestLegacyExternalStorage="true">
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:label="@string/app_name"
|
||||
@@ -69,7 +74,7 @@
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity"/>
|
||||
<service android:name="im.status.ethereum.pushnotifications.ForegroundService"></service>
|
||||
<service android:name="im.status.ethereum.module.ForegroundService"></service>
|
||||
<provider
|
||||
android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="${applicationId}.provider"
|
||||
|
||||
@@ -23,21 +23,17 @@ import android.provider.Settings;
|
||||
import android.os.Bundle;
|
||||
import com.facebook.react.ReactActivityDelegate;
|
||||
import com.facebook.react.ReactRootView;
|
||||
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
||||
import com.facebook.react.bridge.Arguments;
|
||||
import com.facebook.react.bridge.WritableMap;
|
||||
import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;
|
||||
|
||||
import com.facebook.react.ReactFragmentActivity;
|
||||
import com.reactnativenavigation.NavigationActivity;
|
||||
import com.facebook.react.ReactActivity;
|
||||
import com.facebook.react.modules.core.PermissionListener;
|
||||
import org.devio.rn.splashscreen.SplashScreen;
|
||||
|
||||
import java.util.Properties;
|
||||
import im.status.ethereum.module.StatusThreadPoolExecutor;
|
||||
import im.status.ethereum.MainApplication;
|
||||
|
||||
public class MainActivity extends NavigationActivity
|
||||
public class MainActivity extends ReactFragmentActivity
|
||||
implements ActivityCompat.OnRequestPermissionsResultCallback{
|
||||
|
||||
|
||||
@@ -101,16 +97,6 @@ public class MainActivity extends NavigationActivity
|
||||
return intent;
|
||||
}
|
||||
|
||||
private void tryToEmit(String eventName, WritableMap event) {
|
||||
try {
|
||||
((MainApplication) getApplication()).getReactNativeHost()
|
||||
.getReactInstanceManager()
|
||||
.getCurrentReactContext()
|
||||
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
|
||||
.emit("url", event);
|
||||
} catch(Exception e) {/* we expect NPE on first start, which is OK because we have a fallback */}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNewIntent(final Intent intent) {
|
||||
super.onNewIntent(intent);
|
||||
@@ -125,17 +111,14 @@ public class MainActivity extends NavigationActivity
|
||||
switch (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) {
|
||||
case Configuration.UI_MODE_NIGHT_YES:
|
||||
setTheme(R.style.DarkTheme);
|
||||
SplashScreen.show(this, R.style.DarkTheme, R.id.lottie);
|
||||
|
||||
break;
|
||||
case Configuration.UI_MODE_NIGHT_NO:
|
||||
setTheme(R.style.LightTheme);
|
||||
SplashScreen.show(this, R.style.LightTheme, R.id.lottie);
|
||||
break;
|
||||
default:
|
||||
setTheme(R.style.LightTheme);
|
||||
SplashScreen.show(this, R.style.LightTheme, R.id.lottie);
|
||||
}
|
||||
SplashScreen.setAnimationFinished(true);
|
||||
// Make sure we get an Alert for every uncaught exceptions
|
||||
registerUncaughtExceptionHandler(MainActivity.this);
|
||||
|
||||
@@ -144,7 +127,7 @@ public class MainActivity extends NavigationActivity
|
||||
Log.v("RNBootstrap", "Available system memory "+getAvailableMemory(activityManager).availMem + ", maximum usable application memory " + activityManager.getLargeMemoryClass()+"M");
|
||||
|
||||
setSecureFlag();
|
||||
|
||||
SplashScreen.show(this, true);
|
||||
// NOTE: Try to not restore the state https://github.com/software-mansion/react-native-screens/issues/17
|
||||
super.onCreate(null);
|
||||
|
||||
@@ -184,16 +167,6 @@ public class MainActivity extends NavigationActivity
|
||||
@Override
|
||||
public void run() {
|
||||
System.loadLibrary("status-logs");
|
||||
|
||||
// when app is started but the Activity has been destroyed, the deep linking url event is
|
||||
// not emitted when coming back to foreground. This is a workaround. If the problem is
|
||||
// resolved in react-native this code should be removed
|
||||
if (getIntent().getData() != null) {
|
||||
WritableMap event = Arguments.createMap();
|
||||
event.putString("url", getIntent().getDataString());
|
||||
// on first start emit will (silently) fail, but the regular deep linking handler will work
|
||||
tryToEmit("url", event);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -205,7 +178,14 @@ public class MainActivity extends NavigationActivity
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the name of the main component registered from JavaScript.
|
||||
* This is used to schedule rendering of the component.
|
||||
*/
|
||||
@Override
|
||||
protected String getMainComponentName() {
|
||||
return "StatusIm";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
@@ -262,4 +242,14 @@ public class MainActivity extends NavigationActivity
|
||||
mPermissionListener = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ReactActivityDelegate createReactActivityDelegate() {
|
||||
return new ReactActivityDelegate(this, getMainComponentName()) {
|
||||
@Override
|
||||
protected ReactRootView createRootView() {
|
||||
return new RNGestureHandlerEnabledRootView(MainActivity.this);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,28 +9,19 @@ import com.facebook.react.PackageList;
|
||||
|
||||
import com.aakashns.reactnativedialogs.ReactNativeDialogsPackage;
|
||||
import com.facebook.react.ReactApplication;
|
||||
import cl.json.RNSharePackage;
|
||||
import com.facebook.react.ReactNativeHost;
|
||||
import com.reactnativenavigation.NavigationApplication;
|
||||
import com.reactnativenavigation.react.NavigationReactNativeHost;
|
||||
import com.facebook.react.ReactPackage;
|
||||
import com.facebook.soloader.SoLoader;
|
||||
import com.facebook.react.ReactInstanceManager;
|
||||
import com.facebook.react.modules.network.OkHttpClientProvider;
|
||||
import com.cmcewen.blurview.BlurViewPackage;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import im.status.ethereum.keycard.RNStatusKeycardPackage;
|
||||
import im.status.ethereum.module.StatusPackage;
|
||||
import im.status.ethereum.pushnotifications.PushNotificationPackage;
|
||||
import im.status.ethereum.StatusOkHttpClientFactory;
|
||||
|
||||
import com.facebook.react.bridge.JSIModulePackage;
|
||||
import com.swmansion.reanimated.ReanimatedJSIModulePackage;
|
||||
public class MainApplication extends MultiDexApplication implements ReactApplication {
|
||||
|
||||
public class MainApplication extends NavigationApplication {
|
||||
|
||||
private final ReactNativeHost mReactNativeHost = new NavigationReactNativeHost(this) {
|
||||
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
|
||||
@Override
|
||||
public boolean getUseDeveloperSupport() {
|
||||
return BuildConfig.DEBUG;
|
||||
@@ -39,13 +30,10 @@ public class MainApplication extends NavigationApplication {
|
||||
@Override
|
||||
protected List<ReactPackage> getPackages() {
|
||||
StatusPackage statusPackage = new StatusPackage(RootUtil.isDeviceRooted());
|
||||
|
||||
List<ReactPackage> packages = new PackageList(this).getPackages();
|
||||
packages.add(statusPackage);
|
||||
packages.add(new ReactNativeDialogsPackage());
|
||||
packages.add(new RNStatusKeycardPackage());
|
||||
packages.add(new PushNotificationPackage());
|
||||
packages.add(new BlurViewPackage());
|
||||
return packages;
|
||||
}
|
||||
|
||||
@@ -53,11 +41,6 @@ public class MainApplication extends NavigationApplication {
|
||||
protected String getJSMainModuleName() {
|
||||
return "index";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected JSIModulePackage getJSIModulePackage() {
|
||||
return new ReanimatedJSIModulePackage();
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
@@ -68,9 +51,7 @@ public class MainApplication extends NavigationApplication {
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
|
||||
OkHttpClientProvider.setOkHttpClientFactory(new StatusOkHttpClientFactory());
|
||||
|
||||
SoLoader.init(this, /* native exopackage */ false);
|
||||
WebView.setWebContentsDebuggingEnabled(BuildConfig.DEBUG_WEBVIEW == "1");
|
||||
initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
|
||||
}
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
package im.status.ethereum;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import com.facebook.react.modules.network.OkHttpClientFactory;
|
||||
import com.facebook.react.modules.network.OkHttpClientProvider;
|
||||
|
||||
import okhttp3.OkHttpClient;
|
||||
import okhttp3.Interceptor;
|
||||
import okhttp3.tls.HandshakeCertificates;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.InputStream;
|
||||
import java.lang.RuntimeException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.security.cert.CertificateFactory;
|
||||
import java.security.cert.X509Certificate;
|
||||
|
||||
import im.status.ethereum.module.StatusPackage;
|
||||
|
||||
class StatusOkHttpClientFactory implements OkHttpClientFactory {
|
||||
public OkHttpClient createNewNetworkModuleClient() {
|
||||
String certPem = StatusPackage.getImageTLSCert();
|
||||
X509Certificate cert;
|
||||
|
||||
try {
|
||||
CertificateFactory cf = CertificateFactory.getInstance("X.509");
|
||||
cert = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(certPem.getBytes()));
|
||||
} catch(Exception e) {
|
||||
Log.e("StatusOkHttpClientFactory", "Could not parse certificate");
|
||||
cert = null;
|
||||
}
|
||||
|
||||
HandshakeCertificates clientCertificates = new HandshakeCertificates.Builder()
|
||||
.addPlatformTrustedCertificates()
|
||||
.addTrustedCertificate(cert)
|
||||
.build();
|
||||
|
||||
return OkHttpClientProvider.createClientBuilder()
|
||||
.sslSocketFactory(clientCertificates.sslSocketFactory(), clientCertificates.trustManager())
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 482 B |
|
Before Width: | Height: | Size: 272 B |
|
After Width: | Height: | Size: 975 B |
|
Before Width: | Height: | Size: 495 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 826 B |
|
After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 826 B |
@@ -1,21 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?attr/backgroundColor">
|
||||
|
||||
<com.airbnb.lottie.LottieAnimationView
|
||||
android:id="@+id/lottie"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:layout_gravity="center"
|
||||
android:scaleType="fitCenter"
|
||||
android:adjustViewBounds="true"
|
||||
app:lottie_rawRes="@raw/launching_animation"
|
||||
app:lottie_autoPlay="true"
|
||||
app:lottie_loop="true"
|
||||
/>
|
||||
</FrameLayout>
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:layout_gravity="center"
|
||||
android:scaleType="fitCenter"
|
||||
android:src="@drawable/launch_logo"/>
|
||||
|
||||
</FrameLayout>
|
||||
@@ -1,5 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="alert_background">#141414</color>
|
||||
<color name="alert_text">#ffffff</color>
|
||||
</resources>
|
||||
@@ -1,5 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="alert_background">#ffffff</color>
|
||||
<color name="alert_text">#000000</color>
|
||||
</resources>
|
||||
@@ -8,7 +8,6 @@
|
||||
<item name="android:forceDarkAllowed">true</item>
|
||||
<item name="android:windowTranslucentStatus">false</item>
|
||||
<item name="android:statusBarColor">?attr/backgroundColor</item>
|
||||
<item name="android:alertDialogTheme">@style/AlertDialogTheme</item>
|
||||
</style>
|
||||
|
||||
<style name="LightTheme" parent="AppTheme">
|
||||
@@ -22,10 +21,4 @@
|
||||
<item name="backgroundColor">#000000</item>
|
||||
<item name="android:windowLightStatusBar">false</item>
|
||||
</style>
|
||||
|
||||
<style name="AlertDialogTheme" parent="Theme.AppCompat.DayNight.Dialog.Alert">
|
||||
<item name="android:textColor">@color/alert_text</item>
|
||||
<item name="android:textColorPrimary">@color/alert_text</item>
|
||||
<item name="android:background">@color/alert_background</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
||||
@@ -3,7 +3,5 @@
|
||||
|
||||
<!-- These are added by React Native for debug mode, but actually aren't needed in release mode -->
|
||||
<uses-permission tools:node="remove" android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
||||
<!-- Remove licensing permission since we don't license our app and it blocks F-Droid submissions. -->
|
||||
<uses-permission tools:node="remove" android:name="com.android.vending.CHECK_LICENSE"/>
|
||||
|
||||
</manifest>
|
||||
|
||||
@@ -3,7 +3,5 @@
|
||||
|
||||
<!-- These are added by React Native for debug mode, but actually aren't needed in release mode -->
|
||||
<uses-permission tools:node="remove" android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
||||
<!-- Remove licensing permission since we don't license our app and it blocks F-Droid submissions. -->
|
||||
<uses-permission tools:node="remove" android:name="com.android.vending.CHECK_LICENSE"/>
|
||||
|
||||
</manifest>
|
||||
</manifest>
|
||||
@@ -4,7 +4,6 @@
|
||||
* Project-wide gradle configuration properties for use by all modules
|
||||
*/
|
||||
ext {
|
||||
RNNKotlinVersion = "1.4.31"
|
||||
buildToolsVersion = project.buildToolsVersion
|
||||
minSdkVersion = Integer.valueOf(project.minSdkVersion)
|
||||
compileSdkVersion = Integer.valueOf(project.compileSdkVersion)
|
||||
@@ -17,10 +16,9 @@ buildscript {
|
||||
repositories {
|
||||
flatDir { dirs "libs", "${rootDir}/app/libs" }
|
||||
google()
|
||||
mavenCentral()
|
||||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.31"
|
||||
classpath "com.android.tools.build:gradle:${project.ext.gradlePluginVersion}"
|
||||
// WARNING: Do not place your application dependencies here!
|
||||
// They belong in the individual module build.gradle files.
|
||||
@@ -44,23 +42,27 @@ subprojects {
|
||||
|
||||
allprojects {
|
||||
beforeEvaluate {
|
||||
if (System.env.STATUS_GO_ANDROID_LIBDIR == null || System.env.STATUS_GO_ANDROID_LIBDIR == "") {
|
||||
throw new GradleException('STATUS_GO_ANDROID_LIBDIR environment variable is not valid!')
|
||||
}
|
||||
if (System.env.STATUS_GO_ANDROID_LIBDIR == null || System.env.STATUS_GO_ANDROID_LIBDIR == "") {
|
||||
throw new GradleException('STATUS_GO_ANDROID_LIBDIR environment variable is not valid!')
|
||||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenLocal()
|
||||
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
|
||||
maven { url("$rootDir/../node_modules/react-native/android") }
|
||||
// Android JSC is installed from npm
|
||||
maven { url("$rootDir/../node_modules/jsc-android/dist") }
|
||||
// For geth, function, and status-go
|
||||
flatDir { dirs "libs", System.env.STATUS_GO_ANDROID_LIBDIR }
|
||||
// Everything Else
|
||||
maven {
|
||||
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
|
||||
url("$rootDir/../node_modules/react-native/android")
|
||||
}
|
||||
maven {
|
||||
// Android JSC is installed from npm
|
||||
url("$rootDir/../node_modules/jsc-android/dist")
|
||||
}
|
||||
|
||||
google()
|
||||
jcenter() // Required for @react-native-community/blur:3.6.1, can be removed after updating to 3.6.1+
|
||||
mavenCentral()
|
||||
jcenter()
|
||||
|
||||
// for geth, function, and status-go
|
||||
flatDir { dirs "libs", System.env.STATUS_GO_ANDROID_LIBDIR }
|
||||
maven { url "https://www.jitpack.io" }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,12 +23,12 @@
|
||||
# Version requirements used throughout the Gradle scripts
|
||||
kotlinVersion=1.3.50
|
||||
minSdkVersion=23
|
||||
compileSdkVersion=30
|
||||
targetSdkVersion=30
|
||||
buildToolsVersion=31.0.0
|
||||
compileSdkVersion=29
|
||||
targetSdkVersion=29
|
||||
buildToolsVersion=29.0.2
|
||||
supportLibVersion=28.0.0
|
||||
# This should match version from nix/mobile/android/maven-and-npm-deps/maven/default.nix
|
||||
gradlePluginVersion=3.5.4
|
||||
gradlePluginVersion=3.5.3
|
||||
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
@@ -42,11 +42,12 @@ KEYSTORE_KEY_PASSWORD=password
|
||||
ANDROID_ABI_SPLIT=false
|
||||
# Some platforms are excluded though
|
||||
ANDROID_ABI_INCLUDE=armeabi-v7a;arm64-v8a;x86
|
||||
# F-Droid builds need to be unsigned
|
||||
ANDROID_APK_SIGNED=true
|
||||
|
||||
org.gradle.jvmargs=-Xmx8704M
|
||||
|
||||
versionCode=9999
|
||||
commitHash=unknown
|
||||
|
||||
# Flipper
|
||||
FLIPPER_VERSION=0.54.0
|
||||
FLIPPER_VERSION=0.35.0
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
pluginManagement {
|
||||
include ':react-native-share'
|
||||
project(':react-native-share').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-share/android')
|
||||
repositories {
|
||||
mavenLocal() // Let's prioritize local Maven repos so that Nix can provide them offline
|
||||
gradlePluginPortal()
|
||||
@@ -18,5 +16,3 @@ include ':react-native-status'
|
||||
project(':react-native-status').projectDir = new File(rootProject.projectDir, '../modules/react-native-status/android')
|
||||
include ':react-native-status-keycard'
|
||||
project(':react-native-status-keycard').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-status-keycard/android')
|
||||
include ':react-native-blur'
|
||||
project(':react-native-blur').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/blur/android')
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
{
|
||||
"variables": {
|
||||
"module_name%": "status_nodejs_addon",
|
||||
"module_path%": "./lib/binding/"
|
||||
},
|
||||
"targets": [{
|
||||
"target_name": "<(module_name)",
|
||||
"sources": [
|
||||
"./modules/react-native-status/nodejs/status.cpp"
|
||||
],
|
||||
"xcode_settings": {
|
||||
"MACOSX_DEPLOYMENT_TARGET": "10.7"
|
||||
},
|
||||
"libraries": [
|
||||
"<!(pwd)/result/libstatus.a"
|
||||
],
|
||||
"conditions": [
|
||||
["OS=='mac'", {
|
||||
"libraries": [
|
||||
"-framework IOKit",
|
||||
"-framework CoreFoundation",
|
||||
"-framework CoreServices",
|
||||
"-framework Security"
|
||||
]
|
||||
}]
|
||||
]
|
||||
}, {
|
||||
"target_name": "action_after_build",
|
||||
"type": "none",
|
||||
"dependencies": ["<(module_name)"],
|
||||
"copies": [
|
||||
{
|
||||
"files": [ "<(PRODUCT_DIR)/<(module_name).node" ],
|
||||
"destination": "<(module_path)"
|
||||
}
|
||||
]
|
||||
}]
|
||||
}
|
||||
@@ -1,15 +1,12 @@
|
||||
library 'status-jenkins-lib@v1.5.5'
|
||||
|
||||
/* Options section can't access functions in objects. */
|
||||
def isPRBuild = utils.isPRBuild()
|
||||
library 'status-react-jenkins@v1.2.5'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux && x86_64 && nix-2.8' }
|
||||
agent { label 'linux' }
|
||||
|
||||
options {
|
||||
timestamps()
|
||||
/* Prevent Jenkins jobs from running forever */
|
||||
timeout(time: 30, unit: 'MINUTES')
|
||||
timeout(time: 20, unit: 'MINUTES')
|
||||
/* Limit builds retained */
|
||||
buildDiscarder(logRotator(
|
||||
numToKeepStr: '10',
|
||||
@@ -17,11 +14,7 @@ pipeline {
|
||||
artifactNumToKeepStr: '10',
|
||||
))
|
||||
/* Allows combined build to copy */
|
||||
copyArtifactPermission('/status-mobile/*')
|
||||
/* Abort old PR builds. */
|
||||
disableConcurrentBuilds(
|
||||
abortPrevious: isPRBuild
|
||||
)
|
||||
copyArtifactPermission('/status-react/*')
|
||||
}
|
||||
|
||||
parameters {
|
||||
@@ -49,20 +42,46 @@ pipeline {
|
||||
stage('Prep') {
|
||||
steps {
|
||||
script {
|
||||
utils.doGitRebasePR()
|
||||
utils.symlinkEnv()
|
||||
println("Build Number: ${utils.genBuildNumber()}")
|
||||
btype = utils.getBuildType()
|
||||
print "Running ${btype} build!"
|
||||
jenkins.abortPreviousRunningBuilds()
|
||||
/* Cleanup and Prep */
|
||||
commonPrep(btype)
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Bundle') {
|
||||
steps {
|
||||
script { apks = android.bundle() }
|
||||
}
|
||||
}
|
||||
stage('Sign') {
|
||||
steps {
|
||||
script { apks = android.sign(apks) }
|
||||
stage('Parallel Assemble') {
|
||||
parallel {
|
||||
stage('Checks') { stages {
|
||||
stage('Lint') {
|
||||
steps {
|
||||
script {
|
||||
/* We want the build result to be uploaded */
|
||||
catchError(
|
||||
message: 'Linting check failed!',
|
||||
buildResult: 'FAILURE',
|
||||
stageResult: 'FAILURE'
|
||||
) {
|
||||
sh 'make lint'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Tests') {
|
||||
steps {
|
||||
script {
|
||||
sh 'make test'
|
||||
}
|
||||
}
|
||||
}
|
||||
} }
|
||||
stage('Build') { stages {
|
||||
stage('Bundle') {
|
||||
steps {
|
||||
script { apks = android.bundle() }
|
||||
}
|
||||
}
|
||||
} }
|
||||
}
|
||||
}
|
||||
stage('Parallel Upload') {
|
||||
@@ -73,30 +92,35 @@ pipeline {
|
||||
} }
|
||||
}
|
||||
stage('Upload') {
|
||||
steps { script {
|
||||
def urls = apks.collect { s3.uploadArtifact(it) }
|
||||
/* return only the universal APK */
|
||||
if (urls.size() > 1) {
|
||||
env.PKG_URL = urls.find { it.contains('universal') }
|
||||
} else { /* if no universal is available pick first */
|
||||
env.PKG_URL = urls.first()
|
||||
steps {
|
||||
script {
|
||||
def urls = apks.collect { s3.uploadArtifact(it) }
|
||||
/* return only the universal APK */
|
||||
if (urls.size() > 1) {
|
||||
env.PKG_URL = urls.find { it.contains('universal') }
|
||||
} else { /* if no universal is available pick first */
|
||||
env.PKG_URL = urls.first()
|
||||
}
|
||||
if (utils.isNightlyBuild()) {
|
||||
env.DIAWI_URL = android.uploadToDiawi()
|
||||
}
|
||||
if (utils.isE2EBuild()) {
|
||||
env.SAUCE_URL = android.uploadToSauceLabs()
|
||||
}
|
||||
}
|
||||
jenkins.setBuildDesc(APK: env.PKG_URL)
|
||||
/* e2e builds get tested in SauceLabs */
|
||||
if (utils.isE2EBuild()) {
|
||||
env.SAUCE_URL = android.uploadToSauceLabs()
|
||||
}
|
||||
if (utils.isNightlyBuild()) {
|
||||
env.DIAWI_URL = android.uploadToDiawi()
|
||||
}
|
||||
} }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Cleanup') {
|
||||
steps {
|
||||
sh 'make clean'
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
success { script { github.notifyPR(true) } }
|
||||
failure { script { github.notifyPR(false) } }
|
||||
always { sh 'make purge' }
|
||||
always { sh 'make _fix-node-perms' }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
library 'status-jenkins-lib@v1.5.5'
|
||||
library 'status-react-jenkins@v1.2.5'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
@@ -16,24 +16,10 @@ pipeline {
|
||||
))
|
||||
}
|
||||
|
||||
/* WARNING: Defining parameters here with the ?: trick causes them to remember last value. */
|
||||
parameters {
|
||||
choice(
|
||||
name: 'BUILD_TYPE',
|
||||
description: 'Makefile target to build. Optional Parameter.',
|
||||
choices: genChoices(params.BUILD_TYPE, ['manual', 'nightly', 'release', 'pr', 'e2e']),
|
||||
)
|
||||
booleanParam(
|
||||
name: 'PUBLISH',
|
||||
description: 'Trigger publishing of build results for nightly or release.',
|
||||
defaultValue: getPublishDefault(params.PUBLISH),
|
||||
)
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Prep') {
|
||||
steps { script {
|
||||
println("Current JOB: ${env.JOB_NAME}")
|
||||
println "Current JOB: ${env.JOB_NAME}"
|
||||
/* just for a shorter access */
|
||||
btype = utils.getBuildType()
|
||||
} }
|
||||
@@ -41,16 +27,13 @@ pipeline {
|
||||
stage('Build') {
|
||||
parallel {
|
||||
stage('iOS') { steps { script {
|
||||
ios = jenkins.Build('status-mobile/platforms/ios')
|
||||
ios = jenkins.Build('status-react/combined/mobile-ios')
|
||||
} } }
|
||||
stage('Android') { steps { script {
|
||||
apk = jenkins.Build('status-mobile/platforms/android')
|
||||
apk = jenkins.Build('status-react/combined/mobile-android')
|
||||
} } }
|
||||
stage('Android e2e') { steps { script {
|
||||
apke2e = jenkins.Build('status-mobile/platforms/android-e2e')
|
||||
} } }
|
||||
stage('Tests') { steps { script {
|
||||
jenkins.Build('status-mobile/platforms/tests')
|
||||
apke2e = jenkins.Build('status-react/combined/mobile-android-e2e')
|
||||
} } }
|
||||
}
|
||||
}
|
||||
@@ -61,7 +44,7 @@ pipeline {
|
||||
//jenkins.copyArts(iose2e)
|
||||
jenkins.copyArts(apk)
|
||||
jenkins.copyArts(apke2e)
|
||||
sha = "pkg/${utils.pkgFilename(ext: 'sha256')}"
|
||||
sha = "pkg/${utils.pkgFilename('sha256')}"
|
||||
dir('pkg') {
|
||||
/* generate sha256 checksums for upload */
|
||||
sh "sha256sum * | tee ../${sha}"
|
||||
@@ -76,35 +59,33 @@ pipeline {
|
||||
/* mobile */
|
||||
Apk: utils.pkgUrl(apk), Apke2e: utils.pkgUrl(apke2e),
|
||||
iOS: utils.pkgUrl(ios), /*iOSe2e: utils.pkgUrl(iose2e),*/
|
||||
Diawi: utils.getEnv(ios, 'DIAWI_URL'),
|
||||
Diawi: utils.utils.getEnv(ios, 'DIAWI_URL'),
|
||||
/* upload the sha256 checksums file too */
|
||||
SHA: s3.uploadArtifact(sha),
|
||||
]
|
||||
/* add URLs to the build description */
|
||||
jenkins.setBuildDesc(urls)
|
||||
/* Create JSON file with newest build URLs */
|
||||
switch (btype) {
|
||||
/* legacy naming, should have named it nightly.json */
|
||||
case 'nightly': s3.updateBucketJSON(urls, 'latest.json'); break
|
||||
}
|
||||
} }
|
||||
}
|
||||
stage('Publish') {
|
||||
when { expression { params.PUBLISH } }
|
||||
steps { script {
|
||||
switch (btype) {
|
||||
case 'nightly':
|
||||
/* Create JSON file with newest build URLs */
|
||||
s3.updateBucketJSON(urls, 'latest.json');
|
||||
build(job: 'website/status.im', wait: false);
|
||||
break;
|
||||
case 'release':
|
||||
github.publishReleaseFiles(repo: 'status-mobile');
|
||||
break;
|
||||
case 'nightly': build(job: 'misc/status.im', wait: false); break
|
||||
case 'release': github.publishReleaseMobile(); break
|
||||
}
|
||||
} }
|
||||
}
|
||||
stage('Run e2e') {
|
||||
when { expression { btype == 'nightly' && params.PUBLISH } }
|
||||
when { expression { btype == 'nightly' } }
|
||||
steps { script {
|
||||
e2eApk = utils.getEnv(apke2e, 'SAUCE_URL')
|
||||
build(
|
||||
job: 'status-mobile/e2e/status-app-nightly',
|
||||
job: 'end-to-end-tests/status-app-nightly',
|
||||
parameters: [string(name: 'APK_NAME', value: e2eApk)],
|
||||
wait: false
|
||||
)
|
||||
@@ -112,24 +93,3 @@ pipeline {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Helper that generates list of available choices for a parameter
|
||||
* but re-orders them based on the currently set value. First is default. */
|
||||
def List genChoices(String previousChoice, List defaultChoices) {
|
||||
if (previousChoice == null) {
|
||||
return defaultChoices
|
||||
}
|
||||
choices = defaultChoices.minus(previousChoice)
|
||||
choices.add(0, previousChoice)
|
||||
return choices
|
||||
}
|
||||
|
||||
/* Helper that makes PUBLISH default to 'false' unless:
|
||||
* - The build is for a release branch
|
||||
* - A user explicitly specified a value
|
||||
* Since release builds create and re-create GitHub drafts every time. */
|
||||
def Boolean getPublishDefault(Boolean previousValue) {
|
||||
if (env.JOB_NAME.startsWith('status-mobile/release')) { return true }
|
||||
if (previousValue != null) { return previousValue }
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
library 'status-jenkins-lib@v1.5.5'
|
||||
|
||||
/* Options section can't access functions in objects. */
|
||||
def isPRBuild = utils.isPRBuild()
|
||||
library 'status-react-jenkins@v1.2.5'
|
||||
|
||||
pipeline {
|
||||
agent { label 'macos && x86_64 && nix-2.8 && xcode-13.4' }
|
||||
agent { label 'macos-xcode-11.5' }
|
||||
|
||||
parameters {
|
||||
string(
|
||||
@@ -25,11 +22,7 @@ pipeline {
|
||||
artifactNumToKeepStr: '10',
|
||||
))
|
||||
/* Allows combined build to copy */
|
||||
copyArtifactPermission('/status-mobile/*')
|
||||
/* Abort old PR builds. */
|
||||
disableConcurrentBuilds(
|
||||
abortPrevious: isPRBuild
|
||||
)
|
||||
copyArtifactPermission('/status-react/*')
|
||||
}
|
||||
|
||||
environment {
|
||||
@@ -48,20 +41,51 @@ pipeline {
|
||||
stage('Prep') {
|
||||
steps {
|
||||
script {
|
||||
utils.doGitRebasePR()
|
||||
utils.symlinkEnv()
|
||||
println("Build Number: ${utils.genBuildNumber()}")
|
||||
btype = utils.getBuildType()
|
||||
print "Running ${btype} build!"
|
||||
jenkins.abortPreviousRunningBuilds()
|
||||
/* Cleanup and Prep */
|
||||
commonPrep(btype)
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('JSBundle') {
|
||||
steps {
|
||||
script { ios.jsbundle() }
|
||||
}
|
||||
}
|
||||
stage('Bundle') {
|
||||
steps {
|
||||
script { api = ios.bundle() }
|
||||
stage('Parallel Assemble') {
|
||||
parallel {
|
||||
stage('Checks') { stages {
|
||||
stage('Lint') {
|
||||
steps {
|
||||
script {
|
||||
/* We want the build result to be uploaded */
|
||||
catchError(
|
||||
message: 'Linting check failed!',
|
||||
buildResult: 'FAILURE',
|
||||
stageResult: 'FAILURE'
|
||||
) {
|
||||
sh 'make lint'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Tests') {
|
||||
steps {
|
||||
script {
|
||||
sh 'make test'
|
||||
}
|
||||
}
|
||||
}
|
||||
} }
|
||||
stage('Build') { stages {
|
||||
stage('JSBundle') {
|
||||
steps {
|
||||
script { ios.jsbundle() }
|
||||
}
|
||||
}
|
||||
stage('Bundle') {
|
||||
steps {
|
||||
script { api = ios.bundle() }
|
||||
}
|
||||
}
|
||||
} }
|
||||
}
|
||||
}
|
||||
stage('Parallel Upload') {
|
||||
@@ -72,23 +96,30 @@ pipeline {
|
||||
}
|
||||
}
|
||||
stage('Upload') {
|
||||
steps { script {
|
||||
env.PKG_URL = s3.uploadArtifact(api)
|
||||
jenkins.setBuildDesc(IPA: env.PKG_URL)
|
||||
/* e2e builds get tested in SauceLabs */
|
||||
if (utils.isE2EBuild()) {
|
||||
env.SAUCE_URL = ios.uploadToSauceLabs()
|
||||
} else if (!utils.isReleaseBuild()) {
|
||||
env.DIAWI_URL = ios.uploadToDiawi()
|
||||
steps {
|
||||
script {
|
||||
env.PKG_URL = s3.uploadArtifact(api)
|
||||
/* e2e builds get tested in SauceLabs */
|
||||
if (btype == 'e2e') {
|
||||
env.SAUCE_URL = ios.uploadToSauceLabs()
|
||||
} else {
|
||||
env.DIAWI_URL = ios.uploadToDiawi()
|
||||
}
|
||||
}
|
||||
} }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Cleanup') {
|
||||
steps {
|
||||
sh 'make watchman-clean'
|
||||
sh 'make clean'
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
success { script { github.notifyPR(true) } }
|
||||
failure { script { github.notifyPR(false) } }
|
||||
always { sh 'make purge' }
|
||||
always { sh 'make _fix-node-perms' }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,16 @@
|
||||
library 'status-jenkins-lib@v1.5.5'
|
||||
library 'status-react-jenkins@v1.2.5'
|
||||
|
||||
pipeline {
|
||||
agent { label params.AGENT_LABEL }
|
||||
|
||||
parameters {
|
||||
string(
|
||||
name: 'NIX_CACHE_HOST',
|
||||
description: 'FQDN of Nix binary cache host.',
|
||||
defaultValue: params.NIX_CACHE_HOST ?: 'cache-01.do-ams3.nix.ci.statusim.net'
|
||||
)
|
||||
string(
|
||||
name: 'NIX_CACHE_USER',
|
||||
description: 'Username for Nix binary cache host.',
|
||||
defaultValue: params.NIX_CACHE_USER ?: 'nix-cache'
|
||||
)
|
||||
}
|
||||
|
||||
environment {
|
||||
/* See nix/README.md */
|
||||
NIX_IGNORE_SYMLINK_STORE = 1
|
||||
/* we source .bash_profile to be able to use nix-store */
|
||||
NIX_SSHOPTS = "-o StrictHostKeyChecking=no source .profile;"
|
||||
NIX_SSHOPTS = "-o StrictHostKeyChecking=no source .bash_profile;"
|
||||
/* where our /nix/store is hosted */
|
||||
NIX_CACHE_USER = 'nix-cache'
|
||||
NIX_CACHE_HOST = 'master-01.do-ams3.ci.misc.statusim.net'
|
||||
NIX_CONF_DIR = "${env.WORKSPACE}/nix"
|
||||
}
|
||||
|
||||
@@ -39,7 +29,7 @@ pipeline {
|
||||
stages {
|
||||
stage('Setup') {
|
||||
steps { script {
|
||||
nix.shell('nix-env -i openssh', sandbox: false, pure: false)
|
||||
nix.shell('nix-env -i openssh', pure: false)
|
||||
/* some build targets don't build on MacOS */
|
||||
uname = sh(script: 'uname', returnStdout: true)
|
||||
} }
|
||||
@@ -97,9 +87,8 @@ pipeline {
|
||||
sshagent(credentials: ['nix-cache-ssh']) {
|
||||
nix.shell("""
|
||||
find /nix/store/ -mindepth 1 -maxdepth 1 -type d \
|
||||
-not -name '*.links' -and -not -name '*-status-mobile-*' \
|
||||
| xargs nix copy \
|
||||
--to ssh-ng://${params.NIX_CACHE_USER}@${params.NIX_CACHE_HOST}
|
||||
-not -name '*.links' -and -not -name '*-status-react-*' \
|
||||
| xargs nix-copy-closure -v --to ${NIX_CACHE_USER}@${NIX_CACHE_HOST}
|
||||
""",
|
||||
pure: false
|
||||
)
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
library 'status-jenkins-lib@v1.5.5'
|
||||
|
||||
/* Options section can't access functions in objects. */
|
||||
def isPRBuild = utils.isPRBuild()
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux && x86_64 && nix-2.8' }
|
||||
|
||||
options {
|
||||
timestamps()
|
||||
/* Prevent Jenkins jobs from running forever */
|
||||
timeout(time: 10, unit: 'MINUTES')
|
||||
/* Limit builds retained */
|
||||
buildDiscarder(logRotator(
|
||||
numToKeepStr: '10',
|
||||
daysToKeepStr: '20',
|
||||
artifactNumToKeepStr: '10',
|
||||
))
|
||||
/* Abort old PR builds. */
|
||||
disableConcurrentBuilds(
|
||||
abortPrevious: isPRBuild
|
||||
)
|
||||
}
|
||||
|
||||
parameters {
|
||||
string(
|
||||
name: 'BUILD_TYPE',
|
||||
description: 'Specify build type. Values: pr / e2e / nightly / release',
|
||||
defaultValue: 'pr',
|
||||
)
|
||||
}
|
||||
|
||||
environment {
|
||||
LANG = "en_US.UTF-8"
|
||||
LC_ALL = "en_US.UTF-8"
|
||||
LANGUAGE = "en_US.UTF-8"
|
||||
TARGET = 'tests'
|
||||
BUILD_ENV = 'prod'
|
||||
NIX_CONF_DIR = "${env.WORKSPACE}/nix"
|
||||
LOG_FILE = utils.pkgFilename(ext: 'log', arch: 'tests')
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Prep') {
|
||||
steps {
|
||||
script {
|
||||
utils.doGitRebasePR()
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Checks') {
|
||||
parallel {
|
||||
stage('Lint') {
|
||||
steps {
|
||||
sh """#!/bin/bash
|
||||
set -eo pipefail
|
||||
make lint 2>&1 | tee ${LOG_FILE}
|
||||
"""
|
||||
}
|
||||
}
|
||||
stage('Tests') {
|
||||
steps {
|
||||
sh """#!/bin/bash
|
||||
set -eo pipefail
|
||||
make test 2>&1 | tee -a ${LOG_FILE}
|
||||
"""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Upload') {
|
||||
steps {
|
||||
script {
|
||||
env.PKG_URL = s3.uploadArtifact(LOG_FILE)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
success { script { github.notifyPR(true) } }
|
||||
failure { script { github.notifyPR(false) } }
|
||||
always { sh 'make purge' }
|
||||
}
|
||||
}
|
||||
@@ -6,11 +6,11 @@ This folder contains files defininf [Jenkins pipelines](https://jenkins.io/doc/b
|
||||
|
||||
All `Jenkinsfile`s contain the following line:
|
||||
```groovy
|
||||
library 'status-jenkins-lib@master'
|
||||
library 'status-react-jenkins@master'
|
||||
```
|
||||
|
||||
Which loads the used methods - like `nix.shell()` - from a separate private repo:
|
||||
|
||||
https://github.com/status-im/status-jenkins-lib
|
||||
https://github.com/status-im/status-react-jenkins
|
||||
|
||||
This is done to improve security of our CI setup.
|
||||
|
||||
@@ -4,13 +4,13 @@ pipeline {
|
||||
|
||||
parameters {
|
||||
string(
|
||||
name: 'APK_NAME',
|
||||
description: 'Filename of APK uploaded to SauceLabs.',
|
||||
name: 'NETWORK',
|
||||
description: 'Name of test network to use.',
|
||||
defaultValue: 'ropsten',
|
||||
)
|
||||
string(
|
||||
name: 'KEYWORD_EXPRESSION',
|
||||
description: 'This will run tests which contain names that match the given string expression (Optional)',
|
||||
defaultValue: '',
|
||||
name: 'APK_NAME',
|
||||
description: 'Filename of APK uploaded to SauceLabs.',
|
||||
)
|
||||
}
|
||||
|
||||
@@ -44,26 +44,14 @@ pipeline {
|
||||
credentialsId: 'etherscan-api-key',
|
||||
variable: 'ETHERSCAN_API_KEY'
|
||||
),
|
||||
string(
|
||||
credentialsId: 'infura-e2e-token',
|
||||
variable: 'WEB3_INFURA_PROJECT_ID'
|
||||
),
|
||||
file(
|
||||
credentialsId: "mobile-tests-eth-accounts",
|
||||
variable: 'TEST_ETH_ACCOUNTS_FILE'
|
||||
),
|
||||
]) {
|
||||
dir('test/appium/tests') {
|
||||
/* Provide Eth test accounts secrets. */
|
||||
sh 'cp -f $TEST_ETH_ACCOUNTS_FILE users.py'
|
||||
sh """
|
||||
python3 -m pytest \
|
||||
--numprocesses 9 \
|
||||
--rerun_count=2 \
|
||||
python3 -m pytest -m testrail_id \
|
||||
-m "not upgrade" \
|
||||
-n24 --rerun_count=2 \
|
||||
--testrail_report=True \
|
||||
-m testrail_id \
|
||||
-m \"not upgrade\" \
|
||||
-k \"${params.KEYWORD_EXPRESSION}\" \
|
||||
--network=${params.NETWORK} \
|
||||
--apk=${params.APK_NAME}
|
||||
"""
|
||||
}
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
library 'status-jenkins-lib@v1.5.5'
|
||||
|
||||
pipeline {
|
||||
|
||||
agent { label 'linux' }
|
||||
@@ -10,12 +8,16 @@ pipeline {
|
||||
description: 'Name of the branch to checkout and build.',
|
||||
defaultValue: 'develop',
|
||||
)
|
||||
/* Commented to use TEST_MARKERS values from job params
|
||||
string(
|
||||
name: 'NETWORK',
|
||||
description: 'Name of test network to use.',
|
||||
defaultValue: 'ropsten',
|
||||
)
|
||||
string(
|
||||
name: 'TEST_MARKERS',
|
||||
description: 'Marker expression for matching tests to run.',
|
||||
defaultValue: 'critical',
|
||||
) */
|
||||
defaultValue: 'critical or high',
|
||||
)
|
||||
string(
|
||||
name: 'APK_NAME',
|
||||
description: 'Filename of APK uploaded to SauceLabs, path, or URL.',
|
||||
@@ -24,14 +26,9 @@ pipeline {
|
||||
name: 'PR_ID',
|
||||
description: 'ID of the Pull Request triggering this build.',
|
||||
)
|
||||
string(
|
||||
name: 'KEYWORD_EXPRESSION',
|
||||
description: 'This will run tests which contain names that match the given string expression (Optional)',
|
||||
defaultValue: '',
|
||||
)
|
||||
string(
|
||||
name: 'TR_CASE_IDS',
|
||||
description: 'IDs of the TestRail case, separated by a comma (Optional)',
|
||||
description: 'IDs of the TestRail case, separated by a comma. (Optional)',
|
||||
defaultValue: '',
|
||||
)
|
||||
}
|
||||
@@ -61,13 +58,11 @@ pipeline {
|
||||
def extraPytestOpts = ''
|
||||
if (params.TR_CASE_IDS != '') {
|
||||
extraPytestOpts = "--run_testrail_ids='${params.TR_CASE_IDS}'"
|
||||
} else {
|
||||
extraPytestOpts = "-m \"${params.TEST_MARKERS}\""
|
||||
}
|
||||
|
||||
withCredentials([
|
||||
usernamePassword(
|
||||
credentialsId: 'status-im-auto',
|
||||
credentialsId: 'status-im-auto-token',
|
||||
usernameVariable: 'GIT_HUB_USER', /* ignored */
|
||||
passwordVariable: 'GIT_HUB_TOKEN'
|
||||
),
|
||||
@@ -85,26 +80,16 @@ pipeline {
|
||||
credentialsId: 'etherscan-api-key',
|
||||
variable: 'ETHERSCAN_API_KEY'
|
||||
),
|
||||
string(
|
||||
credentialsId: 'infura-e2e-token',
|
||||
variable: 'WEB3_INFURA_PROJECT_ID'
|
||||
),
|
||||
file(
|
||||
credentialsId: "mobile-tests-eth-accounts",
|
||||
variable: 'TEST_ETH_ACCOUNTS_FILE'
|
||||
),
|
||||
]) {
|
||||
dir('test/appium/tests') {
|
||||
/* Provide Eth test account secrets. */
|
||||
sh 'cp -f $TEST_ETH_ACCOUNTS_FILE users.py'
|
||||
sh """
|
||||
python3 -m pytest \
|
||||
--numprocesses 9 \
|
||||
python3 -m pytest -n24 \
|
||||
--rerun_count=2 \
|
||||
--testrail_report=True \
|
||||
-k \"${params.KEYWORD_EXPRESSION}\" \
|
||||
-m "${params.TEST_MARKERS}" \
|
||||
--network=${params.NETWORK} \
|
||||
--apk=${params.APK_NAME} \
|
||||
--build=PR-${params.PR_ID}-${utils.timestamp()} \
|
||||
--build=PR-${params.PR_ID} \
|
||||
--pr_number=${params.PR_ID} \
|
||||
${extraPytestOpts}
|
||||
"""
|
||||
|
||||
@@ -3,6 +3,11 @@ pipeline {
|
||||
agent { label 'linux' }
|
||||
|
||||
parameters {
|
||||
string(
|
||||
name: 'NETWORK',
|
||||
description: 'Name of test network to use',
|
||||
defaultValue: 'ropsten',
|
||||
)
|
||||
string(
|
||||
name: 'APK_NAME',
|
||||
description: 'Filename of APK uploaded to SauceLabs (base for upgrade, usually release build)',
|
||||
@@ -11,16 +16,6 @@ pipeline {
|
||||
name: 'APK_NAME_UPGRADE',
|
||||
description: 'Filename of APK of upgraded application (installed on top of base)',
|
||||
)
|
||||
string(
|
||||
name: 'KEYWORD_EXPRESSION',
|
||||
description: 'This will run tests which contain names that match the given string expression (Optional)',
|
||||
defaultValue: '',
|
||||
)
|
||||
string(
|
||||
name: 'TR_CASE_IDS',
|
||||
description: 'IDs of the TestRail case, separated by a comma (Optional)',
|
||||
defaultValue: '',
|
||||
)
|
||||
}
|
||||
|
||||
options {
|
||||
@@ -37,12 +32,7 @@ pipeline {
|
||||
} }
|
||||
}
|
||||
stage('Test') {
|
||||
steps { script {
|
||||
/* for managing optional arguments */
|
||||
def extraPytestOpts = ''
|
||||
if (params.TR_CASE_IDS != '') {
|
||||
extraPytestOpts = "--run_testrail_ids='${params.TR_CASE_IDS}'"
|
||||
}
|
||||
steps {
|
||||
withCredentials([
|
||||
usernamePassword(
|
||||
credentialsId: 'test-rail-api',
|
||||
@@ -58,33 +48,20 @@ pipeline {
|
||||
credentialsId: 'etherscan-api-key',
|
||||
variable: 'ETHERSCAN_API_KEY'
|
||||
),
|
||||
string(
|
||||
credentialsId: 'infura-e2e-token',
|
||||
variable: 'WEB3_INFURA_PROJECT_ID'
|
||||
),
|
||||
file(
|
||||
credentialsId: "mobile-tests-eth-accounts",
|
||||
variable: 'TEST_ETH_ACCOUNTS_FILE'
|
||||
),
|
||||
]) {
|
||||
dir('test/appium/tests') {
|
||||
/* Provide Eth test accounts secrets. */
|
||||
sh 'cp -f $TEST_ETH_ACCOUNTS_FILE users.py'
|
||||
sh """
|
||||
python3 -m pytest \
|
||||
-m "upgrade" \
|
||||
-k \"${params.KEYWORD_EXPRESSION}\" \
|
||||
--numprocesses 15 \
|
||||
--rerun_count=2 \
|
||||
python3 -m pytest -m upgrade \
|
||||
-n24 --rerun_count=2 \
|
||||
--testrail_report=True \
|
||||
--network=${params.NETWORK} \
|
||||
--apk=${params.APK_NAME} \
|
||||
--apk_upgrade=${params.APK_NAME_UPGRADE} \
|
||||
${extraPytestOpts}
|
||||
--apk_upgrade=${params.APK_NAME_UPGRADE}
|
||||
"""
|
||||
}
|
||||
}
|
||||
}
|
||||
} }
|
||||
}
|
||||
}
|
||||
|
||||
post {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
library 'status-jenkins-lib@v1.5.5'
|
||||
library 'status-react-jenkins@v1.2.5'
|
||||
|
||||
pipeline {
|
||||
agent { label 'macos' }
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
library 'status-jenkins-lib@v1.5.5'
|
||||
library 'status-react-jenkins@v1.2.5'
|
||||
|
||||
pipeline {
|
||||
agent { label 'linux' }
|
||||
@@ -38,7 +38,7 @@ pipeline {
|
||||
steps { script {
|
||||
withCredentials([
|
||||
string(
|
||||
credentialsId: 'google-play-api-key-json',
|
||||
credentialsId: 'SUPPLY_JSON_KEY_DATA',
|
||||
variable: 'GOOGLE_PLAY_JSON_KEY'
|
||||
),
|
||||
]) {
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
/**
|
||||
* This job runs daily and executes `pod repo update` on MacOS
|
||||
* This is done to avoid issues with out of date repo causing errors like:
|
||||
*
|
||||
* Failed with exit code 1 (in target 'StatusImPR' from project 'StatusIm')
|
||||
**/
|
||||
|
||||
pipeline {
|
||||
agent {
|
||||
label params.HOST_LABEL
|
||||
}
|
||||
|
||||
triggers {
|
||||
/* Run daily at 2am */
|
||||
cron('H 2 * * *')
|
||||
}
|
||||
options {
|
||||
timestamps()
|
||||
/* Prevent Jenkins jobs from running forever */
|
||||
timeout(time: 5, unit: 'MINUTES')
|
||||
/* Limit builds retained */
|
||||
buildDiscarder(logRotator(
|
||||
numToKeepStr: '20',
|
||||
))
|
||||
}
|
||||
|
||||
parameters {
|
||||
string(
|
||||
name: 'HOST_LABEL',
|
||||
description: 'Label of host to run on',
|
||||
/* Using startTimeInMillis to randomize which host gets the update. */
|
||||
defaultValue: "maci7-0${(currentBuild.startTimeInMillis % 3) + 1}",
|
||||
)
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Update') {
|
||||
steps {
|
||||
sh 'pod repo update'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,148 +0,0 @@
|
||||
# Description
|
||||
|
||||
This document describes how to update Status APK builds for the [F-Droid](https://f-droid.org/) Android application catalogue.
|
||||
|
||||
# Intro
|
||||
|
||||
In simplest terms F-Droid requires a YAML file that defines the steps necessary to create a universal unsigned APK build. This is achieved by submitting a new app version into the `metadata/im.status.ethereum.yml` file in the [fdroiddata](https://gitlab.com/fdroid/fdroiddata) repository.
|
||||
|
||||
The app builds defined this way run on servers that generate the unsigned APKs using the [fdroidserver](https://gitlab.com/fdroid/fdroidserver) software. The [server setup](https://f-droid.org/en/docs/Build_Server_Setup/) is quite involved but is not necessary unless you want to run your own instance. Normally the applications defined in `fdroiddata` are built by servers maintained by [the F-Droid volunteers](https://f-droid.org/en/contribute/).
|
||||
|
||||
First release of Status app was merged in [fdroid/fdroiddata#7179](https://gitlab.com/fdroid/fdroiddata/-/merge_requests/7179).
|
||||
|
||||
:warning: __WARNING__: Once changes are committed into `fdroiddata` repo they __cannot be changed__.
|
||||
|
||||
# Adding New Versions
|
||||
|
||||
There are two ways - automated and manual - described below.
|
||||
|
||||
## Automated
|
||||
|
||||
The script will analyze a provided APK, update the metadata file based on that information, and commit the change to [`fdroiddata`](https://gitlab.com/fdroid/fdroiddata) repo. The creation of merge request is manual.
|
||||
|
||||
#### Requirements:
|
||||
|
||||
- GitLab account
|
||||
- Forked copy of the [`fdroiddata`](https://gitlab.com/fdroid/fdroiddata) repo
|
||||
- Link to the release published
|
||||
|
||||
#### Steps
|
||||
|
||||
1. Use the F-Droid PR update script via `make`:
|
||||
```sh
|
||||
make fdroid-pr APK=StatusIm-Mobile-v1.16.0-ef34af.apk
|
||||
```
|
||||
The script also accepts a URL.
|
||||
2. Add a fork repo:
|
||||
```sh
|
||||
git remote add john https://gitlab.com/john/fdroiddata.git
|
||||
```
|
||||
3. Push:
|
||||
```sh
|
||||
git push john status-im/v1.16.0
|
||||
```
|
||||
4. [Create a PR via the GitLab interface.](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
|
||||
|
||||
|
||||
## Manual
|
||||
|
||||
You can find our configuration file at [`metadata/im.status.ethereum.yml`](https://gitlab.com/fdroid/fdroiddata/-/blob/master/metadata/im.status.ethereum.yml)
|
||||
|
||||
The file defines all the necessary metadata like `SourceCode`, `Website`, or `License`, but the most important key is `Builds`, which looks like this:
|
||||
```yml
|
||||
Builds:
|
||||
- versionName: 1.12.0
|
||||
versionCode: 2021022512
|
||||
commit: cfb825a11b61d312af8cb5d36686af540c31f481
|
||||
sudo:
|
||||
- cd build/im.status.ethereum
|
||||
- make fdroid-build-env
|
||||
init: nix/scripts/setup.sh
|
||||
output: result/app-release-unsigned.apk
|
||||
scanignore:
|
||||
- android/build.gradle
|
||||
scandelete:
|
||||
- ios
|
||||
build: make release-fdroid BUILD_NUMBER=$$VERCODE$$
|
||||
```
|
||||
It contains a list of objects defining each release of the application. In order to add a new release simply copy a previous release object and adjust the following values:
|
||||
|
||||
* `versionName` - String version like `1.12.0`.
|
||||
* `versionCode` - Android `versionCode`. Normally it is generated from timestamp at build time.
|
||||
* `commit` - Specific commit SHA1 from which the given release was built.
|
||||
|
||||
The `versionCode` should be the same as the one in build that was uploaded to Play Store.
|
||||
It can be found in the build logs or by using:
|
||||
```
|
||||
> make shell TARGET=android
|
||||
> apkanalyzer manifest version-code StatusIm-Mobile-v1.12.0.apk
|
||||
2021022512
|
||||
```
|
||||
|
||||
At the bottom of the file you should also update the following keys:
|
||||
|
||||
* `CurrentVersion` - Same as the new `versionName` added
|
||||
* `CurrentVersionCode` - Same as the `versionCode` added
|
||||
|
||||
Then submit a merge request to the [fdroid/fdroiddata](https://gitlab.com/fdroid/fdroiddata) repository.
|
||||
|
||||
:warning: __WARNING__: Currently GitLab PR builds will fail due to running as `root` instead of `vagrant` and failing to install Nix.
|
||||
|
||||
# Checking Builds
|
||||
|
||||
The simplest way to test if the app builds via F-Droid is to use the Docker image:
|
||||
https://gitlab.com/fdroid/docker-executable-fdroidserver
|
||||
|
||||
Which is available under `registry.gitlab.com/fdroid/docker-executable-fdroidserver:latest`.
|
||||
|
||||
Because we use Nix to build the mobile app we need to slightly modify the image with this `Dockerfile`:
|
||||
```Dockerfile
|
||||
FROM registry.gitlab.com/fdroid/docker-executable-fdroidserver:latest
|
||||
ARG BUILDER_UID=1000
|
||||
ENV BUILDER_USER=vagrant
|
||||
RUN useradd -u $BUILDER_UID $BUILDER_USER
|
||||
RUN mkdir -m 0755 /nix /home/$BUILDER_USER \
|
||||
&& chown -R $BUILDER_USER /nix /home/$BUILDER_USER
|
||||
```
|
||||
Build it using:
|
||||
```
|
||||
docker build --build-arg=BUILDER_UID=$UID -t statusteam/docker-executable-fdroidserver:latest .
|
||||
```
|
||||
Then clone the [fdroiddata](https://gitlab.com/fdroid/fdroiddata) and [fdroidserver](https://gitlab.com/fdroid/fdroidserver) repos and use it to test the build of a specific Status Android app version: `1.12.0`
|
||||
```
|
||||
git clone https://gitlab.com/fdroid/fdroidserver
|
||||
git clone https://gitlab.com/fdroid/fdroiddata
|
||||
docker run --rm \
|
||||
-u $UID:$GID -e USER=vagrant \
|
||||
-v $PWD/fdroiddata:/repo \
|
||||
-v $PWD/fdroidserver:/fdroidserver \
|
||||
statusteam/docker-executable-fdroidserver:latest \
|
||||
build im.status.ethereum
|
||||
```
|
||||
We have to create a user and specify the UID because Nix cannot run as `root` and that is the default user for the F-Droid Docker image. By adding our own user and setting the UID we also make it possible to mount folders like `fdroiddata` and `fdroidserver`.
|
||||
|
||||
You can specify a `--verbose` flag for `build` command for additional information.
|
||||
You can provide `--storage-opt size=30G` flag if Docker complains about running out of space.
|
||||
|
||||
You should also run `lint` and `rewritemeta` for the App ID to verify and fix the YAML metadata formatting.
|
||||
|
||||
# Details
|
||||
|
||||
The original research was done in [#8512](https://github.com/status-im/status-mobile/issues/8512).
|
||||
|
||||
Normally F-Droid server wants to run Gradle itself, but we do not specify the `gradle` key in order to run `make release-fdroid` ourselves in `build` step. We also add `android/build.gradle` to `scanignore` to avoid F-Droid trying to use Gradle directly.
|
||||
|
||||
The Android metadata like description or screenshots is [loaded from our repository](https://f-droid.org/en/docs/All_About_Descriptions_Graphics_and_Screenshots/#fastlane-structure) based on the Fastlane [`supply`](https://docs.fastlane.tools/actions/supply/) tool folder structure for updating Google Play store metadata.
|
||||
|
||||
Once the PR is merged it may take a few days for the F-Droid server farm to build and deploy the new version to their site and app. You can look up the current state of builds [here](https://f-droid.org/wiki/index.php?title=Special:RecentChanges&days=7&from=&hidebots=0&hideanons=1&hideliu=1&limit=500) and look for your App ID and a `deploy` change after it.
|
||||
|
||||
# F-Droid Build
|
||||
|
||||
F-Droid requires submitted applications to be free of non Open Source software. For this reason we need to exclude certain Google libraries at build time.
|
||||
|
||||
This is achieved by setting `GOOGLE_FREE=1` in the `.env.release` file. This affects two things:
|
||||
|
||||
1. [Clojure code conditional](../src/status_im/acquisition/core.cljs) which stops use of `get-referrer`.
|
||||
2. [Gradle build configuration](../android/app/build.gradle) by excluding Google libraries.
|
||||
|
||||
Both are affected by the `.env` file and both are required.
|
||||
@@ -1,202 +0,0 @@
|
||||
# Setup your Editor/IDE
|
||||
|
||||
You can use any Clojure enabled editor. Here are instructions for developing the status-mobile app using:
|
||||
|
||||
* IntelliJ IDEA and Cursive
|
||||
* VS Code and Calva
|
||||
* Emacs/Cider
|
||||
|
||||
(Please add instructions for your favorite editor.)
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Using Cursive](#using-cursive)
|
||||
- [Install Cursive](#install-cursive)
|
||||
- [Getting Cursive to understand `status-mobile`](#getting-cursive-to-understand-status-mobile)
|
||||
- [I get a lot of `cannot be resolved`](#i-get-a-lot-of-cannot-be-resolved)
|
||||
- [REPL!](#repl)
|
||||
- [Connecting to REPL to IntelliJ](#connecting-to-repl-to-intellij)
|
||||
- [Connecting REPL and IntelliJ to `status-mobile`](#connecting-repl-and-intellij-to-status-mobile)
|
||||
- [Using Calva](#using-calva)
|
||||
- [Start and connect the REPL](#start-and-connect-the-repl)
|
||||
- [Use the REPL](#use-the-repl)
|
||||
|
||||
## Using Cursive
|
||||
|
||||
### Install Cursive
|
||||
|
||||
See https://cursive-ide.com/userguide/index.html
|
||||
|
||||
### Getting Cursive to understand `status-mobile`
|
||||
|
||||
- Add this file to the root of the `status-mobile` project dir
|
||||
- https://gist.github.com/Samyoul/f71a0593ba7a12d24dd0d5ef986ebbec
|
||||
- Right click and "add as leiningen project"
|
||||
|
||||
<img src="images/IDE_SETUP/1_fake_project_file.png" width=75% />
|
||||
|
||||
## I get a lot of `cannot be resolved`
|
||||
|
||||
Are you getting problems where you get a lot of `cannot be resolved` on everything?
|
||||
|
||||
<img src="images/IDE_SETUP/2_resolve.jpeg" width=75% />
|
||||
|
||||
See https://cursive-ide.com/userguide/macros.html
|
||||
|
||||
- opt+enter (on macOS)
|
||||
- resolve defview as fn and letsubs as let
|
||||
- move selection on resolve and hit enter
|
||||
- and select defn for defview and let for letsubs
|
||||
|
||||
### REPL!
|
||||
|
||||
#### Connecting to REPL to IntelliJ
|
||||
|
||||
I had a number of problems connecting to REPL, the solution is as follows:
|
||||
|
||||
At the top of IntelliJ IDEA click on the `Add Configuration...` option:
|
||||
|
||||
<img src="images/IDE_SETUP/3_REPL_1.png" width=75% />
|
||||
|
||||
This will load the following menu:
|
||||
|
||||
<img src="images/IDE_SETUP/4_REPL_2.png" width=75% />
|
||||
|
||||
Click on the `+` icon in the top left corner of the menu.
|
||||
|
||||
Select `Clojure REPL > Remote`
|
||||
|
||||
<img src="images/IDE_SETUP/5_REPL_3.png" width=75% />
|
||||
|
||||
Which will load the following menu
|
||||
|
||||
<img src="images/IDE_SETUP/6_REPL_4.png" width=75% />
|
||||
|
||||
Enter the below options:
|
||||
|
||||
- Name = status-mobile
|
||||
- Display Name = status-mobile
|
||||
- Connection type = nREPL
|
||||
- Connection details
|
||||
- Host = 127.0.0.1
|
||||
- Port = 7888
|
||||
|
||||
<img src="images/IDE_SETUP/7_REPL_5.png" width=75% />
|
||||
|
||||
Press `OK`
|
||||
|
||||
Now the below option will be visible.
|
||||
Press the green run button
|
||||
|
||||
<img src="images/IDE_SETUP/8_REPL_6.png" width=75% />
|
||||
|
||||
You should now see an dialog with the following message:
|
||||
|
||||
```shell
|
||||
Connecting to remote nREPL server...
|
||||
Clojure 1.10.1
|
||||
```
|
||||
|
||||
To confirm you have a working connection with REPL enter the following command in the input box below the output:
|
||||
|
||||
```shell
|
||||
(prn 1)
|
||||
```
|
||||
|
||||
Which should output
|
||||
|
||||
```shell
|
||||
(prn 1)
|
||||
1
|
||||
=> nil
|
||||
```
|
||||
|
||||
See below:
|
||||
|
||||
<img src="images/IDE_SETUP/9_REPL_7.png" width=75% />
|
||||
|
||||
#### Connecting REPL and IntelliJ to `status-mobile`
|
||||
|
||||
**The important next step is telling REPL the context in which to interact with the code.**
|
||||
|
||||
Do the following:
|
||||
|
||||
Ensure you have 3 terminals running the following
|
||||
|
||||
- `make run-clojure`
|
||||
- `make run-metro`
|
||||
- `make run-ios` / `make run-android`
|
||||
|
||||
[See the STARTING GUIDE for details](STARTING_GUIDE.md#development)
|
||||
|
||||
Next go back to the REPL input and enter the following commands:
|
||||
|
||||
```clojure
|
||||
(shadow/watch :mobile)
|
||||
(shadow/repl :mobile)
|
||||
```
|
||||
|
||||
See Below
|
||||
|
||||
<img src="images/IDE_SETUP/10_REPL_8.png" width="75%" />
|
||||
|
||||
Which should switch the clj file type target to cljs as shown above
|
||||
|
||||
Finally you are ready to test REPL.
|
||||
|
||||
Create a sample function to evaluate something simple like `(prn "I'm working")`, move your cursor to one of the outer parentheses. Right or `control` click and select the `REPL` option. From there select `Sync files in REPL` and then `Send '...' to REPL'`.
|
||||
|
||||
<img src="images/IDE_SETUP/11_REPL_9.png" width="75%" />
|
||||
|
||||
Alternatively you can use the shortcut commands `⇧⌘M` to sync your files and `⇧⌘P` to send the statement to REPL. You may also need to switch the REPL namespace to match the current file, which can be done manually from the dialogue box or using the `⇧⌘N` shortcut key.
|
||||
|
||||
Following the above should give you the below result:
|
||||
|
||||
<img src="images/IDE_SETUP/12_REPL_10.png" width="75%" />
|
||||
|
||||
🎉 Tada! Working! 🎉
|
||||
|
||||
---
|
||||
|
||||
For additional details on issues you may face when setting up REPL with Cursive [see this document](https://notes.status.im/9Gr7kqF8SzC_SmYK0eB7uQ?view#Connecting-Cursive--IntelliJ-IDEA-to-REPL-Problems)
|
||||
|
||||
## Using Calva
|
||||
|
||||
For VS Code users.
|
||||
|
||||
0. Install Calva.
|
||||
|
||||
### Start and connect the REPL
|
||||
|
||||
1. Open the `status-mobile` folder.
|
||||
1. Start [Status development](STARTING_GUIDE.md#development) (Starting the `run-clojure` and `run-metro` jobs in split view in the VS Code integrated terminal works great.)
|
||||
1. Run the VS Code command: **Calva: Connect to a running REPL Server in the project**
|
||||
1. Select the project type `shadow-cljs`
|
||||
1. Accept the suggested connection `host:port`
|
||||
1. Select to connect to the `:mobile` build
|
||||
|
||||
### Use the REPL
|
||||
|
||||
Open any `.cljs` file in the project and evaluate forms in it. See https://calva.io/try-first/ for some starter tips and links. Confirm that your REPL is connected to the app by evaluating:
|
||||
|
||||
```clojure
|
||||
(js/alert "Hello from Status App!")
|
||||
```
|
||||
|
||||
🎉 Tada! You are ready to use the REPL to improve Status.im! 🎉
|
||||
|
||||
Please consider bookmarking [calva.io](https://calva.io/) for quick access to the Calva documentation.
|
||||
|
||||
## Using Emacs/Cider
|
||||
|
||||
1. Install Emacs/Cider/etc. (there is a lot of variability in how to manage things in emacs, so please google for help with this)
|
||||
2. Add a local ~/.shadow-cljs/config.edn file like below (corresponding to the version numbers of the packages you are using):
|
||||
|
||||
```clojure
|
||||
{:dependencies
|
||||
[[nrepl/nrepl "0.9.0"]
|
||||
[cider/cider-nrepl "0.28.4"]
|
||||
[cider/piggieback "0.5.2"]]}
|
||||
```
|
||||
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
#### Before submission
|
||||
- [ ] Feature or improvements release? (Feature release needs more lead time and assets for comms)
|
||||
- [ ] Sign off by QA
|
||||
- [ ] App store listing content reviewed and updated ([copy](https://docs.google.com/spreadsheets/d/1fLDr3BD1dcg0dolvLiozXoZU27IQirjBzn0h4_QS2u0/edit#gid=0), [images](https://www.dropbox.com/sh/6baklctvxy3nuoo/AACG9kYIVdt2qREW76rP8SP-a?dl=0) )
|
||||
- [ ] Play store content reviewed and updated
|
||||
- [ ] Release notes written and added (500 character limit for updates (Android), no Android references for App store)
|
||||
- [ ] Comms timeframe agreed on (Mon/Tue ping when both submissions are in)
|
||||
- [ ] Privacy policy reviewed and updated
|
||||
- [ ] App translations for key features merged and tested
|
||||
- [ ] Countries to be excluded
|
||||
- [ ] Changes to our FAQ made
|
||||
|
||||
#### Before publishing
|
||||
- [ ] Translations for comms available
|
||||
- [ ] Promotional content ready
|
||||
- [ ] Update Draft with release on https://github.com/status-im/status-mobile/releases
|
||||
- [ ] Add release to DO store and [update site](https://notes.status.im/s/status-release-upload#) (Jakub - requires credentials to upload)
|
||||
|
||||
#### At time of publishing
|
||||
- [ ] validate draft release on github release page https://github.com/status-im/status-mobile/releases
|
||||
- [ ] update https://github.com/status-im/status-mobile/blob/develop/RELEASES.md with release notes
|
||||
@@ -1,115 +0,0 @@
|
||||
# Description
|
||||
|
||||
This document explains some of the steps that are involved in releases.
|
||||
|
||||
# Release process
|
||||
|
||||
## Coordination
|
||||
|
||||
All the coordination is done in the `#release` channel on discord.
|
||||
|
||||
Release readiness can be tracked by watching an appropriate milestone at [milestones](https://github.com/status-im/status-mobile/milestones) section in github.
|
||||
|
||||
When release is building you can check the progress in a testrail. Ask @churik for access if you don't have it
|
||||
|
||||
## Preparing branches
|
||||
Special branches should be created at the start of a release process. That can be done manually or with the script
|
||||
|
||||
### Prepare branches with the script
|
||||
|
||||
You can use the script to cut a release branch. No arguments needed, the new release version will be deducted automatically:
|
||||
|
||||
`scripts/cut-release.sh`
|
||||
|
||||
Upon script call two branches will be created:
|
||||
- `release/a.b.x`
|
||||
- `chore/update-release-to-$version`
|
||||
|
||||
The first one is the main release branch. All bugfixes should be cherry-picked from `develop` to it. Jenkins treats that branch specially and prepares release builds from it.
|
||||
|
||||
The second branch only updates the `VERSION` file and all you need to do is to merge it to `develop`. If you have the `gh` command installed, `cut-release` script will automatically create a PR for this.
|
||||
|
||||
### Prepare branches manually
|
||||
|
||||
#### Create a branch
|
||||
|
||||
First, we need to create a release branch cut from develop.
|
||||
The name of the branch should be `release/a.b.x` where `x` is actually `x`, not a variable, and `a` and `b` are the `MAJOR` and `MINOR` version of the app.
|
||||
|
||||
For example, valid branch names are:
|
||||
|
||||
`release/1.12.x` or `release/3.12.x`
|
||||
|
||||
#### Update version
|
||||
|
||||
We need to update the `VERSION` file to reflect the release we want to build.
|
||||
|
||||
|
||||
## Building
|
||||
|
||||
Jenkins will automatically build this branch and create release candidates.
|
||||
Those will go through the QA process and the QA team will let us know when
|
||||
tested successfully.
|
||||
|
||||
## Bugfixes before an app is released
|
||||
|
||||
Because both `status-mobile` and `status-go` might have newer commits that we don't want to include, bug fixes should be applied separately to develop and the release branch.
|
||||
The best workflow is to send a PR to develop, get it merged, and the cherry-pick on the
|
||||
release branch.
|
||||
|
||||
It is a release manager's responsibility to cherry-pick bugfix from `develop` to release branch. In order to do this, you should be a part of a `release group` on github. Contact @jakubgs to be added.
|
||||
|
||||
If cherry-picking not practical for some reason (i.e develop has diverged significantly from release)
|
||||
other workflows are possible.
|
||||
|
||||
To change status-go, a similar workflow applies.
|
||||
First checkout the tag used in `status-go-version.json` of release branch.
|
||||
|
||||
`git checkout v0.62.3`
|
||||
|
||||
Create a branch on status-go named: `release/vx.y.z+hotfix.w` where (make sure branch name is not the same as the tag)
|
||||
|
||||
`x` is the `MAJOR` version
|
||||
`y` is the `MINOR` version
|
||||
`z` is the `PATCH` version
|
||||
`w` is the `HOTFIX` version
|
||||
|
||||
For example valid names are:
|
||||
|
||||
`release/v0.62.3+hotfix.2`
|
||||
`release/v1.3.4+hotfix.4`
|
||||
|
||||
Once the branch is ready to use and tested successfully, tag the branch:
|
||||
|
||||
`git tag v0.62.3+hotfix.2`
|
||||
|
||||
Push the branch and then the tag to origin:
|
||||
`git push --set-upstream origin release/v0.62.3+hotfix.2`
|
||||
`git push origin v0.62.3+hotfix.2`
|
||||
|
||||
Switch to status-mobile release branch, and cherry pick the commit you need.
|
||||
|
||||
Once that's done, update the status-mobile release branch with the new tag:
|
||||
|
||||
`make shell`
|
||||
|
||||
`scripts/update-status-go.sh v0.62.3+hotfix.2`
|
||||
|
||||
And commit and push the changes
|
||||
|
||||
# Hotfix process
|
||||
|
||||
The hotfix process is basically identical to the workflow of a bugfix:
|
||||
|
||||
1) Add the changes on status-mobile
|
||||
2) Make sure you use a hotfix branch for status-go (unless we are happy to release from develop)
|
||||
3) Update the `VERSION` in status-mobile
|
||||
|
||||
# PlayStore Metadata Updates
|
||||
This section is relevant only for the marketing team, no developer participation is required.
|
||||
|
||||
You can update Play Store release metadata using `fastlane android upload_metadata`.
|
||||
|
||||
But that requires credentials necessary for accessing Play Store API. The simpler way is to edit files contained within [`fastlane/metadata`](metadata) and run the following CI job:
|
||||
|
||||
https://ci.status.im/job/status-mobile/job/tools/job/update-playstore-metadata/
|
||||
@@ -1,19 +0,0 @@
|
||||
# Testing
|
||||
|
||||
### Unit & integration tests
|
||||
|
||||
To run tests:
|
||||
|
||||
```
|
||||
make test
|
||||
```
|
||||
|
||||
|
||||
To watch the tests:
|
||||
|
||||
```
|
||||
make test-watch
|
||||
```
|
||||
|
||||
|
||||
Tests will use the bindings in `modules/react-native-status/nodejs`, if you make any changes to these you will need to restart the watcher.
|
||||
@@ -1,10 +1,4 @@
|
||||
# Codebase Structure and Guidelines
|
||||
|
||||
## Starting the app
|
||||
|
||||
The app is bundled and run in a Nix environment. Information regarding how to run it locally can be found [here](https://status.im/technical/build_status/).
|
||||
|
||||
## Business Logic Modules
|
||||
# Business Logic Modules
|
||||
|
||||
Each business logic module is managed in a module directory.
|
||||
|
||||
@@ -37,7 +31,7 @@ Rationale and how to get there:
|
||||
Currently a lot of business logic is lost in utils and screens namespaces and should be moved to dedicated top level directories.
|
||||
This should make core logic of the app more accessible and organized
|
||||
|
||||
### core.cljs
|
||||
## core.cljs
|
||||
|
||||
Core namespace must only contain functions that can be called outside of the module (i.e. in events or other modules):
|
||||
|
||||
@@ -51,8 +45,9 @@ Core namespace must only contain functions that can be called outside of the mod
|
||||
{:db (module.db/set-current-account db)})
|
||||
```
|
||||
|
||||
### db.cljs
|
||||
## db.cljs
|
||||
|
||||
- must contain specs for the app-db subpart the module modifies
|
||||
- must contain getter and setter functions used by fx producing functions and subscriptions
|
||||
- db logic called by other modules
|
||||
|
||||
@@ -60,70 +55,26 @@ Rationale:
|
||||
|
||||
These guidelines make db.cljs namespaces the place to go when making changes to the db layout and minimize breaking changes when adding/refactoring features
|
||||
|
||||
## re-frame
|
||||
|
||||
### Subscriptions
|
||||
# Subscriptions
|
||||
|
||||
- all subscriptions must be defined in the single `status-im.subs` namespace
|
||||
- subscriptions must subscribe only on other subscriptions, and never on app-db itself
|
||||
- `reg-root-key-sub` should be used for the root keys subscriptions
|
||||
|
||||
### Events
|
||||
# Events
|
||||
|
||||
- all events must be defined in the `core.cljs` namespaces
|
||||
- events must always be declared with `fx/defn` macro
|
||||
- all events must be defined in the single `status-im.events` namespace which can be considered as an index of everything going on in the app
|
||||
- events must always be declared with `register-handler-fx`, no `register-handler-db`
|
||||
- events must never use the `trim-v` interceptor
|
||||
- events must only contain a function call defined in a module
|
||||
```clojure
|
||||
(handlers/register-handler-fx
|
||||
:notifications/handle-push-notification-open
|
||||
(fn [cofx [_ event]]
|
||||
(notifications/handle-push-notification-open event cofx)))
|
||||
```
|
||||
- events must use synthetic namespaces:
|
||||
|
||||
## Testing flow
|
||||
- All PRs automatically go to "REVIEW" column on [Pipeline for QA](https://github.com/status-im/status-mobile/projects/7) project on Github. This is our main board for QA / devs interaction
|
||||
- After the PR gets at least 1 approval, it should be moved to "E2E Tests" column. Some PRs may need approvals from more than one person.
|
||||
- Critical path tests are automatically run for all PRs in "E2E Tests" column.
|
||||
- If E2E tests pass:
|
||||
- If PR doesn't need manual QA (it is small change or change doesn't relate to app) - after passing e2e tests it can be merged (don't use the Github UI to merge, check section on merging PRs).
|
||||
|
||||
- If manual QA needed - add label 'request manual qa'. The QA team will process it (make sure the summary and test instructions are clear). QA team will review results and test PR on different platforms and assign one of the three labels:
|
||||
- No issues - label 'TESTED-OK' and then you can merge it.
|
||||
- If issues - label 'TESTED-ISSUES' and comment from QA with bugs.
|
||||
- After fix and/or discussion the process is repeated.
|
||||
|
||||
- If manual QA is not needed but all tests don't pass, you can ping @churik or @Serhy to confirm that failed E2E tests are not unrelated.
|
||||
|
||||
## Enabling debug logs
|
||||
Calls to `log/debug` will not be printed to the console by default. It can be enabled under "Advanced settings" in the app:
|
||||
|
||||

|
||||
|
||||
## Translations
|
||||
The app relies on system locale to select a language from the [list of supported languages](https://github.com/status-im/status-mobile/blob/bda73867471cf2bb8a68b1cc27c9f94b92d9a58b/src/status_im/i18n_resources.cljs#L9). It falls back to English in cash the system locale is not supported.
|
||||
|
||||
We use Lokalise App to manage [translations](https://translate.status.im/). In case you need to add/remove a key to translations, you only need to change `en.json`. Missing keys fallback to `en.json`. The actual translations will be added by Lokalise.
|
||||
|
||||
## re-frisk
|
||||
re-frisk is a state visualization tool written by our very own Andrey (@flexsurfer). To start re-frisk, execute the following command:
|
||||
```bash
|
||||
$ yarn shadow-cljs run re-frisk-remote.core/start
|
||||
```
|
||||
|
||||
or you can also use make:
|
||||
|
||||
```bash
|
||||
$ make run-re-frisk
|
||||
```
|
||||
|
||||
A server will be started at http://localhost:4567. It might show "not connected" at first. Don't worry and just start using the app. The events and state will populate.
|
||||
|
||||
## Merging approved PRs
|
||||
|
||||
We don't Github's UI to merge. Instead `./scripts/merge-pr.sh` is used to sign and merge PR to `develop`. You first need to enable [GPG signing on you commits](https://github.com/status-im/status-mobile/blob/develop/STARTING_GUIDE.md#configure-gpg-keys-for-signing-commits).
|
||||
|
||||
Once your commits are verified and PR approved, you can run the script like so:
|
||||
|
||||
```bash
|
||||
$ git checkout develop
|
||||
$ git fetch
|
||||
$ git reset --hard origin/develop
|
||||
$ ./scripts/merge-pr.sh 11370
|
||||
```
|
||||
Replace 11370 with your PR id.
|
||||
|
||||
## Release process
|
||||
TODO(shivekkhurana): Compile release notes
|
||||
- `:module.ui/` for user triggered events
|
||||
- `:module.callback/` for callback events, which are events bringing back the result of an fx to the event loop, the name of the event should end with `-success` or `-error` most of the time. Other possibilities can be `-granted`, `-denied` for instance.
|
||||
- `:module/` for internal events, examples are time based events marked `-timed-out`, external changes marked `-changed` or reception of external events marked `-received`.
|
||||
|
||||
@@ -49,7 +49,7 @@ decentralization and security.
|
||||
Q2 we will provide two ways of accessing the Ethereum network:
|
||||
|
||||
- Upstream RPC with Infura (default)
|
||||
- Custom upstream node (https://github.com/status-im/status-mobile/issues/3994)
|
||||
- Custom upstream node (https://github.com/status-im/status-react/issues/3994)
|
||||
|
||||
From a decentralization point of view we need the latter before we can release
|
||||
the beta.
|
||||
|
||||
@@ -20,11 +20,11 @@ chance to talk to strangers and it is open by default.
|
||||
Whether group chats are in scope or not has been a recurring discussing and a
|
||||
lot of effort has been wasted related to this.
|
||||
|
||||
There are currently a lot of outstanding regressions related to group chat: https://github.com/status-im/status-mobile/labels/group-chat Additionally, since group chats are private the encryption and security of those are generally harder than 1-1 and public chat.
|
||||
There are currently a lot of outstanding regressions related to group chat: https://github.com/status-im/status-react/labels/group-chat Additionally, since group chats are private the encryption and security of those are generally harder than 1-1 and public chat.
|
||||
|
||||
## Decision
|
||||
|
||||
Disable group chat for beta and don't work on bugs related to it until after. See https://github.com/status-im/status-mobile/issues/3995
|
||||
Disable group chat for beta and don't work on bugs related to it until after. See https://github.com/status-im/status-react/issues/3995
|
||||
|
||||
This ensures we can release beta without blockers, and then we can take some
|
||||
time to fix group chats properly.
|
||||
|
||||
@@ -13,7 +13,7 @@ Proposed
|
||||
|
||||
We have some data that we don't want to appear in the logs (user passwords are
|
||||
a good example). Currently, they are passed around as strings, that could be
|
||||
printed out by mistake in a log entry (see https://github.com/status-im/status-mobile/issues/4053)
|
||||
printed out by mistake in a log entry (see https://github.com/status-im/status-react/issues/4053)
|
||||
|
||||
## Decision
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@ We also have an ongoing document with them.
|
||||
|
||||
#### iOS Test Flight Release
|
||||
**Upload to AppStore Connect**
|
||||
Use [this Jenkins job](https://jenkins.status.im/job/status-mobile/job/upload_release_ios/)
|
||||
Use [this Jenkins job](https://jenkins.status.im/job/status-react/job/upload_release_ios/)
|
||||
|
||||
**“What to test” field**
|
||||
When AppStore Connect asks you to fill in the field called “what to test”, just copy the release notes there.
|
||||
@@ -114,7 +114,7 @@ If reviewed successfully, we can share it to our users by adding “testflight-b
|
||||
The uploaded release is **immediately available**!
|
||||
Do it only if the iOS build is approved by Apple!
|
||||
|
||||
Use [this Jenkins job](https://jenkins.status.im/job/status-mobile/job/upload_release_android/)
|
||||
Use [this Jenkins job](https://jenkins.status.im/job/status-react/job/upload_release_android/)
|
||||
|
||||
Don’t forget to update the screenshots if necessary!
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ As a rule of thumb, coverage should increase.
|
||||
**3. Reject PRs that don't write what tests the author have done and what platforms you used to test, including screenshots, videos or logs**
|
||||
This means QA and dev have to spend less time catching obvious problems.
|
||||
|
||||
**4. Run tests when a PR is at "Review" stage on https://github.com/status-im/status-mobile/projects/7 (or add new 'e2e stage' between review and `TO TEST`)**
|
||||
**4. Run tests when a PR is at "Review" stage on https://github.com/status-im/status-react/projects/7 (or add new 'e2e stage' between review and `TO TEST`)**
|
||||
|
||||
**5. Dev asks for 2-3 reviewers, including a designer if the change affects UI, and these reviewers review within a day.**
|
||||
This ensures we don't have *diffusion of responsibility* and that PRs are reviewed quickly.
|
||||
|
||||
@@ -23,8 +23,8 @@ The `State` field in the Pivotal story is used to track the progress of a Pivota
|
||||
| ---------- | -------- |
|
||||
| `Unstarted` | In backlog |
|
||||
| `Started` | Developer has started work on story |
|
||||
| `Finished` | Developer has finished work on story (Pull Request for story is in [REVIEW](https://github.com/status-im/status-mobile/projects/7#column-1843024) column in [Pipeline for QA](https://github.com/status-im/status-mobile/projects/7) board) |
|
||||
| `Delivered` | Pull Request for story is in testing in [Pipeline for QA](https://github.com/status-im/status-mobile/projects/7) board) board |
|
||||
| `Finished` | Developer has finished work on story (Pull Request for story is in [REVIEW](https://github.com/status-im/status-react/projects/7#column-1843024) column in [Pipeline for QA](https://github.com/status-im/status-react/projects/7) board) |
|
||||
| `Delivered` | Pull Request for story is in testing in [Pipeline for QA](https://github.com/status-im/status-react/projects/7) board) board |
|
||||
| `Accepted` | PR has been merged |
|
||||
| `Rejected` | PR has been aborted |
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 439 KiB |
|
Before Width: | Height: | Size: 285 KiB |
|
Before Width: | Height: | Size: 180 KiB |
|
Before Width: | Height: | Size: 290 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 655 KiB |
|
Before Width: | Height: | Size: 203 KiB |
|
Before Width: | Height: | Size: 583 KiB |
|
Before Width: | Height: | Size: 585 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 33 KiB |
@@ -11,6 +11,18 @@
|
||||
# There are a few env variables defined in the .env file in
|
||||
# this directory (fastlane/.env)
|
||||
|
||||
# unlocks keychain if KEYCHAIN_PASSWORD variable is present
|
||||
# (to be used on CI machines)
|
||||
def unlock_keychain_if_needed
|
||||
return unless ENV['KEYCHAIN_PASSWORD']
|
||||
|
||||
unlock_keychain(
|
||||
path: 'login.keychain',
|
||||
password: ENV['KEYCHAIN_PASSWORD'],
|
||||
set_default: true
|
||||
)
|
||||
end
|
||||
|
||||
def curl_upload(url, file, auth, conn_timeout = 5, timeout = 60, retries = 3)
|
||||
rval = sh(
|
||||
'curl',
|
||||
@@ -69,45 +81,6 @@ def upload_to_saucelabs(file)
|
||||
end
|
||||
end
|
||||
|
||||
# Creates and unlocks a keychain into which Fastlane match imports signing keys and certs.
|
||||
class Keychain
|
||||
attr_accessor :name, :pass
|
||||
|
||||
def initialize(name)
|
||||
# Local devs will not have KEYCHAIN_PASSWORD set, and will be prompted for password.
|
||||
return "login.keychain-db" unless ENV['KEYCHAIN_PASSWORD']
|
||||
# We user the same keychain every time because we need to set a default.
|
||||
@name = "#{name}.keychain-db"
|
||||
@pass = ENV['KEYCHAIN_PASSWORD']
|
||||
Fastlane::Actions::CreateKeychainAction.run(
|
||||
name: @name,
|
||||
password: @pass,
|
||||
unlock: true,
|
||||
# Fastlane can't find the signing cert without setting a default.
|
||||
default_keychain: true,
|
||||
# Deleting the keychain would cause race condition for parallel jobs.
|
||||
require_create: false,
|
||||
# Lock it up after 25 minutes just in case we don't delete it.
|
||||
lock_when_sleeps: true,
|
||||
lock_after_timeout: true,
|
||||
timeout: 1500
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
# App Store Connect API is an official public API used to manage Apps.
|
||||
# This includes metadata, pricing and availability, provisioning, and more.
|
||||
# It provides a JSON API and auth using API Keys to generate a JSON Web Token (JWT).
|
||||
def asc_api_key()
|
||||
app_store_connect_api_key(
|
||||
key_id: ENV['FASTLANE_ASC_API_KEY_ID'],
|
||||
issuer_id: ENV['FASTLANE_ASC_API_ISSUER_ID'],
|
||||
key_filepath: ENV['FASTLANE_ASC_API_KEY_FILE_PATH'],
|
||||
duration: 1200, # seconds, session length
|
||||
in_house: false,
|
||||
)
|
||||
end
|
||||
|
||||
# builds an ios app with ad-hoc configuration and put it
|
||||
# to "status-ios" output folder
|
||||
# `readonly`:
|
||||
@@ -122,16 +95,12 @@ def build_ios_adhoc(readonly: false, pr_build: false)
|
||||
scheme = pr_build ? 'StatusImPR' : 'StatusIm'
|
||||
app_id = pr_build ? 'im.status.ethereum.pr' : 'im.status.ethereum'
|
||||
|
||||
kc = Keychain.new('fastlane')
|
||||
|
||||
match(
|
||||
type: 'adhoc',
|
||||
readonly: readonly,
|
||||
api_key: asc_api_key(),
|
||||
app_identifier: app_id,
|
||||
force_for_new_devices: true,
|
||||
keychain_name: kc.name,
|
||||
keychain_password: kc.pass
|
||||
readonly: readonly,
|
||||
app_identifier: app_id,
|
||||
keychain_name: 'login.keychain'
|
||||
)
|
||||
|
||||
build_ios_app(
|
||||
@@ -159,15 +128,11 @@ def build_ios_e2e
|
||||
showsdks_output = sh('xcodebuild', '-showsdks')
|
||||
simulator_sdk = showsdks_output.scan(/iphonesimulator\d\d?\.\d\d?/).first
|
||||
|
||||
kc = Keychain.new('fastlane')
|
||||
|
||||
match(
|
||||
type: 'adhoc',
|
||||
readonly: true,
|
||||
api_key: asc_api_key(),
|
||||
force_for_new_devices: true,
|
||||
keychain_name: kc.name,
|
||||
keychain_password: kc.pass
|
||||
readonly: true,
|
||||
keychain_name: 'login.keychain'
|
||||
)
|
||||
|
||||
build_ios_app(
|
||||
@@ -216,6 +181,7 @@ platform :ios do
|
||||
desc 'It creates an .ipa that can be used by a list of devices, registeded in the App Store Connect.'
|
||||
desc 'This .ipa is ready to be distibuted through diawi.com'
|
||||
lane :adhoc do
|
||||
unlock_keychain_if_needed
|
||||
build_ios_adhoc(readonly: true)
|
||||
end
|
||||
|
||||
@@ -223,32 +189,31 @@ platform :ios do
|
||||
desc 'This lane is used for SauceLabs end-to-end testing.'
|
||||
desc 'It creates an .app that can be used inside of a iPhone simulator.'
|
||||
lane :e2e do
|
||||
unlock_keychain_if_needed
|
||||
build_ios_e2e
|
||||
end
|
||||
|
||||
desc '`fastlane ios pr` - makes a new pr build'
|
||||
desc 'This lane builds a new adhoc build and leaves an .ipa that is ad-hoc signed (can be uploaded to diawi)'
|
||||
lane :pr do
|
||||
unlock_keychain_if_needed
|
||||
build_ios_adhoc(pr_build: true)
|
||||
end
|
||||
|
||||
desc '`fastlane ios nightly` - makes a new nightly'
|
||||
desc 'This lane builds a new nightly and leaves an .ipa that is ad-hoc signed (can be uploaded to diawi)'
|
||||
lane :nightly do
|
||||
unlock_keychain_if_needed
|
||||
build_ios_adhoc()
|
||||
end
|
||||
|
||||
desc '`fastlane ios release` builds a release & uploads it to TestFlight'
|
||||
lane :release do
|
||||
kc = Keychain.new('fastlane')
|
||||
|
||||
match(
|
||||
type: 'appstore',
|
||||
readonly: true,
|
||||
api_key: asc_api_key(),
|
||||
app_identifier: 'im.status.ethereum',
|
||||
keychain_name: kc.name,
|
||||
keychain_password: kc.pass
|
||||
keychain_name: 'login.keychain'
|
||||
)
|
||||
|
||||
build_ios_app(
|
||||
@@ -265,7 +230,6 @@ platform :ios do
|
||||
"ITSAppUsesNonExemptEncryption": false
|
||||
}
|
||||
)
|
||||
|
||||
upload_to_testflight(
|
||||
ipa: 'status-ios/StatusIm.ipa',
|
||||
skip_waiting_for_build_processing: true
|
||||
|
||||
@@ -1,80 +1,57 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
CFPropertyList (3.0.5)
|
||||
rexml
|
||||
addressable (2.8.1)
|
||||
public_suffix (>= 2.0.2, < 6.0)
|
||||
artifactory (3.0.15)
|
||||
CFPropertyList (3.0.2)
|
||||
addressable (2.7.0)
|
||||
public_suffix (>= 2.0.2, < 5.0)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.2.0)
|
||||
aws-partitions (1.622.0)
|
||||
aws-sdk-core (3.136.0)
|
||||
aws-eventstream (1.1.0)
|
||||
aws-partitions (1.350.0)
|
||||
aws-sdk-core (3.104.3)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
aws-partitions (~> 1, >= 1.525.0)
|
||||
aws-partitions (~> 1, >= 1.239.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
jmespath (~> 1, >= 1.6.1)
|
||||
aws-sdk-kms (1.58.0)
|
||||
aws-sdk-core (~> 3, >= 3.127.0)
|
||||
jmespath (~> 1.0)
|
||||
aws-sdk-kms (1.36.0)
|
||||
aws-sdk-core (~> 3, >= 3.99.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.114.0)
|
||||
aws-sdk-core (~> 3, >= 3.127.0)
|
||||
aws-sdk-s3 (1.75.0)
|
||||
aws-sdk-core (~> 3, >= 3.104.1)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.4)
|
||||
aws-sigv4 (1.5.1)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sigv4 (1.2.1)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
babosa (1.0.4)
|
||||
claide (1.1.0)
|
||||
babosa (1.0.3)
|
||||
claide (1.0.3)
|
||||
colored (1.2)
|
||||
colored2 (3.1.2)
|
||||
commander (4.6.0)
|
||||
highline (~> 2.0.0)
|
||||
commander-fastlane (4.4.6)
|
||||
highline (~> 1.7.2)
|
||||
declarative (0.0.20)
|
||||
digest-crc (0.6.4)
|
||||
rake (>= 12.0.0, < 14.0.0)
|
||||
declarative-option (0.1.0)
|
||||
digest-crc (0.6.1)
|
||||
rake (~> 13.0)
|
||||
domain_name (0.5.20190701)
|
||||
unf (>= 0.0.5, < 1.0.0)
|
||||
dotenv (2.8.1)
|
||||
emoji_regex (3.2.3)
|
||||
excon (0.92.4)
|
||||
faraday (1.10.2)
|
||||
faraday-em_http (~> 1.0)
|
||||
faraday-em_synchrony (~> 1.0)
|
||||
faraday-excon (~> 1.1)
|
||||
faraday-httpclient (~> 1.0)
|
||||
faraday-multipart (~> 1.0)
|
||||
faraday-net_http (~> 1.0)
|
||||
faraday-net_http_persistent (~> 1.0)
|
||||
faraday-patron (~> 1.0)
|
||||
faraday-rack (~> 1.0)
|
||||
faraday-retry (~> 1.0)
|
||||
ruby2_keywords (>= 0.0.4)
|
||||
faraday-cookie_jar (0.0.7)
|
||||
faraday (>= 0.8.0)
|
||||
dotenv (2.7.6)
|
||||
emoji_regex (3.0.0)
|
||||
excon (0.76.0)
|
||||
faraday (1.0.1)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
faraday-cookie_jar (0.0.6)
|
||||
faraday (>= 0.7.4)
|
||||
http-cookie (~> 1.0.0)
|
||||
faraday-em_http (1.0.0)
|
||||
faraday-em_synchrony (1.0.0)
|
||||
faraday-excon (1.1.0)
|
||||
faraday-httpclient (1.0.1)
|
||||
faraday-multipart (1.0.4)
|
||||
multipart-post (~> 2)
|
||||
faraday-net_http (1.0.1)
|
||||
faraday-net_http_persistent (1.2.0)
|
||||
faraday-patron (1.0.0)
|
||||
faraday-rack (1.0.0)
|
||||
faraday-retry (1.0.3)
|
||||
faraday_middleware (1.2.0)
|
||||
faraday_middleware (1.0.0)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.2.6)
|
||||
fastlane (2.209.1)
|
||||
fastimage (2.2.0)
|
||||
fastlane (2.154.0)
|
||||
CFPropertyList (>= 2.3, < 4.0.0)
|
||||
addressable (>= 2.8, < 3.0.0)
|
||||
artifactory (~> 3.0)
|
||||
addressable (>= 2.3, < 3.0.0)
|
||||
aws-sdk-s3 (~> 1.0)
|
||||
babosa (>= 1.0.3, < 2.0.0)
|
||||
bundler (>= 1.12.0, < 3.0.0)
|
||||
colored
|
||||
commander (~> 4.6)
|
||||
commander-fastlane (>= 4.4.6, < 5.0.0)
|
||||
dotenv (>= 2.1.1, < 3.0.0)
|
||||
emoji_regex (>= 0.1, < 4.0)
|
||||
excon (>= 0.71.0, < 1.0.0)
|
||||
@@ -83,20 +60,18 @@ GEM
|
||||
faraday_middleware (~> 1.0)
|
||||
fastimage (>= 2.1.0, < 3.0.0)
|
||||
gh_inspector (>= 1.1.2, < 2.0.0)
|
||||
google-apis-androidpublisher_v3 (~> 0.3)
|
||||
google-apis-playcustomapp_v1 (~> 0.1)
|
||||
google-cloud-storage (~> 1.31)
|
||||
highline (~> 2.0)
|
||||
google-api-client (>= 0.37.0, < 0.39.0)
|
||||
google-cloud-storage (>= 1.15.0, < 2.0.0)
|
||||
highline (>= 1.7.2, < 2.0.0)
|
||||
json (< 3.0.0)
|
||||
jwt (>= 2.1.0, < 3)
|
||||
mini_magick (>= 4.9.4, < 5.0.0)
|
||||
multipart-post (~> 2.0.0)
|
||||
naturally (~> 2.2)
|
||||
optparse (~> 0.1.1)
|
||||
plist (>= 3.1.0, < 4.0.0)
|
||||
rubyzip (>= 2.0.0, < 3.0.0)
|
||||
security (= 0.1.3)
|
||||
simctl (~> 1.6.3)
|
||||
slack-notifier (>= 2.0.0, < 3.0.0)
|
||||
terminal-notifier (>= 2.0.0, < 3.0.0)
|
||||
terminal-table (>= 1.4.5, < 2.0.0)
|
||||
tty-screen (>= 0.6.3, < 1.0.0)
|
||||
@@ -109,71 +84,60 @@ GEM
|
||||
fastlane-plugin-diawi (2.1.0)
|
||||
rest-client (>= 2.0.0)
|
||||
gh_inspector (1.1.3)
|
||||
google-apis-androidpublisher_v3 (0.25.0)
|
||||
google-apis-core (>= 0.7, < 2.a)
|
||||
google-apis-core (0.7.0)
|
||||
google-api-client (0.38.0)
|
||||
addressable (~> 2.5, >= 2.5.1)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
httpclient (>= 2.8.1, < 3.a)
|
||||
googleauth (~> 0.9)
|
||||
httpclient (>= 2.8.1, < 3.0)
|
||||
mini_mime (~> 1.0)
|
||||
representable (~> 3.0)
|
||||
retriable (>= 2.0, < 4.a)
|
||||
rexml
|
||||
webrick
|
||||
google-apis-iamcredentials_v1 (0.13.0)
|
||||
google-apis-core (>= 0.7, < 2.a)
|
||||
google-apis-playcustomapp_v1 (0.10.0)
|
||||
google-apis-core (>= 0.7, < 2.a)
|
||||
google-apis-storage_v1 (0.17.0)
|
||||
google-apis-core (>= 0.7, < 2.a)
|
||||
google-cloud-core (1.6.0)
|
||||
retriable (>= 2.0, < 4.0)
|
||||
signet (~> 0.12)
|
||||
google-cloud-core (1.5.0)
|
||||
google-cloud-env (~> 1.0)
|
||||
google-cloud-errors (~> 1.0)
|
||||
google-cloud-env (1.6.0)
|
||||
faraday (>= 0.17.3, < 3.0)
|
||||
google-cloud-errors (1.2.0)
|
||||
google-cloud-storage (1.39.0)
|
||||
addressable (~> 2.8)
|
||||
google-cloud-env (1.3.3)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
google-cloud-errors (1.0.1)
|
||||
google-cloud-storage (1.27.0)
|
||||
addressable (~> 2.5)
|
||||
digest-crc (~> 0.4)
|
||||
google-apis-iamcredentials_v1 (~> 0.1)
|
||||
google-apis-storage_v1 (~> 0.17.0)
|
||||
google-cloud-core (~> 1.6)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
google-api-client (~> 0.33)
|
||||
google-cloud-core (~> 1.2)
|
||||
googleauth (~> 0.9)
|
||||
mini_mime (~> 1.0)
|
||||
googleauth (1.2.0)
|
||||
faraday (>= 0.17.3, < 3.a)
|
||||
googleauth (0.13.1)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
jwt (>= 1.4, < 3.0)
|
||||
memoist (~> 0.16)
|
||||
multi_json (~> 1.11)
|
||||
os (>= 0.9, < 2.0)
|
||||
signet (>= 0.16, < 2.a)
|
||||
highline (2.0.3)
|
||||
signet (~> 0.14)
|
||||
highline (1.7.10)
|
||||
http-accept (1.7.0)
|
||||
http-cookie (1.0.5)
|
||||
http-cookie (1.0.3)
|
||||
domain_name (~> 0.5)
|
||||
httpclient (2.8.3)
|
||||
jmespath (1.6.1)
|
||||
json (2.6.2)
|
||||
jwt (2.5.0)
|
||||
jmespath (1.4.0)
|
||||
json (2.3.1)
|
||||
jwt (2.2.1)
|
||||
memoist (0.16.2)
|
||||
mime-types (3.4.1)
|
||||
mime-types (3.3.1)
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2022.0105)
|
||||
mini_magick (4.11.0)
|
||||
mini_mime (1.1.2)
|
||||
mime-types-data (3.2020.0512)
|
||||
mini_magick (4.10.1)
|
||||
mini_mime (1.0.2)
|
||||
multi_json (1.15.0)
|
||||
multipart-post (2.0.0)
|
||||
nanaimo (0.3.0)
|
||||
naturally (2.2.1)
|
||||
naturally (2.2.0)
|
||||
netrc (0.11.0)
|
||||
optparse (0.1.1)
|
||||
os (1.1.4)
|
||||
plist (3.6.0)
|
||||
public_suffix (5.0.0)
|
||||
rake (13.0.6)
|
||||
representable (3.2.0)
|
||||
os (1.1.1)
|
||||
plist (3.5.0)
|
||||
public_suffix (4.0.5)
|
||||
rake (13.0.1)
|
||||
representable (3.0.4)
|
||||
declarative (< 0.1.0)
|
||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||
declarative-option (< 0.2.0)
|
||||
uber (< 0.2.0)
|
||||
rest-client (2.1.0)
|
||||
http-accept (>= 1.7.0, < 2.0)
|
||||
@@ -181,23 +145,21 @@ GEM
|
||||
mime-types (>= 1.16, < 4.0)
|
||||
netrc (~> 0.8)
|
||||
retriable (3.1.2)
|
||||
rexml (3.2.5)
|
||||
rouge (2.0.7)
|
||||
ruby2_keywords (0.0.5)
|
||||
rubyzip (2.3.2)
|
||||
rubyzip (2.3.0)
|
||||
security (0.1.3)
|
||||
signet (0.17.0)
|
||||
addressable (~> 2.8)
|
||||
faraday (>= 0.17.5, < 3.a)
|
||||
signet (0.14.0)
|
||||
addressable (~> 2.3)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
jwt (>= 1.5, < 3.0)
|
||||
multi_json (~> 1.10)
|
||||
simctl (1.6.8)
|
||||
CFPropertyList
|
||||
naturally
|
||||
slack-notifier (2.3.2)
|
||||
terminal-notifier (2.0.0)
|
||||
terminal-table (1.8.0)
|
||||
unicode-display_width (~> 1.1, >= 1.1.1)
|
||||
trailblazer-option (0.1.2)
|
||||
tty-cursor (0.7.1)
|
||||
tty-screen (0.8.1)
|
||||
tty-spinner (0.9.3)
|
||||
@@ -205,20 +167,18 @@ GEM
|
||||
uber (0.1.0)
|
||||
unf (0.1.4)
|
||||
unf_ext
|
||||
unf_ext (0.0.8.2)
|
||||
unicode-display_width (1.8.0)
|
||||
webrick (1.7.0)
|
||||
unf_ext (0.0.7.7)
|
||||
unicode-display_width (1.7.0)
|
||||
word_wrap (1.0.0)
|
||||
xcodeproj (1.22.0)
|
||||
xcodeproj (1.17.1)
|
||||
CFPropertyList (>= 2.3.3, < 4.0)
|
||||
atomos (~> 0.1.3)
|
||||
claide (>= 1.0.2, < 2.0)
|
||||
colored2 (~> 3.1)
|
||||
nanaimo (~> 0.3.0)
|
||||
rexml (~> 3.2.4)
|
||||
xcpretty (0.3.0)
|
||||
rouge (~> 2.0.7)
|
||||
xcpretty-travis-formatter (1.0.1)
|
||||
xcpretty-travis-formatter (1.0.0)
|
||||
xcpretty (~> 0.2, >= 0.0.7)
|
||||
|
||||
PLATFORMS
|
||||
@@ -230,4 +190,4 @@ DEPENDENCIES
|
||||
fastlane-plugin-diawi
|
||||
|
||||
BUNDLED WITH
|
||||
2.3.9
|
||||
2.1.4
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{ stdenv, lib, bundlerEnv, ruby, makeWrapper }:
|
||||
{ stdenv, bundlerEnv, ruby, makeWrapper }:
|
||||
|
||||
let
|
||||
fastlane = stdenv.mkDerivation rec {
|
||||
@@ -23,12 +23,12 @@ let
|
||||
'';
|
||||
|
||||
shellHook = ''
|
||||
[ -z "$STATUS_MOBILE_HOME" ] && echo "STATUS_MOBILE_HOME is empty!" && exit 1
|
||||
[ -z "$STATUS_REACT_HOME" ] && echo "STATUS_REACT_HOME is empty!" && exit 1
|
||||
|
||||
export FASTLANE_PLUGINFILE_PATH=$STATUS_MOBILE_HOME/fastlane/Pluginfile
|
||||
export FASTLANE_PLUGINFILE_PATH=$STATUS_REACT_HOME/fastlane/Pluginfile
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
meta = with stdenv.lib; {
|
||||
description = "A tool to automate building and releasing iOS and Android apps";
|
||||
longDescription = "fastlane is a tool for iOS and Android developers to automate tedious tasks like generating screenshots, dealing with provisioning profiles, and releasing your application.";
|
||||
homepage = https://github.com/fastlane/fastlane;
|
||||
|
||||
@@ -5,20 +5,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1ypdmpdn20hxp5vwxz3zc04r5xcwqc25qszdlg41h8ghdqbllwmw";
|
||||
sha256 = "1fvchp2rhp2rmigx7qglf69xvjqvzq7x0g49naliw29r2bz656sy";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.8.1";
|
||||
};
|
||||
artifactory = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0wify8rhjwr5bw5y6ary61vba290vk766cxw9a9mg05yswmaisls";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.0.15";
|
||||
version = "2.7.0";
|
||||
};
|
||||
atomos = {
|
||||
groups = ["default"];
|
||||
@@ -35,20 +25,20 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1pyis1nvnbjxk12a43xvgj2gv0mvp4cnkc1gzw0v1018r61399gz";
|
||||
sha256 = "0r0pn66yqrdkrfdin7qdim0yj2x75miyg4wp6mijckhzhrjb7cv5";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.2.0";
|
||||
version = "1.1.0";
|
||||
};
|
||||
aws-partitions = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1py4q91ll3v7ylcqflgd190y40d3ixgrhpln011gr5adgbzg9hr6";
|
||||
sha256 = "1rwd13lqambjpq94qhccw3ixn6bvwnqcnd3v1rdlmpcvqq2rw49c";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.622.0";
|
||||
version = "1.350.0";
|
||||
};
|
||||
aws-sdk-core = {
|
||||
dependencies = ["aws-eventstream" "aws-partitions" "aws-sigv4" "jmespath"];
|
||||
@@ -56,10 +46,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "111zdfl6p1n949rvsfr0c88k9yzpibrcd8fihyshbibc2w06qj2b";
|
||||
sha256 = "1xfv8nfz8n700z29di51mcyyrnmbpq7flff4hx9mm92avnly1ysy";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.136.0";
|
||||
version = "3.104.3";
|
||||
};
|
||||
aws-sdk-kms = {
|
||||
dependencies = ["aws-sdk-core" "aws-sigv4"];
|
||||
@@ -67,10 +57,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1p2dbmb1vl8vk2xchrrsp2sxa95ya5w7ll1jlw89yyhls3l2l1ag";
|
||||
sha256 = "0rpwpj4f4q9wdrbgiqngzwfdaaqyz0iif8sv16z6z0mm6y3cb06q";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.58.0";
|
||||
version = "1.36.0";
|
||||
};
|
||||
aws-sdk-s3 = {
|
||||
dependencies = ["aws-sdk-core" "aws-sdk-kms" "aws-sigv4"];
|
||||
@@ -78,10 +68,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1r6dxz3llgxbbm66jq5mkzk0i6qsxwv0d9s0ipwb23vv3bgp23yf";
|
||||
sha256 = "068xx6wp86wkmikdzg4wqxmg570hc3ydp8211j02g13djjr3k28n";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.114.0";
|
||||
version = "1.75.0";
|
||||
};
|
||||
aws-sigv4 = {
|
||||
dependencies = ["aws-eventstream"];
|
||||
@@ -89,41 +79,40 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1d4bifmll4hrf4gihr5hdvn59wjpz4qpyg5jj95kp17fykzqg36n";
|
||||
sha256 = "0aknh3q37rq3ixxa84x2p26g8a15zmiig2rm1pmailsb9vqhfh3j";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.5.1";
|
||||
version = "1.2.1";
|
||||
};
|
||||
babosa = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "16dwqn33kmxkqkv51cwiikdkbrdjfsymlnc0rgbjwilmym8a9phq";
|
||||
sha256 = "10nn9bw63i4awpzn5vrx6kmpx1sg7z8r3fhw9r8bvg9pz2wh489g";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.4";
|
||||
version = "1.0.3";
|
||||
};
|
||||
CFPropertyList = {
|
||||
dependencies = ["rexml"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "193l8r1ycd3dcxa7lsb4pqcghbk56dzc5244m6y8xmv88z6m31d7";
|
||||
sha256 = "1825ll26p28swjiw8n3x2pnh5ygsmg83spf82fnzcjn2p87vc5lf";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.0.5";
|
||||
version = "3.0.2";
|
||||
};
|
||||
claide = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0bpqhc0kqjp1bh9b7ffc395l9gfls0337rrhmab4v46ykl45qg3d";
|
||||
sha256 = "0kasxsms24fgcdsq680nz99d5lazl9rmz1qkil2y5gbbssx89g0z";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.0";
|
||||
version = "1.0.3";
|
||||
};
|
||||
colored = {
|
||||
groups = ["default"];
|
||||
@@ -145,16 +134,16 @@
|
||||
};
|
||||
version = "3.1.2";
|
||||
};
|
||||
commander = {
|
||||
commander-fastlane = {
|
||||
dependencies = ["highline"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1n8k547hqq9hvbyqbx2qi08g0bky20bbjca1df8cqq5frhzxq7bx";
|
||||
sha256 = "0y8d3ac9qwm1cg6rnpf8rcdsy1yxacrd2g2kl809xsp2vi973g65";
|
||||
type = "gem";
|
||||
};
|
||||
version = "4.6.0";
|
||||
version = "4.4.6";
|
||||
};
|
||||
declarative = {
|
||||
groups = ["default"];
|
||||
@@ -166,16 +155,26 @@
|
||||
};
|
||||
version = "0.0.20";
|
||||
};
|
||||
declarative-option = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1g4ibxq566f1frnhdymzi9hxxcm4g2gw4n21mpjk2mhwym4q6l0p";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.1.0";
|
||||
};
|
||||
digest-crc = {
|
||||
dependencies = ["rake"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1czaak53w8n13y1fr0q23gp0fhklvxjac5n562qj3xk6sh5ad0x2";
|
||||
sha256 = "1nygbn680kmya9vnz0pr9681z8lszr2whln0rxk168vaxbcnga8d";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.6.4";
|
||||
version = "0.6.1";
|
||||
};
|
||||
domain_name = {
|
||||
dependencies = ["unf"];
|
||||
@@ -193,41 +192,41 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1n0pi8x8ql5h1mijvm8lgn6bhq4xjb5a500p5r1krq4s6j9lg565";
|
||||
sha256 = "0iym172c5337sm1x2ykc2i3f961vj3wdclbyg1x6sxs3irgfsl94";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.8.1";
|
||||
version = "2.7.6";
|
||||
};
|
||||
emoji_regex = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0jsnrkfy345v66jlm2xrz8znivfnamg3mfzkddn414bndf2vxn7c";
|
||||
sha256 = "0mjl5g6fv8iyf3nnbfyzd64bhl8l1qxyh452797km1aj4c682ia3";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.2.3";
|
||||
version = "3.0.0";
|
||||
};
|
||||
excon = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0cdc76kgr4f1mq4jwbmq1qvr9c15hb4r1cx4dvrdra13vy9sckb5";
|
||||
sha256 = "05is0kb650j8wrdi4rgkdls662chnhdg2p64pgq3zkd3d7l2a9zw";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.92.4";
|
||||
version = "0.76.0";
|
||||
};
|
||||
faraday = {
|
||||
dependencies = ["faraday-em_http" "faraday-em_synchrony" "faraday-excon" "faraday-httpclient" "faraday-multipart" "faraday-net_http" "faraday-net_http_persistent" "faraday-patron" "faraday-rack" "faraday-retry" "ruby2_keywords"];
|
||||
dependencies = ["multipart-post"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1d5ipsv069dhgv9zhxgj8pz4j52yhgvfm01aq881yz7qgjd7ilxp";
|
||||
sha256 = "0wwks9652xwgjm7yszcq5xr960pjypc07ivwzbjzpvy9zh2fw6iq";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.10.2";
|
||||
version = "1.0.1";
|
||||
};
|
||||
faraday-cookie_jar = {
|
||||
dependencies = ["faraday" "http-cookie"];
|
||||
@@ -235,111 +234,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "00hligx26w9wdnpgsrf0qdnqld4rdccy8ym6027h5m735mpvxjzk";
|
||||
sha256 = "1di4gx6446a6zdkrpj679m5k515i53wvb4yxcsqvy8d8zacxiiv6";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.0.7";
|
||||
};
|
||||
faraday-em_http = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "12cnqpbak4vhikrh2cdn94assh3yxza8rq2p9w2j34bqg5q4qgbs";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.0";
|
||||
};
|
||||
faraday-em_synchrony = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1vgrbhkp83sngv6k4mii9f2s9v5lmp693hylfxp2ssfc60fas3a6";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.0";
|
||||
};
|
||||
faraday-excon = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0h09wkb0k0bhm6dqsd47ac601qiaah8qdzjh8gvxfd376x1chmdh";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.0";
|
||||
};
|
||||
faraday-httpclient = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0fyk0jd3ks7fdn8nv3spnwjpzx2lmxmg2gh4inz3by1zjzqg33sc";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.1";
|
||||
};
|
||||
faraday-multipart = {
|
||||
dependencies = ["multipart-post"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "09871c4hd7s5ws1wl4gs7js1k2wlby6v947m2bbzg43pnld044lh";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.4";
|
||||
};
|
||||
faraday-net_http = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1fi8sda5hc54v1w3mqfl5yz09nhx35kglyx72w7b8xxvdr0cwi9j";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.1";
|
||||
};
|
||||
faraday-net_http_persistent = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0dc36ih95qw3rlccffcb0vgxjhmipsvxhn6cw71l7ffs0f7vq30b";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.2.0";
|
||||
};
|
||||
faraday-patron = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "19wgsgfq0xkski1g7m96snv39la3zxz6x7nbdgiwhg5v82rxfb6w";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.0";
|
||||
};
|
||||
faraday-rack = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1h184g4vqql5jv9s9im6igy00jp6mrah2h14py6mpf9bkabfqq7g";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.0";
|
||||
};
|
||||
faraday-retry = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "153i967yrwnswqgvnnajgwp981k9p50ys1h80yz3q94rygs59ldd";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.3";
|
||||
version = "0.0.6";
|
||||
};
|
||||
faraday_middleware = {
|
||||
dependencies = ["faraday"];
|
||||
@@ -347,31 +245,31 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1bw8mfh4yin2xk7138rg3fhb2p5g2dlmdma88k82psah9mbmvlfy";
|
||||
sha256 = "0jik2kgfinwnfi6fpp512vlvs0mlggign3gkbpkg5fw1jr9his0r";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.2.0";
|
||||
version = "1.0.0";
|
||||
};
|
||||
fastimage = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0nnggg20za5vamdpkgrxxa32z33d8hf0g2bciswkhqnc6amb3yjr";
|
||||
sha256 = "11ny2pj0j6pljszrf1w3iqdv2pcl2iwwghjbgcjlizy424zbh0hb";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.2.6";
|
||||
version = "2.2.0";
|
||||
};
|
||||
fastlane = {
|
||||
dependencies = ["CFPropertyList" "addressable" "artifactory" "aws-sdk-s3" "babosa" "colored" "commander" "dotenv" "emoji_regex" "excon" "faraday" "faraday-cookie_jar" "faraday_middleware" "fastimage" "gh_inspector" "google-apis-androidpublisher_v3" "google-apis-playcustomapp_v1" "google-cloud-storage" "highline" "json" "jwt" "mini_magick" "multipart-post" "naturally" "optparse" "plist" "rubyzip" "security" "simctl" "terminal-notifier" "terminal-table" "tty-screen" "tty-spinner" "word_wrap" "xcodeproj" "xcpretty" "xcpretty-travis-formatter"];
|
||||
dependencies = ["CFPropertyList" "addressable" "aws-sdk-s3" "babosa" "colored" "commander-fastlane" "dotenv" "emoji_regex" "excon" "faraday" "faraday-cookie_jar" "faraday_middleware" "fastimage" "gh_inspector" "google-api-client" "google-cloud-storage" "highline" "json" "jwt" "mini_magick" "multipart-post" "plist" "rubyzip" "security" "simctl" "slack-notifier" "terminal-notifier" "terminal-table" "tty-screen" "tty-spinner" "word_wrap" "xcodeproj" "xcpretty" "xcpretty-travis-formatter"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "17m4nrpsjx2kadgy3qasis9d8rzajxgi9gzwkvdj7c0jjs6a768d";
|
||||
sha256 = "05y7qn8f1d3q355vf1fvbwz0sf73bwiwbcpzidd1szh49400h65b";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.209.1";
|
||||
version = "2.154.0";
|
||||
};
|
||||
fastlane-plugin-clean_testflight_testers = {
|
||||
groups = ["default"];
|
||||
@@ -404,60 +302,16 @@
|
||||
};
|
||||
version = "1.1.3";
|
||||
};
|
||||
google-apis-androidpublisher_v3 = {
|
||||
dependencies = ["google-apis-core"];
|
||||
google-api-client = {
|
||||
dependencies = ["addressable" "googleauth" "httpclient" "mini_mime" "representable" "retriable" "signet"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0psz3w8c95ashk5hlfvn5l32mg111z7fv07ngvvgm5mkw6wksh4d";
|
||||
sha256 = "1jybks8i00rxrxx9mkx90dbdk6pczh2w757wchlavmrkrk0dp9s1";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.25.0";
|
||||
};
|
||||
google-apis-core = {
|
||||
dependencies = ["addressable" "googleauth" "httpclient" "mini_mime" "representable" "retriable" "rexml" "webrick"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "07jhk74awjc1npf2rim4kmwz4v0n3ny6y5g31saq7aqxkjmlp3hd";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.7.0";
|
||||
};
|
||||
google-apis-iamcredentials_v1 = {
|
||||
dependencies = ["google-apis-core"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0mf9l1r28hxqqh2ilza2pfffy32vvzq10ifqf88a732k16iwvin1";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.13.0";
|
||||
};
|
||||
google-apis-playcustomapp_v1 = {
|
||||
dependencies = ["google-apis-core"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0jgmfayhww7sy06pzf8r7bvxjix4jdazbyyy4mhp6ghv1s9r85w7";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.10.0";
|
||||
};
|
||||
google-apis-storage_v1 = {
|
||||
dependencies = ["google-apis-core"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "19ccrdgb34w49l62p28yy5qrgwgb4wxs9q3mnb2d334q4q3wsk9f";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.17.0";
|
||||
version = "0.38.0";
|
||||
};
|
||||
google-cloud-core = {
|
||||
dependencies = ["google-cloud-env" "google-cloud-errors"];
|
||||
@@ -465,10 +319,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0amp8vd16pzbdrfbp7k0k38rqxpwd88bkyp35l3x719hbb6l85za";
|
||||
sha256 = "1qjn7vs8f85vxi1nkikbjfja6bv9snrj26vzscjii0cm8n4dy0i1";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.6.0";
|
||||
version = "1.5.0";
|
||||
};
|
||||
google-cloud-env = {
|
||||
dependencies = ["faraday"];
|
||||
@@ -476,31 +330,31 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "05gshdqscg4kil6ppfzmikyavsx449bxyj47j33r4n4p8swsqyb1";
|
||||
sha256 = "0frifczbhs5k699avaxnaypijfmjd2zb1rbdmcb30vdx8sskypa9";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.6.0";
|
||||
version = "1.3.3";
|
||||
};
|
||||
google-cloud-errors = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0nakfswnck6grjpyhckzl40qccyys3sy999h5axk0rldx96fnivd";
|
||||
sha256 = "1hvs1x39g77hbdqjxmzcl6gq8160pv3kskvzbbch0ww1np6qwm67";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.2.0";
|
||||
version = "1.0.1";
|
||||
};
|
||||
google-cloud-storage = {
|
||||
dependencies = ["addressable" "digest-crc" "google-apis-iamcredentials_v1" "google-apis-storage_v1" "google-cloud-core" "googleauth" "mini_mime"];
|
||||
dependencies = ["addressable" "digest-crc" "google-api-client" "google-cloud-core" "googleauth" "mini_mime"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "030y55cybc5w538bdd2xxjqwfka8fnkhv7ld4iqmn7byrkgy9dxc";
|
||||
sha256 = "06pmgk210frapxjjshy9iax6jb5ps8fbylcy0c9ypwji6cwxk990";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.39.0";
|
||||
version = "1.27.0";
|
||||
};
|
||||
googleauth = {
|
||||
dependencies = ["faraday" "jwt" "memoist" "multi_json" "os" "signet"];
|
||||
@@ -508,20 +362,20 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "030bcdnffwndk8h270cmbndixb5h3ss860yifv6bkfys95s5fjpp";
|
||||
sha256 = "0ldhllhv8mlbalp8a3zb1hsj5p2i8f0vf88r71vm083gq7820iwn";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.2.0";
|
||||
version = "0.13.1";
|
||||
};
|
||||
highline = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0yclf57n2j3cw8144ania99h1zinf8q3f5zrhqa754j6gl95rp9d";
|
||||
sha256 = "01ib7jp85xjc4gh4jg0wyzllm46hwv8p0w1m4c75pbgi41fps50y";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.0.3";
|
||||
version = "1.7.10";
|
||||
};
|
||||
http-accept = {
|
||||
groups = ["default"];
|
||||
@@ -539,10 +393,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "13rilvlv8kwbzqfb644qp6hrbsj82cbqmnzcvqip1p6vqx36sxbk";
|
||||
sha256 = "004cgs4xg5n6byjs7qld0xhsjq3n6ydfh897myr2mibvh6fjc49g";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.5";
|
||||
version = "1.0.3";
|
||||
};
|
||||
httpclient = {
|
||||
groups = ["default"];
|
||||
@@ -559,30 +413,30 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1mnvb80cdg7fzdcs3xscv21p28w4igk5sj5m7m81xp8v2ks87jj0";
|
||||
sha256 = "1d4wac0dcd1jf6kc57891glih9w57552zgqswgy74d1xhgnk0ngf";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.6.1";
|
||||
version = "1.4.0";
|
||||
};
|
||||
json = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0yk5d10yvspkc5jyvx9gc1a9pn1z8v4k2hvjk1l88zixwf3wf3cl";
|
||||
sha256 = "158fawfwmv2sq4whqqaksfykkiad2xxrrj0nmpnc6vnlzi1bp7iz";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.6.2";
|
||||
version = "2.3.1";
|
||||
};
|
||||
jwt = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0kcmnx6rgjyd7sznai9ccns2nh7p7wnw3mi8a7vf2wkm51azwddq";
|
||||
sha256 = "01zg1vp3lyl3flyjdkrcc93ghf833qgfgh2p1biqfhkzz11r129c";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.5.0";
|
||||
version = "2.2.1";
|
||||
};
|
||||
memoist = {
|
||||
groups = ["default"];
|
||||
@@ -600,40 +454,40 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0ipw892jbksbxxcrlx9g5ljq60qx47pm24ywgfbyjskbcl78pkvb";
|
||||
sha256 = "1zj12l9qk62anvk9bjvandpa6vy4xslil15wl6wlivyf51z773vh";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.4.1";
|
||||
version = "3.3.1";
|
||||
};
|
||||
mime-types-data = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "003gd7mcay800k2q4pb2zn8lwwgci4bhi42v2jvlidm8ksx03i6q";
|
||||
sha256 = "1z75svngyhsglx0y2f9rnil2j08f9ab54b3l95bpgz67zq2if753";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.2022.0105";
|
||||
version = "3.2020.0512";
|
||||
};
|
||||
mini_magick = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1aj604x11d9pksbljh0l38f70b558rhdgji1s9i763hiagvvx2hs";
|
||||
sha256 = "0lpq12z70n10c1qshcddd5nib2pkcbkwzvmiqqzj60l01k3x4fg9";
|
||||
type = "gem";
|
||||
};
|
||||
version = "4.11.0";
|
||||
version = "4.10.1";
|
||||
};
|
||||
mini_mime = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0lbim375gw2dk6383qirz13hgdmxlan0vc5da2l072j3qw6fqjm5";
|
||||
sha256 = "1axm0rxyx3ss93wbmfkm78a6x03l8y4qy60rhkkiq0aza0vwq3ha";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.2";
|
||||
version = "1.0.2";
|
||||
};
|
||||
multi_json = {
|
||||
groups = ["default"];
|
||||
@@ -670,10 +524,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "04x1nkx6gkqzlc4phdvq05v3vjds6mgqhjqzqpcs6vdh5xyqrf59";
|
||||
sha256 = "0dzqdawqr4agx7zr1fr5zxdwl8vb5rhpz57l1lk7d2y46ha6l4l7";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.2.1";
|
||||
version = "2.2.0";
|
||||
};
|
||||
netrc = {
|
||||
groups = ["default"];
|
||||
@@ -685,66 +539,56 @@
|
||||
};
|
||||
version = "0.11.0";
|
||||
};
|
||||
optparse = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0j9l5a1zszvrlggp1ldx82i4kkqx34g4g3amwp488s499w5l1cvj";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.1.1";
|
||||
};
|
||||
os = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0gwd20smyhxbm687vdikfh1gpi96h8qb1x28s2pdcysf6dm6v0ap";
|
||||
sha256 = "12fli64wz5j9868gpzv5wqsingk1jk457qyqksv9ksmq9b0zpc9x";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.4";
|
||||
version = "1.1.1";
|
||||
};
|
||||
plist = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1whhr897z6z6av85x2cipyjk46bwh6s4wx6nbrcd3iifnzvbqs7l";
|
||||
sha256 = "0ra0910xxbhfsmdi0ig36pr3q0khdqzwb5da3wg7y3n8d1sh9ffp";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.6.0";
|
||||
version = "3.5.0";
|
||||
};
|
||||
public_suffix = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0sqw1zls6227bgq38sxb2hs8nkdz4hn1zivs27mjbniswfy4zvi6";
|
||||
sha256 = "0vywld400fzi17cszwrchrzcqys4qm6sshbv73wy5mwcixmrgg7g";
|
||||
type = "gem";
|
||||
};
|
||||
version = "5.0.0";
|
||||
version = "4.0.5";
|
||||
};
|
||||
rake = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "15whn7p9nrkxangbs9hh75q585yfn66lv0v2mhj6q6dl6x8bzr2w";
|
||||
sha256 = "0w6qza25bq1s825faaglkx1k6d59aiyjjk3yw3ip5sb463mhhai9";
|
||||
type = "gem";
|
||||
};
|
||||
version = "13.0.6";
|
||||
version = "13.0.1";
|
||||
};
|
||||
representable = {
|
||||
dependencies = ["declarative" "trailblazer-option" "uber"];
|
||||
dependencies = ["declarative" "declarative-option" "uber"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1kms3r6w6pnryysnaqqa9fsn0v73zx1ilds9d1c565n3xdzbyafc";
|
||||
sha256 = "0qm9rgi1j5a6nv726ka4mmixivlxfsg91h8rpp72wwd4vqbkkm07";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.2.0";
|
||||
version = "3.0.4";
|
||||
};
|
||||
rest-client = {
|
||||
dependencies = ["http-accept" "http-cookie" "mime-types" "netrc"];
|
||||
@@ -767,16 +611,6 @@
|
||||
};
|
||||
version = "3.1.2";
|
||||
};
|
||||
rexml = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "08ximcyfjy94pm1rhcx04ny1vx2sk0x4y185gzn86yfsbzwkng53";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.2.5";
|
||||
};
|
||||
rouge = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
@@ -787,25 +621,15 @@
|
||||
};
|
||||
version = "2.0.7";
|
||||
};
|
||||
ruby2_keywords = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1vz322p8n39hz3b4a9gkmz9y7a5jaz41zrm2ywf31dvkqm03glgz";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.0.5";
|
||||
};
|
||||
rubyzip = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0grps9197qyxakbpw02pda59v45lfgbgiyw48i0mq9f2bn9y6mrz";
|
||||
sha256 = "0590m2pr9i209pp5z4mx0nb1961ishdiqb28995hw1nln1d1b5ji";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.3.2";
|
||||
version = "2.3.0";
|
||||
};
|
||||
security = {
|
||||
groups = ["default"];
|
||||
@@ -823,10 +647,10 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0100rclkhagf032rg3r0gf3f4znrvvvqrimy6hpa73f21n9k2a0x";
|
||||
sha256 = "10g2667fvxnc50hcd1aywgsbf8j7nrckg3n7zjvywmyz82pwmpqp";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.17.0";
|
||||
version = "0.14.0";
|
||||
};
|
||||
simctl = {
|
||||
dependencies = ["CFPropertyList" "naturally"];
|
||||
@@ -839,6 +663,16 @@
|
||||
};
|
||||
version = "1.6.8";
|
||||
};
|
||||
slack-notifier = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1pkfn99dhy5s526r6k8d87fwwb6j287ga9s7lxqmh60z28xqh3bv";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.3.2";
|
||||
};
|
||||
terminal-notifier = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
@@ -860,16 +694,6 @@
|
||||
};
|
||||
version = "1.8.0";
|
||||
};
|
||||
trailblazer-option = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "18s48fndi2kfvrfzmq6rxvjfwad347548yby0341ixz1lhpg3r10";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.1.2";
|
||||
};
|
||||
tty-cursor = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
@@ -927,27 +751,17 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1yj2nz2l101vr1x9w2k83a0fag1xgnmjwp8w8rw4ik2rwcz65fch";
|
||||
sha256 = "0wc47r23h063l8ysws8sy24gzh74mks81cak3lkzlrw4qkqb3sg4";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.0.8.2";
|
||||
version = "0.0.7.7";
|
||||
};
|
||||
unicode-display_width = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1204c1jx2g89pc25qk5150mk7j5k90692i7ihgfzqnad6qni74h2";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.8.0";
|
||||
};
|
||||
webrick = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1d4cvgmxhfczxiq5fr534lmizkhigd15bsx5719r5ds7k7ivisc7";
|
||||
sha256 = "06i3id27s60141x6fdnjn5rar1cywdwy64ilc59cz937303q3mna";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.7.0";
|
||||
@@ -963,15 +777,15 @@
|
||||
version = "1.0.0";
|
||||
};
|
||||
xcodeproj = {
|
||||
dependencies = ["CFPropertyList" "atomos" "claide" "colored2" "nanaimo" "rexml"];
|
||||
dependencies = ["CFPropertyList" "atomos" "claide" "colored2" "nanaimo"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1s7hxaqd1fi4rlmm2jbrglyvka1r95frlxan61vfcnd8n6pxynpi";
|
||||
sha256 = "0mv5rsbgwq4vzri31w2f1474arrsr5j69rdhklrci6jnjps8dmx9";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.22.0";
|
||||
version = "1.17.1";
|
||||
};
|
||||
xcpretty = {
|
||||
dependencies = ["rouge"];
|
||||
@@ -990,9 +804,9 @@
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "14rg4f70klrs910n7rsgfa4dn8s2qyny55194ax2qyyb2wpk7k5a";
|
||||
sha256 = "15b5c0lxz2blmichfdlabzlbyw5nlh1ci898pxwb661m9bahz3ml";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.1";
|
||||
version = "1.0.0";
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -1,26 +1,12 @@
|
||||
الحاله هي أداة اتصال خاصة وآمنة. يمكنك الدردشة مع الأصدقاء وتخزين الأصول واستكشاف مستقبل الويب دون استغلالها لبياناتك.
|
||||
|
||||
يجمع Status بين برنامج المراسلة الخاص ومحفظة التشفير الآمنة ومتصفح لتطبيقات إيثريوم اللامركزية في أداة اتصال واحدة قوية. الدردشة مع الأصدقاء والمجتمعات المتزايدة. شراء الأصول الرقمية وبيعها وتخزينها وتبادلها. تصفح الإنترنت اللامركزي دون استغلال بياناتك.
|
||||
Status هو نظام تشغيل إيثريوم الخاص بك
|
||||
برنامج المراسلة الخاص
|
||||
أرسل دردشات خاصة 1: 1 ، ومجموعات خاصة ، ودردشات عامة دون وسطاء غير ضروريين في اتصالاتك. Status عبارة عن تطبيق نصي يزيل نقاط الاختناق المركزية من رسائلك يمنحك لمزيد من الخصوصية والمراسلة الآمنة. تطبيق مراسلة مشفر مع تشفير شامل وخصوصية بشكل افتراضي بحيث لا يمكن لأي شخص آخر غيرك والمرسل إليه استعراض رسائلك - ولا حتى Status. يعتبره البعض برنامج مراسلات سريًه.
|
||||
مع الحاله ، أنت وحدك تتحكم في معلوماتك.
|
||||
|
||||
مدفوعات بلا حدود، من النظير إلى النظير
|
||||
يتيح ماسنجر Status لأي شخص في أي مكان إرسال مدفوعات عالمية مباشرة في الدردشة حيث انه متكامل بسلاسة مع محفظة العملات المشفرة.
|
||||
دردشة
|
||||
تزيل الحاله جهات خارجية مركزية من رسائلك. ليس المحتوى الخاص بك محميًا فحسب ، بل أيضًا البيانات الوصفية الخاصة بك - للحصول على الخصوصية المطلقة.
|
||||
|
||||
محفظة إيثريوم آمنة
|
||||
تتيح لك محفظة تشفير Status إرسال أصول إيثريوم وتخزينها وتداولها وتبادلها بأمان مثل ETH و SNT والعملات المستقرة القيمة مثل DAI و NFTs. يمكنك التحكم بكل ثقة في عملتك المشفرة والأصول الرقمية باستخدام تطبيق محفظة إيثريوم هذه . تدعم محفظة البلوكتشين الخاصة Status حاليًا أصول ERC-20 و ERC-721 فقط ؛ لا تدعم البيتكوين.
|
||||
اكسب مع DEFI
|
||||
دع عملاتك المشفرة تعمل مع أحدث تطبيقات التمويل اللامركزية والتبادلات اللامركزية (DEX) مثل Maker و Aave و Uniswap و Synthetix و PoolTogether و Zerion و Kyber وغيرهم الكثير.
|
||||
المعاملات
|
||||
تخزين الأصول الرقمية في محفظة الحالة الخاصة بك. إرسال الرموز المميزة من الأصدقاء وطلبها أو التعامل مع التطبيقات اللامركزية.
|
||||
|
||||
متصفح تطبيقات الويب 3 اللامركزية
|
||||
تصفح الويب الآمن وأدنو من النظام الإيكولوجي المتنامي للتطبيقات اللامركزية باستخدام المتصفح الآمن. يتيح Status الوصول إلى أكثر من مجرد DeFi - اكتشف أحدث الأسواق والمقتنيات والألعاب والشبكات الاجتماعية مثل SuperRare و Gitcoin و Dragonereum و Axie Infinity و Open Sea و CryptoKitties و Decentraland وغيرهم الكثير.
|
||||
|
||||
|
||||
تواصل مع مجتمعك
|
||||
استكشف وتواصل ودردش مع مجتمعاتك و أصدقائك المفضلين لديك. سواء كانت مجموعة صغيرة من الأصدقاء ، أو مجموعة فنانين ، أو تجار تشفير ، أو المؤسسة الكبيرة التالية - أرسل رسائل نصية وتواصل مع مجتمعات Status.
|
||||
|
||||
بثّ اﻷنشطة اﻹجتماعية
|
||||
شارك ما يدور في ذهنك وانشر التحديثات مع جهات الاتصال الخاصة بك في شبكة تواصل اجتماعية لامركزية حديثة ومقاومة للرقابة.
|
||||
|
||||
إنشاء حساب خاص
|
||||
حافظ على خصوصيتك مع إنشاء حساب مستعار. عند إنشاء حسابك المجاني ، لن تضطر أبدًا إلى إدخال رقم هاتف أو عنوان بريد إلكتروني أو حساب مصرفي. يتم إنشاء المفاتيح الخاصة بالمحفظة الخاصة بك وتخزينها على جهازك لضمان وصولك إلى أموالك ومعاملاتك المالية فقط.
|
||||
يكتشف
|
||||
الوصول إلى التطبيقات المستندة إلى الايثريوم على الويب٣ . لعب الألعاب وتبادل الأصول الرقمية وأكثر من ذلك.
|
||||
|
Before Width: | Height: | Size: 451 KiB |
|
Before Width: | Height: | Size: 424 KiB |
|
Before Width: | Height: | Size: 1.0 MiB |