Compare commits

...

30 Commits

Author SHA1 Message Date
Malte Jürgens
1ab00ee774 include timestamp in metainfo 2022-07-28 18:23:26 +02:00
Malte Jürgens
38bcc30ed4 display version number correctly 2022-07-28 18:13:18 +02:00
Malte Jürgens
204439af94 implement automatic versioning 2022-07-28 17:34:54 +02:00
Malte Jürgens
8fc529102c bump version to 1.0.0-rc.11 2022-07-28 16:41:49 +02:00
Malte Jürgens
a7a8346b63 change icon location 2022-07-28 16:41:29 +02:00
Malte Jürgens
88b129f863 bump version to 1.0.0-rc.10 2022-07-28 16:39:27 +02:00
Malte Jürgens
f4fc2e1f19 change desktop file name 2022-07-28 16:39:02 +02:00
Malte Jürgens
e1b35e3ca8 bump version to 1.0.0-rc.9 2022-07-28 16:08:45 +02:00
Malte Jürgens
a773795e38 fix metainfo 2022-07-28 16:08:24 +02:00
Malte Jürgens
c8695ca5ff bump version to 1.0.0-rc.8 2022-07-28 15:59:57 +02:00
Malte Jürgens
bc23d3423a add metainfo 2022-07-28 15:58:50 +02:00
Malte Jürgens
f5217dfdfa remove dependency on aria-label 2022-07-28 15:09:06 +02:00
Malte Jürgens
6ef16b9625 bump version to 1.0.0-rc.7 2022-07-27 21:24:31 +02:00
Malte Jürgens
b62f1bab1f update readme 2022-07-27 19:49:49 +02:00
Malte Jürgens
5f9211f98f remember is window was maximised before fullscreen 2022-07-27 19:38:09 +02:00
Malte Jürgens
cfbb4152c3 ensure application is closed when window is closed 2022-07-27 15:11:53 +02:00
Malte Jürgens
fa83e2d9a8 fix broken discord notifications after restart 2022-07-27 15:02:51 +02:00
Malte Jürgens
58ecbbc6f4 Allow navigation to external links 2022-07-27 14:53:16 +02:00
Malte Jürgens
77300ed178 allow discord to go fullscreen 2022-07-27 14:13:59 +02:00
Malte Jürgens
99df18ef89 add scope of project to readme 2022-07-27 13:09:15 +02:00
Malte Jürgens
6fc6140ce2 bump version to 1.0.0-rc.6 2022-07-27 00:36:33 +02:00
Malte Jürgens
84c12a752e fix virtmic code for rohrkabel v1.2 2022-07-26 21:35:51 +02:00
Malte Jürgens
1199381803 fix git submodule update command 2022-07-26 16:53:13 +02:00
Malte Jürgens
bce32e2ba1 fix submodule version 2022-07-26 16:50:36 +02:00
Malte Jürgens
bc59458e19 use rohrkabel as submodule and update it to v1.2 2022-07-26 16:33:34 +02:00
Malte Jürgens
6492cb9a35 start virtmic with no target when audio capture is requested 2022-07-26 16:02:36 +02:00
Malte Jürgens
a814d9cc1b decrease update interval to 500ms 2022-07-26 15:48:01 +02:00
Malte Jürgens
dd107c6767 Merge pull request #5 from teppyboy/patch-1
readme: add issue #1 to 3rd known issue
2022-07-25 20:03:46 +00:00
tretrauit
50be25d7db readme: add issue #1 to 3rd known issue
So people can trace down more information about this issue.
2022-07-26 03:02:41 +07:00
Malte Jürgens
fd894fb63e Add "Known Issues" 2022-07-25 18:37:00 +00:00
16 changed files with 369 additions and 29 deletions

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "submodules/rohrkabel"]
path = submodules/rohrkabel
url = https://github.com/Soundux/rohrkabel

View File

