Compare commits

..

No commits in common. "debian" and "main" have entirely different histories.
debian ... main

16 changed files with 0 additions and 631 deletions

View file

@ -1,81 +0,0 @@
cmake_minimum_required(VERSION 3.14)
project(snag)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
include(snag_version)
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)
set(CMAKE_BUILD_TYPE "Release")
if(CMAKE_BUILD_TYPE)
set(BUILD_TYPE ${CMAKE_BUILD_TYPE})
else()
set(BUILD_TYPE "Debug")
endif()
set(PROJECT_VERSION_CODENAME ${OS_RELEASE_VERSION_CODENAME})
set(PROJECT_VERSION_DISPLAY "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_BUILD}")
message(STATUS "PROJECT_VERSION_CODENAME: ${PROJECT_VERSION_CODENAME}")
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}")
if(PROJECT_VERSION_CODENAME)
set(DEB_PACKAGE_VERSION "${DEB_PACKAGE_VERSION}-${PROJECT_VERSION_CODENAME}")
endif()
set(DEB_PACKAGE_NAME "${CMAKE_PROJECT_NAME}")
string(TIMESTAMP DEB_PACKAGE_CHANGELOG_DATE "%a, %d %b %Y %H:%M:%S +0000")
configure_file(
"${CMAKE_SOURCE_DIR}/debian/changelog.in"
"${CMAKE_SOURCE_DIR}/debian/changelog"
)
configure_file(
"${CMAKE_SOURCE_DIR}/source/snag/version_.d.in"
"${CMAKE_SOURCE_DIR}/source/snag/version_.d"
)
message(STATUS "DEB_PACKAGE_NAME: ${DEB_PACKAGE_NAME}")
message(STATUS "DEB_PACKAGE_VERSION: ${DEB_PACKAGE_VERSION}")
message(STATUS "")
file(MAKE_DIRECTORY "${CMAKE_SOURCE_DIR}/bin")
add_custom_command(
OUTPUT "${CMAKE_SOURCE_DIR}/bin/${CMAKE_PROJECT_NAME}"
COMMAND build dlang ldc --output "${CMAKE_SOURCE_DIR}/bin" --project "${CMAKE_SOURCE_DIR}"
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
COMMENT "Building snag with dub"
)
add_custom_target(snag ALL
DEPENDS "${CMAKE_SOURCE_DIR}/bin/${CMAKE_PROJECT_NAME}"
)
include(snag_patch)
add_dependencies(snag apply_config_patch)
install(
FILES "${CMAKE_SOURCE_DIR}/bin/${CMAKE_PROJECT_NAME}"
DESTINATION bin
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ
)
install(
FILES "${CMAKE_SOURCE_DIR}/files/snag.json.bak"
DESTINATION /etc/snag/
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
)
install(
FILES "${CMAKE_SOURCE_DIR}/files/snag.8"
DESTINATION /usr/share/man/ru/man8/
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
)

View file

@ -1,20 +0,0 @@
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}")
else()
message(WARNING "Failed to retrieve Git short hash")
endif()
endif()

View file

@ -1,26 +0,0 @@
cmake_minimum_required(VERSION 3.6)
find_program(PATCH_EXECUTABLE patch)
if(NOT PATCH_EXECUTABLE)
message(FATAL_ERROR "Patch utility not found! Install patch tool before continuing.")
endif()
set(PATCH_FILE "${CMAKE_SOURCE_DIR}/patches/config.patch")
set(PATCH_MARKER_FILE "${CMAKE_BINARY_DIR}/.config_patch_applied")
if(NOT EXISTS "${PATCH_FILE}")
message(WARNING "Patch file not found: ${PATCH_FILE}")
endif()
add_custom_command(
OUTPUT "${PATCH_MARKER_FILE}"
COMMAND "${PATCH_EXECUTABLE}" -p1 -i "${PATCH_FILE}" --reject-file=- --silent || exit 0
COMMAND cmake -E touch "${PATCH_MARKER_FILE}"
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
COMMENT "Applying config.patch..."
VERBATIM
)
add_custom_target(apply_config_patch
DEPENDS "${PATCH_MARKER_FILE}"
)

