From 5f89f0ce31f433ef9cb8420806a7db19f48311a4 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 20:25:21 +0300 Subject: [PATCH 01/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index d84f269..8acc9f3 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -20,13 +20,15 @@ jobs: - name: Create release run: | + export VERSION=$(grep "# Version" projman.tcl | grep -oE '\b[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}\b') + export RELEASE=$(grep "# Release" projman.tcl | grep -oE '[0-9A-Za-z]+$') # Создаем релиз через API curl -X POST \ -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ -H "Content-Type: application/json" \ -d '{ "tag_name": "'"${{ gitea.ref_name }}"'", - "name": "Release '"${{ gitea.ref_name }}"'", + "name": "Release '"${{ gitea.ref_name }}" ${VERSION} - ${RELEASE}'", "body": "Automated release for '"${{ gitea.ref_name }}"'", "draft": false, "prerelease": false @@ -39,7 +41,7 @@ jobs: response=$(curl -s -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ "${{vars.main_url}}/api/v1/repos/${{ gitea.repository }}/releases/tags/${{ gitea.ref_name }}") - echo "id=$(echo $response | jq -r '.id')" >> $GITHUB_OUTPUT + echo "id=$(echo $response" - name: Upload Linux package run: | -- 2.49.1 From 9c15f2398770471521e509daf0a8970139885733 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 20:31:16 +0300 Subject: [PATCH 02/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 8acc9f3..f08f520 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -20,7 +20,7 @@ jobs: - name: Create release run: | - export VERSION=$(grep "# Version" projman.tcl | grep -oE '\b[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}\b') + export VERSION=$(grep Version projman.tcl | grep -oE '\b[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}\b') export RELEASE=$(grep "# Release" projman.tcl | grep -oE '[0-9A-Za-z]+$') # Создаем релиз через API curl -X POST \ @@ -41,16 +41,21 @@ jobs: response=$(curl -s -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ "${{vars.main_url}}/api/v1/repos/${{ gitea.repository }}/releases/tags/${{ gitea.ref_name }}") - echo "id=$(echo $response" + id=$(echo $response | grep -o '"id":[0-9]*' | cut -d':' -f2 | head -n1) + echo "id=$id" >> $GITHUB_OUTPUT - name: Upload Linux package run: | + export DEB=$(ls -1| grep projman | grep -E 'deb$') + echo "${DEB}" curl --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - --upload-file "$(ls -1| grep projman | grep -E 'deb$')" \ - "${{vars.main_url}}/api/v1/repos/${{ gitea.repository }}/releases/${{ steps.release_info.outputs.id }}/assets?name=$(ls -1| grep projman | grep -E 'deb$')" + --upload-file "${DEB}" \ + "${{vars.main_url}}/api/v1/repos/${{ gitea.repository }}/releases/${{ steps.release_info.outputs.id }}/assets?name=${DEB}" - name: Upload OpenBSD package run: | + export PKG=$(ls -1| grep projman | grep -E 'tgz$') + echo ${PKG} curl --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - --upload-file "$(ls -1| grep projman | grep -E 'tgz$')" \ - "${{vars.main_url}}/api/v1/repos/${{ gitea.repository }}/releases/${{ steps.release_info.outputs.id }}/assets?name=$(ls -1| grep projman | grep -E 'tgz$')" + --upload-file "${PKG}" \ + "${{vars.main_url}}/api/v1/repos/${{ gitea.repository }}/releases/${{ steps.release_info.outputs.id }}/assets?name=${PKG}" -- 2.49.1 From debcffb9a278b626cb739426525771b90b92d585 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 20:35:54 +0300 Subject: [PATCH 03/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 98 ++++++++++++++++++++++++-------------- 1 file changed, 62 insertions(+), 36 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index f08f520..cd71287 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -1,61 +1,87 @@ -name: Gitea Actions Demo -run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀 +name: Gitea Actions +run-name: ${{ gitea.actor }} тестирует Gitea Actions on: [push] jobs: Explore-Gitea-Actions: - runs-on: tcl-tk-builder + runs-on: tcl-tk-builder # Ваш корректный runner steps: - - name: Build the DEB-packages + - name: Клонирование репозитория run: | - git clone ${{ vars.main_url }}${{ gitea.repository }} + git clone "${{ vars.main_url }}${{ gitea.repository }}.git" . pwd + ls -la + + - name: Сборка DEB-пакетов + run: | cd projman/debian ./build-deb-projman.sh cd ../openbsd ./build-package-bsd.sh cd ../../ - curl --user ${{secrets.USER}}:${{secrets.API_TOKEN}} --upload-file "$(ls -1| grep projman | grep -E 'deb$')" ${{vars.main_url}}api/packages/${{vars.user}}/debian/pool/bookworm/main/upload - - run: echo "This job's status is ${{ job.status }}." + + # Ищем DEB файл + DEB_FILE=$(find . -name "*.deb" -type f | head -1) + echo "DEB файл: $DEB_FILE" + + # Загружаем в репозиторий пакетов + curl --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + --upload-file "$DEB_FILE" \ + "${{ vars.main_url }}api/packages/${{ vars.user }}/debian/pool/bookworm/main/upload?version=$(basename "$DEB_FILE" | grep -o '[0-9].*[0-9]')" - - name: Create release + - name: Извлечение информации о версии + id: version_info run: | - export VERSION=$(grep Version projman.tcl | grep -oE '\b[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}\b') - export RELEASE=$(grep "# Release" projman.tcl | grep -oE '[0-9A-Za-z]+$') - # Создаем релиз через API - curl -X POST \ + VERSION=$(grep "Version" projman.tcl | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1) + RELEASE=$(grep "# Release" projman.tcl | tail -1 | grep -oE '[0-9A-Za-z]+$') + echo "VERSION=$VERSION" >> $GITEA_OUTPUT + echo "RELEASE=$RELEASE" >> $GITEA_OUTPUT + echo "Извлечено: Version=$VERSION, Release=$RELEASE" + + - name: Создание релиза (только для тегов) + if: startsWith(gitea.ref, 'refs/tags/') + id: create_release + run: | + TAG_NAME="${GITEA_REF#refs/tags/}" + echo "Создание релиза для тега: $TAG_NAME" + + # Создаем релиз через API Gitea + response=$(curl -s -X POST \ -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ -H "Content-Type: application/json" \ -d '{ - "tag_name": "'"${{ gitea.ref_name }}"'", - "name": "Release '"${{ gitea.ref_name }}" ${VERSION} - ${RELEASE}'", - "body": "Automated release for '"${{ gitea.ref_name }}"'", + "tag_name": "'"$TAG_NAME"'", + "name": "Projman '"$VERSION"' (Release '"$RELEASE"')", + "body": "Автоматический релиз\\n\\nВерсия: '"$VERSION"'\\nРевизия: '"$RELEASE"'\\n\\nСобран: '"$(date)"'", "draft": false, "prerelease": false }' \ - "${{vars.main_url}}/api/v1/repos/${{ gitea.repository }}/releases" - - - name: Get release ID - id: release_info - run: | - response=$(curl -s -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - "${{vars.main_url}}/api/v1/repos/${{ gitea.repository }}/releases/tags/${{ gitea.ref_name }}") + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases") - id=$(echo $response | grep -o '"id":[0-9]*' | cut -d':' -f2 | head -n1) - echo "id=$id" >> $GITHUB_OUTPUT + echo "Ответ API: $response" + + # Извлекаем ID созданного релиза + RELEASE_ID=$(echo "$response" | grep -o '"id":[0-9]*' | cut -d: -f2) + echo "ID релиза: $RELEASE_ID" + echo "RELEASE_ID=$RELEASE_ID" >> $GITEA_OUTPUT - - name: Upload Linux package + - name: Загрузка пакетов в релиз + if: steps.create_release.outputs.RELEASE_ID != '' run: | - export DEB=$(ls -1| grep projman | grep -E 'deb$') - echo "${DEB}" - curl --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - --upload-file "${DEB}" \ - "${{vars.main_url}}/api/v1/repos/${{ gitea.repository }}/releases/${{ steps.release_info.outputs.id }}/assets?name=${DEB}" + # Находим все собранные пакеты + for package in $(find . -name "projman*" \( -name "*.deb" -o -name "*.tgz" \) -type f); do + echo "Загрузка пакета: $(basename "$package")" + + curl -v --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + --upload-file "$package" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/${{ steps.create_release.outputs.RELEASE_ID }}/assets?name=$(basename "$package")" + + echo "Пакет загружен: $(basename "$package")" + done - - name: Upload OpenBSD package + - name: Статус выполнения run: | - export PKG=$(ls -1| grep projman | grep -E 'tgz$') - echo ${PKG} - curl --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - --upload-file "${PKG}" \ - "${{vars.main_url}}/api/v1/repos/${{ gitea.repository }}/releases/${{ steps.release_info.outputs.id }}/assets?name=${PKG}" + echo "Статус задания: ${{ job.status }}" + echo "Текущая директория: $(pwd)" + echo "Содержимое:" + ls -la -- 2.49.1 From ff18a032f400fa7bfde606a5dbf6b8bd59f28992 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 20:38:00 +0300 Subject: [PATCH 04/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 101 +++++++++++++++---------------------- 1 file changed, 41 insertions(+), 60 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index cd71287..c24901b 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -1,87 +1,68 @@ -name: Gitea Actions -run-name: ${{ gitea.actor }} тестирует Gitea Actions +name: Сборка Projman on: [push] jobs: - Explore-Gitea-Actions: - runs-on: tcl-tk-builder # Ваш корректный runner + build: + runs-on: tcl-tk-builder steps: - - name: Клонирование репозитория + - name: Клонирование run: | - git clone "${{ vars.main_url }}${{ gitea.repository }}.git" . - pwd - ls -la + git clone "${{ vars.main_url }}${{ gitea.repository }}.git" src + cd src - - name: Сборка DEB-пакетов + - name: Сборка пакетов run: | - cd projman/debian + cd src + echo "=== Сборка DEB ===" + cd debian ./build-deb-projman.sh + + echo "=== Сборка OpenBSD ===" cd ../openbsd ./build-package-bsd.sh - cd ../../ - # Ищем DEB файл - DEB_FILE=$(find . -name "*.deb" -type f | head -1) - echo "DEB файл: $DEB_FILE" - - # Загружаем в репозиторий пакетов - curl --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - --upload-file "$DEB_FILE" \ - "${{ vars.main_url }}api/packages/${{ vars.user }}/debian/pool/bookworm/main/upload?version=$(basename "$DEB_FILE" | grep -o '[0-9].*[0-9]')" + echo "=== Собранные файлы ===" + cd ../.. + find src -name "*.deb" -o -name "*.tgz" | xargs ls -la - - name: Извлечение информации о версии - id: version_info + - name: Извлечение версии + id: get_version run: | - VERSION=$(grep "Version" projman.tcl | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1) - RELEASE=$(grep "# Release" projman.tcl | tail -1 | grep -oE '[0-9A-Za-z]+$') - echo "VERSION=$VERSION" >> $GITEA_OUTPUT - echo "RELEASE=$RELEASE" >> $GITEA_OUTPUT - echo "Извлечено: Version=$VERSION, Release=$RELEASE" + cd src + VERSION=$(grep "Version" projman.tcl | head -1 | grep -o '[0-9.]\+') + RELEASE=$(grep "# Release" projman.tcl | tail -1 | awk '{print $NF}') + echo "version=$VERSION" >> $GITEA_OUTPUT + echo "release=$RELEASE" >> $GITEA_OUTPUT - - name: Создание релиза (только для тегов) + - name: Создание релиза для тегов if: startsWith(gitea.ref, 'refs/tags/') - id: create_release run: | + cd src TAG_NAME="${GITEA_REF#refs/tags/}" - echo "Создание релиза для тега: $TAG_NAME" - # Создаем релиз через API Gitea - response=$(curl -s -X POST \ + echo "=== Создание релиза $TAG_NAME ===" + + # Создаем релиз + RESPONSE=$(curl -s -X POST \ -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ -H "Content-Type: application/json" \ -d '{ "tag_name": "'"$TAG_NAME"'", - "name": "Projman '"$VERSION"' (Release '"$RELEASE"')", - "body": "Автоматический релиз\\n\\nВерсия: '"$VERSION"'\\nРевизия: '"$RELEASE"'\\n\\nСобран: '"$(date)"'", - "draft": false, - "prerelease": false + "name": "Projman '"$TAG_NAME"'", + "body": "Версия: '"$VERSION"'\nРевизия: '"$RELEASE"'", + "draft": false }' \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases") - echo "Ответ API: $response" + echo "Ответ: $RESPONSE" - # Извлекаем ID созданного релиза - RELEASE_ID=$(echo "$response" | grep -o '"id":[0-9]*' | cut -d: -f2) - echo "ID релиза: $RELEASE_ID" - echo "RELEASE_ID=$RELEASE_ID" >> $GITEA_OUTPUT - - - name: Загрузка пакетов в релиз - if: steps.create_release.outputs.RELEASE_ID != '' - run: | - # Находим все собранные пакеты - for package in $(find . -name "projman*" \( -name "*.deb" -o -name "*.tgz" \) -type f); do - echo "Загрузка пакета: $(basename "$package")" - - curl -v --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - --upload-file "$package" \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/${{ steps.create_release.outputs.RELEASE_ID }}/assets?name=$(basename "$package")" - - echo "Пакет загружен: $(basename "$package")" + # Извлекаем ID релиза + REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) + + # Загружаем файлы в релиз + for FILE in $(find . -name "projman*" -type f \( -name "*.deb" -o -name "*.tgz" \)); do + echo "Загружаем: $FILE" + curl -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + --upload-file "$FILE" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$(basename $FILE)" done - - - name: Статус выполнения - run: | - echo "Статус задания: ${{ job.status }}" - echo "Текущая директория: $(pwd)" - echo "Содержимое:" - ls -la -- 2.49.1 From 9eb32586c7364fd5a606ef23ecef6d78dc049361 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 20:40:38 +0300 Subject: [PATCH 05/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index c24901b..6f2c93e 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -8,11 +8,11 @@ jobs: - name: Клонирование run: | git clone "${{ vars.main_url }}${{ gitea.repository }}.git" src - cd src + pwd - name: Сборка пакетов run: | - cd src + # cd src echo "=== Сборка DEB ===" cd debian ./build-deb-projman.sh @@ -37,7 +37,7 @@ jobs: - name: Создание релиза для тегов if: startsWith(gitea.ref, 'refs/tags/') run: | - cd src + # cd src TAG_NAME="${GITEA_REF#refs/tags/}" echo "=== Создание релиза $TAG_NAME ===" -- 2.49.1 From 9cc837bdd8d63123d14e0b8cae20590ffd230b5f Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 20:42:53 +0300 Subject: [PATCH 06/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 6f2c93e..2ad6b2c 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -12,7 +12,7 @@ jobs: - name: Сборка пакетов run: | - # cd src + cd src echo "=== Сборка DEB ===" cd debian ./build-deb-projman.sh @@ -37,7 +37,7 @@ jobs: - name: Создание релиза для тегов if: startsWith(gitea.ref, 'refs/tags/') run: | - # cd src + cd src TAG_NAME="${GITEA_REF#refs/tags/}" echo "=== Создание релиза $TAG_NAME ===" -- 2.49.1 From 08ba3678f807500e90917f32f465078b1eba36bc Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 20:46:48 +0300 Subject: [PATCH 07/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 139 ++++++++++++++++++++++++++++--------- 1 file changed, 108 insertions(+), 31 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 2ad6b2c..60df9c1 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -5,64 +5,141 @@ jobs: build: runs-on: tcl-tk-builder steps: - - name: Клонирование + - name: Клонирование репозитория run: | - git clone "${{ vars.main_url }}${{ gitea.repository }}.git" src - pwd + git clone "${{ vars.main_url }}${{ gitea.repository }}.git" . + echo "Ревизия: $(git rev-parse --short HEAD)" - name: Сборка пакетов run: | - cd src - echo "=== Сборка DEB ===" + echo "=== Сборка DEB пакета ===" cd debian ./build-deb-projman.sh - echo "=== Сборка OpenBSD ===" + echo "=== Сборка OpenBSD пакета ===" cd ../openbsd ./build-package-bsd.sh - echo "=== Собранные файлы ===" - cd ../.. - find src -name "*.deb" -o -name "*.tgz" | xargs ls -la + echo "=== Список созданных файлов ===" + cd .. + find . -name "*.deb" -o -name "*.tgz" -o -name "*.changes" | xargs ls -la - name: Извлечение версии - id: get_version + id: version_info run: | - cd src - VERSION=$(grep "Version" projman.tcl | head -1 | grep -o '[0-9.]\+') + VERSION=$(grep "Version" projman.tcl | head -1 | grep -o '[0-9.]\+[a-zA-Z0-9]*') RELEASE=$(grep "# Release" projman.tcl | tail -1 | awk '{print $NF}') - echo "version=$VERSION" >> $GITEA_OUTPUT - echo "release=$RELEASE" >> $GITEA_OUTPUT - - - name: Создание релиза для тегов - if: startsWith(gitea.ref, 'refs/tags/') - run: | - cd src TAG_NAME="${GITEA_REF#refs/tags/}" + echo "VERSION=${VERSION}" >> $GITEA_ENV + echo "RELEASE=${RELEASE}" >> $GITEA_ENV + echo "TAG_NAME=${TAG_NAME}" >> $GITEA_ENV + + echo "Версия: $VERSION" + echo "Ревизия: $RELEASE" + echo "Тег: $TAG_NAME" + + - name: Создание релиза + run: | echo "=== Создание релиза $TAG_NAME ===" + # Ищем основной DEB пакет (бинарный) + DEB_FILE=$(find . -name "*_amd64.deb" -type f | head -1) + TGZ_FILE=$(find . -name "*.tgz" -type f | head -1) + + echo "DEB файл: $DEB_FILE" + echo "TGZ файл: $TGZ_FILE" + + # Создаем тело релиза + RELEASE_BODY="Версия: $VERSION + Ревизия: $RELEASE + Дата сборки: $(date) + + Доступные пакеты: + - $(basename "$DEB_FILE") (Debian/Ubuntu) + - $(basename "$TGZ_FILE") (OpenBSD) + + Собран из ревизии: $(git rev-parse --short HEAD)" + # Создаем релиз RESPONSE=$(curl -s -X POST \ -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ -H "Content-Type: application/json" \ -d '{ "tag_name": "'"$TAG_NAME"'", - "name": "Projman '"$TAG_NAME"'", - "body": "Версия: '"$VERSION"'\nРевизия: '"$RELEASE"'", - "draft": false + "name": "Projman '"$VERSION"'", + "body": "'"$(echo "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g')"'", + "draft": false, + "prerelease": false }' \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases") - echo "Ответ: $RESPONSE" + echo "Ответ API: $RESPONSE" # Извлекаем ID релиза - REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) + if echo "$RESPONSE" | grep -q '"id"'; then + REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) + echo "ID релиза: $REL_ID" + echo "REL_ID=$REL_ID" >> $GITEA_ENV + else + echo "Ошибка создания релиза!" + exit 1 + fi + + - name: Загрузка DEB пакета + if: env.REL_ID != '' + run: | + DEB_FILE=$(find . -name "*_amd64.deb" -type f | head -1) + if [ -f "$DEB_FILE" ]; then + echo "Загружаем DEB: $(basename "$DEB_FILE")" + curl -v --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + --upload-file "$DEB_FILE" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$(basename "$DEB_FILE")" + else + echo "DEB файл не найден!" + find . -name "*.deb" -type f + fi + + - name: Загрузка OpenBSD пакета + if: env.REL_ID != '' + run: | + TGZ_FILE=$(find . -name "*.tgz" -type f | head -1) + if [ -f "$TGZ_FILE" ]; then + echo "Загружаем TGZ: $(basename "$TGZ_FILE")" + curl -v --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + --upload-file "$TGZ_FILE" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$(basename "$TGZ_FILE")" + else + echo "TGZ файл не найден!" + find . -name "*.tgz" -type f + fi + + - name: Загрузка дополнительных файлов + if: env.REL_ID != '' + run: | + # Загружаем .changes файл + CHANGES_FILE=$(find . -name "*.changes" -type f | head -1) + if [ -f "$CHANGES_FILE" ]; then + echo "Загружаем changes: $(basename "$CHANGES_FILE")" + curl --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + --upload-file "$CHANGES_FILE" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$(basename "$CHANGES_FILE")" + fi - # Загружаем файлы в релиз - for FILE in $(find . -name "projman*" -type f \( -name "*.deb" -o -name "*.tgz" \)); do - echo "Загружаем: $FILE" - curl -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - --upload-file "$FILE" \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$(basename $FILE)" - done + # Загружаем .buildinfo файл + BUILDINFO_FILE=$(find . -name "*.buildinfo" -type f | head -1) + if [ -f "$BUILDINFO_FILE" ]; then + echo "Загружаем buildinfo: $(basename "$BUILDINFO_FILE")" + curl --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + --upload-file "$BUILDINFO_FILE" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$(basename "$BUILDINFO_FILE")" + fi + + - name: Итоговый отчет + run: | + echo "=== Сборка завершена ===" + echo "Тег: $TAG_NAME" + echo "Версия: $VERSION" + echo "Созданные файлы:" + find . -name "projman*" -type f | xargs ls -la + -- 2.49.1 From f743c47d6b78f868403d8ac5677dcec769386341 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 20:48:40 +0300 Subject: [PATCH 08/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 60df9c1..4f6959f 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -22,7 +22,7 @@ jobs: echo "=== Список созданных файлов ===" cd .. - find . -name "*.deb" -o -name "*.tgz" -o -name "*.changes" | xargs ls -la + find ../ -name "*.deb" -o -name "*.tgz" -o -name "*.changes" | xargs ls -la - name: Извлечение версии id: version_info -- 2.49.1 From a2c525ecd1e10549f6c69d574ef6b6b81c7e5403 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 20:50:36 +0300 Subject: [PATCH 09/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 134 +++++++++++++++---------------------- 1 file changed, 53 insertions(+), 81 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 4f6959f..a4fef14 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -1,5 +1,8 @@ name: Сборка Projman -on: [push] +on: + push: + tags: + - '*' jobs: build: @@ -7,8 +10,14 @@ jobs: steps: - name: Клонирование репозитория run: | + echo "GITEA_REF = $GITEA_REF" + echo "Полный URL: ${{ vars.main_url }}${{ gitea.repository }}.git" git clone "${{ vars.main_url }}${{ gitea.repository }}.git" . - echo "Ревизия: $(git rev-parse --short HEAD)" + + # Получаем имя тега из git + TAG_NAME=$(git describe --tags --exact-match 2>/dev/null || echo "") + echo "Тег из git: $TAG_NAME" + echo "TAG_NAME=$TAG_NAME" >> $GITEA_ENV - name: Сборка пакетов run: | @@ -22,44 +31,50 @@ jobs: echo "=== Список созданных файлов ===" cd .. - find ../ -name "*.deb" -o -name "*.tgz" -o -name "*.changes" | xargs ls -la + find . -name "*_amd64.deb" -o -name "*.tgz" -o -name "*.changes" | xargs ls -la 2>/dev/null || true + + - name: Поиск файлов + id: find_files + run: | + DEB_FILE=$(find . -name "*_amd64.deb" -type f | head -1) + TGZ_FILE=$(find . -name "*.tgz" -type f | head -1) + + echo "Найден DEB: $DEB_FILE" + echo "Найден TGZ: $TGZ_FILE" + + echo "DEB_FILE=$DEB_FILE" >> $GITEA_ENV + echo "TGZ_FILE=$TGZ_FILE" >> $GITEA_ENV - name: Извлечение версии id: version_info run: | - VERSION=$(grep "Version" projman.tcl | head -1 | grep -o '[0-9.]\+[a-zA-Z0-9]*') - RELEASE=$(grep "# Release" projman.tcl | tail -1 | awk '{print $NF}') - TAG_NAME="${GITEA_REF#refs/tags/}" + VERSION=$(grep "Version" projman.tcl | head -1 | grep -o '[0-9.]\+[a-zA-Z0-9]*' || echo "unknown") + RELEASE=$(grep "# Release" projman.tcl | tail -1 | awk '{print $NF}' || echo "unknown") echo "VERSION=${VERSION}" >> $GITEA_ENV echo "RELEASE=${RELEASE}" >> $GITEA_ENV - echo "TAG_NAME=${TAG_NAME}" >> $GITEA_ENV echo "Версия: $VERSION" echo "Ревизия: $RELEASE" - echo "Тег: $TAG_NAME" - name: Создание релиза run: | - echo "=== Создание релиза $TAG_NAME ===" + echo "=== Создание релиза ===" + echo "TAG_NAME из env: $TAG_NAME" - # Ищем основной DEB пакет (бинарный) - DEB_FILE=$(find . -name "*_amd64.deb" -type f | head -1) - TGZ_FILE=$(find . -name "*.tgz" -type f | head -1) + if [ -z "$TAG_NAME" ]; then + echo "ОШИБКА: TAG_NAME пустой!" + echo "Пытаемся получить тег из git..." + TAG_NAME=$(git describe --tags --exact-match 2>/dev/null) + echo "Тег из git: $TAG_NAME" + + if [ -z "$TAG_NAME" ]; then + echo "Не удалось получить имя тега. Используем версию из projman.tcl" + TAG_NAME="v$VERSION" + fi + fi - echo "DEB файл: $DEB_FILE" - echo "TGZ файл: $TGZ_FILE" - - # Создаем тело релиза - RELEASE_BODY="Версия: $VERSION - Ревизия: $RELEASE - Дата сборки: $(date) - - Доступные пакеты: - - $(basename "$DEB_FILE") (Debian/Ubuntu) - - $(basename "$TGZ_FILE") (OpenBSD) - - Собран из ревизии: $(git rev-parse --short HEAD)" + echo "Будет использован тег: $TAG_NAME" # Создаем релиз RESPONSE=$(curl -s -X POST \ @@ -67,8 +82,8 @@ jobs: -H "Content-Type: application/json" \ -d '{ "tag_name": "'"$TAG_NAME"'", - "name": "Projman '"$VERSION"'", - "body": "'"$(echo "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g')"'", + "name": "Projman '"$TAG_NAME"'", + "body": "Автоматический релиз\n\nВерсия: '"$VERSION"'\nРевизия: '"$RELEASE"'", "draft": false, "prerelease": false }' \ @@ -82,64 +97,21 @@ jobs: echo "ID релиза: $REL_ID" echo "REL_ID=$REL_ID" >> $GITEA_ENV else - echo "Ошибка создания релиза!" + echo "Ошибка создания релиза:" + echo "$RESPONSE" exit 1 fi - - name: Загрузка DEB пакета + - name: Загрузка файлов в релиз if: env.REL_ID != '' run: | - DEB_FILE=$(find . -name "*_amd64.deb" -type f | head -1) - if [ -f "$DEB_FILE" ]; then - echo "Загружаем DEB: $(basename "$DEB_FILE")" - curl -v --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - --upload-file "$DEB_FILE" \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$(basename "$DEB_FILE")" - else - echo "DEB файл не найден!" - find . -name "*.deb" -type f - fi - - - name: Загрузка OpenBSD пакета - if: env.REL_ID != '' - run: | - TGZ_FILE=$(find . -name "*.tgz" -type f | head -1) - if [ -f "$TGZ_FILE" ]; then - echo "Загружаем TGZ: $(basename "$TGZ_FILE")" - curl -v --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - --upload-file "$TGZ_FILE" \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$(basename "$TGZ_FILE")" - else - echo "TGZ файл не найден!" - find . -name "*.tgz" -type f - fi - - - name: Загрузка дополнительных файлов - if: env.REL_ID != '' - run: | - # Загружаем .changes файл - CHANGES_FILE=$(find . -name "*.changes" -type f | head -1) - if [ -f "$CHANGES_FILE" ]; then - echo "Загружаем changes: $(basename "$CHANGES_FILE")" - curl --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - --upload-file "$CHANGES_FILE" \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$(basename "$CHANGES_FILE")" - fi + echo "=== Загрузка файлов ===" - # Загружаем .buildinfo файл - BUILDINFO_FILE=$(find . -name "*.buildinfo" -type f | head -1) - if [ -f "$BUILDINFO_FILE" ]; then - echo "Загружаем buildinfo: $(basename "$BUILDINFO_FILE")" + # Загружаем все файлы projman + for FILE in $(find . -maxdepth 1 -name "projman*" -type f); do + echo "Загружаем: $(basename "$FILE")" curl --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - --upload-file "$BUILDINFO_FILE" \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$(basename "$BUILDINFO_FILE")" - fi - - - name: Итоговый отчет - run: | - echo "=== Сборка завершена ===" - echo "Тег: $TAG_NAME" - echo "Версия: $VERSION" - echo "Созданные файлы:" - find . -name "projman*" -type f | xargs ls -la - + --upload-file "$FILE" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$(basename "$FILE")" + echo "OK" + done -- 2.49.1 From d4d38e26ce3d6adc97b37c43e31e02a7a098d7ba Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 20:51:35 +0300 Subject: [PATCH 10/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 133 ++++++++++--------------------------- 1 file changed, 36 insertions(+), 97 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index a4fef14..1831d20 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -1,4 +1,4 @@ -name: Сборка Projman +name: Simple Release on: push: tags: @@ -8,110 +8,49 @@ jobs: build: runs-on: tcl-tk-builder steps: - - name: Клонирование репозитория + - name: Get tag name + run: | + # Просто выводим все переменные для отладки + echo "=== Все переменные окружения ===" + env | grep -i gitea + echo "=== Конец ===" + + # Пробуем разные способы получить тег + echo "Способ 1: $GITEA_REF" + echo "Способ 2: ${{ gitea.ref }}" + echo "Способ 3: ${{ gitea.ref_name }}" + + # Сохраняем тег + echo "TAG=${{ gitea.ref_name }}" >> $GITEA_ENV + + - name: Checkout run: | - echo "GITEA_REF = $GITEA_REF" - echo "Полный URL: ${{ vars.main_url }}${{ gitea.repository }}.git" git clone "${{ vars.main_url }}${{ gitea.repository }}.git" . - - # Получаем имя тега из git - TAG_NAME=$(git describe --tags --exact-match 2>/dev/null || echo "") - echo "Тег из git: $TAG_NAME" - echo "TAG_NAME=$TAG_NAME" >> $GITEA_ENV + echo "Current tag: $(git tag --points-at HEAD)" - - name: Сборка пакетов + - name: Build run: | - echo "=== Сборка DEB пакета ===" - cd debian - ./build-deb-projman.sh - - echo "=== Сборка OpenBSD пакета ===" - cd ../openbsd - ./build-package-bsd.sh - - echo "=== Список созданных файлов ===" - cd .. - find . -name "*_amd64.deb" -o -name "*.tgz" -o -name "*.changes" | xargs ls -la 2>/dev/null || true + cd debian && ./build-deb-projman.sh + cd ../openbsd && ./build-package-bsd.sh - - name: Поиск файлов - id: find_files + - name: Create and Upload run: | - DEB_FILE=$(find . -name "*_amd64.deb" -type f | head -1) - TGZ_FILE=$(find . -name "*.tgz" -type f | head -1) + TAG="${{ gitea.ref_name }}" + echo "Using tag: $TAG" - echo "Найден DEB: $DEB_FILE" - echo "Найден TGZ: $TGZ_FILE" - - echo "DEB_FILE=$DEB_FILE" >> $GITEA_ENV - echo "TGZ_FILE=$TGZ_FILE" >> $GITEA_ENV - - - name: Извлечение версии - id: version_info - run: | - VERSION=$(grep "Version" projman.tcl | head -1 | grep -o '[0-9.]\+[a-zA-Z0-9]*' || echo "unknown") - RELEASE=$(grep "# Release" projman.tcl | tail -1 | awk '{print $NF}' || echo "unknown") - - echo "VERSION=${VERSION}" >> $GITEA_ENV - echo "RELEASE=${RELEASE}" >> $GITEA_ENV - - echo "Версия: $VERSION" - echo "Ревизия: $RELEASE" - - - name: Создание релиза - run: | - echo "=== Создание релиза ===" - echo "TAG_NAME из env: $TAG_NAME" - - if [ -z "$TAG_NAME" ]; then - echo "ОШИБКА: TAG_NAME пустой!" - echo "Пытаемся получить тег из git..." - TAG_NAME=$(git describe --tags --exact-match 2>/dev/null) - echo "Тег из git: $TAG_NAME" - - if [ -z "$TAG_NAME" ]; then - echo "Не удалось получить имя тега. Используем версию из projman.tcl" - TAG_NAME="v$VERSION" - fi - fi - - echo "Будет использован тег: $TAG_NAME" - - # Создаем релиз - RESPONSE=$(curl -s -X POST \ + # 1. Создаем релиз + echo "Creating release..." + curl -X POST \ -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ -H "Content-Type: application/json" \ - -d '{ - "tag_name": "'"$TAG_NAME"'", - "name": "Projman '"$TAG_NAME"'", - "body": "Автоматический релиз\n\nВерсия: '"$VERSION"'\nРевизия: '"$RELEASE"'", - "draft": false, - "prerelease": false - }' \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases") + -d '{"tag_name":"'"$TAG"'","name":"Release '"$TAG"'","draft":false}' \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases" - echo "Ответ API: $RESPONSE" - - # Извлекаем ID релиза - if echo "$RESPONSE" | grep -q '"id"'; then - REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) - echo "ID релиза: $REL_ID" - echo "REL_ID=$REL_ID" >> $GITEA_ENV - else - echo "Ошибка создания релиза:" - echo "$RESPONSE" - exit 1 - fi - - - name: Загрузка файлов в релиз - if: env.REL_ID != '' - run: | - echo "=== Загрузка файлов ===" - - # Загружаем все файлы projman - for FILE in $(find . -maxdepth 1 -name "projman*" -type f); do - echo "Загружаем: $(basename "$FILE")" - curl --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - --upload-file "$FILE" \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$(basename "$FILE")" - echo "OK" + # 2. Загружаем все файлы + echo "Uploading files..." + for f in $(ls projman* 2>/dev/null); do + echo " $f" + curl -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + --upload-file "$f" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/tags/$TAG/assets?name=$f" done -- 2.49.1 From 46017d027a66cbe4c11cdaf07d2bcbf45abb0f41 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 20:52:47 +0300 Subject: [PATCH 11/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 1831d20..3761593 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -1,8 +1,5 @@ name: Simple Release -on: - push: - tags: - - '*' +on: [push] jobs: build: -- 2.49.1 From d4ed578178f27254d77e7a79479aaa16f4bc5d7e Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 20:55:46 +0300 Subject: [PATCH 12/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 3761593..ae06cba 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -45,7 +45,7 @@ jobs: # 2. Загружаем все файлы echo "Uploading files..." - for f in $(ls projman* 2>/dev/null); do + for f in $(ls ../projman* 2>/dev/null); do echo " $f" curl -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ --upload-file "$f" \ -- 2.49.1 From e20cb3464fe62df5bba1cf05f625c9b72b2be4ec Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 20:59:04 +0300 Subject: [PATCH 13/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index ae06cba..800dbe3 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -45,9 +45,10 @@ jobs: # 2. Загружаем все файлы echo "Uploading files..." - for f in $(ls ../projman* 2>/dev/null); do - echo " $f" - curl -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - --upload-file "$f" \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/tags/$TAG/assets?name=$f" - done + curl -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + --upload-file "../projman_2.0.0-beta1_amd64.deb" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/tags/$TAG/assets?name=../projman_2.0.0-beta1_amd64.deb" + curl -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + --upload-file "../projman-2.0.0beta1.tgz" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/tags/$TAG/assets?name=../projman-2.0.0beta1.tgz" + -- 2.49.1 From 261dc38748d752809cef0bf69ded70baba6d03a3 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 21:02:54 +0300 Subject: [PATCH 14/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 81 +++++++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 31 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 800dbe3..c99a4d2 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -1,50 +1,69 @@ -name: Simple Release -on: [push] +name: Build and Create Tag Release +on: + push: + branches: + - master + - main jobs: build: runs-on: tcl-tk-builder steps: - - name: Get tag name - run: | - # Просто выводим все переменные для отладки - echo "=== Все переменные окружения ===" - env | grep -i gitea - echo "=== Конец ===" - - # Пробуем разные способы получить тег - echo "Способ 1: $GITEA_REF" - echo "Способ 2: ${{ gitea.ref }}" - echo "Способ 3: ${{ gitea.ref_name }}" - - # Сохраняем тег - echo "TAG=${{ gitea.ref_name }}" >> $GITEA_ENV - - - name: Checkout + - name: Клонирование run: | git clone "${{ vars.main_url }}${{ gitea.repository }}.git" . - echo "Current tag: $(git tag --points-at HEAD)" + + - name: Получение версии + id: get_version + run: | + VERSION=$(grep "Version" projman.tcl | head -1 | grep -o '[0-9.]\+[a-zA-Z0-9]*' || echo "1.0.0") + RELEASE=$(grep "# Release" projman.tcl | tail -1 | awk '{print $NF}' || echo "$(date +%Y%m%d)") + + # Создаем имя тега из версии + TAG="v${VERSION}-${RELEASE}" + echo "TAG=$TAG" >> $GITEA_ENV + echo "VERSION=$VERSION" >> $GITEA_ENV + + echo "Будет создан тег: $TAG" - - name: Build + - name: Создание тега в git + run: | + git config user.email "actions@gitea" + git config user.name "Gitea Actions" + + # Создаем тег локально + git tag -a "$TAG" -m "Release $TAG" + + # Пушим тег на сервер + git push origin "$TAG" + + - name: Сборка пакетов run: | cd debian && ./build-deb-projman.sh cd ../openbsd && ./build-package-bsd.sh - - - name: Create and Upload - run: | - TAG="${{ gitea.ref_name }}" - echo "Using tag: $TAG" - # 1. Создаем релиз - echo "Creating release..." + echo "Собранные файлы:" + ls -la projman* + + - name: Создание релиза с тегом + run: | + echo "Создаем релиз для тега: $TAG" + curl -X POST \ -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ -H "Content-Type: application/json" \ - -d '{"tag_name":"'"$TAG"'","name":"Release '"$TAG"'","draft":false}' \ + -d '{ + "tag_name": "'"$TAG"'", + "name": "Projman '"$VERSION"'", + "body": "## Информация о сборке\n\n- Версия: '"$VERSION"'\n- Дата: '"$(date)"'\n- Коммит: '"$(git rev-parse --short HEAD)"'", + "draft": false, + "prerelease": false + }' \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases" - - # 2. Загружаем все файлы - echo "Uploading files..." + + - name: Загрузка файлов + run: | + # Загружаем все файлы projman* curl -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ --upload-file "../projman_2.0.0-beta1_amd64.deb" \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/tags/$TAG/assets?name=../projman_2.0.0-beta1_amd64.deb" -- 2.49.1 From 72101c90d5d2edfab218cced21fd1c079e445444 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 21:03:55 +0300 Subject: [PATCH 15/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index c99a4d2..48cf650 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -28,8 +28,8 @@ jobs: - name: Создание тега в git run: | - git config user.email "actions@gitea" - git config user.name "Gitea Actions" + git config user.email "svk@nuk-svk.ru" + git config user.name "svk" # Создаем тег локально git tag -a "$TAG" -m "Release $TAG" -- 2.49.1 From 47f1473167697e66a59a5ee6ae6a0874b9a2f12a Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 21:06:17 +0300 Subject: [PATCH 16/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 48cf650..104bff4 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -33,10 +33,11 @@ jobs: # Создаем тег локально git tag -a "$TAG" -m "Release $TAG" + + git remote set-url origin "https://${{ secrets.USER }}:${{ secrets.API_TOKEN }}@git.nuk-svk.ru/${{ gitea.repository }}.git" # Пушим тег на сервер git push origin "$TAG" - - name: Сборка пакетов run: | cd debian && ./build-deb-projman.sh -- 2.49.1 From b8ada446e123ada617596da3d9169712fdf29cf9 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 21:07:33 +0300 Subject: [PATCH 17/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 104bff4..7beb471 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -44,7 +44,6 @@ jobs: cd ../openbsd && ./build-package-bsd.sh echo "Собранные файлы:" - ls -la projman* - name: Создание релиза с тегом run: | -- 2.49.1 From d60bef5de3cf95809d3b7d86fe4cf625a87eebb9 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 21:10:56 +0300 Subject: [PATCH 18/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 173 ++++++++++++++++++++++++++++++------- 1 file changed, 143 insertions(+), 30 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 7beb471..80c5c77 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -1,9 +1,10 @@ -name: Build and Create Tag Release +name: Build and Release on: push: branches: - master - main + workflow_dispatch: # Ручной запуск jobs: build: @@ -19,55 +20,167 @@ jobs: VERSION=$(grep "Version" projman.tcl | head -1 | grep -o '[0-9.]\+[a-zA-Z0-9]*' || echo "1.0.0") RELEASE=$(grep "# Release" projman.tcl | tail -1 | awk '{print $NF}' || echo "$(date +%Y%m%d)") - # Создаем имя тега из версии - TAG="v${VERSION}-${RELEASE}" + # Создаем имя тега + TAG="v${VERSION}" echo "TAG=$TAG" >> $GITEA_ENV echo "VERSION=$VERSION" >> $GITEA_ENV + echo "RELEASE=$RELEASE" >> $GITEA_ENV - echo "Будет создан тег: $TAG" + echo "Тег: $TAG" + echo "Версия: $VERSION" + echo "Ревизия: $RELEASE" - - name: Создание тега в git + - name: Проверка существования тега + id: check_tag run: | + # Проверяем, существует ли тег локально + if git show-ref --tags --quiet --verify -- "refs/tags/$TAG"; then + echo "Тег $TAG уже существует локально" + echo "TAG_EXISTS=true" >> $GITEA_ENV + else + echo "Тег $TAG не существует локально" + echo "TAG_EXISTS=false" >> $GITEA_ENV + fi + + # Проверяем на удаленном сервере + git ls-remote --tags origin "$TAG" && echo "TAG_EXISTS_REMOTE=true" >> $GITEA_ENV || echo "TAG_EXISTS_REMOTE=false" >> $GITEA_ENV + + - name: Создание тега (только если не существует) + if: env.TAG_EXISTS_REMOTE == 'false' + run: | + echo "Создаем новый тег: $TAG" git config user.email "svk@nuk-svk.ru" - git config user.name "svk" + git config user.name svk" # Создаем тег локально - git tag -a "$TAG" -m "Release $TAG" + git tag -a "$TAG" -m "Release $TAG - $RELEASE" git remote set-url origin "https://${{ secrets.USER }}:${{ secrets.API_TOKEN }}@git.nuk-svk.ru/${{ gitea.repository }}.git" - + # Пушим тег на сервер git push origin "$TAG" + env: + GIT_ASKPASS: "echo ${{ secrets.API_TOKEN }}" + - name: Сборка пакетов run: | + echo "=== Сборка DEB пакета ===" cd debian && ./build-deb-projman.sh + + echo "=== Сборка OpenBSD пакета ===" cd ../openbsd && ./build-package-bsd.sh - echo "Собранные файлы:" + echo "=== Собранные файлы ===" + find . -name "projman*" -type f | xargs ls -la - - name: Создание релиза с тегом + - name: Проверка существования релиза + id: check_release run: | - echo "Создаем релиз для тега: $TAG" + # Проверяем, существует ли уже релиз для этого тега + RESPONSE=$(curl -s -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/tags/$TAG" || echo "{}") - curl -X POST \ - -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - -H "Content-Type: application/json" \ - -d '{ - "tag_name": "'"$TAG"'", - "name": "Projman '"$VERSION"'", - "body": "## Информация о сборке\n\n- Версия: '"$VERSION"'\n- Дата: '"$(date)"'\n- Коммит: '"$(git rev-parse --short HEAD)"'", - "draft": false, - "prerelease": false - }' \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases" + if echo "$RESPONSE" | grep -q '"id"'; then + REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) + echo "Реліз уже существует. ID: $REL_ID" + echo "RELEASE_EXISTS=true" >> $GITEA_ENV + echo "REL_ID=$REL_ID" >> $GITEA_ENV + else + echo "Реліз не существует" + echo "RELEASE_EXISTS=false" >> $GITEA_ENV + fi - - name: Загрузка файлов + - name: Создание или обновление релиза run: | - # Загружаем все файлы projman* - curl -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - --upload-file "../projman_2.0.0-beta1_amd64.deb" \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/tags/$TAG/assets?name=../projman_2.0.0-beta1_amd64.deb" - curl -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - --upload-file "../projman-2.0.0beta1.tgz" \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/tags/$TAG/assets?name=../projman-2.0.0beta1.tgz" + echo "=== Работа с релизом для тега $TAG ===" + + RELEASE_BODY="## Projman $VERSION + + **Ревизия:** $RELEASE + **Дата сборки:** $(date) + **Коммит:** $(git rev-parse --short HEAD) + + ### Собранные пакеты: + - DEB пакет для Debian/Ubuntu + - TGZ пакет для OpenBSD" + + if [ "$RELEASE_EXISTS" = "true" ]; then + echo "Обновляем существующий релиз ID: $REL_ID" + + # Обновляем существующий релиз + curl -X PATCH \ + -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + -H "Content-Type: application/json" \ + -d '{ + "name": "Projman '"$VERSION"'", + "body": "'"$(echo "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g')"'", + "draft": false, + "prerelease": false + }' \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID" + + else + echo "Создаем новый релиз" + + # Создаем новый релиз + RESPONSE=$(curl -s -X POST \ + -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + -H "Content-Type: application/json" \ + -d '{ + "tag_name": "'"$TAG"'", + "name": "Projman '"$VERSION"'", + "body": "'"$(echo "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g')"'", + "draft": false, + "prerelease": false + }' \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases") + + # Получаем ID нового релиза + REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) + echo "REL_ID=$REL_ID" >> $GITEA_ENV + fi + + echo "ID релиза: $REL_ID" + - name: Загрузка файлов в релиз + if: env.REL_ID != '' + run: | + echo "=== Загрузка файлов в релиз ===" + + # Сначала удаляем старые файлы с таким же именем (если есть) + echo "Проверяем существующие файлы в релизе..." + EXISTING_ASSETS=$(curl -s -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets") + + # Загружаем все новые файлы + for FILE in $(find . -maxdepth 1 -name "projman*" -type f); do + FILENAME=$(basename "$FILE") + echo "Обрабатываем файл: $FILENAME" + + # Проверяем, существует ли файл с таким именем + ASSET_ID=$(echo "$EXISTING_ASSETS" | grep -o "\"name\":\"$FILENAME\".*\"id\":[0-9]*" | grep -o '"id":[0-9]*' | cut -d: -f2) + + if [ -n "$ASSET_ID" ]; then + echo " Файл уже существует (ID: $ASSET_ID), удаляем..." + curl -X DELETE \ + -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/assets/$ASSET_ID" + fi + + echo " Загружаем новый файл..." + curl --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + --upload-file "$FILE" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$FILENAME" + + echo " Готово!" + done + + - name: Финализация + run: | + echo "=== Сборка завершена ===" + echo "Тег: $TAG" + echo "ID релиза: $REL_ID" + echo "Файлы в релизе:" + curl -s -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets" | \ + grep -o '"name":"[^"]*"' | cut -d'"' -f4 -- 2.49.1 From faaecbb2718bf1dea5f1e3d861d57ba2ea3fba28 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 21:18:59 +0300 Subject: [PATCH 19/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 109 ++++++++++++++++++++++--------------- 1 file changed, 64 insertions(+), 45 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 80c5c77..f4662a3 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -33,34 +33,32 @@ jobs: - name: Проверка существования тега id: check_tag run: | - # Проверяем, существует ли тег локально - if git show-ref --tags --quiet --verify -- "refs/tags/$TAG"; then - echo "Тег $TAG уже существует локально" - echo "TAG_EXISTS=true" >> $GITEA_ENV - else - echo "Тег $TAG не существует локально" - echo "TAG_EXISTS=false" >> $GITEA_ENV - fi + echo "Проверяем тег: $TAG" # Проверяем на удаленном сервере - git ls-remote --tags origin "$TAG" && echo "TAG_EXISTS_REMOTE=true" >> $GITEA_ENV || echo "TAG_EXISTS_REMOTE=false" >> $GITEA_ENV + if git ls-remote --tags origin "$TAG" 2>/dev/null | grep -q "$TAG"; then + echo "Тег $TAG уже существует на удаленном сервере" + echo "TAG_EXISTS_REMOTE=true" >> $GITEA_ENV + else + echo "Тег $TAG не существует на удаленном сервере" + echo "TAG_EXISTS_REMOTE=false" >> $GITEA_ENV + fi - name: Создание тега (только если не существует) if: env.TAG_EXISTS_REMOTE == 'false' run: | echo "Создаем новый тег: $TAG" git config user.email "svk@nuk-svk.ru" - git config user.name svk" + git config user.name "svk" # Создаем тег локально git tag -a "$TAG" -m "Release $TAG - $RELEASE" + # Настраиваем URL для push git remote set-url origin "https://${{ secrets.USER }}:${{ secrets.API_TOKEN }}@git.nuk-svk.ru/${{ gitea.repository }}.git" # Пушим тег на сервер git push origin "$TAG" - env: - GIT_ASKPASS: "echo ${{ secrets.API_TOKEN }}" - name: Сборка пакетов run: | @@ -71,7 +69,7 @@ jobs: cd ../openbsd && ./build-package-bsd.sh echo "=== Собранные файлы ===" - find . -name "projman*" -type f | xargs ls -la + find . -maxdepth 1 -name "projman*" -type f | xargs ls -la 2>/dev/null || echo "Файлы не найдены" - name: Проверка существования релиза id: check_release @@ -80,6 +78,8 @@ jobs: RESPONSE=$(curl -s -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/tags/$TAG" || echo "{}") + echo "Ответ API проверки релиза: $RESPONSE" + if echo "$RESPONSE" | grep -q '"id"'; then REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) echo "Реліз уже существует. ID: $REL_ID" @@ -88,9 +88,11 @@ jobs: else echo "Реліз не существует" echo "RELEASE_EXISTS=false" >> $GITEA_ENV + echo "REL_ID=" >> $GITEA_ENV fi - name: Создание или обновление релиза + id: create_release run: | echo "=== Работа с релизом для тега $TAG ===" @@ -104,21 +106,26 @@ jobs: - DEB пакет для Debian/Ubuntu - TGZ пакет для OpenBSD" + # Экранируем переносы строк для JSON + ESCAPED_BODY=$(echo "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g') + if [ "$RELEASE_EXISTS" = "true" ]; then echo "Обновляем существующий релиз ID: $REL_ID" # Обновляем существующий релиз - curl -X PATCH \ + RESPONSE=$(curl -s -X PATCH \ -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ -H "Content-Type: application/json" \ -d '{ "name": "Projman '"$VERSION"'", - "body": "'"$(echo "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g')"'", + "body": "'"$ESCAPED_BODY"'", "draft": false, "prerelease": false }' \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID" + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID") + echo "Ответ обновления релиза: $RESPONSE" + else echo "Создаем новый релиз" @@ -129,58 +136,70 @@ jobs: -d '{ "tag_name": "'"$TAG"'", "name": "Projman '"$VERSION"'", - "body": "'"$(echo "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g')"'", + "body": "'"$ESCAPED_BODY"'", "draft": false, "prerelease": false }' \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases") + echo "Ответ создания релиза: $RESPONSE" + # Получаем ID нового релиза - REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) - echo "REL_ID=$REL_ID" >> $GITEA_ENV + if echo "$RESPONSE" | grep -q '"id"'; then + NEW_REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) + echo "Новый ID релиза: $NEW_REL_ID" + echo "REL_ID=$NEW_REL_ID" >> $GITEA_ENV + echo "id=$NEW_REL_ID" >> $GITHUB_OUTPUT # Для совместимости + else + echo "ОШИБКА: Не удалось получить ID релиза из ответа" + echo "REL_ID=" >> $GITEA_ENV + fi fi - - echo "ID релиза: $REL_ID" - name: Загрузка файлов в релиз if: env.REL_ID != '' run: | echo "=== Загрузка файлов в релиз ===" + echo "ID релиза для загрузки: $REL_ID" - # Сначала удаляем старые файлы с таким же именем (если есть) - echo "Проверяем существующие файлы в релизе..." - EXISTING_ASSETS=$(curl -s -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets") + # Находим все файлы projman + FILES=$(find ../ -maxdepth 1 \( -name "*projman*deb" -o -name "*projman*tgz" \) -type f) + if [ -z "$FILES" ]; then + echo "Нет файлов projman для загрузки" + exit 0 + fi - # Загружаем все новые файлы - for FILE in $(find . -maxdepth 1 -name "projman*" -type f); do + echo "Найдены файлы:" + echo "$FILES" + + # Загружаем каждый файл + for FILE in $FILES; do FILENAME=$(basename "$FILE") - echo "Обрабатываем файл: $FILENAME" + echo "Загружаем: $FILENAME" - # Проверяем, существует ли файл с таким именем - ASSET_ID=$(echo "$EXISTING_ASSETS" | grep -o "\"name\":\"$FILENAME\".*\"id\":[0-9]*" | grep -o '"id":[0-9]*' | cut -d: -f2) - - if [ -n "$ASSET_ID" ]; then - echo " Файл уже существует (ID: $ASSET_ID), удаляем..." - curl -X DELETE \ - -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/assets/$ASSET_ID" - fi - - echo " Загружаем новый файл..." - curl --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + curl -v --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ --upload-file "$FILE" \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$FILENAME" - echo " Готово!" + echo "Файл загружен: $FILENAME" done - name: Финализация run: | echo "=== Сборка завершена ===" echo "Тег: $TAG" + echo "Версия: $VERSION" + echo "Ревизия: $RELEASE" echo "ID релиза: $REL_ID" - echo "Файлы в релизе:" - curl -s -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets" | \ - grep -o '"name":"[^"]*"' | cut -d'"' -f4 + + if [ -n "$REL_ID" ]; then + echo "Проверяем файлы в релизе..." + curl -s -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets" | \ + grep -o '"name":"[^"]*"' | cut -d'"' -f4 || echo "Не удалось получить список файлов" + else + echo "Релиз не был создан или ID не получен" + fi + + echo "Собранные файлы:" + find . -maxdepth 1 -name "projman*" -type f | xargs ls -la 2>/dev/null || echo "Файлы не найдены" -- 2.49.1 From c26301d61118dc5dc8ab97c2160f85a526c26065 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 21:25:03 +0300 Subject: [PATCH 20/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index f4662a3..2e3d688 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -97,11 +97,11 @@ jobs: echo "=== Работа с релизом для тега $TAG ===" RELEASE_BODY="## Projman $VERSION - + **Ревизия:** $RELEASE **Дата сборки:** $(date) **Коммит:** $(git rev-parse --short HEAD) - + ### Собранные пакеты: - DEB пакет для Debian/Ubuntu - TGZ пакет для OpenBSD" @@ -109,8 +109,9 @@ jobs: # Экранируем переносы строк для JSON ESCAPED_BODY=$(echo "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g') - if [ "$RELEASE_EXISTS" = "true" ]; then - echo "Обновляем существующий релиз ID: $REL_ID" + # Проверяем переменную RELEASE_EXISTS правильно + if [ "${{ env.RELEASE_EXISTS }}" = "true" ]; then + echo "Обновляем существующий релиз ID: ${{ env.REL_ID }}" # Обновляем существующий релиз RESPONSE=$(curl -s -X PATCH \ @@ -122,10 +123,13 @@ jobs: "draft": false, "prerelease": false }' \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID") + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/${{ env.REL_ID }}") echo "Ответ обновления релиза: $RESPONSE" + # Сохраняем ID релиза для следующего шага + echo "REL_ID=${{ env.REL_ID }}" >> $GITEA_ENV + else echo "Создаем новый релиз" @@ -149,13 +153,12 @@ jobs: NEW_REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) echo "Новый ID релиза: $NEW_REL_ID" echo "REL_ID=$NEW_REL_ID" >> $GITEA_ENV - echo "id=$NEW_REL_ID" >> $GITHUB_OUTPUT # Для совместимости else echo "ОШИБКА: Не удалось получить ID релиза из ответа" echo "REL_ID=" >> $GITEA_ENV + exit 1 fi fi - - name: Загрузка файлов в релиз if: env.REL_ID != '' run: | @@ -202,4 +205,4 @@ jobs: fi echo "Собранные файлы:" - find . -maxdepth 1 -name "projman*" -type f | xargs ls -la 2>/dev/null || echo "Файлы не найдены" + find ../ -maxdepth 1 \( -name "*projman*deb" -o -name "*projman*tgz" \) -type f | xargs ls -la 2>/dev/null || echo "Файлы не найдены" -- 2.49.1 From ff1e9dcf8ea6c76e9168b82d4f01df947b63640e Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 21:28:21 +0300 Subject: [PATCH 21/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 2e3d688..e92573b 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -83,12 +83,12 @@ jobs: if echo "$RESPONSE" | grep -q '"id"'; then REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) echo "Реліз уже существует. ID: $REL_ID" - echo "RELEASE_EXISTS=true" >> $GITEA_ENV - echo "REL_ID=$REL_ID" >> $GITEA_ENV + echo "RELEASE_EXISTS=true" >> $GITHUB_ENV + echo "REL_ID=$REL_ID" >> $GITHUB_ENV else echo "Реліз не существует" - echo "RELEASE_EXISTS=false" >> $GITEA_ENV - echo "REL_ID=" >> $GITEA_ENV + echo "RELEASE_EXISTS=false" >> $GITHUB_ENV + echo "REL_ID=" >> $GITHUB_ENV fi - name: Создание или обновление релиза @@ -109,9 +109,9 @@ jobs: # Экранируем переносы строк для JSON ESCAPED_BODY=$(echo "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g') - # Проверяем переменную RELEASE_EXISTS правильно - if [ "${{ env.RELEASE_EXISTS }}" = "true" ]; then - echo "Обновляем существующий релиз ID: ${{ env.REL_ID }}" + # Используем переменные окружения ПРАВИЛЬНО + if [ "$RELEASE_EXISTS" = "true" ]; then + echo "Обновляем существующий релиз ID: $REL_ID" # Обновляем существующий релиз RESPONSE=$(curl -s -X PATCH \ @@ -123,13 +123,10 @@ jobs: "draft": false, "prerelease": false }' \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/${{ env.REL_ID }}") + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID") echo "Ответ обновления релиза: $RESPONSE" - # Сохраняем ID релиза для следующего шага - echo "REL_ID=${{ env.REL_ID }}" >> $GITEA_ENV - else echo "Создаем новый релиз" @@ -152,13 +149,14 @@ jobs: if echo "$RESPONSE" | grep -q '"id"'; then NEW_REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) echo "Новый ID релиза: $NEW_REL_ID" - echo "REL_ID=$NEW_REL_ID" >> $GITEA_ENV + echo "REL_ID=$NEW_REL_ID" >> $GITHUB_ENV else echo "ОШИБКА: Не удалось получить ID релиза из ответа" - echo "REL_ID=" >> $GITEA_ENV + echo "REL_ID=" >> $GITHUB_ENV exit 1 fi fi + - name: Загрузка файлов в релиз if: env.REL_ID != '' run: | -- 2.49.1 From a6ad7c7720c66dce1443c0403ef9f149888be06c Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 21:31:13 +0300 Subject: [PATCH 22/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 68 +++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index e92573b..a68d49f 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -22,43 +22,50 @@ jobs: # Создаем имя тега TAG="v${VERSION}" - echo "TAG=$TAG" >> $GITEA_ENV - echo "VERSION=$VERSION" >> $GITEA_ENV - echo "RELEASE=$RELEASE" >> $GITEA_ENV - echo "Тег: $TAG" - echo "Версия: $VERSION" - echo "Ревизия: $RELEASE" + # Правильный формат для Gitea - в кавычках + echo 'TAG="'"${TAG}"'"' >> $GITEA_ENV + echo 'VERSION="'"${VERSION}"'"' >> $GITEA_ENV + echo 'RELEASE="'"${RELEASE}"'"' >> $GITEA_ENV + + echo "Тег: ${TAG}" + echo "Версия: ${VERSION}" + echo "Ревизия: ${RELEASE}" - name: Проверка существования тега id: check_tag run: | - echo "Проверяем тег: $TAG" + echo "Проверяем тег: ${TAG}" # Проверяем на удаленном сервере - if git ls-remote --tags origin "$TAG" 2>/dev/null | grep -q "$TAG"; then - echo "Тег $TAG уже существует на удаленном сервере" - echo "TAG_EXISTS_REMOTE=true" >> $GITEA_ENV + if git ls-remote --tags origin "${TAG}" 2>/dev/null | grep -q "${TAG}"; then + echo "Тег ${TAG} уже существует на удаленном сервере" + echo 'TAG_EXISTS_REMOTE="true"' >> $GITEA_ENV else - echo "Тег $TAG не существует на удаленном сервере" - echo "TAG_EXISTS_REMOTE=false" >> $GITEA_ENV + echo "Тег ${TAG} не существует на удаленном сервере" + echo 'TAG_EXISTS_REMOTE="false"' >> $GITEA_ENV fi + - name: Создание тега (только если не существует) + if: env.TAG_EXISTS_REMOTE == 'true' + run: | + echo "Тег уже существует, пропускаем создание" + - name: Создание тега (только если не существует) if: env.TAG_EXISTS_REMOTE == 'false' run: | - echo "Создаем новый тег: $TAG" + echo "Создаем новый тег: ${TAG}" git config user.email "svk@nuk-svk.ru" git config user.name "svk" # Создаем тег локально - git tag -a "$TAG" -m "Release $TAG - $RELEASE" + git tag -a "${TAG}" -m "Release ${TAG} - ${RELEASE}" # Настраиваем URL для push git remote set-url origin "https://${{ secrets.USER }}:${{ secrets.API_TOKEN }}@git.nuk-svk.ru/${{ gitea.repository }}.git" # Пушим тег на сервер - git push origin "$TAG" + git push origin "${TAG}" - name: Сборка пакетов run: | @@ -83,12 +90,14 @@ jobs: if echo "$RESPONSE" | grep -q '"id"'; then REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) echo "Реліз уже существует. ID: $REL_ID" - echo "RELEASE_EXISTS=true" >> $GITHUB_ENV - echo "REL_ID=$REL_ID" >> $GITHUB_ENV + + # Ключевое исправление: пишем в правильном формате + echo 'RELEASE_EXISTS="true"' >> $GITEA_ENV + echo 'REL_ID="'"${REL_ID}"'"' >> $GITEA_ENV else echo "Реліз не существует" - echo "RELEASE_EXISTS=false" >> $GITHUB_ENV - echo "REL_ID=" >> $GITHUB_ENV + echo 'RELEASE_EXISTS="false"' >> $GITEA_ENV + echo 'REL_ID=""' >> $GITEA_ENV fi - name: Создание или обновление релиза @@ -96,12 +105,18 @@ jobs: run: | echo "=== Работа с релизом для тега $TAG ===" + # Проверяем, что тег существует перед созданием релиза + if ! git ls-remote --tags origin "${TAG}" 2>/dev/null | grep -q "${TAG}"; then + echo "ОШИБКА: Тег ${TAG} не существует на сервере!" + exit 1 + fi + RELEASE_BODY="## Projman $VERSION - + **Ревизия:** $RELEASE **Дата сборки:** $(date) **Коммит:** $(git rev-parse --short HEAD) - + ### Собранные пакеты: - DEB пакет для Debian/Ubuntu - TGZ пакет для OpenBSD" @@ -109,8 +124,8 @@ jobs: # Экранируем переносы строк для JSON ESCAPED_BODY=$(echo "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g') - # Используем переменные окружения ПРАВИЛЬНО - if [ "$RELEASE_EXISTS" = "true" ]; then + # Используем переменные напрямую, так как они в окружении + if [ "$RELEASE_EXISTS" = "true" ] && [ -n "$REL_ID" ]; then echo "Обновляем существующий релиз ID: $REL_ID" # Обновляем существующий релиз @@ -149,10 +164,11 @@ jobs: if echo "$RESPONSE" | grep -q '"id"'; then NEW_REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) echo "Новый ID релиза: $NEW_REL_ID" - echo "REL_ID=$NEW_REL_ID" >> $GITHUB_ENV + echo 'REL_ID="'"${NEW_REL_ID}"'"' >> $GITEA_ENV else echo "ОШИБКА: Не удалось получить ID релиза из ответа" - echo "REL_ID=" >> $GITHUB_ENV + echo "Ответ сервера: $RESPONSE" + echo 'REL_ID=""' >> $GITEA_ENV exit 1 fi fi @@ -178,7 +194,7 @@ jobs: FILENAME=$(basename "$FILE") echo "Загружаем: $FILENAME" - curl -v --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + curl -s --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ --upload-file "$FILE" \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$FILENAME" -- 2.49.1 From 5f8f7a64c3b9ab6e09cc11bebe72c6502bdfb6b0 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 21:33:58 +0300 Subject: [PATCH 23/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 68 +++++++++++++++----------------------- 1 file changed, 26 insertions(+), 42 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index a68d49f..8544f45 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -22,50 +22,43 @@ jobs: # Создаем имя тега TAG="v${VERSION}" + echo "TAG=$TAG" >> $GITEA_ENV + echo "VERSION=$VERSION" >> $GITEA_ENV + echo "RELEASE=$RELEASE" >> $GITEA_ENV - # Правильный формат для Gitea - в кавычках - echo 'TAG="'"${TAG}"'"' >> $GITEA_ENV - echo 'VERSION="'"${VERSION}"'"' >> $GITEA_ENV - echo 'RELEASE="'"${RELEASE}"'"' >> $GITEA_ENV - - echo "Тег: ${TAG}" - echo "Версия: ${VERSION}" - echo "Ревизия: ${RELEASE}" + echo "Тег: $TAG" + echo "Версия: $VERSION" + echo "Ревизия: $RELEASE" - name: Проверка существования тега id: check_tag run: | - echo "Проверяем тег: ${TAG}" + echo "Проверяем тег: $TAG" # Проверяем на удаленном сервере - if git ls-remote --tags origin "${TAG}" 2>/dev/null | grep -q "${TAG}"; then - echo "Тег ${TAG} уже существует на удаленном сервере" - echo 'TAG_EXISTS_REMOTE="true"' >> $GITEA_ENV + if git ls-remote --tags origin "$TAG" 2>/dev/null | grep -q "$TAG"; then + echo "Тег $TAG уже существует на удаленном сервере" + echo "TAG_EXISTS_REMOTE=true" >> $GITEA_ENV else - echo "Тег ${TAG} не существует на удаленном сервере" - echo 'TAG_EXISTS_REMOTE="false"' >> $GITEA_ENV + echo "Тег $TAG не существует на удаленном сервере" + echo "TAG_EXISTS_REMOTE=false" >> $GITEA_ENV fi - - name: Создание тега (только если не существует) - if: env.TAG_EXISTS_REMOTE == 'true' - run: | - echo "Тег уже существует, пропускаем создание" - - name: Создание тега (только если не существует) if: env.TAG_EXISTS_REMOTE == 'false' run: | - echo "Создаем новый тег: ${TAG}" + echo "Создаем новый тег: $TAG" git config user.email "svk@nuk-svk.ru" git config user.name "svk" # Создаем тег локально - git tag -a "${TAG}" -m "Release ${TAG} - ${RELEASE}" + git tag -a "$TAG" -m "Release $TAG - $RELEASE" # Настраиваем URL для push git remote set-url origin "https://${{ secrets.USER }}:${{ secrets.API_TOKEN }}@git.nuk-svk.ru/${{ gitea.repository }}.git" # Пушим тег на сервер - git push origin "${TAG}" + git push origin "$TAG" - name: Сборка пакетов run: | @@ -89,15 +82,15 @@ jobs: if echo "$RESPONSE" | grep -q '"id"'; then REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) - echo "Реліз уже существует. ID: $REL_ID" + echo "Релиз уже существует. ID: $REL_ID" + echo "RELEASE_EXISTS=true" >> $GITEA_ENV - # Ключевое исправление: пишем в правильном формате - echo 'RELEASE_EXISTS="true"' >> $GITEA_ENV - echo 'REL_ID="'"${REL_ID}"'"' >> $GITEA_ENV + # Используем метод записи через echo без >> для числовых значений + echo "REL_ID=${REL_ID}" >> $GITEA_ENV else - echo "Реліз не существует" - echo 'RELEASE_EXISTS="false"' >> $GITEA_ENV - echo 'REL_ID=""' >> $GITEA_ENV + echo "Релиз не существует" + echo "RELEASE_EXISTS=false" >> $GITEA_ENV + echo "REL_ID=" >> $GITEA_ENV fi - name: Создание или обновление релиза @@ -105,12 +98,6 @@ jobs: run: | echo "=== Работа с релизом для тега $TAG ===" - # Проверяем, что тег существует перед созданием релиза - if ! git ls-remote --tags origin "${TAG}" 2>/dev/null | grep -q "${TAG}"; then - echo "ОШИБКА: Тег ${TAG} не существует на сервере!" - exit 1 - fi - RELEASE_BODY="## Projman $VERSION **Ревизия:** $RELEASE @@ -124,8 +111,7 @@ jobs: # Экранируем переносы строк для JSON ESCAPED_BODY=$(echo "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g') - # Используем переменные напрямую, так как они в окружении - if [ "$RELEASE_EXISTS" = "true" ] && [ -n "$REL_ID" ]; then + if [ "$RELEASE_EXISTS" = "true" ]; then echo "Обновляем существующий релиз ID: $REL_ID" # Обновляем существующий релиз @@ -164,12 +150,10 @@ jobs: if echo "$RESPONSE" | grep -q '"id"'; then NEW_REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) echo "Новый ID релиза: $NEW_REL_ID" - echo 'REL_ID="'"${NEW_REL_ID}"'"' >> $GITEA_ENV + echo "REL_ID=${NEW_REL_ID}" >> $GITEA_ENV else echo "ОШИБКА: Не удалось получить ID релиза из ответа" - echo "Ответ сервера: $RESPONSE" - echo 'REL_ID=""' >> $GITEA_ENV - exit 1 + echo "REL_ID=" >> $GITEA_ENV fi fi @@ -194,7 +178,7 @@ jobs: FILENAME=$(basename "$FILE") echo "Загружаем: $FILENAME" - curl -s --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + curl -v --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ --upload-file "$FILE" \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$FILENAME" -- 2.49.1 From 6f858814ce15d5169e933029555ab170175aa6e2 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 21:36:36 +0300 Subject: [PATCH 24/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 8544f45..450f51d 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -82,20 +82,23 @@ jobs: if echo "$RESPONSE" | grep -q '"id"'; then REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) - echo "Релиз уже существует. ID: $REL_ID" + echo "Реліз уже существует. ID: $REL_ID" echo "RELEASE_EXISTS=true" >> $GITEA_ENV - # Используем метод записи через echo без >> для числовых значений - echo "REL_ID=${REL_ID}" >> $GITEA_ENV + # Сохраняем REL_ID в файл, а не в $GITEA_ENV + echo "$REL_ID" > /tmp/rel_id.txt else - echo "Релиз не существует" + echo "Реліз не существует" echo "RELEASE_EXISTS=false" >> $GITEA_ENV - echo "REL_ID=" >> $GITEA_ENV + echo "" > /tmp/rel_id.txt fi - name: Создание или обновление релиза id: create_release run: | + # Читаем REL_ID из файла + REL_ID=$(cat /tmp/rel_id.txt 2>/dev/null || echo "") + echo "=== Работа с релизом для тега $TAG ===" RELEASE_BODY="## Projman $VERSION @@ -111,7 +114,7 @@ jobs: # Экранируем переносы строк для JSON ESCAPED_BODY=$(echo "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g') - if [ "$RELEASE_EXISTS" = "true" ]; then + if [ "$RELEASE_EXISTS" = "true" ] && [ -n "$REL_ID" ]; then echo "Обновляем существующий релиз ID: $REL_ID" # Обновляем существующий релиз @@ -128,6 +131,9 @@ jobs: echo "Ответ обновления релиза: $RESPONSE" + # Сохраняем ID для следующего шага + echo "$REL_ID" > /tmp/rel_id.txt + else echo "Создаем новый релиз" @@ -150,16 +156,24 @@ jobs: if echo "$RESPONSE" | grep -q '"id"'; then NEW_REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) echo "Новый ID релиза: $NEW_REL_ID" - echo "REL_ID=${NEW_REL_ID}" >> $GITEA_ENV + echo "$NEW_REL_ID" > /tmp/rel_id.txt else echo "ОШИБКА: Не удалось получить ID релиза из ответа" - echo "REL_ID=" >> $GITEA_ENV + echo "" > /tmp/rel_id.txt + exit 1 fi fi - name: Загрузка файлов в релиз - if: env.REL_ID != '' run: | + # Читаем REL_ID из файла + REL_ID=$(cat /tmp/rel_id.txt 2>/dev/null || echo "") + + if [ -z "$REL_ID" ]; then + echo "Нет ID релиза, пропускаем загрузку файлов" + exit 0 + fi + echo "=== Загрузка файлов в релиз ===" echo "ID релиза для загрузки: $REL_ID" @@ -187,6 +201,9 @@ jobs: - name: Финализация run: | + # Читаем REL_ID из файла + REL_ID=$(cat /tmp/rel_id.txt 2>/dev/null || echo "") + echo "=== Сборка завершена ===" echo "Тег: $TAG" echo "Версия: $VERSION" -- 2.49.1 From 0c3ef13f2582b8d6c824d47512930e256c71d38b Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 21:38:44 +0300 Subject: [PATCH 25/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 44 +++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 450f51d..0e66b00 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -85,21 +85,23 @@ jobs: echo "Реліз уже существует. ID: $REL_ID" echo "RELEASE_EXISTS=true" >> $GITEA_ENV - # Сохраняем REL_ID в файл, а не в $GITEA_ENV - echo "$REL_ID" > /tmp/rel_id.txt + # Очищаем и сохраняем REL_ID в файл + echo -n "$REL_ID" | tr -d '\n' > /tmp/rel_id.txt else echo "Реліз не существует" echo "RELEASE_EXISTS=false" >> $GITEA_ENV - echo "" > /tmp/rel_id.txt + echo -n "" > /tmp/rel_id.txt fi - name: Создание или обновление релиза id: create_release run: | - # Читаем REL_ID из файла - REL_ID=$(cat /tmp/rel_id.txt 2>/dev/null || echo "") + # Читаем REL_ID из файла и очищаем от лишних символов + REL_ID=$(cat /tmp/rel_id.txt 2>/dev/null | tr -d '\n\r ' || echo "") echo "=== Работа с релизом для тега $TAG ===" + echo "RELEASE_EXISTS: $RELEASE_EXISTS" + echo "REL_ID: '$REL_ID'" RELEASE_BODY="## Projman $VERSION @@ -131,8 +133,15 @@ jobs: echo "Ответ обновления релиза: $RESPONSE" - # Сохраняем ID для следующего шага - echo "$REL_ID" > /tmp/rel_id.txt + # Проверяем ответ + if echo "$RESPONSE" | grep -q '"id"'; then + echo "Релиз успешно обновлен" + echo -n "$REL_ID" > /tmp/rel_id.txt + else + echo "ОШИБКА: Не удалось обновить релиз" + echo "Ответ: $RESPONSE" + exit 1 + fi else echo "Создаем новый релиз" @@ -154,20 +163,21 @@ jobs: # Получаем ID нового релиза if echo "$RESPONSE" | grep -q '"id"'; then - NEW_REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) + NEW_REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2 | tr -d '\n\r ') echo "Новый ID релиза: $NEW_REL_ID" - echo "$NEW_REL_ID" > /tmp/rel_id.txt + echo -n "$NEW_REL_ID" > /tmp/rel_id.txt else echo "ОШИБКА: Не удалось получить ID релиза из ответа" - echo "" > /tmp/rel_id.txt + echo "Ответ: $RESPONSE" + echo -n "" > /tmp/rel_id.txt exit 1 fi fi - name: Загрузка файлов в релиз run: | - # Читаем REL_ID из файла - REL_ID=$(cat /tmp/rel_id.txt 2>/dev/null || echo "") + # Читаем REL_ID из файла и очищаем + REL_ID=$(cat /tmp/rel_id.txt 2>/dev/null | tr -d '\n\r ' || echo "") if [ -z "$REL_ID" ]; then echo "Нет ID релиза, пропускаем загрузку файлов" @@ -192,17 +202,21 @@ jobs: FILENAME=$(basename "$FILE") echo "Загружаем: $FILENAME" - curl -v --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + curl -s --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ --upload-file "$FILE" \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$FILENAME" - echo "Файл загружен: $FILENAME" + if [ $? -eq 0 ]; then + echo "Файл загружен: $FILENAME" + else + echo "ОШИБКА загрузки: $FILENAME" + fi done - name: Финализация run: | # Читаем REL_ID из файла - REL_ID=$(cat /tmp/rel_id.txt 2>/dev/null || echo "") + REL_ID=$(cat /tmp/rel_id.txt 2>/dev/null | tr -d '\n\r ' || echo "") echo "=== Сборка завершена ===" echo "Тег: $TAG" -- 2.49.1 From 2e5c7640e53e46b6ce11548c1873983f943cdd0b Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 21:41:04 +0300 Subject: [PATCH 26/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 0e66b00..496ed9d 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -80,8 +80,10 @@ jobs: echo "Ответ API проверки релиза: $RESPONSE" + # Правильное извлечение ID из JSON if echo "$RESPONSE" | grep -q '"id"'; then - REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) + # Используем Python для корректного парсинга JSON + REL_ID=$(echo "$RESPONSE" | python3 -c "import sys, json; print(json.load(sys.stdin).get('id', ''))") echo "Реліз уже существует. ID: $REL_ID" echo "RELEASE_EXISTS=true" >> $GITEA_ENV @@ -123,6 +125,7 @@ jobs: RESPONSE=$(curl -s -X PATCH \ -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ -H "Content-Type: application/json" \ + -H "Accept: application/json" \ -d '{ "name": "Projman '"$VERSION"'", "body": "'"$ESCAPED_BODY"'", @@ -140,6 +143,10 @@ jobs: else echo "ОШИБКА: Не удалось обновить релиз" echo "Ответ: $RESPONSE" + # Пробуем получить более детальную информацию + echo "Пробуем получить информацию о релизе с ID $REL_ID..." + curl -s -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID" exit 1 fi @@ -150,6 +157,7 @@ jobs: RESPONSE=$(curl -s -X POST \ -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ -H "Content-Type: application/json" \ + -H "Accept: application/json" \ -d '{ "tag_name": "'"$TAG"'", "name": "Projman '"$VERSION"'", @@ -161,9 +169,9 @@ jobs: echo "Ответ создания релиза: $RESPONSE" - # Получаем ID нового релиза + # Получаем ID нового релиза через Python if echo "$RESPONSE" | grep -q '"id"'; then - NEW_REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2 | tr -d '\n\r ') + NEW_REL_ID=$(echo "$RESPONSE" | python3 -c "import sys, json; print(json.load(sys.stdin).get('id', ''))") echo "Новый ID релиза: $NEW_REL_ID" echo -n "$NEW_REL_ID" > /tmp/rel_id.txt else -- 2.49.1 From 80d7fc12566e6b7f0e0170bf879eb9fdc514e859 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 21:42:34 +0300 Subject: [PATCH 27/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 496ed9d..0e66b00 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -80,10 +80,8 @@ jobs: echo "Ответ API проверки релиза: $RESPONSE" - # Правильное извлечение ID из JSON if echo "$RESPONSE" | grep -q '"id"'; then - # Используем Python для корректного парсинга JSON - REL_ID=$(echo "$RESPONSE" | python3 -c "import sys, json; print(json.load(sys.stdin).get('id', ''))") + REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) echo "Реліз уже существует. ID: $REL_ID" echo "RELEASE_EXISTS=true" >> $GITEA_ENV @@ -125,7 +123,6 @@ jobs: RESPONSE=$(curl -s -X PATCH \ -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ -H "Content-Type: application/json" \ - -H "Accept: application/json" \ -d '{ "name": "Projman '"$VERSION"'", "body": "'"$ESCAPED_BODY"'", @@ -143,10 +140,6 @@ jobs: else echo "ОШИБКА: Не удалось обновить релиз" echo "Ответ: $RESPONSE" - # Пробуем получить более детальную информацию - echo "Пробуем получить информацию о релизе с ID $REL_ID..." - curl -s -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID" exit 1 fi @@ -157,7 +150,6 @@ jobs: RESPONSE=$(curl -s -X POST \ -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ -H "Content-Type: application/json" \ - -H "Accept: application/json" \ -d '{ "tag_name": "'"$TAG"'", "name": "Projman '"$VERSION"'", @@ -169,9 +161,9 @@ jobs: echo "Ответ создания релиза: $RESPONSE" - # Получаем ID нового релиза через Python + # Получаем ID нового релиза if echo "$RESPONSE" | grep -q '"id"'; then - NEW_REL_ID=$(echo "$RESPONSE" | python3 -c "import sys, json; print(json.load(sys.stdin).get('id', ''))") + NEW_REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2 | tr -d '\n\r ') echo "Новый ID релиза: $NEW_REL_ID" echo -n "$NEW_REL_ID" > /tmp/rel_id.txt else -- 2.49.1 From d4b7e4e453cfa41039fef07774e1cf92d80cc2b3 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 21:52:47 +0300 Subject: [PATCH 28/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 0e66b00..eb7394d 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -80,8 +80,10 @@ jobs: echo "Ответ API проверки релиза: $RESPONSE" + # Извлекаем id релиза (первый id в JSON) if echo "$RESPONSE" | grep -q '"id"'; then - REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2) + # Используем sed для точного извлечения первого id (игнорируем id автора) + REL_ID=$(echo "$RESPONSE" | sed -n 's/.*"id":\([0-9]*\).*/\1/p' | head -1) echo "Реліз уже существует. ID: $REL_ID" echo "RELEASE_EXISTS=true" >> $GITEA_ENV @@ -134,9 +136,8 @@ jobs: echo "Ответ обновления релиза: $RESPONSE" # Проверяем ответ - if echo "$RESPONSE" | grep -q '"id"'; then + if echo "$RESPONSE" | sed -n 's/.*"id":\([0-9]*\).*/\1/p' | head -1 | grep -q '[0-9]'; then echo "Релиз успешно обновлен" - echo -n "$REL_ID" > /tmp/rel_id.txt else echo "ОШИБКА: Не удалось обновить релиз" echo "Ответ: $RESPONSE" @@ -162,8 +163,8 @@ jobs: echo "Ответ создания релиза: $RESPONSE" # Получаем ID нового релиза - if echo "$RESPONSE" | grep -q '"id"'; then - NEW_REL_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | cut -d: -f2 | tr -d '\n\r ') + NEW_REL_ID=$(echo "$RESPONSE" | sed -n 's/.*"id":\([0-9]*\).*/\1/p' | head -1) + if [ -n "$NEW_REL_ID" ]; then echo "Новый ID релиза: $NEW_REL_ID" echo -n "$NEW_REL_ID" > /tmp/rel_id.txt else -- 2.49.1 From 611ed34dc1ec8eccec534fc61c77c9f725587ab0 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 21:55:40 +0300 Subject: [PATCH 29/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index eb7394d..5a596dc 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -80,17 +80,18 @@ jobs: echo "Ответ API проверки релиза: $RESPONSE" - # Извлекаем id релиза (первый id в JSON) + # Извлекаем id релиза - первый id в JSON if echo "$RESPONSE" | grep -q '"id"'; then - # Используем sed для точного извлечения первого id (игнорируем id автора) - REL_ID=$(echo "$RESPONSE" | sed -n 's/.*"id":\([0-9]*\).*/\1/p' | head -1) - echo "Реліз уже существует. ID: $REL_ID" + # Извлекаем только первый id (id релиза), игнорируем id автора + # Используем awk для точного извлечения + REL_ID=$(echo "$RESPONSE" | awk -F'"id":' '{print $2}' | awk -F',' '{print $1}' | head -1 | tr -d ' ') + echo "Релиз уже существует. ID: $REL_ID" echo "RELEASE_EXISTS=true" >> $GITEA_ENV # Очищаем и сохраняем REL_ID в файл echo -n "$REL_ID" | tr -d '\n' > /tmp/rel_id.txt else - echo "Реліз не существует" + echo "Релиз не существует" echo "RELEASE_EXISTS=false" >> $GITEA_ENV echo -n "" > /tmp/rel_id.txt fi @@ -136,7 +137,7 @@ jobs: echo "Ответ обновления релиза: $RESPONSE" # Проверяем ответ - if echo "$RESPONSE" | sed -n 's/.*"id":\([0-9]*\).*/\1/p' | head -1 | grep -q '[0-9]'; then + if echo "$RESPONSE" | grep -q '"id"'; then echo "Релиз успешно обновлен" else echo "ОШИБКА: Не удалось обновить релиз" @@ -163,7 +164,7 @@ jobs: echo "Ответ создания релиза: $RESPONSE" # Получаем ID нового релиза - NEW_REL_ID=$(echo "$RESPONSE" | sed -n 's/.*"id":\([0-9]*\).*/\1/p' | head -1) + NEW_REL_ID=$(echo "$RESPONSE" | awk -F'"id":' '{print $2}' | awk -F',' '{print $1}' | head -1 | tr -d ' ') if [ -n "$NEW_REL_ID" ]; then echo "Новый ID релиза: $NEW_REL_ID" echo -n "$NEW_REL_ID" > /tmp/rel_id.txt -- 2.49.1 From b12273809b48f26f7385740074db17cfbb8d7a5d Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 21:59:31 +0300 Subject: [PATCH 30/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 47 ++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 5a596dc..81a0094 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -199,21 +199,54 @@ jobs: echo "Найдены файлы:" echo "$FILES" + # Сначала проверим существующие ассеты + echo "=== Проверяем существующие ассеты ===" + curl -s -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets" | \ + jq -r '.[].name' 2>/dev/null || echo "Не удалось получить список ассетов" + # Загружаем каждый файл for FILE in $FILES; do FILENAME=$(basename "$FILE") echo "Загружаем: $FILENAME" - curl -s --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ - --upload-file "$FILE" \ - "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets?name=$FILENAME" - - if [ $? -eq 0 ]; then - echo "Файл загружен: $FILENAME" + # Используем правильный endpoint для загрузки ассетов + UPLOAD_URL="${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets" + + echo "URL загрузки: $UPLOAD_URL?name=$FILENAME" + + # Загружаем файл + RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" \ + --user "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + -H "Content-Type: application/octet-stream" \ + -X POST \ + --data-binary @"$FILE" \ + "$UPLOAD_URL?name=$FILENAME") + + HTTP_STATUS=$(echo "$RESPONSE" | grep "HTTP_STATUS:" | cut -d':' -f2) + API_RESPONSE=$(echo "$RESPONSE" | grep -v "HTTP_STATUS:") + + echo "Статус: $HTTP_STATUS" + echo "Ответ API: $API_RESPONSE" + + if [ "$HTTP_STATUS" = "201" ] || [ "$HTTP_STATUS" = "200" ]; then + echo "✅ Файл загружен: $FILENAME" else - echo "ОШИБКА загрузки: $FILENAME" + echo "❌ ОШИБКА загрузки: $FILENAME" + echo "Детали: $API_RESPONSE" fi + + echo "---" done + + # Проверяем итоговый список ассетов + echo "=== Итоговый список ассетов ===" + curl -s -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets" | \ + jq -r '.[] | "\(.name) - \(.browser_download_url)"' 2>/dev/null || \ + curl -s -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ + "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID/assets" | \ + grep -o '"name":"[^"]*"' | cut -d'"' -f4 - name: Финализация run: | -- 2.49.1 From ebc2e2eef88e2ccd30980399d7b91f72b9e89fcd Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 22:02:55 +0300 Subject: [PATCH 31/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 81a0094..14b106d 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -112,10 +112,6 @@ jobs: **Дата сборки:** $(date) **Коммит:** $(git rev-parse --short HEAD) - ### Собранные пакеты: - - DEB пакет для Debian/Ubuntu - - TGZ пакет для OpenBSD" - # Экранируем переносы строк для JSON ESCAPED_BODY=$(echo "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g') @@ -127,11 +123,13 @@ jobs: -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ -H "Content-Type: application/json" \ -d '{ - "name": "Projman '"$VERSION"'", - "body": "'"$ESCAPED_BODY"'", - "draft": false, - "prerelease": false - }' \ + "tag_name": "'"$TAG"'", + "name": "Projman '"$VERSION"'", + "body": "'"$ESCAPED_BODY"'", + "draft": false, + "prerelease": false, + "make_latest": "true" + }' \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID") echo "Ответ обновления релиза: $RESPONSE" -- 2.49.1 From 6fd0d2a77bd5d0525c426d93a5dd5d647bf668ff Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 22:04:14 +0300 Subject: [PATCH 32/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 14b106d..e8b47b9 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -112,6 +112,10 @@ jobs: **Дата сборки:** $(date) **Коммит:** $(git rev-parse --short HEAD) + ### Собранные пакеты: + - DEB пакет для Debian/Ubuntu + - TGZ пакет для OpenBSD" + # Экранируем переносы строк для JSON ESCAPED_BODY=$(echo "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g') @@ -123,13 +127,13 @@ jobs: -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ -H "Content-Type: application/json" \ -d '{ - "tag_name": "'"$TAG"'", - "name": "Projman '"$VERSION"'", - "body": "'"$ESCAPED_BODY"'", - "draft": false, - "prerelease": false, - "make_latest": "true" - }' \ + "tag_name": "'"$TAG"'", + "name": "Projman '"$VERSION"'", + "body": "'"$ESCAPED_BODY"'", + "draft": false, + "prerelease": false, + "make_latest": "true" + }' \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID") echo "Ответ обновления релиза: $RESPONSE" -- 2.49.1 From f865cc2b5ea634882e7af7bc1e6e9134d4237fd8 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 22:05:56 +0300 Subject: [PATCH 33/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index e8b47b9..e130c98 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -112,10 +112,6 @@ jobs: **Дата сборки:** $(date) **Коммит:** $(git rev-parse --short HEAD) - ### Собранные пакеты: - - DEB пакет для Debian/Ubuntu - - TGZ пакет для OpenBSD" - # Экранируем переносы строк для JSON ESCAPED_BODY=$(echo "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g') @@ -127,12 +123,10 @@ jobs: -u "${{ secrets.USER }}:${{ secrets.API_TOKEN }}" \ -H "Content-Type: application/json" \ -d '{ - "tag_name": "'"$TAG"'", "name": "Projman '"$VERSION"'", "body": "'"$ESCAPED_BODY"'", "draft": false, - "prerelease": false, - "make_latest": "true" + "prerelease": false }' \ "${{ vars.main_url }}api/v1/repos/${{ gitea.repository }}/releases/$REL_ID") -- 2.49.1 From 72a23954f6937afe6194b33a5276fba81264b9d9 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 22:07:34 +0300 Subject: [PATCH 34/49] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index e130c98..95acb18 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -110,8 +110,9 @@ jobs: **Ревизия:** $RELEASE **Дата сборки:** $(date) - **Коммит:** $(git rev-parse --short HEAD) - + **Коммит:** $(git rev-parse --short HEAD)" + + # Экранируем переносы строк для JSON ESCAPED_BODY=$(echo "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g') -- 2.49.1 From c2ebf1e7241f2e461346219cafd04fba91afdd5b Mon Sep 17 00:00:00 2001 From: svk Date: Fri, 23 Jan 2026 14:00:49 +0300 Subject: [PATCH 35/49] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=20?= =?UTF-8?q?=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20=D0=B1=D1=81=D0=B4-?= =?UTF-8?q?=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openbsd/build-package-bsd.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openbsd/build-package-bsd.sh b/openbsd/build-package-bsd.sh index 7f32f8d..78c1f95 100755 --- a/openbsd/build-package-bsd.sh +++ b/openbsd/build-package-bsd.sh @@ -49,7 +49,6 @@ cat > ${WORK_DIR}/${PKG_FULLNAME}/+CONTENTS << EOF @depend devel/tklib:tklib-*:tcl-* @comment Editor for Tcl/Tk and other languages. @arch amd64 -@wantlib pthread @ignore @cwd /usr/local EOF @@ -78,7 +77,7 @@ Supported languages for highlighting and navigation: Tcl/Tk, GO, Perl, Python, Ruby, Shell (BASH), Markdown, YAML (Ansible), Lua. EOF -(cd ${WORK_DIR} && tar -czf ../../../${PKG_FULLNAME}.tgz ${PKG_FULLNAME}/) +(cd ${WORK_DIR}/${PKG_FULLNAME}/ && pwd && ls -1 && tar -czf ../../../../${PKG_FULLNAME}.tgz .) echo "Package created: ${PKG_FULLNAME}.tgz" -- 2.49.1 From 1758afd100a2fcce20819ecb7bbe40a8b0aa0d2a Mon Sep 17 00:00:00 2001 From: svk Date: Mon, 26 Jan 2026 19:46:01 +0300 Subject: [PATCH 36/49] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D0=BE=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20=D0=B2=D0=BD?= =?UTF-8?q?=D0=B5=D1=88=D0=BD=D0=B8=D0=BC=D0=B8=20=D0=B8=D0=BD=D1=81=D1=82?= =?UTF-8?q?=D1=80=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D0=BC=D0=B8:=20-=20?= =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B8=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20(=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B0=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B2,=20=D1=81=D0=BE=D1=85=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5)=20=D1=81=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D0=BE=D0=BC=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5?= =?UTF-8?q?=D0=BA=20tools.ini=20-=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BC=D0=B5=D0=BD=D1=8E=20'=D0=98=D0=BD=D1=81=D1=82?= =?UTF-8?q?=D1=80=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D1=8B'=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=BA=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D1=82=D0=B0=D0=BA=20=D0=B8=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5?= =?UTF-8?q?=D0=BA=D1=81=D1=82=D0=BD=D0=BE=D0=B3=D0=BE=20(=D0=B2=D1=81?= =?UTF-8?q?=D0=BF=D0=BB=D1=8B=D0=B2=D0=B0=D1=8E=D1=89=D0=B5=D0=B3=D0=BE)?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=B5=20=20too?= =?UTF-8?q?ls.ini.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/gui.tcl | 9 ++- lib/msgs/en.msg | 2 +- lib/msgs/ru.msg | 1 + lib/tools.tcl | 150 ++++++++++++++++++++++++++++++++++++++++++++++++ projman.tcl | 13 ++++- 5 files changed, 171 insertions(+), 4 deletions(-) create mode 100644 lib/tools.tcl diff --git a/lib/gui.tcl b/lib/gui.tcl index 3f26659..d5f0a8f 100644 --- a/lib/gui.tcl +++ b/lib/gui.tcl @@ -135,7 +135,11 @@ GetEditMenu [menu .frmMenu.mnuEdit.m] ttk::menubutton .frmMenu.mnuView -text [::msgcat::mc "View"] -menu .frmMenu.mnuView.m GetViewMenu [menu .frmMenu.mnuView.m] -pack .frmMenu.mnuFile .frmMenu.mnuEdit .frmMenu.mnuView -side left +ttk::menubutton .frmMenu.mnuTools -text [::msgcat::mc "Tools"] -menu .frmMenu.mnuTools.m +Tools::GetMenu [menu .frmMenu.mnuTools.m] + + +pack .frmMenu.mnuFile .frmMenu.mnuEdit .frmMenu.mnuView .frmMenu.mnuTools -side left ttk::menubutton .frmMenu.mnuHelp -text [::msgcat::mc "Help"] -menu .frmMenu.mnuHelp.m GetHelpMenu [menu .frmMenu.mnuHelp.m] @@ -151,6 +155,9 @@ GetFileMenu .popup.file menu .popup.view .popup add cascade -label [::msgcat::mc "View"] -menu .popup.view GetViewMenu .popup.view +menu .popup.tools +.popup add cascade -label [::msgcat::mc "Tools"] -menu .popup.tools +Tools::GetMenu .popup.tools set frmTool [ttk::frame .frmBody.frmTool] ttk::panedwindow .frmBody.panel -orient horizontal -style TPanedwindow diff --git a/lib/msgs/en.msg b/lib/msgs/en.msg index 1840432..72cadfe 100644 --- a/lib/msgs/en.msg +++ b/lib/msgs/en.msg @@ -174,6 +174,7 @@ ::msgcat::mcset en "Title normal" ::msgcat::mcset en "Title modify" ::msgcat::mcset en "Toolbar" +::msgcat::mcset en "Tools" ::msgcat::mcset en "Undo" ::msgcat::mcset en "Update" ::msgcat::mcset en "Variables" @@ -185,4 +186,3 @@ ::msgcat::mcset en "Work dir" - diff --git a/lib/msgs/ru.msg b/lib/msgs/ru.msg index bff7471..0991f34 100644 --- a/lib/msgs/ru.msg +++ b/lib/msgs/ru.msg @@ -214,6 +214,7 @@ ::msgcat::mcset ru "Title normal" "Файл нормальный" ::msgcat::mcset ru "Title modify" "Файл изменен" ::msgcat::mcset ru "Toolbar" "Панель инструментов" +::msgcat::mcset ru "Tools" "Инструменты" ::msgcat::mcset ru "User name" "Имя пользователя" ::msgcat::mcset ru "Undo" "Отменить" ::msgcat::mcset ru "Update" "Обновить" diff --git a/lib/tools.tcl b/lib/tools.tcl new file mode 100644 index 0000000..4be511d --- /dev/null +++ b/lib/tools.tcl @@ -0,0 +1,150 @@ +################################################################## +# tools.tcl - this file implements the logic of working +# with external tools. +################################################################## +# svk, 01/2026 +################################################################## + +namespace eval Tools {} { + variable toolsINISections + variable toolsVariables +} + +set ::toolsDefault "\[VisualRegexp\] +commandString=tkregexp % +description'A graphical front-end to write/debug regular expression +icon= +shortCut= +\[TkDIFF\] +commandString=tkdiff %f %f +description=TkDiff is a Tcl/Tk front-end to diff +icon= +shortCut= +" +# Создание файла настроек внешних инструментов +proc Tools::Create {dir} { + set toolsFile [open [file join $dir tools.ini] "w+"] + puts $toolsFile $::toolsDefault + close $toolsFile +} + +proc Tools::Read {dir} { + set toolsFile [ini::open [file join $dir tools.ini] "r"] + foreach section [ini::sections $toolsFile] { + foreach key [ini::keys $toolsFile $section] { + lappend ::toolsINIsections($section) $key + dict set ::toolsVariables $section $key [ini::value $toolsFile $section $key] + DebugPuts "Tools::Read: $toolsFile $section $key = [ini::value $toolsFile $section $key]" + } + } + ini::close $toolsFile +} + +proc Tools::Write {dir} { + set toolsFile [ini::open [file join $dir tools.ini] "w"] + foreach section [array names ::toolsINIsections] { + dict for {key value} [dict get $::toolsVariables $section] { + DebugPuts "Tools::write: $section $key = $value" + # ini::set $toolsFile $section $key [dict get $::toolsVariables $section $key] + ini::set $toolsFile $section $key $value + } + } + ini::commit $toolsFile + ini::close $toolsFile +} + +# Добавление перменной в список +# если отсутствует нужная секция то она будет добавлена. +proc Tools::AddVariable {key value section} { + # Проверяем, существует ли уже такая переменная + if {[info exists ::toolsVariables($key)]} { + DebugPuts "The variable '$key' already exists: " + return 0 + } + # Добавляем в массив переменных + # set ::toolsVariables($key) $value + dict set ::toolsVariables $section $key $value + # Добавляем в список ключей секции + if {[dict exists $::toolsVariables $key]} { + # Проверяем, нет ли уже такого ключа в секции + if {[lsearch -exact $::toolsINIsections($section) $key] == -1} { + lappend ::toolsINIsections($section) $key + } + } else { + set ::toolsINIsections($section) [list $key] + } + DebugPuts "Tools::AddVariable: The variable '$key' has been added to the '$section' array 'toolsVariables' with value '$value'" + + return 1 +} + +# Проверяем наличие переменных в tools.ini на основе "эталонного" списка +# и выставляем значение по умолчанию если в конфиге переменной нет +proc Tools::CheckVariables {} { + set valList [split $::toolsDefault "\n"] + foreach item $valList { + if {[regexp -nocase -all -- {\[(\w+)\]} $item -> v1]} { + set section $v1 + } + if {[regexp {^([^=]+)=(.*)$} $item -> key value]} { + # puts "$section $key $value >> [dict get $::toolsVariables $section $key]" + # if {[dict get $::toolsVariables $section $key] eq ""} + if ![dict exists $::toolsVariables $section $key] { + DebugPuts "Error in Tools::CheckVariables: variable $section $key not found" + Tools::AddVariable "$key" "$value" "$section" + # DebugPuts "Tools::CheckVariables: The variable toolsVariables $key setting to default value \"$value\"" + } + } + } + foreach id [dict keys $::toolsVariables] { + DebugPuts "Tools::CheckVariables: config parameters for $id [dict get $::toolsVariables $id]!" + } + # DebugPuts "toolsVariables dict keys: [dict keys $::toolsVariables]" +} + +proc Tools::GetMenu {m} { + global cfgVariables toolsVariables + foreach toolName [dict keys $toolsVariables] { + dict for {key value} [dict get $toolsVariables $toolName] { + DebugPuts "GetToolsMenu $key $value" + if {$key eq "commandString"} { + set cmd "$value" + } + if {$key eq "shortCut"} { + set shortCut "$value" + } + } + if {[info exists cmd] == 1 && $cmd ne ""} { + if {[info exists shortCut] == 1 && $shortCut ne ""} { + $m add command -label $toolName -accelerator $shortCut -command [list Tools::Execute "$toolName"] + } else { + $m add command -label $toolName -command [list Tools::Execute "$toolName"] + } + } + } +} + +proc Tools::Execute {toolName} { + global cfgVariables toolsVariables + if ![dict exists $::toolsVariables $toolName commandString] { + DebugPuts "Tools::Execute: command for $toolName not found" + return + } else { + set command [dict get $::toolsVariables $toolName commandString] + DebugPuts "Tools::Execute: command for $toolName as $command" + } + # 1. Определять текущий файл + # 2. Определять выделен ли текст в открытом редакторе + # 3. Опеределять сколько файлов выделено в дереве + # 4. Заменяем знак %f на имя текущего файла (файлов) + # regsub -all "%f" $command "$filePath" fullCommand + # 5. Заменяем %s на выделенный в редакторе текст + # 6. Заменяем %d на текущий каталог(и), если он выделен в дереве, + # и если не выделено то корневой открытый в дереве + # 7. Проверять команды на доступность в системе и подставлять полный путь к команде + # если в конфиге не указан полный путь. + set pipe [open "|$command" "r"] + fileevent $pipe readable + fconfigure $pipe -buffering none -blocking no +} + diff --git a/projman.tcl b/projman.tcl index 18ad1ef..47d07bb 100755 --- a/projman.tcl +++ b/projman.tcl @@ -114,13 +114,22 @@ foreach modFile [lsort [glob -nocomplain [file join $dir(theme) *]]] { } -# загружаем пользовательский конфиг, если он отсутствует, то копируем дефолтный -if {[file exists [file join $dir(cfg) projman.ini]] ==0} { +# загружаем пользовательский конфиг, если он отсутствует или пустой, то копируем дефолтный +if {[file exists [file join $dir(cfg) projman.ini]] == 0 || [file size [file join $dir(cfg) projman.ini]] == 0} { Config::create $dir(cfg) } Config::read $dir(cfg) Config::CheckVariables +# загружаем пользовательский конфиг для инстурментов, если он отсутствует или пустой, то копируем дефолтный +if {[file exists [file join $dir(cfg) tools.ini]] == 0 || [file size [file join $dir(cfg) tools.ini]] == 0} { + Tools::Create $dir(cfg) +} +# Читаем настройки для внешних инструментов +Tools::Read $dir(cfg) +Tools::CheckVariables +Tools::Write $dir(cfg) + ::msgcat::mclocale $cfgVariables(locale) if [::msgcat::mcload [file join $dir(lib) msgs]] { -- 2.49.1 From bc2808c3e4399b8af375350750a27c91f4a2cab8 Mon Sep 17 00:00:00 2001 From: svk Date: Tue, 27 Jan 2026 14:22:12 +0300 Subject: [PATCH 37/49] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20tkregexp=20=D0=B4=D0=BB=D1=8F=20=D1=83=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8=20=D0=B2=20/usr/bin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debian/build-deb-projman.sh | 3 ++- debian/install | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/build-deb-projman.sh b/debian/build-deb-projman.sh index d332154..0cb4911 100755 --- a/debian/build-deb-projman.sh +++ b/debian/build-deb-projman.sh @@ -11,6 +11,7 @@ sed -i "/# Build:.*/c$TXT" projman.tcl cp projman.tcl projman cp changelog-gen.tcl changelog-gen +cp tkregexp.tcl tkregexp ./changelog-gen.tcl --project-name projman --project-version ${VERSION} --project-release ${RELEASE} --out-file debian/changelog --deb --last @@ -25,5 +26,5 @@ dpkg-buildpackage -d #cp ../projman_${VERSION}-${RELEASE}_amd64.deb /files/ -rm -v projman changelog-gen +rm -v projman changelog-gen tkregexp rm -r -v debian/{projman,.debhelper} diff --git a/debian/install b/debian/install index 954b959..621a7cb 100644 --- a/debian/install +++ b/debian/install @@ -1,5 +1,6 @@ projman /usr/bin/ changelog-gen /usr/bin/ +tkregexp /usr/bin lib/*.tcl /usr/share/projman/lib lib/msgs/* /usr/share/projman/lib/msgs theme /usr/share/projman/ -- 2.49.1 From aaa027398aab807014261f07bf715b813480477c Mon Sep 17 00:00:00 2001 From: svk Date: Tue, 27 Jan 2026 14:22:55 +0300 Subject: [PATCH 38/49] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0?= =?UTF-8?q?=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D0=BE=D0=B2=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=BD=D0=BE=D0=B9=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=B8=20=D0=B8=20=D0=B7=D0=B0=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D0=BA=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD=D0=B8=D1=85=20?= =?UTF-8?q?=D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/editor.tcl | 12 +++++++++--- lib/tools.tcl | 28 +++++++++++++++++++++++----- lib/tree.tcl | 10 +++++++++- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/lib/editor.tcl b/lib/editor.tcl index 7e585ee..09a0e08 100644 --- a/lib/editor.tcl +++ b/lib/editor.tcl @@ -363,15 +363,21 @@ namespace eval Editor { } } - proc SelectionGet {txt} { - variable selectionText + proc SelectionGet {{txt ""}} { + global nbEditor + variable selectionText "" + if {$txt eq ""} { + DebugPuts "Editor::SelectionGet: [focus]" + set txt [focus] + } set selBegin [lindex [$txt tag ranges sel] 0] set selEnd [lindex [$txt tag ranges sel] 1] if {$selBegin ne "" && $selEnd ne ""} { set selectionText [$txt get $selBegin $selEnd] } + return $selectionText } - + proc SelectionHighlight {txt} { variable selectionText $txt tag remove lightSelected 1.0 end diff --git a/lib/tools.tcl b/lib/tools.tcl index 4be511d..68a467e 100644 --- a/lib/tools.tcl +++ b/lib/tools.tcl @@ -11,7 +11,7 @@ namespace eval Tools {} { } set ::toolsDefault "\[VisualRegexp\] -commandString=tkregexp % +commandString=tkregexp %s description'A graphical front-end to write/debug regular expression icon= shortCut= @@ -125,7 +125,7 @@ proc Tools::GetMenu {m} { } proc Tools::Execute {toolName} { - global cfgVariables toolsVariables + global cfgVariables toolsVariables tree if ![dict exists $::toolsVariables $toolName commandString] { DebugPuts "Tools::Execute: command for $toolName not found" return @@ -133,18 +133,36 @@ proc Tools::Execute {toolName} { set command [dict get $::toolsVariables $toolName commandString] DebugPuts "Tools::Execute: command for $toolName as $command" } - # 1. Определять текущий файл + + set fullCommand $command + # 2. Определять выделен ли текст в открытом редакторе + set selectedText [Editor::SelectionGet] + if {$selectedText ne ""} { + regsub -all "%s" $command "$selectedText" fullCommand + DebugPuts "Tools::Execute: selected text \"$selectedText\", command \"$fullCommand\"" + } + + # 1. Определять текущий файл # 3. Опеределять сколько файлов выделено в дереве # 4. Заменяем знак %f на имя текущего файла (файлов) # regsub -all "%f" $command "$filePath" fullCommand + set filesList [Tree::GetSelectedItemValues $tree] + if {$filesList ne ""} { + foreach file $filesList { + # Если больше нет %f для замены, выходим из цикла + if {![string match "*%f*" $fullCommand]} break + set fullCommand [regsub {%f} $fullCommand $file] + } + DebugPuts "Tools::Execute: $fullCommand" + } + # 5. Заменяем %s на выделенный в редакторе текст # 6. Заменяем %d на текущий каталог(и), если он выделен в дереве, # и если не выделено то корневой открытый в дереве # 7. Проверять команды на доступность в системе и подставлять полный путь к команде # если в конфиге не указан полный путь. - set pipe [open "|$command" "r"] + set pipe [open "|$fullCommand" "r"] fileevent $pipe readable fconfigure $pipe -buffering none -blocking no } - diff --git a/lib/tree.tcl b/lib/tree.tcl index 920c63a..2fc99ab 100644 --- a/lib/tree.tcl +++ b/lib/tree.tcl @@ -99,6 +99,7 @@ namespace eval Tree { proc PressItem {tree} { global nbEditor lexers editors activeProject set id [$tree selection] + if {[llength $id] > 1} {return} $tree tag remove selected $tree item $id -tags selected SetActiveProject [GetItemID $tree [GetUpperItem $tree $id]] @@ -160,5 +161,12 @@ namespace eval Tree { GetUpperItem $tree $parent } } - + + proc GetSelectedItemValues {tree} { + set valuesList "" + foreach itemID [$tree selection] { + lappend valuesList [GetItemID $tree $itemID] + } + return $valuesList + } } -- 2.49.1 From 807131eee2ad15f572361c5ddca68aa3fd3e5588 Mon Sep 17 00:00:00 2001 From: svk Date: Tue, 27 Jan 2026 15:26:59 +0300 Subject: [PATCH 39/49] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=83=D1=82=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B4=D0=BE=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD=D0=B8=D1=85=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BA=20=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=83.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 23 +++++++++++++++++++++++ debian/changelog | 11 +++++++++++ lib/tools.tcl | 49 ++++++++++++++++++++++++++++++++++++++---------- projman.tcl | 4 ++-- 4 files changed, 75 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index bacf2bc..62c1e53 100644 --- a/README.md +++ b/README.md @@ -158,6 +158,29 @@ Or type "projman" into terminal, Or choose the name of the program "Projman" on - Alt-S - Split the edited window horizontally - Alt-K - Open folder +### Work with external tools +ProjMan allows you to connect any external tools to the editor. To do this, you need to add an entry to the file ~/.config/projman/tools.ini. + +Calling an external program is available through the main and pop-up menus. To transfer the parameters, write the appropriate template in the file. + - %s - template for substituting selected text in the editor + - %f - template for substituting selected file\(s\) in the file tree + +When adding multiple %f templates, the corresponding number of files allocated in the tree will be substituted. + +``` +[TkDIFF] +commandString=tkdiff %f %f +description=TkDiff is a Tcl/Tk front-end to diff +icon= +shortCut= + +[VisualRegexp] +commandString=tkregexp "%s" +description=A graphical front-end to write/debug regular expression +icon= +shortCut= +``` + ## Credits Sergey Kalinin - author diff --git a/debian/changelog b/debian/changelog index 52aad62..e3c0b25 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,14 @@ +projman (2.0.0-beta2) stable; urgency=medium + + * Сделана обработка шаблонов командной строки и запуск внешних инструментов. + * Добавлен tkregexp для установки в /usr/bin + * Начало работы с внешними инструментами: - Добавлено создание и работа (проверка параметров + * Исправлен скрипт сборки бсд-пакета + * Добавлена сборка пакетов для openbsd + * Релиз 1-й бета версии + + -- svk Thu, 22 Jan 2026 17:58:15 +0300 + projman (2.0.0-beta1) stable; urgency=medium * Сделан вывод отладочной информации по запросу. diff --git a/lib/tools.tcl b/lib/tools.tcl index 68a467e..f20e5c0 100644 --- a/lib/tools.tcl +++ b/lib/tools.tcl @@ -11,8 +11,8 @@ namespace eval Tools {} { } set ::toolsDefault "\[VisualRegexp\] -commandString=tkregexp %s -description'A graphical front-end to write/debug regular expression +commandString=tkregexp \"%s\" +description=A graphical front-end to write/debug regular expression icon= shortCut= \[TkDIFF\] @@ -124,6 +124,28 @@ proc Tools::GetMenu {m} { } } +proc Tools::CommandPathSettings {command} { + global tcl_platform + if [file exists $command] {return $command} + + if {$tcl_platform(platform) eq "windows"} { + set cmd "where $command)" + } else { + set cmd "which $command" + } + DebugPuts [catch {exec {*}$cmd} toolsPath] + DebugPuts "executor_path $toolsPath" + if {[catch {exec {*}$cmd} toolsPath]} { + DebugPuts "Программа $command не найдена в системе" + return "" + } + set fullPath [string trim $toolsPath] + set firstPath [lindex [split $toolsPath "\n"] 0] + + DebugPuts "Tools::CommandPathSettings: executable path $fullPath" + return $fullPath +} + proc Tools::Execute {toolName} { global cfgVariables toolsVariables tree if ![dict exists $::toolsVariables $toolName commandString] { @@ -133,13 +155,22 @@ proc Tools::Execute {toolName} { set command [dict get $::toolsVariables $toolName commandString] DebugPuts "Tools::Execute: command for $toolName as $command" } - - set fullCommand $command - + # 7. Проверять команды на доступность в системе и подставлять полный путь к команде + # если в конфиге не указан полный путь. + # Проверем наличие внешгних программ в системе + set cmd [lindex [split $command " "] 0] + if [file exists $cmd] { + set fullCommand $command + } else { + set fullPathToExec [Tools::CommandPathSettings "$cmd"] + set fullCommand [lreplace [split $command " "] 0 0 $fullPathToExec] + } + DebugPuts "Tools::Execute: $fullPathToExec, $fullCommand" # 2. Определять выделен ли текст в открытом редакторе + # 5. Заменяем %s на выделенный в редакторе текст set selectedText [Editor::SelectionGet] if {$selectedText ne ""} { - regsub -all "%s" $command "$selectedText" fullCommand + regsub -all "%s" $fullCommand "$selectedText" fullCommand DebugPuts "Tools::Execute: selected text \"$selectedText\", command \"$fullCommand\"" } @@ -154,14 +185,12 @@ proc Tools::Execute {toolName} { if {![string match "*%f*" $fullCommand]} break set fullCommand [regsub {%f} $fullCommand $file] } - DebugPuts "Tools::Execute: $fullCommand" } - # 5. Заменяем %s на выделенный в редакторе текст # 6. Заменяем %d на текущий каталог(и), если он выделен в дереве, # и если не выделено то корневой открытый в дереве - # 7. Проверять команды на доступность в системе и подставлять полный путь к команде - # если в конфиге не указан полный путь. + DebugPuts "Tools::Execute: $fullCommand" + set pipe [open "|$fullCommand" "r"] fileevent $pipe readable fconfigure $pipe -buffering none -blocking no diff --git a/projman.tcl b/projman.tcl index 47d07bb..aa335f6 100755 --- a/projman.tcl +++ b/projman.tcl @@ -9,8 +9,8 @@ exec wish8.6 "$0" -- "$@" # Home page: https://nuk-svk.ru ###################################################### # Version: 2.0.0 -# Release: beta1 -# Build: 22012026174911 +# Release: beta2 +# Build: 27012026142407 ###################################################### # определим текущую версию, релиз и т.д. -- 2.49.1 From 4b09b1e97dc5c68800623a4127e58c7accf08b3f Mon Sep 17 00:00:00 2001 From: svk Date: Tue, 27 Jan 2026 16:16:53 +0300 Subject: [PATCH 40/49] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA?= =?UTF-8?q?=D0=B8=20=D1=81=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD=D0=B8=D1=85=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/tools.tcl | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/tools.tcl b/lib/tools.tcl index f20e5c0..3c165df 100644 --- a/lib/tools.tcl +++ b/lib/tools.tcl @@ -136,7 +136,7 @@ proc Tools::CommandPathSettings {command} { DebugPuts [catch {exec {*}$cmd} toolsPath] DebugPuts "executor_path $toolsPath" if {[catch {exec {*}$cmd} toolsPath]} { - DebugPuts "Программа $command не найдена в системе" + DebugPuts "Tools::CommandPathSettings: Программа $command не найдена в системе" return "" } set fullPath [string trim $toolsPath] @@ -165,7 +165,12 @@ proc Tools::Execute {toolName} { set fullPathToExec [Tools::CommandPathSettings "$cmd"] set fullCommand [lreplace [split $command " "] 0 0 $fullPathToExec] } - DebugPuts "Tools::Execute: $fullPathToExec, $fullCommand" + if {$fullPathToExec eq ""} { + DebugPuts "Tools::Execute: $command not found" + return + } else { + DebugPuts "Tools::Execute: $fullPathToExec, $fullCommand" + } # 2. Определять выделен ли текст в открытом редакторе # 5. Заменяем %s на выделенный в редакторе текст set selectedText [Editor::SelectionGet] -- 2.49.1 From 2dd7b7239ebfaff00316b77aadb0bdc1b32d4fd6 Mon Sep 17 00:00:00 2001 From: svk Date: Tue, 27 Jan 2026 16:25:22 +0300 Subject: [PATCH 41/49] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D1=85=20=D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=BE=D0=B2.=20=D0=98=20=D0=BF=D1=83=D0=BD=D0=BA?= =?UTF-8?q?=D1=82=20=D0=B2=20=D0=BC=D0=B5=D0=BD=D1=8E=20'=D0=98=D0=BD?= =?UTF-8?q?=D1=81=D1=82=D1=80=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D1=8B'->'?= =?UTF-8?q?=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B8'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/tools.tcl | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/tools.tcl b/lib/tools.tcl index 3c165df..23139a6 100644 --- a/lib/tools.tcl +++ b/lib/tools.tcl @@ -122,6 +122,8 @@ proc Tools::GetMenu {m} { } } } + $m add separator + $m add command -label "[::msgcat::mc "Settings"]" -command Tools::Settings } proc Tools::CommandPathSettings {command} { @@ -200,3 +202,11 @@ proc Tools::Execute {toolName} { fileevent $pipe readable fconfigure $pipe -buffering none -blocking no } + +# Правка файла настроек +proc Tools::Settings {} { + global dir + + FileOper::Edit [file join $dir(cfg) tools.ini] + # Config::read $dir(cfg) +} -- 2.49.1 From d13a4adba5acd6311abe8125a902ccbcf771a523 Mon Sep 17 00:00:00 2001 From: svk Date: Tue, 27 Jan 2026 16:40:24 +0300 Subject: [PATCH 42/49] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0?= =?UTF-8?q?=20=D1=81=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BD=D1=8B=D0=BC=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=B2=D0=B8=D0=B4=D0=B6?= =?UTF-8?q?=D0=B5=D1=82=D0=B0=20=D0=B2=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5?= =?UTF-8?q?=D0=B4=D1=83=D1=80=D0=B5=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B2=D1=8B=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B0?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/editor.tcl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/editor.tcl b/lib/editor.tcl index 09a0e08..4c727c8 100644 --- a/lib/editor.tcl +++ b/lib/editor.tcl @@ -369,6 +369,9 @@ namespace eval Editor { if {$txt eq ""} { DebugPuts "Editor::SelectionGet: [focus]" set txt [focus] + if {![string match -nocase "*text*" $txt]} { + return "" + } } set selBegin [lindex [$txt tag ranges sel] 0] set selEnd [lindex [$txt tag ranges sel] 1] -- 2.49.1 From a974068883ea062d759076711ae923fc5d8e7d70 Mon Sep 17 00:00:00 2001 From: svk Date: Tue, 27 Jan 2026 16:44:48 +0300 Subject: [PATCH 43/49] =?UTF-8?q?2-=D1=8F=20=D0=B1=D0=B5=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debian/changelog | 9 +++++++-- projman.tcl | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index e3c0b25..69c1502 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,13 +1,16 @@ projman (2.0.0-beta2) stable; urgency=medium + * Исправлена ошибка с некорректным определением виджета в процедуре получения выделенного текста. + * Добавлено редактирование настроек внешних инструментов. И пункт в меню 'Инструменты'->'Настройки' + * Исправление ошибки с запуском внешних программ. + * Добавлено определение путей до внешних программ при подключении к редактору. * Сделана обработка шаблонов командной строки и запуск внешних инструментов. * Добавлен tkregexp для установки в /usr/bin * Начало работы с внешними инструментами: - Добавлено создание и работа (проверка параметров * Исправлен скрипт сборки бсд-пакета * Добавлена сборка пакетов для openbsd - * Релиз 1-й бета версии - -- svk Thu, 22 Jan 2026 17:58:15 +0300 + -- svk Thu, 27 Jan 2026 17:58:15 +0300 projman (2.0.0-beta1) stable; urgency=medium @@ -479,3 +482,5 @@ projman (2.0.0-alfa0) stable; urgency=medium + + diff --git a/projman.tcl b/projman.tcl index aa335f6..c6937b1 100755 --- a/projman.tcl +++ b/projman.tcl @@ -10,7 +10,7 @@ exec wish8.6 "$0" -- "$@" ###################################################### # Version: 2.0.0 # Release: beta2 -# Build: 27012026142407 +# Build: 27012026164054 ###################################################### # определим текущую версию, релиз и т.д. -- 2.49.1 From 26546dfe27818554e1430a065536d3c85a28afbc Mon Sep 17 00:00:00 2001 From: svk Date: Tue, 27 Jan 2026 17:31:39 +0300 Subject: [PATCH 44/49] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B4=D0=B8=D0=BD=D0=B0=D0=BC=D0=B8=D1=87?= =?UTF-8?q?=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BC=D0=B5=D0=BD=D1=8E=20'=D0=98?= =?UTF-8?q?=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D1=8B'.?= =?UTF-8?q?=20=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D1=8B=D0=B5=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D1=8B=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=BD=D1=8B=20?= =?UTF-8?q?=D1=81=D1=80=D0=B0=D0=B7=D1=83=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5?= =?UTF-8?q?=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=20=D0=BD=D0=B0=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=20tools.ini=20=D0=B2=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/files.tcl | 6 ++++++ lib/tools.tcl | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/lib/files.tcl b/lib/files.tcl index fe4383b..df4cdb3 100644 --- a/lib/files.tcl +++ b/lib/files.tcl @@ -391,6 +391,12 @@ namespace eval FileOper { if {[file tail $filePath] eq "projman.ini"} { Config::read $dir(cfg) } + if {[file tail $filePath] eq "tools.ini"} { + Tools::Read $dir(cfg) + Tools::CheckVariables + Tools::GetMenu .popup.tools + Tools::GetMenu .frmMenu.mnuTools.m + } if [string match "*untitled*" $nbEditorItem] { FileOper::Close if {$type ne "close"} { diff --git a/lib/tools.tcl b/lib/tools.tcl index 23139a6..a15c9d1 100644 --- a/lib/tools.tcl +++ b/lib/tools.tcl @@ -29,6 +29,7 @@ proc Tools::Create {dir} { } proc Tools::Read {dir} { + set ::toolsVariables "" set toolsFile [ini::open [file join $dir tools.ini] "r"] foreach section [ini::sections $toolsFile] { foreach key [ini::keys $toolsFile $section] { @@ -104,6 +105,12 @@ proc Tools::CheckVariables {} { proc Tools::GetMenu {m} { global cfgVariables toolsVariables + set count [$m index end] + if {$count != "none"} { + for {set i $count} {$i >= 0} {incr i -1} { + $m delete $i + } + } foreach toolName [dict keys $toolsVariables] { dict for {key value} [dict get $toolsVariables $toolName] { DebugPuts "GetToolsMenu $key $value" -- 2.49.1 From e21995d13ea9525ee0b4796dd73cac6e523a0562 Mon Sep 17 00:00:00 2001 From: svk Date: Tue, 27 Jan 2026 17:37:10 +0300 Subject: [PATCH 45/49] =?UTF-8?q?=D0=A1=D0=B1=D0=BE=D1=80=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B1=D0=B5=D1=82=D0=B02?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debian/changelog | 3 ++- projman.tcl | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index 69c1502..9d40e4e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,6 @@ projman (2.0.0-beta2) stable; urgency=medium + * Добавлена динамическая генерация меню 'Инструменты'. Теперь новые внешние инструменты доступны сразу после сохранения файла настроек tools.ini в редакторе. * Исправлена ошибка с некорректным определением виджета в процедуре получения выделенного текста. * Добавлено редактирование настроек внешних инструментов. И пункт в меню 'Инструменты'->'Настройки' * Исправление ошибки с запуском внешних программ. @@ -10,7 +11,7 @@ projman (2.0.0-beta2) stable; urgency=medium * Исправлен скрипт сборки бсд-пакета * Добавлена сборка пакетов для openbsd - -- svk Thu, 27 Jan 2026 17:58:15 +0300 + -- svk Tue, 27 Jan 2026 16:44:48 +0300 projman (2.0.0-beta1) stable; urgency=medium diff --git a/projman.tcl b/projman.tcl index c6937b1..1405bfd 100755 --- a/projman.tcl +++ b/projman.tcl @@ -10,7 +10,7 @@ exec wish8.6 "$0" -- "$@" ###################################################### # Version: 2.0.0 # Release: beta2 -# Build: 27012026164054 +# Build: 27012026173153 ###################################################### # определим текущую версию, релиз и т.д. -- 2.49.1 From c74fa5b11330140016a3691d22bb91162fd82b82 Mon Sep 17 00:00:00 2001 From: svk Date: Wed, 28 Jan 2026 12:26:53 +0300 Subject: [PATCH 46/49] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20(bind)=20=D1=81=D0=BE=D1=87=D0=B5?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BA=D0=BB=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=88=D1=8C=20=D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D0=B2=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D0=BA=D0=B0=D1=85=20=D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/tools.tcl | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/tools.tcl b/lib/tools.tcl index a15c9d1..bcece50 100644 --- a/lib/tools.tcl +++ b/lib/tools.tcl @@ -124,6 +124,7 @@ proc Tools::GetMenu {m} { if {[info exists cmd] == 1 && $cmd ne ""} { if {[info exists shortCut] == 1 && $shortCut ne ""} { $m add command -label $toolName -accelerator $shortCut -command [list Tools::Execute "$toolName"] + bind . <$shortCut> [list Tools::Execute "$toolName"] } else { $m add command -label $toolName -command [list Tools::Execute "$toolName"] } -- 2.49.1 From c69db69c69eb2f400db6550f29b2e12fae666012 Mon Sep 17 00:00:00 2001 From: svk Date: Wed, 28 Jan 2026 12:35:44 +0300 Subject: [PATCH 47/49] =?UTF-8?q?=D0=A1=D0=B1=D0=BE=D1=80=D0=BA=D0=B0=20?= =?UTF-8?q?=20beta2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debian/changelog | 1 + projman.tcl | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 9d40e4e..a7f1d13 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,6 @@ projman (2.0.0-beta2) stable; urgency=medium + * Добавлено подключение (bind) сочетания клавиш указанных в настройках инструментов. * Добавлена динамическая генерация меню 'Инструменты'. Теперь новые внешние инструменты доступны сразу после сохранения файла настроек tools.ini в редакторе. * Исправлена ошибка с некорректным определением виджета в процедуре получения выделенного текста. * Добавлено редактирование настроек внешних инструментов. И пункт в меню 'Инструменты'->'Настройки' diff --git a/projman.tcl b/projman.tcl index 1405bfd..491f7dd 100755 --- a/projman.tcl +++ b/projman.tcl @@ -10,7 +10,7 @@ exec wish8.6 "$0" -- "$@" ###################################################### # Version: 2.0.0 # Release: beta2 -# Build: 27012026173153 +# Build: 28012026123432 ###################################################### # определим текущую версию, релиз и т.д. -- 2.49.1 From 36d1940c7b9d0088c2559cd0d9a9c3bd0c0761d5 Mon Sep 17 00:00:00 2001 From: svk Date: Wed, 28 Jan 2026 12:42:05 +0300 Subject: [PATCH 48/49] =?UTF-8?q?=D0=9D=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=B0=D1=8F=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/tools.tcl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tools.tcl b/lib/tools.tcl index bcece50..0051bff 100644 --- a/lib/tools.tcl +++ b/lib/tools.tcl @@ -124,7 +124,7 @@ proc Tools::GetMenu {m} { if {[info exists cmd] == 1 && $cmd ne ""} { if {[info exists shortCut] == 1 && $shortCut ne ""} { $m add command -label $toolName -accelerator $shortCut -command [list Tools::Execute "$toolName"] - bind . <$shortCut> [list Tools::Execute "$toolName"] + bind . <$shortCut> "[list Tools::Execute "$toolName"]; break" } else { $m add command -label $toolName -command [list Tools::Execute "$toolName"] } -- 2.49.1 From 1b6493d3a855f2c6ec400810eb52b02d06744b1f Mon Sep 17 00:00:00 2001 From: svk Date: Wed, 28 Jan 2026 12:43:25 +0300 Subject: [PATCH 49/49] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D0=B0=D1=8F=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- projman.tcl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projman.tcl b/projman.tcl index 491f7dd..ccd279f 100755 --- a/projman.tcl +++ b/projman.tcl @@ -10,7 +10,7 @@ exec wish8.6 "$0" -- "$@" ###################################################### # Version: 2.0.0 # Release: beta2 -# Build: 28012026123432 +# Build: 28012026124210 ###################################################### # определим текущую версию, релиз и т.д. -- 2.49.1