@@ -1,11 +1,16 @@
cmake_minimum_required(VERSION 3.0)
project(discord-screenaudio)
include(version.cmake)
determine_version("${CMAKE_CURRENT_SOURCE_DIR}" DISCORD_SCEENAUDIO)
add_definitions( -DDISCORD_SCEENAUDIO_VERSION_FULL="${DISCORD_SCEENAUDIO_VERSION_FULL}" )
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")
string(TIMESTAMP TIMESTAMP %s)
# set(CMAKE_AUTOUIC ON)
find_package(Qt5 CONFIG REQUIRED COMPONENTS
@@ -22,18 +27,33 @@ set(discord-screenaudio_SRC
resources.qrc
)
include(FetchContent)
# Adapted from https://cliutils.gitlab.io/modern-cmake/chapters/projects/submodule.html
find_package(Git QUIET)
if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
option(GIT_SUBMODULE "Check submodules during build" ON)
if(GIT_SUBMODULE)
message(STATUS "Updating submodules")
execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive --checkout
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
RESULT_VARIABLE GIT_SUBMOD_RESULT)
if(NOT GIT_SUBMOD_RESULT EQUAL "0")
message(FATAL_ERROR "`git submodule update --init --recursive --checkout` failed with ${GIT_SUBMOD_RESULT}, please provide the submodules manually")
endif()
endif()
endif()
FetchContent_Declare(
rohrkabel
GIT_REPOSITORY "https://github.com/Soundux/rohrkabel"
GIT_TAG "d87403f48d3a95aa4bcf4cd60112d9e4bb090d5d"
)
FetchContent_MakeAvailable(rohrkabel)
if(NOT EXISTS "${PROJECT_SOURCE_DIR}/submodules/rohrkabel/CMakeLists.txt")
message(FATAL_ERROR "Rohrkabel was not found since you are not in a Git checkout or have GIT_SUBMODULE disabled. Please provide rohrkabel manually to `./submodules/rohrkabel`.")
endif()
add_subdirectory(submodules/rohrkabel)
add_executable(discord-screenaudio ${discord-screenaudio_SRC})
target_link_libraries(discord-screenaudio Qt5::Widgets Qt5::WebEngineWidgets rohrkabel)
install(TARGETS discord-screenaudio DESTINATION bin)
install(PROGRAMS assets/discord-screenaudio.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
install(FILES assets/de.shorsh.discord-screenaudio.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/256x256/apps)
install(PROGRAMS assets/de.shorsh.discord-screenaudio.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
configure_file(assets/de.shorsh.discord-screenaudio.metainfo.xml.in de.shorsh.discord-screenaudio.metainfo.xml)
install(FILES ${CMAKE_BINARY_DIR}/de.shorsh.discord-screenaudio.metainfo.xml DESTINATION ${CMAKE_INSTALL_PREFIX}/share/metainfo)

View File

@@ -9,6 +9,19 @@ of [@edisionnano](https://github.com/edisionnano) and the
![Screenshot_20220718_194357](https://user-images.githubusercontent.com/48161361/179571245-11ea05f3-fb5e-4aef-9132-2736e122ef04.png)
The purpose of this project is **not** to provide an alternative to the original
Discord client. Rather, it should be used in addition to the original client in
case you want to stream something, maybe used with a second account. For
anything else, this client has way too many things that work less well than in
the original client.
## Known Issues
- Only works with **PipeWire**
- Only works on **X11**
- Can only share primary screen (no other screens or specific applications) (see
[#1](https://github.com/maltejur/discord-screenaudio/issues/1))
## Installation
If you are using Arch, you can build and install
@@ -30,7 +43,14 @@ On Debian:
### Building
To build the program, run this in the source directory:
First, clone the repository:
```bash
git clone https://github.com/maltejur/discord-screenaudio.git
cd discord-screenaudio
```
Then, to build the program, run this in the source directory:
```bash
cmake -B build

View File

@@ -2,5 +2,5 @@
Type=Application
Name=discord-screenaudio
Exec=discord-screenaudio
Icon=discord
Icon=de.shorsh.discord-screenaudio
Terminal=false

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>de.shorsh.discord-screenaudio</id>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-3.0+</project_license>
<name>discord-screenaudio</name>
<releases>
<release version="${DISCORD_SCEENAUDIO_VERSION_FULL}" timestamp="${TIMESTAMP}" />
</releases>
<summary>A very WIP custom discord client that supports streaming with audio on Linux</summary>
<description>
<p>A very WIP custom discord client that supports streaming with audio on Linux, made possible by the great work of @edisionnano and the Rohrkabel library by @Curve.</p>
<p>The purpose of this project is not to provide an alternative to the original Discord client. Rather, it should be used in addition to the original client in case you want to stream something, maybe used with a second account. For anything else, this client has way too many things that work less well than in the original client.</p>
</description>
<launchable type="desktop-id">
discord-screenaudio.desktop
</launchable>
<screenshots>
<screenshot type="default">
<image>
https://user-images.githubusercontent.com/48161361/179571245-11ea05f3-fb5e-4aef-9132-2736e122ef04.png
</image>
</screenshot>
</screenshots>
<url type="homepage">https://github.com/maltejur/discord-screenaudio</url>
<provides>
<binary>discord-screenaudio</binary>
</provides>
</component>

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -81,11 +81,16 @@ setInterval(() => {
});
hiddenElements.length = 0;
} else {
for (const el of document.querySelectorAll(
'[aria-label="Share Your Screen"]'
)) {
for (const el of [
document.getElementsByClassName("actionButtons-2vEOUh")?.[0]?.children[1],
document.querySelector(
".wrapper-3t3Yqv > div > div > div > div > .controlButton-2PMNom"
),
]) {
if (!el) continue;
if (el.classList.contains("discord-screenaudio-cloned")) continue;
el.classList.add("discord-screenaudio-cloned");
elClone = el.cloneNode(true);
elClone.ariaLabel = "Share Your Screen with Audio";
elClone.title = "Share Your Screen with Audio";
elClone.addEventListener("click", () => {
console.log("!discord-screenaudio-start-stream");
@@ -117,9 +122,10 @@ setInterval(() => {
) {
for (const el of document.getElementsByClassName("info-3pQQBb")) {
const aboutEl = document.createElement("div");
aboutEl.innerText = "discord-screenaudio v1.0.0-rc.5";
aboutEl.innerText = `discord-screenaudio ${window.discordScreenaudioVersion}`;
aboutEl.style.fontSize = "12px";
aboutEl.style.color = "var(--text-muted)";
aboutEl.style.textTransform = "none";
aboutEl.classList.add("dirscordScreenaudioAboutText");
el.appendChild(aboutEl);
}
@@ -128,4 +134,8 @@ setInterval(() => {
// Remove stream settings if stream is active
document.getElementById("manage-streams-change-windows")?.remove();
document.querySelector(`[aria-label="Stream Settings"]`)?.remove();
}, 1000);
}, 500);
// Fix for broken discord notifications after restart
// (https://github.com/maltejur/discord-screenaudio/issues/17)
Notification.requestPermission();

View File

@@ -17,6 +17,11 @@ DiscordPage::DiscordPage(QWidget *parent) : QWebEnginePage(parent) {
connect(this, &QWebEnginePage::featurePermissionRequested, this,
&DiscordPage::featurePermissionRequested);
connect(this, &QWebEnginePage::loadStarted, [=]() {
runJavaScript(QString("window.discordScreenaudioVersion = '%1';")
.arg(QApplication::applicationVersion()));
});
settings()->setAttribute(QWebEngineSettings::ScreenCaptureEnabled, true);
settings()->setAttribute(QWebEngineSettings::JavascriptCanOpenWindows, true);
settings()->setAttribute(QWebEngineSettings::AllowRunningInsecureContent,
@@ -26,10 +31,12 @@ DiscordPage::DiscordPage(QWidget *parent) : QWebEnginePage(parent) {
settings()->setAttribute(QWebEngineSettings::FullScreenSupportEnabled, true);
settings()->setAttribute(QWebEngineSettings::PlaybackRequiresUserGesture,
false);
settings()->setAttribute(QWebEngineSettings::JavascriptCanOpenWindows, false);
setUrl(QUrl("https://discord.com/app"));
injectScript(":/assets/userscript.js");
injectVersion(QApplication::applicationVersion());
connect(&m_streamDialog, &StreamDialog::requestedStreamStart, this,
&DiscordPage::startStream);
@@ -58,17 +65,39 @@ void DiscordPage::injectScript(QString source) {
}
}
void DiscordPage::injectVersion(QString version) {
QWebEngineScript script;
auto code = QString("window.discordScreenaudioVersion = '%1';").arg(version);
script.setSourceCode(code);
script.setName("version.js");
script.setWorldId(QWebEngineScript::MainWorld);
script.setInjectionPoint(QWebEngineScript::DocumentCreation);
script.setRunsOnSubFrames(false);
scripts().insert(script);
}
void DiscordPage::featurePermissionRequested(const QUrl &securityOrigin,
QWebEnginePage::Feature feature) {
// Allow every permission asked
setFeaturePermission(securityOrigin, feature,
QWebEnginePage::PermissionGrantedByUser);
if (feature == QWebEnginePage::Feature::MediaAudioCapture) {
if (m_virtmicProcess.state() == QProcess::NotRunning) {
qDebug() << "[virtmic] Starting Virtmic with no target to make sure "
"Discord can find all the audio devices";
m_virtmicProcess.start(QApplication::arguments()[0],
{"--virtmic", "None"});
}
}
}
bool DiscordPage::acceptNavigationRequest(const QUrl &url,
QWebEnginePage::NavigationType type,
bool isMainFrame) {
qDebug() << url;
if (type == QWebEnginePage::NavigationTypeLinkClicked) {
QDesktopServices::openUrl(url);
return false;
@@ -76,10 +105,23 @@ bool DiscordPage::acceptNavigationRequest(const QUrl &url,
return true;
};
bool ExternalPage::acceptNavigationRequest(const QUrl &url,
QWebEnginePage::NavigationType type,
bool isMainFrame) {
QDesktopServices::openUrl(url);
deleteLater();
return false;
}
QWebEnginePage *DiscordPage::createWindow(QWebEnginePage::WebWindowType type) {
return new ExternalPage;
}
void DiscordPage::stopVirtmic() {
if (m_virtmicProcess.state() == QProcess::Running) {
qDebug() << "[virtmic] Stopping Virtmic";
m_virtmicProcess.kill();
m_virtmicProcess.waitForFinished();
}
}

View File

@@ -4,6 +4,7 @@
#include "virtmic.h"
#include <QProcess>
#include <QWebEngineFullScreenRequest>
#include <QWebEnginePage>
class DiscordPage : public QWebEnginePage {
@@ -18,11 +19,13 @@ private:
bool acceptNavigationRequest(const QUrl &url,
QWebEnginePage::NavigationType type,
bool isMainFrame) override;
QWebEnginePage *createWindow(QWebEnginePage::WebWindowType type) override;
void
javaScriptConsoleMessage(QWebEnginePage::JavaScriptConsoleMessageLevel level,
const QString &message, int lineNumber,
const QString &sourceID) override;
void injectScript(QString source);
void injectVersion(QString version);
void stopVirtmic();
void startVirtmic(QString target);
@@ -31,3 +34,15 @@ private Q_SLOTS:
QWebEnginePage::Feature feature);
void startStream(QString target, uint width, uint height, uint frameRate);
};
// Will immediately get destroyed again but is needed for navigation to
// target="_blank" links, since QWebEnginePage::newWindowRequested is
// only available sinec Qt 6.3.
class ExternalPage : public QWebEnginePage {
Q_OBJECT
private:
bool acceptNavigationRequest(const QUrl &url,
QWebEnginePage::NavigationType type,
bool isMainFrame) override;
};

View File

@@ -7,7 +7,7 @@
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QApplication::setApplicationName("discord-screenaudio");
QApplication::setApplicationVersion("1.0.0-rc.5");
QApplication::setApplicationVersion(DISCORD_SCEENAUDIO_VERSION_FULL);
QCommandLineParser parser;
parser.setApplicationDescription(

View File

@@ -23,8 +23,25 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
}
void MainWindow::setupWebView() {
m_webView = new QWebEngineView(this);
auto page = new DiscordPage(this);
connect(page, &QWebEnginePage::fullScreenRequested, this,
&MainWindow::fullScreenRequested);
m_webView = new QWebEngineView(this);
m_webView->setPage(page);
setCentralWidget(m_webView);
}
void MainWindow::fullScreenRequested(
QWebEngineFullScreenRequest fullScreenRequest) {
fullScreenRequest.accept();
if (fullScreenRequest.toggleOn()) {
m_wasMaximized = isMaximized();
showFullScreen();
} else {
m_wasMaximized ? showMaximized() : showNormal();
}
}
void MainWindow::closeEvent(QCloseEvent *event) { QApplication::quit(); }

View File

@@ -21,4 +21,9 @@ private:
QWebEngineView *m_webView;
QWebEngineProfile *prepareProfile();
DiscordPage *m_discordPage;
void closeEvent(QCloseEvent *event) override;
bool m_wasMaximized;
private Q_SLOTS:
void fullScreenRequested(QWebEngineFullScreenRequest fullScreenRequest);
};

View File

@@ -1,5 +1,8 @@
#include "virtmic.h"
#include <rohrkabel/loop/main.hpp>
#include <rohrkabel/registry/registry.hpp>
namespace Virtmic {
QVector<QString> getTargets() {
@@ -24,7 +27,7 @@ QVector<QString> getTargets() {
}
}
});
core.sync();
core.update();
return targets;
}
@@ -81,14 +84,21 @@ void start(QString _target) {
std::string target = _target.toLatin1().toStdString();
auto virtual_mic =
core.create("adapter",
{{"node.name", "discord-screenaudio-virtmic"},
{"media.class", "Audio/Source/Virtual"},
{"factory.name", "support.null-audio-sink"},
{"audio.channels", "2"},
{"audio.position", "FL,FR"}},
pipewire::node::type, pipewire::node::version, false);
auto virtual_mic = core.create("adapter",
{{"node.name", "discord-screenaudio-virtmic"},
{"media.class", "Audio/Source/Virtual"},
{"factory.name", "support.null-audio-sink"},
{"audio.channels", "2"},
{"audio.position", "FL,FR"}},
pipewire::node::type, pipewire::node::version,
pipewire::update_strategy::none);
if (target == "None") {
while (true) {
main_loop.run();
}
return;
}
auto reg_events = reg.listen<pipewire::registry_listener>();
reg_events.on<pipewire::registry_event::global>(

View File

@@ -3,7 +3,6 @@
#include <QString>
#include <QVector>
#include <iostream>
#include <rohrkabel/registry/registry.hpp>
namespace Virtmic {

1
submodules/rohrkabel Submodule

Submodule submodules/rohrkabel added at 04bfb921c4

163
version.cmake Normal file
View File

@@ -0,0 +1,163 @@
# Copyright (c) 2018-2021 Ribose Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
# desired length of commit hash
set(GIT_REV_LEN 7)
# call git, store output in var (can fail)
macro(_git var)
execute_process(
COMMAND "${GIT_EXECUTABLE}" ${ARGN}
WORKING_DIRECTORY "${source_dir}"
RESULT_VARIABLE _git_ec
OUTPUT_VARIABLE ${var}
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
endmacro()
function(extract_version_info version var_prefix)
# extract the main components
# v1.9.0-3-g5b92266+1546836556
# v1.9.0-3-g5b92266-dirty+1546836556
string(REGEX MATCH "^v?([0-9]+\\.[0-9]+\\.[0-9]+)(-([0-9]+)-g([0-9a-f]+)(-dirty)?)?(\\+([0-9]+))?$" matches "${version}")
if (NOT matches)
message(FATAL_ERROR "Failed to extract version components from ${version}.")
endif()
set(${var_prefix}_VERSION "${CMAKE_MATCH_1}" PARENT_SCOPE) # 1.9.0
if (NOT CMAKE_MATCH_3)
set(CMAKE_MATCH_3 "0")
endif()
set(${var_prefix}_VERSION_NCOMMITS "${CMAKE_MATCH_3}" PARENT_SCOPE) # 3
if (NOT CMAKE_MATCH_4)
set(CMAKE_MATCH_4 "0")
endif()
set(${var_prefix}_VERSION_GIT_REV "${CMAKE_MATCH_4}" PARENT_SCOPE) # 5b92266
if (CMAKE_MATCH_5 STREQUAL "-dirty")
set(${var_prefix}_VERSION_IS_DIRTY TRUE PARENT_SCOPE)
else()
set(${var_prefix}_VERSION_IS_DIRTY FALSE PARENT_SCOPE)
endif()
# timestamp is optional, default to 0
if (NOT CMAKE_MATCH_7)
set(CMAKE_MATCH_7 "0")
endif()
set(${var_prefix}_VERSION_COMMIT_TIMESTAMP "${CMAKE_MATCH_7}" PARENT_SCOPE) # 1546836556
endfunction()
function(determine_version source_dir var_prefix)
set(has_release_tag NO)
set(has_version_txt NO)
set(local_prefix "_determine_ver")
# find out base version via version.txt
set(base_version "0.0.0")
if (EXISTS "${source_dir}/version.txt")
set(has_version_txt YES)
file(STRINGS "${source_dir}/version.txt" version_file)
extract_version_info("${version_file}" "${local_prefix}")
set(base_version "${${local_prefix}_VERSION}")
message(STATUS "Found version.txt with ${version_file}")
else()
message(STATUS "Found no version.txt.")
endif()
# for GIT_EXECUTABLE
find_package(Git)
# get a description of the version, something like:
# v1.9.1-0-g38ffe82 (a tagged release)
# v1.9.1-0-g38ffe82-dirty (a tagged release with local modifications)
# v1.9.0-3-g5b92266 (post-release snapshot)
# v1.9.0-3-g5b92266-dirty (post-release snapshot with local modifications)
_git(version describe --abbrev=${GIT_REV_LEN} --match "v[0-9]*" --long --dirty)
if (NOT _git_ec EQUAL 0)
# no annotated tags, fake one
message(STATUS "Found no annotated tags.")
_git(revision rev-parse --short=${GIT_REV_LEN} --verify HEAD)
if (_git_ec EQUAL 0)
set(version "v${base_version}-0-g${revision}")
# check if dirty (this won't detect untracked files, but should be ok)
_git(changes diff-index --quiet HEAD --)
if (NOT _git_ec EQUAL 0)
string(APPEND version "-dirty")
endif()
# append the commit timestamp of the most recent commit (only
# in non-release branches -- typically master)
_git(commit_timestamp show -s --format=%ct)
if (_git_ec EQUAL 0)
string(APPEND version "+${commit_timestamp}")
endif()
elseif(has_version_txt)
# Nothing to get from git - so use version.txt completely
set(version "${version_file}")
else()
# Sad case - no git, no version.txt
set(version "v${base_version}")
endif()
else()
set(has_release_tag YES)
message(STATUS "Found annotated tag ${version}")
endif()
extract_version_info("${version}" "${local_prefix}")
if ("${has_version_txt}" AND NOT ${base_version} STREQUAL ${local_prefix}_VERSION)
message(WARNING "Tagged version ${${local_prefix}_VERSION} doesn't match one from the version.txt: ${base_version}")
if (${base_version} VERSION_GREATER ${local_prefix}_VERSION)
set(${local_prefix}_VERSION ${base_version})
endif()
endif()
foreach(suffix VERSION VERSION_NCOMMITS VERSION_GIT_REV VERSION_IS_DIRTY VERSION_COMMIT_TIMESTAMP)
if (NOT DEFINED ${local_prefix}_${suffix})
message(FATAL_ERROR "Unable to determine version.")
endif()
set(${var_prefix}_${suffix} "${${local_prefix}_${suffix}}" PARENT_SCOPE)
message(STATUS "${var_prefix}_${suffix}: ${${local_prefix}_${suffix}}")
endforeach()
# Set VERSION_SUFFIX and VERSION_FULL. When making changes, be aware that
# this is used in packaging as well and will affect ordering.
# | state | version_full |
# |-----------------------------------------------------|
# | exact tag | 0.9.0 |
# | exact tag, dirty | 0.9.0+git20180604 |
# | after tag | 0.9.0+git20180604.1.085039f |
# | no tag, version.txt | 0.9.0+git20180604.2ee02af |
# | no tag, no version.txt| 0.0.0+git20180604.2ee02af |
string(TIMESTAMP date "%Y%m%d" UTC)
set(version_suffix "")
if (NOT ${local_prefix}_VERSION_NCOMMITS EQUAL 0)
# 0.9.0+git20150604.4.289818b
string(APPEND version_suffix "+git${date}.${${local_prefix}_VERSION_NCOMMITS}.${${local_prefix}_VERSION_GIT_REV}")
elseif ((NOT has_release_tag) AND ((NOT has_version_txt) OR ("${base_version}" STREQUAL "0.0.0") OR (NOT "${revision}" STREQUAL "")))
# 0.9.0+git20150604.289818b
string(APPEND version_suffix "+git${date}.${${local_prefix}_VERSION_GIT_REV}")
elseif(${local_prefix}_VERSION_IS_DIRTY)
# 0.9.0+git20150604
string(APPEND version_suffix "+git${date}")
endif()
set(version_full "${${local_prefix}_VERSION}${version_suffix}")
# set the results
set(${var_prefix}_VERSION_SUFFIX "${version_suffix}" PARENT_SCOPE)
set(${var_prefix}_VERSION_FULL "${version_full}" PARENT_SCOPE)
# for informational purposes
message(STATUS "${var_prefix}_VERSION_SUFFIX: ${version_suffix}")
message(STATUS "${var_prefix}_VERSION_FULL: ${version_full}")
endfunction()