Compare commits
1 commit
Author | SHA1 | Date | |
---|---|---|---|
2ad04b4603 |
15 changed files with 610 additions and 0 deletions
84
CMakeLists.txt
Normal file
84
CMakeLists.txt
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
cmake_minimum_required(VERSION 3.14)
|
||||||
|
|
||||||
|
project(snag)
|
||||||
|
set(PROJECT_VERSION_MAJOR 0)
|
||||||
|
set(PROJECT_VERSION_MINOR 1)
|
||||||
|
set(PROJECT_VERSION_PATCH 0)
|
||||||
|
string(TIMESTAMP PROJECT_VERSION_BUILD "%y%j.%H%M")
|
||||||
|
|
||||||
|
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})
|
||||||
|
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}")
|
||||||
|
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
|
||||||
|
)
|
24
cmake/snag_git.cmake
Normal file
24
cmake/snag_git.cmake
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
cmake_minimum_required(VERSION 3.6)
|
||||||
|
|
||||||
|
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()
|
||||||
|
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 "")
|
26
cmake/snag_patch.cmake
Normal file
26
cmake/snag_patch.cmake
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
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}"
|
||||||
|
)
|
59
cmake/snag_platforms.cmake
Normal file
59
cmake/snag_platforms.cmake
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
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 "")
|
6
debian.md
Normal file
6
debian.md
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
# Сборка из под Debian
|
||||||
|
|
||||||
|
```
|
||||||
|
cmake .
|
||||||
|
dpkg-buildpackage -us -uc -nc
|
||||||
|
```
|
10
debian/.gitignore
vendored
Normal file
10
debian/.gitignore
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
.debhelper
|
||||||
|
*.debhelper
|
||||||
|
*.debhelper.log
|
||||||
|
changelog
|
||||||
|
debhelper-build-stamp
|
||||||
|
termidesk-lsb
|
||||||
|
termidesk-lsb.substvars
|
||||||
|
files
|
||||||
|
tmp
|
||||||
|
|
6
debian/changelog.in
vendored
Normal file
6
debian/changelog.in
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
${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
Normal file
1
debian/compat
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
11
|
14
debian/control
vendored
Normal file
14
debian/control
vendored
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
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
Executable file
23
debian/rules
vendored
Executable file
|
@ -0,0 +1,23 @@
|
||||||
|
#!/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
|
||||||
|
|
||||||
|
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
|
1
debian/source/format
vendored
Normal file
1
debian/source/format
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
3.0 (native)
|
324
files/snag.8
Normal file
324
files/snag.8
Normal file
|
@ -0,0 +1,324 @@
|
||||||
|
.\" 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
|
16
files/snag.json.bak
Normal file
16
files/snag.json.bak
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"git": "",
|
||||||
|
"project": "",
|
||||||
|
"email": "",
|
||||||
|
"author": "",
|
||||||
|
"presnag": [
|
||||||
|
],
|
||||||
|
"postsnag": [
|
||||||
|
],
|
||||||
|
"rules": {
|
||||||
|
"tracking": [
|
||||||
|
],
|
||||||
|
"ignore": [
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
13
patches/config.patch
Normal file
13
patches/config.patch
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
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;
|
||||||
|
|
3
source/snag/version_.d.in
Normal file
3
source/snag/version_.d.in
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
module snag.version_;
|
||||||
|
|
||||||
|
enum snagVersion = "${PROJECT_VERSION_DISPLAY}";
|
Loading…
Add table
Add a link
Reference in a new issue