View file

@ -1,59 +0,0 @@
cmake_minimum_required (VERSION 3.6)
if (NOT WIN32)
set (OS_RELEASE_FILE "/etc/os-release")
file(STRINGS ${OS_RELEASE_FILE} OS_RELEASE)
else ()
list(APPEND OS_RELEASE "ID=${CMAKE_SYSTEM_NAME}")
endif ()
foreach(_line IN LISTS OS_RELEASE)
if (_line STREQUAL "")
continue()
endif()
string(REPLACE "=" ";" _pair "${_line}")
list(GET _pair 0 _name)
list(GET _pair 1 _value)
set(OS_RELEASE_${_name} ${_value})
endforeach()
if (${OS_RELEASE_ID} MATCHES "altlinux")
string(REGEX REPLACE "[\"\.]" "" alt_branch_id ${OS_RELEASE_ALT_BRANCH_ID})
set (OS_RELEASE_VERSION_CODENAME "${alt_branch_id}")
elseif (${OS_RELEASE_ID} MATCHES "astra")
#string(REGEX REPLACE "_x86-64$" "" _version ${OS_RELEASE_VERSION_CODENAME})
file(STRINGS "/etc/astra_version" _version)
string(REGEX REPLACE "\\.|\t|\n|\r" "" _version ${_version})
set (OS_RELEASE_VERSION_CODENAME "${OS_RELEASE_VERSION_CODENAME}")
if (${OS_RELEASE_VERSION_CODENAME} MATCHES "4.7_arm")
set (OS_RELEASE_VERSION_CODENAME "astra47")
elseif (NOT ${OS_RELEASE_VERSION_CODENAME} MATCHES "orel")
set (OS_RELEASE_VERSION_CODENAME "${OS_RELEASE_ID}${_version}")
else ()
set (OS_RELEASE_VERSION_CODENAME "${OS_RELEASE_VERSION_CODENAME}")
endif()
elseif (${OS_RELEASE_ID} MATCHES "debian")
set (OS_RELEASE_VERSION_CODENAME "${OS_RELEASE_VERSION_CODENAME}")
elseif (${OS_RELEASE_ID} MATCHES "centos")
string(REGEX REPLACE "[\"\.]" "" version_id ${OS_RELEASE_VERSION_ID})
set (OS_RELEASE_VERSION_CODENAME "el${version_id}")
elseif (${OS_RELEASE_ID} MATCHES "fedora")
set (OS_RELEASE_VERSION_CODENAME "f${OS_RELEASE_VERSION_ID}")
elseif (${OS_RELEASE_ID} MATCHES "freebsd")
set (OS_RELEASE_VERSION_CODENAME "${OS_RELEASE_NAME}")
elseif (${OS_RELEASE_ID} MATCHES "msys2")
set (OS_RELEASE_VERSION_CODENAME "${OS_RELEASE_ID}")
elseif (${OS_RELEASE_ID} MATCHES "ubuntu")
set (OS_RELEASE_VERSION_CODENAME "${OS_RELEASE_UBUNTU_CODENAME}")
elseif (${OS_RELEASE_ID} MATCHES "sberlinux")
string(REGEX REPLACE "[\"\.]" "" version_id ${OS_RELEASE_VERSION_ID})
set (OS_RELEASE_VERSION_CODENAME "sl${version_id}")
elseif (${OS_RELEASE_ID} MATCHES "Windows")
set (OS_RELEASE_VERSION_CODENAME "win")
else ()
set (OS_RELEASE_VERSION_CODENAME "")
endif()
MESSAGE(STATUS "OS_RELEASE_ID: ${OS_RELEASE_ID}")
MESSAGE(STATUS "OS_RELEASE_VERSION_CODENAME: ${OS_RELEASE_VERSION_CODENAME}")
MESSAGE(STATUS "")

