diff --git a/CMakeLists.txt b/CMakeLists.txt index 2303b63..14f8b2f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,15 +1,18 @@ cmake_minimum_required(VERSION 3.14) project(snag) -list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") -include(snag_version) +set(PROJECT_VERSION_MAJOR 0) +set(PROJECT_VERSION_MINOR 1) +set(PROJECT_VERSION_PATCH 0) string(TIMESTAMP PROJECT_VERSION_BUILD "%y%j.%H%M") -if(GIT_HASH_VERSION) - message(STATUS "GIT_HASH_VERSION is set") - include(snag_git) -endif() -include(snag_platforms) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") +include(snag_git) +include(snag_platforms) +set(PROJECT_VERSION_SUFFIX "-${GIT_VERSION_SUFFIX}") + +# Overwrite suffix for Release or Release Candidate builds +set(PROJECT_VERSION_SUFFIX "-alpha.1") set(CMAKE_BUILD_TYPE "Release") if(CMAKE_BUILD_TYPE) set(BUILD_TYPE ${CMAKE_BUILD_TYPE}) @@ -24,7 +27,7 @@ message(STATUS "PROJECT_VERSION_DISPLAY: ${PROJECT_VERSION_DISPLAY}") message(STATUS "") # Deb package -set(DEB_PACKAGE_VERSION "${PROJECT_VERSION_DISPLAY}${PROJECT_VERSION_SUFFIX}${GIT_VERSION_SUFFIX}") +set(DEB_PACKAGE_VERSION "${PROJECT_VERSION_DISPLAY}${PROJECT_VERSION_SUFFIX}") if(PROJECT_VERSION_CODENAME) set(DEB_PACKAGE_VERSION "${DEB_PACKAGE_VERSION}-${PROJECT_VERSION_CODENAME}") endif() diff --git a/cmake/snag_git.cmake b/cmake/snag_git.cmake index fe97527..dee20ed 100644 --- a/cmake/snag_git.cmake +++ b/cmake/snag_git.cmake @@ -1,20 +1,24 @@ cmake_minimum_required(VERSION 3.6) -find_package(Git) - -if(GIT_FOUND) - # Получаем короткий хэш текущего коммита - execute_process( - COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE GIT_SHORT_HASH - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - # Проверяем, успешно ли получен хэш - if(GIT_SHORT_HASH) - message(STATUS "Git short hash: ${GIT_SHORT_HASH}") - set(GIT_VERSION_SUFFIX "-${GIT_SHORT_HASH}") +if(DEFINED ENV{CI_COMMIT_BRANCH}) + string(REGEX REPLACE ".*/" "" GIT_BRANCH $ENV{CI_COMMIT_BRANCH}) + string(REPLACE "_" "-" GIT_BRANCH ${GIT_BRANCH}) + if(NOT GIT_BRANCH STREQUAL "stable") + set(GIT_VERSION_SUFFIX "${GIT_BRANCH}-") else() - message(WARNING "Failed to retrieve Git short hash") + set(GIT_VERSION_SUFFIX "") endif() +else() + set(GIT_BRANCH "dev") + set(GIT_VERSION_SUFFIX "${GIT_BRANCH}-") endif() + +if(DEFINED ENV{CI_COMMIT_SHORT_SHA}) + set(GIT_TAG $ENV{CI_COMMIT_SHORT_SHA}) +else() + set(GIT_TAG "0000000") +endif() + +set(GIT_VERSION_SUFFIX "${GIT_VERSION_SUFFIX}${GIT_TAG}") +MESSAGE(STATUS "GIT_VERSION_SUFFIX: ${GIT_VERSION_SUFFIX}") +MESSAGE(STATUS "") diff --git a/cmake/snag_version.cmake b/cmake/snag_version.cmake deleted file mode 100644 index e5d7c23..0000000 --- a/cmake/snag_version.cmake +++ /dev/null @@ -1,28 +0,0 @@ -cmake_minimum_required (VERSION 3.6) - -# Сохраняем копию файла с версией программы и каждый раз обновляем при конфигуре через Cmake -if(EXISTS "${CMAKE_SOURCE_DIR}/source/snag/version_.d.bak") - configure_file( - "${CMAKE_SOURCE_DIR}/source/snag/version_.d.bak" - "${CMAKE_SOURCE_DIR}/source/snag/version_.d" - COPYONLY - ) -else() - configure_file( - "${CMAKE_SOURCE_DIR}/source/snag/version_.d" - "${CMAKE_SOURCE_DIR}/source/snag/version_.d.bak" - COPYONLY - ) -endif() - -# Чтение файла version_.d -file(READ "${CMAKE_SOURCE_DIR}/source/snag/version_.d" VERSION_FILE_CONTENT) - -# Извлечение строки версии (например, "0.1.0-alpha.1") -string(REGEX MATCH "snagVersion = \"([0-9]+)\\.([0-9]+)\\.([0-9]+)([^\"]*)\"" _ ${VERSION_FILE_CONTENT}) - -# Установка переменных для мажорной, минорной, патч-версии и суффикса -set(PROJECT_VERSION_MAJOR ${CMAKE_MATCH_1}) -set(PROJECT_VERSION_MINOR ${CMAKE_MATCH_2}) -set(PROJECT_VERSION_PATCH ${CMAKE_MATCH_3}) -set(PROJECT_VERSION_SUFFIX ${CMAKE_MATCH_4}) diff --git a/debian.md b/debian.md index 1cb700c..8f287aa 100644 --- a/debian.md +++ b/debian.md @@ -1,6 +1,6 @@ # Сборка из под Debian ``` -cmake . -DGIT_HASH_VERSION=ON +cmake . dpkg-buildpackage -us -uc -nc ``` diff --git a/debian/rules b/debian/rules index 0f12aca..1da37a9 100755 --- a/debian/rules +++ b/debian/rules @@ -8,7 +8,7 @@ DEST_DIR = $(DEBIAN_DIR)/snag dh $@ $(BUILD_SYSTEM) override_dh_auto_configure: - cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr -DGIT_HASH_VERSION=ON + cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr override_dh_auto_build: cmake --build build diff --git a/source/app.d b/source/app.d index d952688..a79b3f8 100644 --- a/source/app.d +++ b/source/app.d @@ -237,9 +237,7 @@ int main(string[] args) return EXIT_FAILURE; } catch (Exception e) { writeln( - "AN UNEXPECTED ERROR HAS OCCURRED!\n", - "PLEASE REPORT IT TO THE AUTHOR OF THE SNAG: ", - "alexander@zhirov.kz (Alexander Zhirov)\n\n", + "AN UNEXPECTED ERROR HAS OCCURRED! PLEASE REPORT IT TO THE AUTHOR OF THE SNAG!\n\n", e ); return EXIT_FAILURE; diff --git a/source/snag/core/core.d b/source/snag/core/core.d index 7f5f9a1..9917240 100644 --- a/source/snag/core/core.d +++ b/source/snag/core/core.d @@ -22,8 +22,8 @@ class Snag { this(SnagConfig config) { _baseCommand = format( - "git -C %s --git-dir=%s --work-tree=%s", - config.project, config.git, config.project + "git --git-dir=%s --work-tree=%s", + config.git, config.project ).split(); _config = config; @@ -131,7 +131,7 @@ class Snag { } writeln("The following list of files requires backup:"); result.output.split('\n')[0..$-1].map!(e => - e.strip.splitByFirstSpace + e.strip.split ).each!(e => writefln("\t%s\t/%s", gitStatus(e[0], true), e[1]) ); @@ -158,7 +158,7 @@ class Snag { result = execute(_baseCommand ~ ["rev-parse", "--short", "HEAD"]); if (result.status == 128) { // Если это самый первый коммит после инициализации репозитория - git(["add", _config.project], "Failed to prepare files for archiving"); + git(["add", "."], "Failed to prepare files for archiving"); git(["commit", "-m"] ~ message, "Failed to create a snapshot"); newSnapshot = git( ["rev-parse", "--short", "HEAD"], @@ -197,7 +197,7 @@ class Snag { "Failed to create a branch from the current state" ); git( - ["add", _config.project], + ["add", "."], "Failed to prepare files for archiving" ); git( @@ -211,7 +211,7 @@ class Snag { } else { // Если коммит является посленим в ветке git( - ["add", _config.project], + ["add", "."], "Failed to prepare files for archiving" ); git( @@ -250,7 +250,7 @@ class Snag { [ "log", "--all", - "--date=format:%Y.%m.%d %H:%M:%S", + "--date=format:%Y.%m.%d %H:%M", "--pretty=" ~ format ], "Failed to retrieve the list of snapshots" @@ -273,7 +273,7 @@ class Snag { ); if (result.output.length) { git( - ["restore", _config.project], + ["restore", "."], "Failed to reset file changes state" ); git( @@ -381,8 +381,8 @@ class Snag { // Выполнение git команд относительно распакованного архива string[] customCommand = format( - "git -C %s --git-dir=%s --work-tree=%s", - tempDirectory, _config.git, tempDirectory + "git --git-dir=%s --work-tree=%s", + _config.git, tempDirectory ).split(); // Необходимо проверить, что текущее состояние файлов не идентично файлам распакованного архива @@ -406,7 +406,7 @@ class Snag { ); // Создание нового снимка на основе состояния файлов из распакованного архива - result = execute(customCommand ~ ["add", tempDirectory]); + result = execute(customCommand ~ ["add", "."]); result.status && throw new SnagException( "Failed to prepare files for archiving:\n" @@ -427,7 +427,7 @@ class Snag { // Сброс состояния файлов git( - ["restore", _config.project], + ["restore", "."], "Failed to reset file changes state" ); git( diff --git a/source/snag/core/rules.d b/source/snag/core/rules.d index 85fca40..d8a2c9c 100644 --- a/source/snag/core/rules.d +++ b/source/snag/core/rules.d @@ -75,8 +75,8 @@ class SnagRules { _gitignoreBak = _gitignore ~ ".bak"; _baseCommand = format( - "git -C %s --git-dir=%s --work-tree=%s", - config.project, config.git, config.project + "git --git-dir=%s --work-tree=%s", + config.git, config.project ).split(); generate(); diff --git a/source/snag/lib/lib.d b/source/snag/lib/lib.d index 6db6056..902691d 100644 --- a/source/snag/lib/lib.d +++ b/source/snag/lib/lib.d @@ -2,8 +2,6 @@ module snag.lib.lib; import std.regex; import std.process; -import std.algorithm; -import std.string; bool isValidHash(string hash) { auto hashPattern = ctRegex!r"^[a-fA-F0-9]{7}$"; @@ -19,9 +17,3 @@ bool checkGit() { auto result = execute(["which", "git"]); return !result.status; } - -string[] splitByFirstSpace(string line) { - auto spaceIndex = line.indexOf(' '); - return spaceIndex == -1 ? - [line] : [line[0 .. spaceIndex], line[spaceIndex + 1..$]]; -} diff --git a/source/snag/version_.d.in b/source/snag/version_.d.in index 9005846..9a8338d 100644 --- a/source/snag/version_.d.in +++ b/source/snag/version_.d.in @@ -1,3 +1,3 @@ module snag.version_; -enum snagVersion = "${PROJECT_VERSION_DISPLAY}${PROJECT_VERSION_SUFFIX}${GIT_VERSION_SUFFIX}"; +enum snagVersion = "${PROJECT_VERSION_DISPLAY}";