Skip to content

Commit 7f930ac

Browse files
authored
Merge pull request #50 from Renardjojo/develop
v1.2.1
2 parents db9f68a + c03b1f9 commit 7f930ac

File tree

3 files changed

+189
-161
lines changed

3 files changed

+189
-161
lines changed

CMakeLists.txt

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
66
set(CMAKE_CXX_EXTENSIONS OFF)
77

88
set(PROJECT_NAME "PetForDesktop")
9+
set(PROJECT_VERSION 1.2.1)
910
set(REL_RESOURCES_DIR "content")
1011

1112
set(ABS_RESOURCE_DIR "${CMAKE_SOURCE_DIR}/${REL_RESOURCES_DIR}")
@@ -20,39 +21,39 @@ set(ABS_README_PATH "${CMAKE_SOURCE_DIR}/README.md")
2021
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
2122

2223
########### Create version ############
23-
find_package(Git)
24-
25-
if(GIT_EXECUTABLE)
26-
# Generate a git-describe version string from Git repository tags
27-
execute_process(
28-
COMMAND ${GIT_EXECUTABLE} describe --tags --dirty --match "v*"
29-
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
30-
OUTPUT_VARIABLE GIT_DESCRIBE_VERSION
31-
RESULT_VARIABLE GIT_DESCRIBE_ERROR_CODE
32-
OUTPUT_STRIP_TRAILING_WHITESPACE
33-
)
34-
35-
if(NOT GIT_DESCRIBE_ERROR_CODE)
36-
string(REGEX REPLACE "^v([0-9]+)\\..*" "\\1" VERSION_MAJOR "${GIT_DESCRIBE_VERSION}")
37-
string(REGEX REPLACE "^v[0-9]+\\.([0-9]+).*" "\\1" VERSION_MINOR "${GIT_DESCRIBE_VERSION}")
38-
string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" VERSION_PATCH "${GIT_DESCRIBE_VERSION}")
39-
string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.[0-9]+(.*)" "\\1" VERSION_SHA1 "${GIT_DESCRIBE_VERSION}")
40-
set(PROJECT_VERSION_SHORT "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
41-
set(PROJECT_VERSION_SHA ${GIT_DESCRIBE_VERSION})
42-
endif()
43-
endif()
44-
45-
# Final fallback: Just use a bogus version string that is semantically older
46-
# than anything else and spit out a warning to the developer.
47-
if(NOT DEFINED PROJECT_VERSION_SHA)
48-
set(PROJECT_VERSION_SHA v0.0.0-unknown)
49-
set(PROJECT_VERSION_SHORT v0.0.0)
50-
message(WARNING "Failed to determine PROJECT_VERSION_SHA from Git tags. Using default version \"${PROJECT_VERSION_SHA}\".")
51-
endif()
24+
#find_package(Git)
25+
#
26+
#if(GIT_EXECUTABLE)
27+
# # Generate a git-describe version string from Git repository tags
28+
# execute_process(
29+
# COMMAND ${GIT_EXECUTABLE} describe --tags --dirty --match "v*"
30+
# WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
31+
# OUTPUT_VARIABLE GIT_DESCRIBE_VERSION
32+
# RESULT_VARIABLE GIT_DESCRIBE_ERROR_CODE
33+
# OUTPUT_STRIP_TRAILING_WHITESPACE
34+
# )
35+
#
36+
# if(NOT GIT_DESCRIBE_ERROR_CODE)
37+
# string(REGEX REPLACE "^v([0-9]+)\\..*" "\\1" VERSION_MAJOR "${GIT_DESCRIBE_VERSION}")
38+
# string(REGEX REPLACE "^v[0-9]+\\.([0-9]+).*" "\\1" VERSION_MINOR "${GIT_DESCRIBE_VERSION}")
39+
# string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" VERSION_PATCH "${GIT_DESCRIBE_VERSION}")
40+
# string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.[0-9]+(.*)" "\\1" VERSION_SHA1 "${GIT_DESCRIBE_VERSION}")
41+
# set(PROJECT_VERSION_SHORT "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
42+
# set(PROJECT_VERSION_SHA ${GIT_DESCRIBE_VERSION})
43+
# endif()
44+
#endif()
45+
#
46+
## Final fallback: Just use a bogus version string that is semantically older
47+
## than anything else and spit out a warning to the developer.
48+
#if(NOT DEFINED PROJECT_VERSION_SHA)
49+
# set(PROJECT_VERSION_SHA v0.0.0-unknown)
50+
# set(PROJECT_VERSION_SHORT v0.0.0)
51+
# message(WARNING "Failed to determine PROJECT_VERSION_SHA from Git tags. Using default version \"${PROJECT_VERSION_SHA}\".")
52+
#endif()
5253

5354
########### Create project ############
54-
project(${PROJECT_NAME} VERSION ${PROJECT_VERSION_SHORT})
55-
message(STATUS "Project ${PROJECT_NAME} ${PROJECT_VERSION_SHORT}")
55+
project(${PROJECT_NAME} VERSION ${PROJECT_VERSION})
56+
message(STATUS "Project ${PROJECT_NAME} ${PROJECT_VERSION}")
5657

5758
########### Setup ############
5859
# Set env variable
@@ -120,8 +121,7 @@ target_link_libraries(${PROJECT_NAME} cpr)
120121
########### Define ############
121122
target_compile_definitions(${PROJECT_NAME} PRIVATE RESOURCE_PATH="${REL_RESOURCES_DIR}/")
122123
target_compile_definitions(${PROJECT_NAME} PRIVATE PROJECT_NAME="${PROJECT_NAME}")
123-
target_compile_definitions(${PROJECT_NAME} PRIVATE PROJECT_VERSION="${PROJECT_VERSION_SHA}")
124-
target_compile_definitions(${PROJECT_NAME} PRIVATE PROJECT_VERSION_SHORT="${PROJECT_VERSION_SHORT}")
124+
target_compile_definitions(${PROJECT_NAME} PRIVATE PROJECT_VERSION="${PROJECT_VERSION}")
125125

126126
########### Build link ############
127127
# Set a symbolic link so exe can find the /Data folder

include/Engine/Updater.hpp

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
#pragma once
2+
3+
#include "Engine/Log.hpp"
4+
5+
#include "boxer/boxer.h"
6+
7+
#include <cpr/cpr.h>
8+
9+
#include <thread>
10+
#include <regex>
11+
12+
class Updater
13+
{
14+
std::thread m_thread;
15+
16+
public:
17+
18+
Updater()
19+
: m_thread(Updater::checkForUpdate)
20+
{}
21+
22+
~Updater()
23+
{
24+
m_thread.join();
25+
}
26+
27+
private:
28+
29+
static void startup(LPCTSTR lpApplicationName)
30+
{
31+
// additional information
32+
STARTUPINFO si;
33+
PROCESS_INFORMATION pi;
34+
35+
// set the size of the structures
36+
ZeroMemory(&si, sizeof(si));
37+
si.cb = sizeof(si);
38+
ZeroMemory(&pi, sizeof(pi));
39+
40+
// start the program up
41+
CreateProcess(lpApplicationName, // the path
42+
NULL, // Command line
43+
NULL, // Process handle not inheritable
44+
NULL, // Thread handle not inheritable
45+
FALSE, // Set handle inheritance to FALSE
46+
0, // No creation flags
47+
NULL, // Use parent's environment block
48+
NULL, // Use parent's starting directory
49+
&si, // Pointer to STARTUPINFO structure
50+
&pi // Pointer to PROCESS_INFORMATION structure (removed extra parentheses)
51+
);
52+
// Close process and thread handles.
53+
CloseHandle(pi.hProcess);
54+
CloseHandle(pi.hThread);
55+
}
56+
57+
static void changeFileExtension(char* file_name)
58+
{
59+
// Find the last '.' character in the file name
60+
char* dot = strrchr(file_name, '.');
61+
if (dot == NULL)
62+
{
63+
// File name has no extension, so append the new extension
64+
strcat(file_name, ".exe");
65+
}
66+
else
67+
{
68+
// File name has an extension, so copy the file name up to the '.' character
69+
// into a new buffer, and append the new extension
70+
size_t length = dot - file_name;
71+
char new_file_name[1024];
72+
strncpy(new_file_name, file_name, length);
73+
new_file_name[length] = '\0';
74+
strcat(new_file_name, ".exe");
75+
strncpy(file_name, new_file_name, length + 5);
76+
}
77+
}
78+
79+
static void generateAndLoadFile(const char* data, size_t count)
80+
{
81+
// Generate a unique file name
82+
char temp_file_name[1024] = {0};
83+
if (tmpnam(temp_file_name) == NULL)
84+
return;
85+
86+
// Create the temporary file
87+
changeFileExtension(temp_file_name);
88+
FILE* temp_file = fopen(temp_file_name, "w+b");
89+
if (temp_file == NULL)
90+
return;
91+
92+
fwrite(data, sizeof(char), count, temp_file);
93+
fclose(temp_file);
94+
95+
startup(temp_file_name);
96+
97+
unlink(temp_file_name);
98+
exit(1);
99+
}
100+
101+
static void checkForUpdate()
102+
{
103+
cpr::Response response = cpr::Get(cpr::Url{"https://api.github.com/repos/Renardjojo/PetDesktop/releases/latest"});
104+
if (response.error)
105+
{
106+
log((response.error.message + "\n").c_str());
107+
return;
108+
}
109+
110+
std::string json = response.text;
111+
std::regex pattern("\"tag_name\":\\s*\"(.*?)\"");
112+
std::smatch matches;
113+
114+
if (std::regex_search(json, matches, pattern))
115+
{
116+
if (matches[1] != "v" PROJECT_VERSION)
117+
{
118+
boxer::Selection selection = boxer::show(
119+
(std::string(PROJECT_NAME " ") + matches[1].str() + " is available. Do you want download it ?")
120+
.c_str(),
121+
PROJECT_NAME " " PROJECT_VERSION " updater", boxer::Style::Question, boxer::Buttons::YesNo);
122+
123+
// TODO: Dialog pop up ?
124+
if (selection == boxer::Selection::Yes)
125+
{
126+
pattern = "\"browser_download_url\":\\s*\"(.*?)\"";
127+
if (std::regex_search(json, matches, pattern))
128+
{
129+
logf("Update package line found: %s\n", matches[1]);
130+
cpr::Response response = cpr::Get(cpr::Url{matches[1]});
131+
generateAndLoadFile(response.text.c_str(), response.text.size());
132+
}
133+
else
134+
{
135+
log("Update package not found\n");
136+
}
137+
}
138+
}
139+
else
140+
{
141+
logf("The version %s is the latest\n", PROJECT_VERSION);
142+
}
143+
}
144+
}
145+
};

0 commit comments

Comments
 (0)