View file

@ -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})

View file

@ -1,6 +0,0 @@
# Сборка из под Debian
```
cmake . -DGIT_HASH_VERSION=ON
dpkg-buildpackage -us -uc -nc
```

10
debian/.gitignore vendored
View file

@ -1,10 +0,0 @@
.debhelper
*.debhelper
*.debhelper.log
changelog
debhelper-build-stamp
termidesk-lsb
termidesk-lsb.substvars
files
tmp

6
debian/changelog.in vendored
View file

@ -1,6 +0,0 @@
${DEB_PACKAGE_NAME} (${DEB_PACKAGE_VERSION}) stable; urgency=medium
* Release snag ${DEB_PACKAGE_VERSION}
-- Alexander Zhirov <alexander@zhirov.kz> ${DEB_PACKAGE_CHANGELOG_DATE}

1
debian/compat vendored
View file

@ -1 +0,0 @@
11

14
debian/control vendored
View file

@ -1,14 +0,0 @@
Source: snag
Maintainer: Alexander Zhirov <alexander@zhirov.kz>
Section: non-free/admin
Priority: optional
Build-Depends: debhelper (>= 11), cmake
Homepage: https://zhirov.kz
Package: snag
Architecture: any
Section: non-free/admin
Priority: optional
Description: Сommand-line utility for creating, managing, and restoring data snapshots
Depends: git (>= 2.30)
Homepage: https://zhirov.kz

23
debian/rules vendored
View file

@ -1,23 +0,0 @@
#!/usr/bin/make -f
BUILD_SYSTEM = --buildsystem=cmake
DEBIAN_DIR = $(CURDIR)/debian
DEST_DIR = $(DEBIAN_DIR)/snag
%:
dh $@ $(BUILD_SYSTEM)
override_dh_auto_configure:
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr -DGIT_HASH_VERSION=ON
override_dh_auto_build:
cmake --build build
override_dh_auto_test:
# Ничего не делаем, тесты отсутствуют
override_dh_auto_install:
DESTDIR=$(DEST_DIR) cmake --install build
override_dh_shlibdeps:
# Отключить проверку зависимостей от *.so

View file

@ -1 +0,0 @@
3.0 (native)

View file

