...
 
Commits (101)
AccessModifierOffset: -8
AlignAfterOpenBracket: DontAlign
AlignConsecutiveAssignments: true
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: DontAlign
AlignOperands: true
AlignTrailingComments: true
#AllowAllArgumentsOnNextLine: false
#AllowAllConstructorInitializersOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: false
#AllowShortLambdasOnASingleLine: Empty
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes
BinPackArguments: false
BinPackParameters: false
BraceWrapping:
# AfterCaseLabel: false
AfterClass: true
AfterControlStatement: false
AfterEnum: false
AfterFunction: true
AfterNamespace: true
AfterStruct: true
AfterUnion: true
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakAfterJavaFieldAnnotations: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Linux
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeColon
BreakInheritanceList: BeforeColon
BreakStringLiterals: true
ColumnLimit: 90
CommentPragmas: ''
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 8
ContinuationIndentWidth: 8
Cpp11BracedListStyle: true
DerivePointerAlignment: false
FixNamespaceComments: true
IncludeBlocks: Preserve
IndentCaseLabels: false
#IndentPPDirectives: BeforeHash
IndentWidth: 8
IndentWrappedFunctionNames: false
KeepEmptyLinesAtTheStartOfBlocks: false
Language: Cpp
NamespaceIndentation: All
PenaltyBreakBeforeFirstCallParameter: 90
PenaltyBreakComment: 90
PenaltyBreakFirstLessLess: 0
PenaltyBreakString: 90
PenaltyExcessCharacter: 1
PenaltyReturnTypeOnItsOwnLine: 20
PointerAlignment: Right
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: true
#SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: true
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInContainerLiterals: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Cpp11
TabWidth: 8
UseTab: ForContinuationAndIndentation
......@@ -50,23 +50,13 @@ linux-appimage:
- "*.AppImage.zsync"
expire_in: 1 week
click-xenial:
stage: deploy
image: kaidan/ubuntu-touch-xenial
script: utils/travis/build.sh
variables:
PLATFORM: ubuntu-touch
artifacts:
paths:
- "*.click"
expire_in: 1 week
windows-mxe:
stage: deploy
image: kaidan/windows-mxe
script:
- utils/build-windows-mxe.sh
- mv build/bin/kaidan.exe kaidan.exe
allow_failure: true
artifacts:
paths:
- "kaidan.exe"
......@@ -80,17 +70,30 @@ android:
- sudo apt -y install inkscape optipng
- GIT_EXTRA="--branch ${KF5_VERSION}" /opt/helpers/build-kde-dependencies --withProject kirigami
- /opt/helpers/build-cmake qxmpp https://github.com/qxmpp-project/qxmpp.git -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF
- GIT_EXTRA="--branch ${CI_COMMIT_REF_NAME} --recursive" /opt/helpers/build-cmake ${CI_PROJECT_NAME} ${CI_REPOSITORY_URL} -DQTANDROID_EXPORTED_TARGET=kaidan -DANDROID_APK_DIR=${CI_PROJECT_DIR}/src/${CI_PROJECT_NAME}/misc/android -DI18N=1
- /opt/helpers/build-cmake zxing-cpp https://github.com/nu-book/zxing-cpp.git
- GIT_EXTRA="--branch ${CI_COMMIT_REF_NAME} --recursive" /opt/helpers/build-cmake ${CI_PROJECT_NAME} ${CI_REPOSITORY_URL} -DQTANDROID_EXPORTED_TARGET=kaidan -DANDROID_APK_DIR=${CI_PROJECT_DIR}/src/${CI_PROJECT_NAME}/misc/android -DI18N=1 -DUSE_KNOTIFICATIONS=OFF
- ${CI_PROJECT_DIR}/src/${CI_PROJECT_NAME}/utils/render-logos.sh
- /opt/helpers/create-apk ${CI_PROJECT_NAME}
- mv ${CI_PROJECT_DIR}/build/${CI_PROJECT_NAME}/kaidan_build_apk/build/outputs/apk/kaidan_build_apk-debug.apk ${CI_PROJECT_DIR}
variables:
KF5_VERSION: master
allow_failure: true
artifacts:
paths:
- "kaidan_build_apk-debug.apk"
expire_in: 1 week
mac-osxcross:
stage: deploy
image: kaidan/mac-osxcross
script:
- utils/build-mac-osxcross.sh
- tar -cf kaidan.tar -C build/bin/ kaidan.app
allow_failure: true
artifacts:
paths:
- "kaidan.tar"
expire_in: 1 week
variables:
GIT_SUBMODULE_STRATEGY: recursive
......
......@@ -7,3 +7,6 @@
[submodule "3rdparty/qxmpp"]
path = 3rdparty/qxmpp
url = https://github.com/qxmpp-project/qxmpp
[submodule "3rdparty/zxing-cpp"]
path = 3rdparty/zxing-cpp
url = https://github.com/nu-book/zxing-cpp
#
# This list is used by git-shortlog to fix a few botched name translations
# in the git archive, either because the author's full name was messed up
# and/or not always written the same way, making contributions from the
# same person appearing not to be so.
#
Linus Jahn <lnj@kaidan.im> <git@lnj.li>
Linus Jahn <lnj@kaidan.im> <linus.jahn@searchmetrics.com>
Jonah Brüchert <jbb@kaidan.im> <jbb.prv@gmx.de>
Jonah Brüchert <jbb@kaidan.im> <jbb.mail@gmx.de>
Jonah Brüchert <jbb@kaidan.im> <jbbgameich@gmail.com>
Jonah Brüchert <jbb@kaidan.im> <jbbgameich@outlook.com>
geobra <s.g.b@gmx.de>
Muhammad Nur Hidayat Yasuyoshi <mnh48mail@gmail.com>
Subproject commit a4bc2e5f38de971aef396655e6c122ec2a8aaeac
Subproject commit 1f12816dd78b6a7447c95919c7bf096be986ffd4
Subproject commit a2b0da8b540186eb4d25d1ae70618f231248d4e5
Subproject commit 4384fa0c81628fa96c36405fb65a2b0ecf04a989
Subproject commit 754cc5a70479a54659dbc93ccb5bf28e1da77ef4
Subproject commit e6eb0b78d0cb17fccd5ddb60966ba2a0a2d2b593
Subproject commit baecef0d69b81ace79cd44035ac859bc201f1847
cmake_minimum_required(VERSION 2.8.12)
cmake_minimum_required(VERSION 3.3)
find_package(ECM 5.40.0 REQUIRED NO_MODULE)
set(CMAKE_CXX_STANDARD 14)
set(QT_MIN_VERSION "5.8.0")
set(QT_MIN_VERSION "5.10.0")
if(POLICY CMP0071)
cmake_policy(SET CMP0071 NEW)
......@@ -15,17 +15,20 @@ set(APPLICATION_DISPLAY_NAME "Kaidan")
if(UBUNTU_TOUCH)
set(APPLICATION_NAME "${APPLICATION_ID}")
endif()
set(VERSION_STRING "0.4.0~dev")
set(VERSION_STRING "0.5.0-dev")
set(DEVELOPMENT_BUILD TRUE)
set(ANDROID_VERSION_CODE 3)
set(ANDROID_VERSION_CODE 6)
# CMake options
option(I18N "Enable i18n support" FALSE)
option(STATIC_BUILD "Build Kaidan statically")
option(UBUNTU_TOUCH "Building a Ubuntu Touch click (internal use only!)" FALSE)
option(APPIMAGE "Build Kaidan as AppImage (will only work in the appimage script)" FALSE)
option(UBUNTU_TOUCH "Building an Ubuntu Touch click (internal use only!)" FALSE)
option(CLICK_ARCH "Architecture that will be used in the click's manifest")
option(CLICK_DATE "Date used in the version number in the click's manifest")
option(QUICK_COMPILER "Use QtQuick compiler to improve performance" FALSE)
option(USE_KNOTIFICATIONS "Use KNotifications for displaying notifications" TRUE)
option(BUNDLE_ICONS "Bundle breeze icons" FALSE)
# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
......@@ -53,9 +56,10 @@ kde_enable_exceptions()
# Find packages
find_package(PkgConfig REQUIRED)
find_package(Qt5 ${QT_MIN_VERSION} REQUIRED NO_MODULE COMPONENTS Core Qml Quick Svg Sql QuickControls2 Xml)
find_package(Qt5 ${QT_MIN_VERSION} REQUIRED NO_MODULE COMPONENTS Core Qml Quick Svg Sql QuickControls2 Xml Multimedia)
find_package(KF5Kirigami2 REQUIRED)
pkg_search_module(QXmpp REQUIRED qxmpp>=0.9)
find_package(ZXing REQUIRED COMPONENTS Core)
pkg_search_module(QXmpp REQUIRED qxmpp>=1.0)
# Optional QtQuickCompiler
if(QUICK_COMPILER)
......@@ -66,6 +70,12 @@ if(QUICK_COMPILER)
)
endif()
if(USE_KNOTIFICATIONS)
find_package(KF5Notifications REQUIRED)
set(__KF5Notifications_LIBRARIES KF5::Notifications)
add_definitions(-DHAVE_KNOTIFICATIONS)
endif()
# Optional QWidget style integration (not on mobile)
if(NOT UBUNTU_TOUCH AND NOT ANDROID AND NOT IOS)
find_package(Qt5Widgets)
......@@ -111,7 +121,7 @@ endif()
#
# Include bundled icons on Ubuntu Touch, Android, Windows, macOS and iOS
if(UBUNTU_TOUCH OR ANDROID OR WIN32 OR APPLE)
if(BUNDLE_ICONS OR UBUNTU_TOUCH OR ANDROID OR WIN32 OR APPLE)
set(KAIDAN_ICONS_QRC kirigami-icons.qrc)
endif()
......@@ -132,7 +142,7 @@ elseif(WIN32)
message(STATUS ${KAIDAN_ICNS})
endif()
link_directories(${QXmpp_LIBDIR})
link_directories(${QXmpp_LIBDIR} /tmp/qxmpp-ios-build/lib)
if(QUICK_COMPILER)
qtquick_compiler_add_resources(KAIDAN_QML_QRC kaidan_qml.qrc)
......@@ -159,7 +169,10 @@ target_link_libraries(${PROJECT_NAME}
Qt5::Svg
Qt5::Network
Qt5::Xml
Qt5::Multimedia
ZXing::Core
${__Qt5Widgets_LIBRARIES}
${__KF5Notifications_LIBRARIES}
# currently needs to be hardcoded for windows builds
qxmpp
)
......@@ -247,6 +260,7 @@ if(STATIC_BUILD)
find_library(QSHAPES_PLUGIN qmlshapesplugin PATHS ${QT_QML_PATH}/qml/QtQuick/Shapes)
find_library(QUICKSHAPES Qt5QuickShapes PATHS ${QT_LIBDIR})
find_library(QTEMPLATES_PLUGIN qtquicktemplates2plugin PATHS ${QT_QML_PATH}/qml/QtQuick/Templates.2)
find_library(QTMULTIMEDIA_PLUGIN qtmultimediaplugin PATHS ${QT_QML_PATH}/qml/QtMultimedia)
find_library(QMODELS_PLUGIN modelsplugin PATHS ${QT_QML_PATH}/qml/QtQml/Models.2)
target_link_libraries(${PROJECT_NAME}
${plugin_libs}
......@@ -314,8 +328,8 @@ endif()
if(UBUNTU_TOUCH)
set(KAIDAN_COMPILE_DEFINITIONS UBUNTU_TOUCH=True)
elseif(NOT ANDROID AND NOT IOS AND NOT WIN32)
set(KAIDAN_COMPILE_DEFINITIONS NOTIFICATIONS_LIBNOTIFY=True)
elseif(APPIMAGE)
set(KAIDAN_COMPILE_DEFINITIONS APPIMAGE=True)
endif()
if(STATIC_BUILD)
......@@ -396,5 +410,9 @@ elseif(UNIX AND NOT APPLE)
)
endif()
# KNotifications
if(USE_KNOTIFICATIONS)
install(FILES misc/kaidan.notifyrc DESTINATION ${KNOTIFYRC_INSTALL_DIR})
endif()
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
Upstream-Name: kaidan
Source: https://git.kaidan.im/kaidan/kaidan/
Source: https://invent.kde.org/kde/kaidan/
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Files: src/*
......@@ -9,6 +9,8 @@ Copyright: 2016-2019, Linus Jahn <lnj@kaidan.im>
2016-2019, Jonah Brüchert <jbb@kaidan.im>
2017-2019, Ilya Bizyaev <bizyaev@zoho.com>
2018, Allan Nordhøy <epost@anotheragency.no>
2019, Filipe Azevedo <pasnox@gmail.com>
2019, Melvin Keskin <melvo@olomono.de>
2019, Xavier <xavi@delape.net>
2018, Nicolas Fella <nicolas.fella@gmx.de>
2018, Bjarne Roß <ross.b@freenet.de>
......@@ -20,15 +22,20 @@ Copyright: 2016-2019, Linus Jahn <lnj@kaidan.im>
License: GPL-3+ with OpenSSL exception
Files: i18n/*
Copyright: 2017-2018, Linus Jahn <lnj@kaidan.im>
2017-2018, Jonah Brüchert <jbb@kaidan.im>
2017-2018, Muhammad Nur Hidayat Yasuyoshi <mnh48mail@gmail.com>
2018, Allan Nordhøy <epost@anotheragency.no>
2018, advocatux <advocatux@airpost.net>
Copyright: 2017-2019, Linus Jahn <lnj@kaidan.im>
2017-2019, Jonah Brüchert <jbb@kaidan.im>
2017-2019, Muhammad Nur Hidayat Yasuyoshi <mnh48mail@gmail.com>
2018-2019, Allan Nordhøy <epost@anotheragency.no>
2018-2019, advocatux <advocatux@airpost.net>
2018-2019, aitzol berasategi <aitzol@disroot.org>
2019, Milan Korecky <milan.korecky@gmail.com>
2017-2018, Joeke de Graaf <mappack@null.net>
2019, Sylke Vicious <silkevicious@gmail.com>
2017, Ilya Bizyaev <bizyaev@zoho.com>
2017, ZatroxDE <zatroxde@outlook.com>
2018, aitzol berasategi <aitzol@disroot.org>
2019, Joan CiberSheep <cibersheep@gmail.com>
2019, Melvin Keskin <melvo@olomono.de>
2019, Anne Onyme 017 <anneonyme017@netcourrier.com>
2019, ssantos <ssantos@web.de>
2018, oiseauroch <tobias.ollive@mailoo.org>
2018, Andreas Kleinert <Andy.Kleinert@gmail.com>
......@@ -54,6 +61,11 @@ Files: src/EmojiModel.cpp
Copyright: 2017, Konstantinos Sideris <siderisk@auth.gr>
License: GPL-3+
Files: src/QrCodeVideoFrame.h
src/QrCodeVideoFrame.cpp
Copyright: 2017, QZXing authors
License: apache-2.0
Files: data/images/message_checkmark.svg
Copyright: 2014, Michael Kurz <betheg@bitcloner.org>
License: GPL-3+
......@@ -162,3 +174,16 @@ License: MIT-Apple
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.
License: apache-2.0
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
.
http://www.apache.org/licenses/LICENSE-2.0
.
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
......@@ -39,10 +39,12 @@ how to do that:
### Dependencies
Here are the general dependencies of Kaidan listed:
* [Qt](https://doc.qt.io/qt-5/build-sources.html) (Core Qml Quick Svg Sql QuickControls2) (>= 5.8.0)
* [QXmpp][qxmpp] (>= 0.9.0)
* [Qt](https://doc.qt.io/qt-5/build-sources.html) (Core Qml Quick Svg Sql QuickControls2 Multimedia) (>= 5.10.0)
* [QXmpp][qxmpp] (>= 1.0.0)
* [Kirigami 2](https://phabricator.kde.org/source/kirigami/) (>= 5.42.0)
* [ECM (extra-cmake-modules)](https://api.kde.org/ecm/manual/ecm.7.html)
* [ZXing-cpp](https://github.com/nu-book/zxing-cpp)
* [KNotifications][knotif] (`-DUSE_KNOTIFICATIONS=OFF` to disable)
### Build instructions
......@@ -58,3 +60,4 @@ There are guides on how to build Kaidan for each supported platform (currently t
[openstore]: https://open-store.io/app/im.kaidan.kaidan
[android]: https://www.kaidan.im/download/#android
[supp-xeps]: https://invent.kde.org/kde/kaidan/wikis/Supported-XEPs
[knotif]: https://api.kde.org/frameworks/knotifications/html/index.html
# Changelog
### Version 0.4.0 (UNRELEASED)
### Version 0.4.1 (released on Jul 16, 2019)
* Fix SSL problems for AppImage (lnj)
* Fix connection problems (lnj)
* Keep QXmpp v0.8.3 compatibility (lnj)
### Version 0.4.0 (released on Jul 08, 2019)
Build system:
* Support for Android (ilyabizyaev)
......@@ -13,9 +19,11 @@ Build system:
* Improve Linux AppImage build script (ilyabizyaev)
* Add additional image formats in AppImage (jbb)
Back-end:
Features:
* Show proper notifications using KNotifications (lnj)
* Add settings page for changing passwords (jbb, lnj)
* Add XEP-0352: Client State Indication (gloox/QXmpp) (lnj)
* Add media/file sharing (lnj)
* Add media/file (including GIFs) sharing (lnj, jbb)
* Full back-end rewrite to QXmpp (lnj)
* Implement XEP-0363: HTTP File Upload and UploadManager for QXmpp (lnj)
* Use XEP-0280: Message Carbons from QXmpp (lnj)
......@@ -26,11 +34,9 @@ Back-end:
* Implement XEP-0382: Spoiler messages (xavi)
* Kaidan is now offline usable (lnj)
* Kaidan is able to open xmpp: URIs (lnj)
User interface:
* New logo (ilyabizyaev)
* Show presence information of contacts (lnj)
* Add EmojiPicker from Spectral (jbb)
* Show presence information of contacts (lnj, melvo)
* Add EmojiPicker from Spectral with search and favorites functionality (jbb, fazevedo)
* Highlight links in chat and make links clickable (lnj)
* New about dialog instead of the about page (ilyabizyaev)
* Add image preview in chat and before sending (lnj)
......@@ -70,12 +76,13 @@ Misc:
* Add GitLab CI integration (jbb)
Fixes:
* Fix blocking of GUI thread while database interaction (lnj)
* Fix TLS connection bug (lnj)
* Don't send notifications when receiving own messages via. carbons (lnj)
* Fix timezone bug of message timestamps (lnj)
* Fix several message editing bugs (lnj)
* Fix black icons (jbb)
* Fix richt text labels in Plasma Mobile (lnj)
* Fix rich text labels in Plasma Mobile (lnj)
* Small Plasma Mobile fixes (jbb)
### Version 0.3.2 (released on 25.11.2017)
......
......@@ -20,6 +20,19 @@
"-DCMAKE_INSTALL_PREFIX=../../../bin/ubuntu-touch/tmp"
],
"postbuild": "make install"
},
"zxing-cpp": {
"template": "cmake",
"src_dir": "3rdparty/zxing-cpp",
"make_jobs": 2,
"build_args": [
"-DCMAKE_BUILD_TYPE=Release",
"-DBUILD_SHARED_LIBRARY=ON",
"-DLINK_CPP_STATICALLY=OFF",
"-DCMAKE_PREFIX_PATH=../../../bin/ubuntu-touch/tmp",
"-DCMAKE_INSTALL_PREFIX=../../../bin/ubuntu-touch/tmp"
],
"postbuild": "make install"
}
}
}
# Updating License Information
These steps should only be followed while [releasing a new Kaidan version](release.md).
1. `git checkout master`
1. `git pull origin master`
1. `utils/generate-license.py > LICENSE` (On Debian `sudo apt install python3-git` may be needed.)
1. Add possible aliases:
1. `git diff`
1. If there are contributers with multiple email addresses:
1. Adjust *utils/generate-license.py*:
1. Add a line like the following for each alias in REPLACE_USER_IDS = [...]:
`("Alias <alias@example.org>", "FirstName LastName <user@example.com>"),`
1. `git add utils/generate-license.py`
1. `utils/generate-license.py > LICENSE`
1. `git add LICENSE`
# Releasing a New Kaidan Version
## Summary
### Main Repository
* [ ] Update translations
* [ ] Update changelog content
* [ ] Update license information
* [ ] Update version in *CMakeLists.txt*
* [ ] Update changelog release date
* [ ] Archive release on *stable* branch
* [ ] Add tag on *stable* branch
* [ ] Publish release builds
* [ ] Merge *stable* branch into *master* branch
* [ ] Update version in *CMakeLists.txt* to new development version
### Website Repository
* [ ] Update screenshot
* [ ] Update version and date in *index.html*
* [ ] Publish blog post
### Mastodon
* [ ] Create a toot
## Details
**X.Y.Z and N+1 must be adjusted to correspond to the actual version unless otherwise noted.**
### In Repository **https://invent.kde.org/kde/kaidan.git**
1. `git checkout master`
1. `git pull origin master`
1. `git checkout -b release/vX.Y.Z` or if that branch already exists: `git checkout release/vX.Y.Z`
1. [Update translations](translation.md)
1. Update changelog (*changelog.md*):
1. Set version *vX.Y.Z*
1. Set release date to *UNRELEASED*
1. Mention important changes and their authors
1. `git add changelog.md`
1. `git commit -m "Prepare changelog for vX.Y.Z"`
1. Check correct functionality of all release builds
1. [Update license information](license.md)
1. In *CMakeLists.txt*:
1. Change `set(VERSION_STRING "X.Y.Z-dev")` to `set(VERSION_STRING "X.Y.Z")`
1. Change `set(DEVELOPMENT_BUILD TRUE)` to `set(DEVELOPMENT_BUILD FALSE)`
1. Change `set(ANDROID_VERSION_CODE N)` to `set(ANDROID_VERSION_CODE N+1)`
1. `git add CMakeLists.txt`
1. Update changelog (*changelog.md*):
1. Set release date
1. `git add changelog.md`
1. `git commit -m "Release Kaidan vX.Y.Z"`
1. `git push --set-upstream origin release/vX.Y.Z`
1. Archive release on *stable* branch:
1. `git checkout stable` or if that branch does not already exist: `git checkout -b stable origin/stable`
1. `git pull origin stable`
1. `git merge release/vX.Y.Z`
1. `git push origin stable`
1. `git push -d release/vX.Y.Z`
1. Add tag on *stable* branch:
1. `git tag -a vX.Y.Z` or for signed tags: `git tag -s v0.4.1`
1. Add changelog part for vX.Y.Z as tag message
1. `git push origin vX.Y.Z`
1. Add changelog part for vX.Y.Z as release note on https://invent.kde.org/kde/kaidan/tags
1. Publish release builds on https://download.kde.org:
1. Download builds from https://invent.kde.org/kde/kaidan/pipelines?scope=tags&page=1 for tag *vX.Y.Z*
1. Rename downloaded builds to *kaidan_X.Y.Z_<architecture>.<type>* (Replace <architecture>.<type> with the corresponding architecture and file type.)
1. `../releaseme/tarme.rb --version X.Y.Z --origin stable kaidan` (*releasme* is the directory of the repository **https://anongit.kde.org/releaseme.git**.)
1. `kdecp5 kaidan-X.Y.Z.* ftp://upload.kde.org/incoming`:
1. Create admin ticket as described in output with additional lines for all uploaded files and hash values by SHA-256 and SHA-1
1. Merge *stable* branch into *master* branch:
1. `git checkout master`
1. `git merge stable`
1. Start new development version:
* **X.Y.Z, X.Y+1 and N+1 must be adjusted to correspond to the actual version.**
1. In *CMakeLists.txt*:
1. Change `set(VERSION_STRING "X.Y.Z")` to `set(VERSION_STRING "X.Y+1.0-dev")`
1. Change `set(DEVELOPMENT_BUILD FALSE)` to `set(DEVELOPMENT_BUILD TRUE)`
1. Change `set(ANDROID_VERSION_CODE N)` to `set(ANDROID_VERSION_CODE N+1)`
1. `git add CMakeLists.txt`
1. `git commit -m "Continue with Kaidan vX.Y+1.0-dev"`
1. `git push origin master`
### In Repository **https://invent.kde.org/websites/kaidan-im.git**
1. `git checkout master`
1. `git pull origin master`
1. Update screenshot (which will update the screenshot on the website and in the README):
1. Create one screenshot for desktop and one for mobile version
1. Put those two screenshots into one image like *images/screenshot.png* and overwrite that by that by the new one
1. `optipng -o7 images/screenshot.png`
1. `advpng -z4 images/screenshot.png`
1. `git add images/screenshot.png`
1. `git commit -m "Update screenshot"`
1. `git push origin master`
1. Update version and date in the following lines of *index.html*:
1. `<h3>Current version: X.Y.Z</h3>`
1. `<h4>(released MONTH DAY, YEAR)</h4>`
1. Publish blog post:
1. Create *_posts/YEAR-MONTH-DAY-kaidan-X.Y.Z.md*
1. Add header as in other posts of that directory
1. Copy *images/screenshot.png* to *images/screenshots/screenshot-X.Y*
1. Include *images/screenshots/screenshot-X.Y* into blog post
1. Add changelog part for vX.Y.Z
### On Mastodon via **https://fosstodon.org/@kaidan**
1. Create a toot like https://fosstodon.org/@kaidan/101929341888805925
# Adding Translations Repository
`git remote add weblate https://hosted.weblate.org/git/kaidan/translations/`
# Updating Translations
1. <a name="update-weblate"/> Update translations from Weblate:
1. On https://hosted.weblate.org/projects/kaidan/translations/#repository with a developer account:
1. Click *Commit*
1. Click *Rebase*
1. `git pull weblate master`
1. `git push origin master`
1. If there is a push error related to the policy of KDE which specifies that at least a first and a last name must be set for the author field:
1. Prepend X for a missing field to the specific commit (possibly by `rebase -i`)
1. `git push origin master`
1. Update translation sources:
1. `git checkout master`
1. `git pull origin master`
1. `cd build && make -j$(nproc) && cd -`
1. `git add i18n`
1. `git commit -m "Update translation sources" --author "Kaidan translations <translations@kaidan.im>"`
1. `git push origin master`
1. Shortly before the release follow the [first steps](#update-weblate) again.
This diff is collapsed.
......@@ -128,6 +128,53 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EmojiPicker</name>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>People</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Nature</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Food</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Activity</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Travel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Objects</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Symbols</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Flags</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Search emoji</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EmptyChatPage</name>
<message>
......@@ -261,6 +308,14 @@
<source>Spoiler</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Message could not be sent.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Message correction was not successful.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RegistrationManager</name>
......
......@@ -128,6 +128,53 @@
<translation>La descàrrega ha fallat: %1</translation>
</message>
</context>
<context>
<name>EmojiPicker</name>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>People</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Nature</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Food</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Activity</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Travel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Objects</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Symbols</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Flags</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Search emoji</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EmptyChatPage</name>
<message>
......@@ -261,6 +308,14 @@
<source>Spoiler</source>
<translation>Filtració</translation>
</message>
<message>
<source>Message could not be sent.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Message correction was not successful.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RegistrationManager</name>
......
......@@ -20,43 +20,43 @@
<name>ChangePassword</name>
<message>
<source>Change password</source>
<translation type="unfinished"></translation>
<translation>Změna hesla</translation>
</message>
<message>
<source>Current password:</source>
<translation type="unfinished"></translation>
<translation>Stávající heslo:</translation>
</message>
<message>
<source>New password:</source>
<translation type="unfinished"></translation>
<translation>Nové heslo:</translation>
</message>
<message>
<source>New password (repeat):</source>
<translation type="unfinished"></translation>
<translation>Nové heslo (opakovat):</translation>
</message>
<message>
<source>New passwords do not match.</source>
<translation type="unfinished"></translation>
<translation>Nová hesla se neshodují.</translation>
</message>
<message>
<source>Current password is invalid.</source>
<translation type="unfinished"></translation>
<translation>Stávající heslo je neplatné.</translation>
</message>
<message>
<source>You need to be connected to change your password.</source>
<translation type="unfinished"></translation>
<translation>Pro změnu hesla je nutné být připojen.</translation>
</message>
<message>
<source>After changing your password, you will need to reenter it on all your other devices.</source>
<translation type="unfinished"></translation>
<translation>Po změně hesla bude třeba zadat nové heslo na všech vašich ostatních zařízeních.</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Zrušit</translation>
<translation>Zrušit</translation>
</message>
<message>
<source>Change</source>
<translation type="unfinished"></translation>
<translation>Změnit</translation>
</message>
</context>
<context>
......@@ -132,6 +132,53 @@
<translation>Chyba při stahování: %1</translation>
</message>
</context>
<context>
<name>EmojiPicker</name>
<message>
<source>Favorites</source>
<translation>Oblíbené</translation>
</message>
<message>
<source>People</source>
<translation>Lidé</translation>
</message>
<message>
<source>Nature</source>
<translation>Příroda</translation>
</message>
<message>
<source>Food</source>
<translation>Jídlo</translation>
</message>
<message>
<source>Activity</source>
<translation>Činnosti</translation>
</message>
<message>
<source>Travel</source>
<translation>Cestování</translation>
</message>
<message>
<source>Objects</source>
<translation>Předměty</translation>
</message>
<message>
<source>Symbols</source>
<translation>Symboly</translation>
</message>
<message>
<source>Flags</source>
<translation>Vlajky</translation>
</message>
<message>
<source>Search</source>
<translation>Hledat</translation>
</message>
<message>
<source>Search emoji</source>
<translation>Hledat emoji</translation>
</message>
</context>
<context>
<name>EmptyChatPage</name>
<message>
......@@ -177,7 +224,7 @@
</message>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
<translation>Nastavení</translation>
</message>
</context>
<context>
......@@ -274,16 +321,24 @@ Prosím zkontrolujte své připojení k internetu.</translation>
<source>Spoiler</source>
<translation>«Spoiler»</translation>
</message>
<message>
<source>Message could not be sent.</source>
<translation>Zprávu se nepodařilo odeslat.</translation>
</message>
<message>
<source>Message correction was not successful.</source>
<translation>Oprava zprávy se nezdařila.</translation>
</message>
</context>
<context>
<name>RegistrationManager</name>
<message>
<source>Password changed successfully.</source>
<translation type="unfinished"></translation>
<translation>Změna hesla byla úspěšná.</translation>
</message>
<message>
<source>Failed to change password: %1</source>
<translation type="unfinished"></translation>
<translation>Změna hesla se nezdařila: %1</translation>
</message>
</context>
<context>
......@@ -432,15 +487,15 @@ Prosím zkontrolujte své připojení k internetu.</translation>
<name>SettingsPage</name>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
<translation>Nastavení</translation>
</message>
<message>
<source>Change password</source>
<translation type="unfinished"></translation>
<translation>Změna hesla</translation>
</message>
<message>
<source>Changes your account&apos;s password. You will need to re-enter it on your other devices.</source>
<translation type="unfinished"></translation>
<translation>Změní heslo k vašemu účtu. Bude třeba ho zadat na všech vašich zařízeních.</translation>
</message>
</context>
<context>
......
......@@ -69,43 +69,43 @@
<name>ChangePassword</name>
<message>
<source>Change password</source>
<translation type="unfinished"></translation>
<translation>Passwort ändern</translation>
</message>
<message>
<source>Current password:</source>
<translation type="unfinished"></translation>
<translation>Aktuelles Passwort:</translation>
</message>
<message>
<source>New password:</source>
<translation type="unfinished"></translation>
<translation>Neues Passwort:</translation>
</message>
<message>
<source>New password (repeat):</source>
<translation type="unfinished"></translation>
<translation>Neues Passwort (erneut):</translation>
</message>
<message>
<source>New passwords do not match.</source>
<translation type="unfinished"></translation>
<translation>Die eingegebenen Passwörter stimmen nicht überein.</translation>
</message>
<message>
<source>Current password is invalid.</source>
<translation type="unfinished"></translation>
<translation>Aktuelles Passwort ist ungültig.</translation>
</message>
<message>
<source>You need to be connected to change your password.</source>
<translation type="unfinished"></translation>
<translation>Sie müssen verbunden sein, um Ihr Passwort zu ändern.</translation>
</message>
<message>
<source>After changing your password, you will need to reenter it on all your other devices.</source>
<translation type="unfinished"></translation>
<translation>Nachdem Sie Ihr Passwort geändert haben, werden Sie es auf allen anderen Geräten neu eingeben müssen.</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Abbrechen</translation>
<translation>Abbrechen</translation>
</message>
<message>
<source>Change</source>
<translation type="unfinished"></translation>
<translation>Ändern</translation>
</message>
</context>
<context>
......@@ -196,6 +196,53 @@
<translation>Herunterladen fehlgeschlagen: %1</translation>
</message>
</context>
<context>
<name>EmojiPicker</name>
<message>
<source>Favorites</source>
<translation>Favoriten</translation>
</message>
<message>
<source>People</source>
<translation>Menschen</translation>
</message>
<message>
<source>Nature</source>
<translation>Natur</translation>
</message>
<message>
<source>Food</source>
<translation>Essen</translation>
</message>
<message>
<source>Activity</source>
<translation>Aktivitäten</translation>
</message>
<message>
<source>Travel</source>
<translation>Reisen</translation>
</message>
<message>
<source>Objects</source>
<translation>Gegenstände</translation>
</message>
<message>
<source>Symbols</source>
<translation>Zeichen</translation>
</message>
<message>
<source>Flags</source>
<translation>Flaggen</translation>
</message>
<message>
<source>Search</source>
<translation>Suche</translation>
</message>
<message>
<source>Search emoji</source>
<translation>Suche Emoji</translation>
</message>
</context>
<context>
<name>EmptyChatPage</name>
<message>
......@@ -264,7 +311,7 @@
</message>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
<translation>Einstellungen</translation>
</message>
</context>
<context>
......@@ -371,7 +418,7 @@
</message>
<message>
<source>Could not connect to the server.</source>
<translation>Konnte nicht zum Server verbinden.</translation>
<translation>Konnte nicht mit dem Server verbinden.</translation>
</message>
<message>
<source>Authentification protocol not supported by the server.</source>
......@@ -396,16 +443,24 @@
<source>Spoiler</source>
<translation>Spoiler</translation>
</message>
<message>
<source>Message could not be sent.</source>
<translation>Nachricht konnte nicht gesendet werden.</translation>
</message>
<message>
<source>Message correction was not successful.</source>
<translation>Nachrichtenkorrektur war nicht erfolgreich.</translation>
</message>
</context>
<context>
<name>RegistrationManager</name>
<message>
<source>Password changed successfully.</source>
<translation type="unfinished"></translation>
<translation>Passwort erfolgreich geändert.</translation>
</message>
<message>
<source>Failed to change password: %1</source>
<translation type="unfinished"></translation>
<translation>Änderung des Passworts ist fehlgeschlagen: %1</translation>
</message>
</context>
<context>
......@@ -566,15 +621,15 @@
<name>SettingsPage</name>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
<translation>Einstellungen</translation>
</message>
<message>
<source>Change password</source>
<translation type="unfinished"></translation>
<translation>Passwort ändern</translation>
</message>
<message>
<source>Changes your account&apos;s password. You will need to re-enter it on your other devices.</source>
<translation type="unfinished"></translation>
<translation>Das Passwort Ihres Kontos ändern. Sie werden das neue Passwort auf allen anderen Geräten neu eingeben müssen.</translation>
</message>
</context>
<context>
......
......@@ -128,6 +128,53 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EmojiPicker</name>
<message>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>People</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Nature</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Food</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Activity</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Travel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Objects</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Symbols</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Flags</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Search emoji</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EmptyChatPage</name>
<message>
......@@ -261,6 +308,14 @@
<source>Spoiler</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Message could not be sent.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Message correction was not successful.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RegistrationManager</name>
......
......@@ -46,43 +46,43 @@
<name>ChangePassword</name>
<message>
<source>Change password</source>
<translation type="unfinished"></translation>
<translation>Cambiar contraseña</translation>
</message>
<message>
<source>Current password:</source>
<translation type="unfinished"></translation>
<translation>Contraseña actual:</translation>
</message>
<message>
<source>New password:</source>
<translation type="unfinished"></translation>
<translation>Nueva contraseña:</translation>
</message>
<message>
<source>New password (repeat):</source>
<translation type="unfinished"></translation>
<translation>Nueva contraseña (repetir):</translation>
</message>
<message>
<source>New passwords do not match.</source>
<translation type="unfinished"></translation>
<translation>Las nuevas contraseñas no coinciden.</translation>
</message>
<message>
<source>Current password is invalid.</source>
<translation type="unfinished"></translation>
<translation>La contraseña actual no es válida.</translation>
</message>
<message>
<source>You need to be connected to change your password.</source>
<translation type="unfinished"></translation>
<translation>Necesita estar conectado para cambiar su contraseña.</translation>
</message>
<message>
<source>After changing your password, you will need to reenter it on all your other devices.</source>
<translation type="unfinished"></translation>
<translation>Después de cambiar su contraseña, necesitará introducirla en todos sus dispositivos.</translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Cancelar</translation>
<translation>Cancelar</translation>
</message>
<message>
<source>Change</source>
<translation type="unfinished"></translation>
<translation>Cambiar</translation>
</message>
</context>
<context>
......@@ -173,6 +173,53 @@
<translation>Error de descarga: %1</translation>
</message>
</context>
<context>
<name>EmojiPicker</name>
<message>
<source>Favorites</source>
<translation>Favoritos</translation>
</message>
<message>
<source>People</source>
<translation>Gente</translation>
</message>
<message>
<source>Nature</source>
<translation>Naturaleza</translation>
</message>
<message>
<source>Food</source>
<translation>Comida</translation>
</message>
<message>
<source>Activity</source>
<translation>Actividad</translation>
</message>
<message>
<source>Travel</source>
<translation>Viajes</translation>
</message>
<message>
<source>Objects</source>
<translation>Objetos</translation>
</message>
<message>
<source>Symbols</source>
<translation>Símbolos</translation>
</message>
<message>
<source>Flags</source>
<translation>Banderas</translation>
</message>
<message>
<source>Search</source>
<translation>Buscar</translation>
</message>
<message>
<source>Search emoji</source>
<translation>Buscar «emoji»</translation>
</message>
</context>
<context>
<name>EmptyChatPage</name>
<message>
......@@ -233,7 +280,7 @@
</message>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
<translation>Configuración</translation>
</message>
</context>
<context>
......@@ -361,16 +408,24 @@
<source>Spoiler</source>
<translation>«Spoiler»</translation>
</message>
<message>
<source>Message could not be sent.</source>
<translation>No se pudo enviar el mensaje.</translation>
</message>
<message>
<source>Message correction was not successful.</source>
<translation>Falló la corrección del mensaje.</translation>
</message>
</context>
<context>
<name>RegistrationManager</name>
<message>
<source>Password changed successfully.</source>
<translation type="unfinished"></translation>
<translation>Contraseña cambiada con éxito.</translation>
</message>
<message>
<source>Failed to change password: %1</source>
<translation type="unfinished"></translation>
<translation>Error al cambiar la contraseña: %1</translation>
</message>
</context>
<context>
......@@ -531,15 +586,15 @@
<name>SettingsPage</name>
<message>
<source>Settings</source>
<translation type="unfinished"></translation>
<translation>Configuración</translation>
</message>
<message>
<source>Change password</source>
<translation type="unfinished"></translation>
<translation>Cambiar contraseña</translation>
</message>
<message>
<source>Changes your account&apos;s password. You will need to re-enter it on your other devices.</source>
<translation type="unfinished"></translation>
<translation>Cambia la contraseña de su cuenta. Necesitará introducirla en todos sus dispositivos.</translation>
</message>