@ -1,324 +0,0 @@
.\" Man-страница для snag
.\" Сгенерирована из документации Markdown
.TH SNAG 1 "30 мая 2025" "1.0" "Команды пользователя"
.SH НАЗВАНИЕ
snag \- утилита для создания, управления и восстановления снимков данных
.SH СИНТАКСИС
.B snag
[\fIфлаги\fR] [\fIопции\fR] \fIкоманда\fR
.SH ОПИСАНИЕ
.B snag
(snapshot git) — это утилита командной строки для создания, управления и восстановления снимков данных. Она позволяет импортировать, экспортировать, создавать и восстанавливать снимки, а также управлять правилами отслеживания файлов.
.SH ФЛАГИ
.TP
.BR \-h ", " \-\-help
Выводит справку.
.TP
.BR \-\-version
Выводит версию утилиты.
.SH ОПЦИИ
.TP
.BR \-c ", " \-\-config " <путь>"
Указывает путь к файлу конфигурации.
.SH КОМАНДЫ
.TP
.B init
Инициализация репозитория для хранения снимков.
.RS
.B snag init
[\-h] [\-f]
.TP
.BR \-f ", " \-\-force
Перезаписывает существующий репозиторий.
.RE
.TP
.B create
Создание нового снимка.
.RS
.B snag create
[\-h] [\-\-no\-pre] [\-\-no\-post] [\-c <комментарий>] [\-a <автор>] [\-e <email>]
.TP
.BR \-\-no\-pre
Выполнение без предкоманд.
.TP
.BR \-\-no\-post
Выполнение без посткоманд.
.TP
.BR \-c ", " \-\-comment " <значение>"
Указывает комментарий к снимку.
.TP
.BR \-a ", " \-\-author " <значение>"
Указывает автора снимка.
.TP
.BR \-e ", " \-\-email " <значение>"
Указывает email автора.
.RE
.TP
.B import
Импорт снимка из архива tar.gz.
.RS
.B snag import
[\-h] [\-\-no\-pre] [\-\-no\-post] [\-c <комментарий>] [\-a <автор>] [\-e <email>] <путь_к_архиву>
.TP
.BR \-\-no\-pre
Без выполнения предкоманд.
.TP
.BR \-\-no\-post
Без выполнения посткоманд.
.TP
.BR \-c ", " \-\-comment " <значение>"
Комментарий к снимку.
.TP
.BR \-a ", " \-\-author " <значение>"
Автор снимка.
.TP
.BR \-e ", " \-\-email " <значение>"
Email автора.
.TP
.BR <путь_к_архиву>
Путь к файлу tar.gz.
.RE
.TP
.B export
Экспорт снимка в архив tar.gz.
.RS
.B snag export
[\-h] [\-s <хэш_снимка>] <путь_к_папке>
.TP
.BR \-s ", " \-\-snapshot " <хэш>"
Указывает хэш снимка.
.TP
.BR <путь_к_папке>
Путь к папке для сохранения архива.
.RE
.TP
.B restore
Восстановление состояния из указанного снимка.
.RS
.B snag restore
[\-h] [\-\-no\-pre] [\-\-no\-post] <хэш_снимка>
.TP
.BR \-\-no\-pre
Без выполнения предкоманд.
.TP
.BR \-\-no\-post
Без выполнения посткоманд.
.TP
.BR <хэш_снимка>
Хэш восстанавливаемого снимка.
.RE
.TP
.B list
Вывод списка снимков.
.RS
.B snag list
[\-h] [\-c] [\-a] [\-e]
.TP
.BR \-c ", " \-\-comment
Показать комментарии к снимкам.
.TP
.BR \-a ", " \-\-author
Показать авторов снимков.
.TP
.BR \-e ", " \-\-email
Показать email авторов.
.RE
.TP
.B diff
Показ изменённых данных.
.RS
.B snag diff
.RE
.TP
.B status
Проверка статуса отслеживаемых файлов.
.RS
.B snag status
.RE
.TP
.B size
Отображение размера снимков.
.RS
.B snag size
.RE
.TP
.B rules
Управление правилами отслеживания.
.RS
.B snag rules
[\-h] save|show|update|reset|clear
.TP
.B save
Сохраняет правила.
.TP
.B show
Показывает правила.
.RS
.B snag rules show
[\-h] [\-c]
.TP
.BR \-c ", " \-\-config
Показать правила из файла конфигурации.
.RE
.TP
.B update
Обновляет правила.
.RS
.B snag rules update
[\-h] [\-r]
.TP
.BR \-r ", " \-\-remove
Удаляет игнорируемые файлы из отслеживания (требуется осторожность).
.RE
.TP
.B reset
Сбрасывает правила до состояния внесенных изменений.
.TP
.B clear
Очищает правила.
.RE
.SH ПРИМЕРЫ
.TP
Инициализация репозитория:
.RS
.B snag init
.RE
.TP
Создание снимка с комментарием:
.RS
.B snag create -c \(dqНачальный снимок\(dq -a \(dqИван Иванов\(dq -e \(dqivan@example.com\(dq
.RE
.TP
Импорт снимка из архива:
.RS
.B snag import archive.tar.gz
.RE
.TP
Экспорт снимка:
.RS
.B snag export -s abc123 /path/to/output
.RE
.TP
Восстановление снимка:
.RS
.B snag restore abc123
.RE
.TP
Просмотр списка снимков с комментариями:
.RS
.B snag list -c
.RE
.TP
Обновление правил отслеживания:
.RS
.B snag rules update
.RE
.SH КОНФИГУРАЦИЯ
.B snag
поддерживает настройку через конфигурационный файл в формате JSON, который задаётся с помощью опции
.B -c
или
.B --config.
Этот файл определяет параметры работы утилиты, включая пути, автора, команды для выполнения до и после создания снимков, а также правила отслеживания файлов.
Пример использования конфигурационного файла:
.RS
.B snag -c /path/to/config.json create
.RE
.SS Пример конфигурационного файла
.nf
{
"git": "/path/to/git/repository/dir",
"project": "/path/to/project",
"email": "user@site.domain",
"author": "snag",
"presnag": [
"systemctl stop my.service"
],
"postsnag": [
"systemctl start my.service"
],
"rules": {
"tracking": [
"/first_dir/",
"/second_dir/*.conf",
"/second_dir/more/"
],
"ignore": [
"/second_dir/more/*.so"
]
}
}
.fi
.SS Описание полей конфигурационного файла
.TP
.B git (строка)
Путь к репозиторию для хранения снимков (например, /path/to/git/repository/dir).
.TP
.B project (строка)
Путь к проекту или директории, файлы которой отслеживаются (например, /path/to/project).
.TP
.B email (строка)
Email автора снимков (например, user@site.domain). Переопределяется опцией
.B -e
или
.B --email.
.TP
.B author (строка)
Имя автора снимков (например, snag). Переопределяется опцией
.B -a
или
.B --author.
.TP
.B presnag (массив строк)
Список команд, выполняемых перед созданием или импортом снимка (если не указан
.B --no-pre).
Пример: systemctl stop my.service.
.TP
.B postsnag (массив строк)
Список команд, выполняемых после создания или импорта снимка (если не указан
.B --no-post).
Пример: systemctl start my.service.
.TP
.B rules (объект)
Определяет правила отслеживания файлов.
.RS
.TP
.B tracking (массив строк)
Список шаблонов файлов или директорий для отслеживания (например, /first_dir/, /second_dir/*.conf, /second_dir/more/).
.TP
.B ignore (массив строк)
Список файлов или директорий, исключаемых из отслеживания (например, /second_dir/more/*.so).
.RE
.SS Примечания
.IP \(bu 4
Правила в разделе
.B rules
можно обновлять с помощью
.B snag rules update
или просматривать с помощью
.B snag rules show -c.
.IP \(bu 4
Параметры командной строки, такие как
.B -e
или
.B -a,
имеют приоритет над значениями из конфигурационного файла.
.IP \(bu 4
Убедитесь, что пути, указанные в
.B git
и
.B project,
существуют и доступны для записи/чтения.
.IP \(bu 4
Команды в
.B presnag
и
.B postsnag
должны быть корректными и доступными в системе, иначе операция может завершиться ошибкой.
.SH ЛИЦЕНЗИЯ
GPL-2.0. Подробности см. в файле LICENSE.
.SH КОНТАКТЫ
Для вопросов и предложений: alexander@zhirov.kz

View file

@ -1,16 +0,0 @@
{
"git": "",
"project": "",
"email": "",
"author": "",
"presnag": [
],
"postsnag": [
],
"rules": {
"tracking": [
],
"ignore": [
]
}
}

View file

@ -1,13 +0,0 @@
diff --git a/source/app.d b/source/app.d
index a79b3f8..2872378 100644
--- a/source/app.d
+++ b/source/app.d
@@ -148,7 +148,7 @@ int main(string[] args)
)
.parse(args);
- string configFile = argumets.option("config", "snag.json");
+ string configFile = argumets.option("config", "/etc/snag/snag.json");
SnagConfig config;

View file

@ -1,3 +0,0 @@
module snag.version_;
enum snagVersion = "${PROJECT_VERSION_DISPLAY}${PROJECT_VERSION_SUFFIX}${GIT_VERSION_SUFFIX}";