From 5f89f0ce31f433ef9cb8420806a7db19f48311a4 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 22 Jan 2026 20:25:21 +0300 Subject: [PATCH 01/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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/72] =?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 From 1c7c2ec90efd1f10efcfffe344f443de6d764f0e Mon Sep 17 00:00:00 2001 From: svk Date: Wed, 28 Jan 2026 19:38:50 +0300 Subject: [PATCH 50/72] =?UTF-8?q?=D0=92=D1=8B=D0=BD=D0=B5=D1=81=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4=20=D1=81=D0=B2=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D1=81=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=BE=D0=B9=20=D0=BF=D0=BE=D0=B4=D1=81=D0=BA=D0=B0=D0=B7?= =?UTF-8?q?=D0=BE=D0=BA=20=D0=BF=D1=80=D0=B8=20=D0=B2=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D0=B8=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B4=D1=83?= =?UTF-8?q?=D1=80=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C.=20=D0=98?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BD=D0=B5=D0=B4?= =?UTF-8?q?=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D1=83=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=D0=B5=20=D0=B2=D0=B0?= =?UTF-8?q?=D1=80=D0=B8=D0=B0=D0=BD=D1=82=D0=B0=20=D0=B8=D0=B7=20=D1=81?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D0=B8=20=D0=B2=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=B2=D0=BA=D0=B5=20=D0=B5=D0=B3=D0=BE=20=D0=B2=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D1=82.=20=D0=98=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D1=83=20=D0=BA=D0=BB=D0=B0=D0=B2=D0=B8=D1=88=20=D0=92?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=20=D0=92=D0=BD=D0=B8=D0=B7=20=D0=92=D0=B2?= =?UTF-8?q?=D0=BE=D0=B4=20=D0=9E=D1=82=D0=BC=D0=B5=D0=BD=D0=B0=20=D0=B2=20?= =?UTF-8?q?=D0=BE=D0=BA=D0=BD=D0=B5=20=D1=81=D0=BE=20=D1=81=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=BA=D0=BE=D0=BC=20=D0=B2=D0=B0=D1=80=D0=B8=D0=B0=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/editor.tcl | 282 +++++++------------------------------- lib/helper.tcl | 336 ++++++++++++++++++++++++++++++++++++++++++++++ lib/imgviewer.tcl | 2 +- 3 files changed, 387 insertions(+), 233 deletions(-) create mode 100644 lib/helper.tcl diff --git a/lib/editor.tcl b/lib/editor.tcl index 4c727c8..9326f6d 100644 --- a/lib/editor.tcl +++ b/lib/editor.tcl @@ -402,234 +402,7 @@ namespace eval Editor { } } - proc VarHelperKey { widget K A } { - set win .varhelper - # if { [winfo exists $win] == 0 } { return } - set ind [$win.lBox curselection] - # puts ">>>>>>>>>>>> VarHelperBind <<<<<<<<<<<<<<<<" - - switch -- $K { - Prior { - set up [expr [$win.lBox index active] - [$win.lBox cget -height]] - if { $up < 0 } { set up 0 } - $win.lBox activate $up - $win.lBox selection clear 0 end - $win.lBox selection set $up $up - } - Next { - set down [expr [$win.lBox index active] + [$win.lBox cget -height]] - if { $down >= [$win.lBox index end] } { set down end } - $win.lBox activate $down - $win.lBox selection clear 0 end - $win.lBox selection set $down $down - } - Up { - set up [expr [$win.lBox index active] - 1] - if { $up < 0 } { set up 0 } - $win.lBox activate $up - $win.lBox selection clear 0 end - $win.lBox selection set $up $up - } - Down { - set down [expr [$win.lBox index active] + 1] - if { $down >= [$win.lBox index end] } { set down end } - $win.lBox activate $down - $win.lBox selection clear 0 end - $win.lBox selection set $down $down - } - Return { - $widget delete "insert - 1 chars wordstart" "insert wordend - 1 chars" - $widget insert "insert" [$win.lBox get [$win.lBox curselection]] - # eval [bind VarHelperBind ] - Editor::VarHelperEscape $widget - } - default { - $widget insert "insert" $A - # eval [bind VarHelperBind ] - Editor::VarHelperEscape $widget - } - } - } ;# proc auto_completition_key - proc VarHelperEscape {w} { - # puts ">>>>>>>>>>>> VarHelperEscape <<<<<<<<<<<<<<<<" - # bindtags $w [list [winfo parent $w] $w Text sysAfter all] - bindtags $w [list [winfo toplevel $w] $w Ctext sysAfter all] - catch { destroy .varhelper } - DebugPuts [bindtags $w] - DebugPuts [bind $w] - } - proc VarHelper {x y w word wordType} { - global editors lexers variables - variable txt - variable win - # set txt $w.frmText.t - # блокировка открытия диалога если запущен другой - set txt $w - # set win .varhelper - # Проверяем если есть выделение то блокировать появление диалога - if {[$txt tag ranges sel] != ""} { - DebugPuts "You have selected text [$txt tag ranges sel]" - return - } - # puts "$x $y $w $word $wordType" - set fileType [dict get $editors $txt fileType] - - if {[dict exists $editors $txt variableList] != 0} { - set varList [dict get $editors $txt variableList] - # puts $varList - } - if {[dict exists $editors $txt procedureList] != 0} { - set procList [dict get $editors $txt procedureList] - } - # puts $procList - # puts ">>>>>>>[dict get $lexers $fileType commands]" - if {[dict exists $lexers $fileType commands] !=0} { - foreach i [dict get $lexers $fileType commands] { - # puts $i - lappend procList $i - } - } - - # if {[dict exists $editors $txt variableList] == 0 && [dict exists $editors $txt procedureList] == 0} { - # return - # } - set findedVars "" - switch -- $wordType { - vars { - foreach i [lsearch -nocase -all $varList $word*] { - # puts [lindex $varList $i] - set item [lindex [lindex $varList $i] 0] - # puts $item - if {[lsearch $findedVars $item] eq "-1"} { - lappend findedVars $item - # puts $item - } - } - } - procedure { - foreach i [lsearch -nocase -all $procList $word*] { - # puts [lindex $varList $i] - set item [lindex [lindex $procList $i] 0] - # puts $item - if {[lsearch $findedVars $item] eq "-1"} { - lappend findedVars $item - # puts $item - } - } - } - default { - foreach i [lsearch -nocase -all $varList $word*] { - # puts [lindex $varList $i] - set item [lindex [lindex $varList $i] 0] - # puts $item - if {[lsearch $findedVars $item] eq "-1"} { - lappend findedVars $item - # puts $item - } - } - foreach i [lsearch -nocase -all $procList $word*] { - # puts [lindex $varList $i] - set item [lindex [lindex $procList $i] 0] - # puts $item - if {[lsearch $findedVars $item] eq "-1"} { - lappend findedVars $item - # puts $item - } - } - } - } - # unset item - # bindtags $txt [list VarHelperBind [winfo toplevel $txt] $txt Ctext sysAfter all] - # bindtags $txt.t [list VarHelperBind [winfo parent $txt.t] $txt.t Text sysAfter all] - # bind VarHelperBind "Editor::VarHelperEscape $txt.t; break" - # # bindtags $txt.t {[list [winfo parent $txt.t] $txt.t Text sysAfter all]}; - # # bindtags $txt {[list [winfo toplevel $txt] $txt Ctext sysAfter all]}; - # # catch { destroy .varhelper }" - # bind VarHelperBind {Editor::VarHelperKey %W %K %A; break} - # - if {$findedVars eq ""} { - return - } - # puts $findedVars - VarHelperDialog $x $y $w $word $findedVars - - } - - proc VarHelperDialog {x y w word findedVars} { - global editors lexers variables - variable txt - variable win - # puts ">>>>>>>>>>>>>$x $y $w $word $findedVars" - # set txt $w.frmText.t - # блокировка открытия диалога если запущен другой - # if [winfo exists .findVariables] { - # return - # } - # if { [winfo exists $win] } { destroy $win } - set txt $w - set win .varhelper - # if {$findedVars eq ""} { - # return - # } - toplevel $win - wm transient $win . - wm overrideredirect $win 1 - - listbox $win.lBox -width 30 -border 0 - pack $win.lBox -expand true -fill y -side left - - foreach { item } $findedVars { - $win.lBox insert end $item - } - - catch { $win.lBox activate 0 ; $win.lBox selection set 0 0 } - - if { [set height [llength $findedVars]] > 10 } { set height 10 } - $win.lBox configure -height $height - - # focus $win.lBox - - bind $win { - destroy $Editor::win - focus -force $Editor::txt.t - break - } - bind $win.lBox { - destroy $Editor::win - focus -force $Editor::txt.t - break - } - bind VarHelperBind { - $Editor::txt delete "insert - 1 chars wordstart" "insert wordend - 1 chars" - $Editor::txt insert "insert" [.varhelper.lBox get [.varhelper.lBox curselection]] - # eval [bind VarHelperBind ] - Editor::VarHelperEscape $Editor::txt - break - } - - # Определям расстояние до края экрана (основного окна) и если - # оно меньше размера окна со списком то сдвигаем его вверх - set winGeomY [winfo reqheight $win] - set winGeomX [winfo reqwidth $win] - - set topHeight [winfo height .] - set topWidth [winfo width .] - set topLeftUpperX [winfo x .] - set topLeftUpperY [winfo y .] - set topRightLowerX [expr $topLeftUpperX + $topWidth] - set topRightLowerY [expr $topLeftUpperY + $topHeight] - - if {[expr [expr $x + $winGeomX] > $topRightLowerX]} { - set x [expr $x - $winGeomX] - } - if {[expr [expr $y + $winGeomY] > $topRightLowerY]} { - set y [expr $y - $winGeomY] - } - - wm geom $win +$x+$y - } - proc ReleaseKey {k txt fileType} { global cfgVariables lexers set pos [$txt index insert] @@ -645,8 +418,53 @@ namespace eval Editor { unset lpos $txt tag remove lightSelected 1.0 end - if { [winfo exists .varhelper] } { destroy .varhelper } - # puts $k + # Обработка ввода для показа окна с подсказками. + # if { [winfo exists .varhelper] } { destroy .varhelper } + # Флаг, нужно ли показывать новый список + set showNewList 1 + + # Проверяем окно списка + if {[winfo exists .varhelper]} { + # Определяем, какая клавиша отпущена + switch -- $k { + Up - Down { + # Стрелки - управление списком, окно остается + # НЕ показываем новый список + set showNewList 0 + return + } + Return { + # Enter - выберет элемент, окно закроется в SelectFromList + # НЕ показываем новый список + set showNewList 0 + return + } + Escape { + # Escape - закрыть окно + destroy .varhelper + set ::Helper::listActive 0 + Helper::VarHelperBindingsRestore $txt + # НЕ показываем новый список + set showNewList 0 + return + } + Control_L - Control_R - Alt_L - Alt_R - Shift_L - Shift_R { + # Модификаторы - окно остается + # НЕ показываем новый список + set showNewList 0 + return + } + default { + # Любая другая клавиша (буквы, цифры, пробел, Tab и т.д.) + # закрывает окно списка, но ПОКАЗЫВАЕМ новый список + destroy .varhelper + set ::Helper::listActive 0 + Helper::VarHelperBindingsRestore $txt + # showNewList остается = 1 (показываем новый список) + } + } + } + switch $k { Return { regexp {^(\s*)} [$txt get [expr $lineNum - 1].0 [expr $lineNum - 1].end] -> spaceStart @@ -693,7 +511,7 @@ namespace eval Editor { set lastSymbol [string last $varSymbol [$txt get $lineNum.0 $pos]] if {$lastSymbol ne "-1"} { set word [string trim [$txt get $lineNum.[expr $lastSymbol + 1] $pos]] - Editor::VarHelper $box_x $box_y $txt $word vars + Helper::VarHelper $box_x $box_y $txt $word vars } } else { set ind [$txt search -backwards -regexp {\W} $pos {insert linestart}] @@ -706,7 +524,7 @@ namespace eval Editor { set word [$txt get {insert linestart} $pos] } if {$word ne ""} { - Editor::VarHelper $box_x $box_y $txt $word {} + Helper::VarHelper $box_x $box_y $txt $word {} } } } @@ -722,7 +540,7 @@ namespace eval Editor { set word [$txt get {insert linestart} $pos] } if {$word ne ""} { - Editor::VarHelper $box_x $box_y $txt $word procedure + Helper::VarHelper $box_x $box_y $txt $word procedure } } } diff --git a/lib/helper.tcl b/lib/helper.tcl new file mode 100644 index 0000000..8dd03e1 --- /dev/null +++ b/lib/helper.tcl @@ -0,0 +1,336 @@ +namespace eval Helper { + variable ::originalBindings {} + # Флаг, указывающий, что окно со списком активно + variable ::listActive 0 + # Переменная для отслеживания предыдущего ввода (чтобы не обновлять список без необходимости) + variable ::previousInput "" + + proc VarHelperKey { widget K A } { + set win .varhelper + DebugPuts "Helper::VarHelperKey: K=$K, A='$A'" + + # Проверяем, существует ли окно списка + if {![winfo exists $win]} { + DebugPuts "Window doesn't exist, restoring bindings" + Helper::VarHelperBindingsRestore $widget + set ::listActive 0 + return + } + + switch -- $K { + { + DebugPuts "Processing Up arrow" + # Перемещаем выбор вверх + set current [$win.lBox curselection] + DebugPuts "Current selection: $current" + + if {$current ne "" && $current > 0} { + $win.lBox selection clear 0 end + $win.lBox selection set [expr {$current - 1}] + $win.lBox activate [expr {$current - 1}] + $win.lBox see [expr {$current - 1}] + } elseif {[$win.lBox size] > 0} { + # Если ничего не выбрано, выбираем последний элемент + set last [expr {[$win.lBox size] - 1}] + $win.lBox selection clear 0 end + $win.lBox selection set $last + $win.lBox activate $last + $win.lBox see $last + } + return -code break + } + { + DebugPuts "Processing Down arrow" + # Перемещаем выбор вниз + set current [$win.lBox curselection] + set size [$win.lBox size] + DebugPuts "Current selection: $current, size: $size" + + if {$current ne "" && $current < $size - 1} { + $win.lBox selection clear 0 end + $win.lBox selection set [expr {$current + 1}] + $win.lBox activate [expr {$current + 1}] + $win.lBox see [expr {$current + 1}] + } elseif {$size > 0} { + # Если ничего не выбрано, выбираем первый элемент + $win.lBox selection clear 0 end + $win.lBox selection set 0 + $win.lBox activate 0 + $win.lBox see 0 + } + return -code break + } + { + DebugPuts "Processing Return" + Helper::SelectFromList $widget + return -code break + } + { + DebugPuts "Processing Escape" + # Закрываем окно списка + wm withdraw $win + set ::listActive 0 + Helper::VarHelperBindingsRestore $widget + set ::previousInput "" + focus $widget + return -code break + } + default { + DebugPuts "Default case for K=$K, A='$A'" + # Для печатных символов + if {$A ne ""} { + DebugPuts "Inserting character '$A' and restoring bindings" + # Восстанавливаем привязки перед вставкой + Helper::VarHelperBindingsRestore $widget + # Вставляем символ + $widget insert "insert" $A + } + return -code break + } + } + } + + proc VarHelper {x y w word wordType} { + global editors lexers variables + variable txt + variable win + + DebugPuts "=== VarHelper called: word='$word', wordType='$wordType' ===" + + set txt $w + # Проверяем если есть выделение то блокировать появление диалога + if {[$txt tag ranges sel] != ""} { + DebugPuts "You have selected text [$txt tag ranges sel]" + return + } + + set fileType [dict get $editors $txt fileType] + + if {[dict exists $editors $txt variableList] != 0} { + set varList [dict get $editors $txt variableList] + } else { + set varList {} + } + if {[dict exists $editors $txt procedureList] != 0} { + set procList [dict get $editors $txt procedureList] + } else { + set procList {} + } + + if {[dict exists $lexers $fileType commands] != 0} { + foreach i [dict get $lexers $fileType commands] { + lappend procList $i + } + } + + set findedVars "" + switch -- $wordType { + vars { + foreach i [lsearch -nocase -all $varList $word*] { + set item [lindex [lindex $varList $i] 0] + if {[lsearch $findedVars $item] eq "-1"} { + lappend findedVars $item + } + } + } + procedure { + foreach i [lsearch -nocase -all $procList $word*] { + set item [lindex [lindex $procList $i] 0] + if {[lsearch $findedVars $item] eq "-1"} { + lappend findedVars $item + } + } + } + default { + foreach i [lsearch -nocase -all $varList $word*] { + set item [lindex [lindex $varList $i] 0] + if {[lsearch $findedVars $item] eq "-1"} { + lappend findedVars $item + } + } + foreach i [lsearch -nocase -all $procList $word*] { + set item [lindex [lindex $procList $i] 0] + if {[lsearch $findedVars $item] eq "-1"} { + lappend findedVars $item + } + } + } + } + + DebugPuts "Found [llength $findedVars] items: $findedVars" + + if {$findedVars eq ""} { + DebugPuts "No items found, returning" + return + } + + VarHelperDialog $x $y $w $word $findedVars + } + + proc VarHelperDialog {x y w word findedVars} { + variable txt + variable win + + set txt $w + set win .varhelper + + DebugPuts "VarHelperDialog called with [llength $findedVars] items" + + # Если окно уже существует, уничтожаем его + if {[winfo exists $win]} { + DebugPuts "Window already exists, destroying it" + destroy $win + Helper::VarHelperBindingsRestore $txt + } + + toplevel $win + wm transient $win . + wm overrideredirect $win 1 + + listbox $win.lBox -width 30 -border 0 + pack $win.lBox -expand true -fill y -side left + + foreach item $findedVars { + $win.lBox insert end $item + } + + DebugPuts "Listbox created with [llength $findedVars] items" + + # Выбираем первый элемент + if {[llength $findedVars] > 0} { + $win.lBox selection set 0 + $win.lBox activate 0 + } + + if {[set height [llength $findedVars]] > 10} { + set height 10 + } + $win.lBox configure -height $height + + Helper::VarHelperBindingsSetup $w + + # Привязка для закрытия окна списка + bind $win [list apply {{win txt} { + set ::listActive 0 + Helper::VarHelperBindingsRestore $txt + set ::previousInput "" + }} $win $txt.t] + + # Определяем расстояние до края экрана (основного окна) и если + # оно меньше размера окна со списком то сдвигаем его вверх + set winGeomY [winfo reqheight $win] + set winGeomX [winfo reqwidth $win] + + set topHeight [winfo height .] + set topWidth [winfo width .] + set topLeftUpperX [winfo x .] + set topLeftUpperY [winfo y .] + set topRightLowerX [expr $topLeftUpperX + $topWidth] + set topRightLowerY [expr $topLeftUpperY + $topHeight] + + if {[expr $x + $winGeomX] > $topRightLowerX} { + set x [expr $x - $winGeomX] + } + if {[expr $y + $winGeomY] > $topRightLowerY} { + set y [expr $y - $winGeomY] + } + set ::listActive 1 + DebugPuts "Showing window at +$x+$y" + wm geom $win +$x+$y + } + + proc VarHelperBindingsSetup {txt} { + DebugPuts "Setting up bindings for $txt" + + # Сбрасываем сохраненные привязки + set ::originalBindings {} + + # Список событий для перехвата + set events { } + + # Сохраняем и заменяем привязки + foreach event $events { + # Получаем текущую привязку + set original [bind $txt $event] + DebugPuts " Saving binding for $event: '$original'" + + # Сохраняем оригинал + lappend ::originalBindings [list $event $original] + + # Устанавливаем новую привязку + bind $txt $event [list Helper::VarHelperKey $txt $event %A] + } + } + + # Восстановление оригинальных привязок + proc VarHelperBindingsRestore {txt} { + DebugPuts "Restoring bindings for $txt" + DebugPuts "Have [llength $::originalBindings] bindings to restore" + + if {![info exists ::originalBindings]} { + DebugPuts " No original bindings stored" + # Очищаем наши привязки + foreach event { } { + bind $txt $event {} + } + return + } + + # Восстанавливаем оригинальные привязки + foreach binding $::originalBindings { + set event [lindex $binding 0] + set command [lindex $binding 1] + DebugPuts " Restoring $event: '$command'" + + if {$command eq ""} { + bind $txt $event {} + } else { + bind $txt $event $command + } + } + + # Очищаем сохраненные привязки + set ::originalBindings {} + } + + proc SelectFromList {txt} { + set win .varhelper + + DebugPuts "SelectFromList called" + + if {![winfo exists $win]} { + DebugPuts "Window doesn't exist" + return + } + + # Получаем выбранный элемент + set selected [$win.lBox curselection] + DebugPuts "Selected index: $selected" + + if {$selected ne ""} { + set text [$win.lBox get $selected] + DebugPuts "Selected text: $text" + + # Вставляем выбранный текст в текстовое поле + $txt delete "insert - 1 chars wordstart" "insert wordend - 1 chars" + $txt insert "insert" $text + + # Закрываем окно списка + destroy $win + set ::listActive 0 + Helper::VarHelperBindingsRestore $txt + set ::previousInput "" + + # Возвращаем фокус + focus $txt.t + } + } + + proc DebugPuts {msg} { + puts "DEBUG: $msg" + } +} + + + + diff --git a/lib/imgviewer.tcl b/lib/imgviewer.tcl index 436cf66..6c143c1 100644 --- a/lib/imgviewer.tcl +++ b/lib/imgviewer.tcl @@ -19,7 +19,7 @@ proc ImageViewer {f w node} { #$w.scrwin setwidget $w.scrwin.f openImg $f $w.f.c $node } - + proc openImg {fn w node} { global im1 factor set im1 [image create photo -file $fn] -- 2.49.1 From 3de27dac4fefebda1b7bb9ea4f42830fc47939ed Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 29 Jan 2026 14:22:55 +0300 Subject: [PATCH 51/72] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D1=81?= =?UTF-8?q?=D0=BE=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=BE=D0=BC=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D0=B2=D1=81=D0=BF=D0=BB=D1=8B=D0=B2=D0=B0=D1=8E=D1=89?= =?UTF-8?q?=D0=B5=D0=B3=D0=BE=20=D0=BE=D0=BA=D0=BD=D0=B0.=20=D0=A2=D0=B5?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D1=8C=20=D1=82=D0=B0=D0=BC=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B6=D0=BD=D0=BE=20=D0=B2=D1=8B=D0=B1=D1=80=D0=B0=D1=82=D1=8C?= =?UTF-8?q?=20=D0=B8=D0=B7=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=B5=D0=BB=D0=BA=D0=B0=D0=BC=D0=B8=20=D0=B8=20?= =?UTF-8?q?=D0=B2=D1=81=D1=82=D0=B0=D0=B2=D0=B8=D1=82=D1=8C=20=D0=BF=D0=BE?= =?UTF-8?q?=20Enter.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/editor.tcl | 76 ++++++++++++++++++++++++++++++++++++++++++++++---- lib/helper.tcl | 46 +++++++++++++++--------------- 2 files changed, 94 insertions(+), 28 deletions(-) diff --git a/lib/editor.tcl b/lib/editor.tcl index 9326f6d..ff85af6 100644 --- a/lib/editor.tcl +++ b/lib/editor.tcl @@ -16,7 +16,7 @@ namespace eval Editor { $node.frmText.t configure -$optionName $value } } - + # Comment one string or selected string proc Comment {txt fileType} { global lexers cfgVariables @@ -404,7 +404,14 @@ namespace eval Editor { } proc ReleaseKey {k txt fileType} { - global cfgVariables lexers + global cfgVariables lexers returnProcessed + # Если Return уже обработан в SelectFromList, пропускаем + # puts "$returnProcessed $k" + if {$k eq "Return" && [info exists returnProcessed]} { + unset returnProcessed + return + } + # set pos [$txt index insert] set lineNum [lindex [split $pos "."] 0] set posNum [lindex [split $pos "."] 1] @@ -508,10 +515,68 @@ namespace eval Editor { if {$cfgVariables(variableHelper) eq "true"} { if {[dict exists $lexers $fileType variableSymbol] != 0} { set varSymbol [dict get $lexers $fileType variableSymbol] - set lastSymbol [string last $varSymbol [$txt get $lineNum.0 $pos]] + set lineText [$txt get $lineNum.0 $pos] + # # Ищем переменную с помощью регулярного выражения + # # Паттерн ищет $ за которым идет имя переменной И курсор сразу после имени + # if {[regexp "(\\$)(\[a-zA-Z_:\]\[a-zA-Z0-9_:\]*)\$" $lineText -> symbol varName]} { + # # Проверяем, что найденный $ - это действительно начало переменной + # # (а не часть строки или другого символа) + # DebugPuts "Found variable: $symbol$varName" + # + # # Дополнительная проверка: перед $ не должно быть обратного слэша (экранирование) + # set posOfVarSymbol [string last $varSymbol $lineText] + # if {$posOfVarSymbol > 0} { + # set charBefore [string index $lineText [expr {$posOfVarSymbol - 1}]] + # if {$charBefore eq "\\"} { + # DebugPuts "Dollar sign is escaped, skipping" + # return + # } + # } + # Helper::VarHelper $box_x $box_y $txt $varName vars + # } + DebugPuts "Line text: '$lineText'" + + # Проверяем, есть ли $ в строке + set lastSymbol [string last $varSymbol $lineText] if {$lastSymbol ne "-1"} { - set word [string trim [$txt get $lineNum.[expr $lastSymbol + 1] $pos]] - Helper::VarHelper $box_x $box_y $txt $word vars + # Проверяем экранирование + if {$lastSymbol > 0} { + set charBefore [string index $lineText [expr {$lastSymbol - 1}]] + if {$charBefore eq "\\"} { + DebugPuts "Dollar sign is escaped, skipping" + return + } + } + # Берем текст после $ + set afterDollar [string range $lineText [expr {$lastSymbol + 1}] end] + DebugPuts "Text after $varSymbol: '$afterDollar'" + # Если после $ ничего нет (только что ввели $) - показываем все переменные + if {$afterDollar eq ""} { + DebugPuts "Just typed $varSymbol, showing all variables" + Helper::VarHelper $box_x $box_y $txt "" vars + return + } + # Проверяем, что введено после $ + if {[regexp {^([a-zA-Z_:][a-zA-Z0-9_:]*)?$} $afterDollar -> varName]} { + # Вариант 1: regexp с концом строки - курсор сразу после (возможного) имени + DebugPuts "Cursor after variable name (or $varSymbol only): '$varName'" + Helper::VarHelper $box_x $box_y $txt $varName vars + } elseif {[regexp {^([a-zA-Z_:][a-zA-Z0-9_:]*)} $afterDollar -> varName]} { + # Вариант 2: есть имя переменной, но курсор не обязательно сразу после + DebugPuts "Found variable name: '$varName'" + # Проверяем позицию курсора + set varEndPos [expr {[string length $varName] + 1}] ; # +1 для $ + + if {$varEndPos == [string length $lineText]} { + # Курсор сразу после имени + Helper::VarHelper $box_x $box_y $txt $varName vars + } else { + DebugPuts "Cursor not immediately after variable name, skipping" + } + } else { + # После $ что-то недопустимое (например, цифра, скобка и т.д.) + DebugPuts "Invalid characters after $varSymbol" + } } } else { set ind [$txt search -backwards -regexp {\W} $pos {insert linestart}] @@ -523,6 +588,7 @@ namespace eval Editor { # set ind [$txt search -backwards -regexp {^} $pos {insert linestart}] set word [$txt get {insert linestart} $pos] } + DebugPuts "> Extracted word: '$word'" if {$word ne ""} { Helper::VarHelper $box_x $box_y $txt $word {} } diff --git a/lib/helper.tcl b/lib/helper.tcl index 8dd03e1..b78e084 100644 --- a/lib/helper.tcl +++ b/lib/helper.tcl @@ -4,7 +4,7 @@ namespace eval Helper { variable ::listActive 0 # Переменная для отслеживания предыдущего ввода (чтобы не обновлять список без необходимости) variable ::previousInput "" - + proc VarHelperKey { widget K A } { set win .varhelper DebugPuts "Helper::VarHelperKey: K=$K, A='$A'" @@ -16,7 +16,7 @@ namespace eval Helper { set ::listActive 0 return } - + switch -- $K { { DebugPuts "Processing Up arrow" @@ -275,7 +275,7 @@ namespace eval Helper { } return } - + # Восстанавливаем оригинальные привязки foreach binding $::originalBindings { set event [lindex $binding 0] @@ -288,49 +288,49 @@ namespace eval Helper { bind $txt $event $command } } - + # Очищаем сохраненные привязки set ::originalBindings {} } proc SelectFromList {txt} { + global returnProcessed editors lexers set win .varhelper - - DebugPuts "SelectFromList called" + puts "[dict get $editors $txt fileType]" + puts "[dict get $lexers [dict get $editors $txt fileType] variableSymbol]" if {![winfo exists $win]} { - DebugPuts "Window doesn't exist" return } - - # Получаем выбранный элемент set selected [$win.lBox curselection] - DebugPuts "Selected index: $selected" - if {$selected ne ""} { - set text [$win.lBox get $selected] - DebugPuts "Selected text: $text" - - # Вставляем выбранный текст в текстовое поле - $txt delete "insert - 1 chars wordstart" "insert wordend - 1 chars" - $txt insert "insert" $text - - # Закрываем окно списка + set text [string trim [$win.lBox get $selected]] + set varSymbol [dict get $lexers [dict get $editors $txt fileType] variableSymbol] + # Опеределяем что символ перед позицией вставки равен символу переменной из настроек lexers + # если равен то вставляем выбранное из списка сразу за ним + # если нет то удаляем введенный текст до этого символа и вставляем выбранное из списка + if {[$txt get "insert - 1 char" "insert"] eq $varSymbol} { + $txt insert "insert" $text + } else { + $txt delete "insert - 1 chars wordstart" "insert wordend - 1 chars" + $txt insert "insert" $text + } + # Закрываем окно destroy $win set ::listActive 0 Helper::VarHelperBindingsRestore $txt set ::previousInput "" + + # Устанавливаем флаг, что Return уже обработан + set returnProcessed 1 + # after 10 {catch {unset returnProcessed}} - # Возвращаем фокус focus $txt.t } } - proc DebugPuts {msg} { puts "DEBUG: $msg" } } - - -- 2.49.1 From 782ed0298a71e03b5b7314b8735312e2fc4b93b9 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 29 Jan 2026 14:58:09 +0300 Subject: [PATCH 52/72] =?UTF-8?q?=D0=92=D1=8B=D0=BF=D1=83=D1=81=D0=BA=203-?= =?UTF-8?q?=D0=B9=20=D0=B1=D0=B5=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debian/changelog | 8 ++++++++ projman.tcl | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index a7f1d13..f7477d7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +projman (2.0.0-beta3) stable; urgency=medium + + * Вынес код связанный с обработкой подсказок при вводе переменных и процедур в отдельный модуль. + * Исправил работу со списком переменных из всплывающего окна. Теперь там можно выбрать из списка стрелками и вставить по Enter. Исправил обработку клавиш Вверх Вниз Ввод Отмена в окне со списком вариантов. + + -- svk Thu, 29 Jan 2026 14:22:55 +0300 + projman (2.0.0-beta2) stable; urgency=medium * Добавлено подключение (bind) сочетания клавиш указанных в настройках инструментов. @@ -486,3 +493,4 @@ projman (2.0.0-alfa0) stable; urgency=medium + diff --git a/projman.tcl b/projman.tcl index ccd279f..dc38804 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: beta2 -# Build: 28012026124210 +# Release: beta3 +# Build: 29012026142306 ###################################################### # определим текущую версию, релиз и т.д. -- 2.49.1 From 166cd5f4d85a1b756c0ea1b8d3524c71b8adb514 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 29 Jan 2026 15:57:16 +0300 Subject: [PATCH 53/72] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D1=83=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BD=D0=B0=D0=BB=D0=B8=D1=87=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=81=D0=B8=D0=BC=D0=B2=D0=BE=D0=BB=D0=B0=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/helper.tcl | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/helper.tcl b/lib/helper.tcl index b78e084..dadd7c1 100644 --- a/lib/helper.tcl +++ b/lib/helper.tcl @@ -296,8 +296,8 @@ namespace eval Helper { proc SelectFromList {txt} { global returnProcessed editors lexers set win .varhelper - puts "[dict get $editors $txt fileType]" - puts "[dict get $lexers [dict get $editors $txt fileType] variableSymbol]" + # puts "[dict get $editors $txt fileType]" + # puts "[dict get $lexers [dict get $editors $txt fileType] variableSymbol]" if {![winfo exists $win]} { return @@ -305,7 +305,12 @@ namespace eval Helper { set selected [$win.lBox curselection] if {$selected ne ""} { set text [string trim [$win.lBox get $selected]] - set varSymbol [dict get $lexers [dict get $editors $txt fileType] variableSymbol] + # DebugPuts "[dict exists $lexers [dict get $editors $txt fileType] variableSymbol]" + if [dict exists $lexers [dict get $editors $txt fileType] variableSymbol] { + set varSymbol [dict get $lexers [dict get $editors $txt fileType] variableSymbol] + } else { + set varSymbol "" + } # Опеределяем что символ перед позицией вставки равен символу переменной из настроек lexers # если равен то вставляем выбранное из списка сразу за ним # если нет то удаляем введенный текст до этого символа и вставляем выбранное из списка @@ -333,4 +338,3 @@ namespace eval Helper { } } - -- 2.49.1 From c2d128dd42eefb91d88b1edc0adba78da644981c Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 29 Jan 2026 16:00:03 +0300 Subject: [PATCH 54/72] =?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 dc38804..519f949 100755 --- a/projman.tcl +++ b/projman.tcl @@ -10,7 +10,7 @@ exec wish8.6 "$0" -- "$@" ###################################################### # Version: 2.0.0 # Release: beta3 -# Build: 29012026142306 +# Build: 29012026155729 ###################################################### # определим текущую версию, релиз и т.д. -- 2.49.1 From e86b600cd9b625ee312c589f0c8a04c8ee8cdffd Mon Sep 17 00:00:00 2001 From: svk Date: Fri, 30 Jan 2026 13:47:05 +0300 Subject: [PATCH 55/72] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B4=D0=B8=D0=B0=D0=BB=D0=BE=D0=B3=20'=D0=A1=D0=BE?= =?UTF-8?q?=D1=85=D1=80=D0=B0=D0=BD=D0=B8=D1=82=D1=8C=20=D0=BA=D0=B0=D0=BA?= =?UTF-8?q?'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debian/changelog | 1 + lib/editor.tcl | 2 ++ lib/files.tcl | 29 +++++++++++++++++++++++++++-- lib/helper.tcl | 1 - lib/menu.tcl | 2 ++ projman.tcl | 2 +- 6 files changed, 33 insertions(+), 4 deletions(-) diff --git a/debian/changelog b/debian/changelog index f7477d7..ff29f9b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,6 @@ projman (2.0.0-beta3) stable; urgency=medium + * Добавил диалог вменю "Сохранить как" * Вынес код связанный с обработкой подсказок при вводе переменных и процедур в отдельный модуль. * Исправил работу со списком переменных из всплывающего окна. Теперь там можно выбрать из списка стрелками и вставить по Enter. Исправил обработку клавиш Вверх Вниз Ввод Отмена в окне со списком вариантов. diff --git a/lib/editor.tcl b/lib/editor.tcl index ff85af6..1a2ebc5 100644 --- a/lib/editor.tcl +++ b/lib/editor.tcl @@ -745,6 +745,8 @@ namespace eval Editor { } bind $txt "Editor::SplitEditorForExecute $w $fileType $nb " bind $txt "Editor::SplitEditorForExecute $w $fileType $nb " + # bind $txt FileOper::Close + # bind $txt "FileOper::Close saveas" # bind $txt.t "Editor::ReleaseKey %K $txt.t $fileType" # bind $txt.t "Editor::PressKey %K $txt.t" diff --git a/lib/files.tcl b/lib/files.tcl index df4cdb3..04db052 100644 --- a/lib/files.tcl +++ b/lib/files.tcl @@ -383,6 +383,8 @@ namespace eval FileOper { set filePath [Tree::GetItemID $tree $treeItem] } set editedText [$nbEditorItem.frmText.t get 0.0 end] + if {$type eq "saveas"} {set filePath [FileOper::SaveDialog]} + DebugPuts "FileOper::Save $filePath" set f [open $filePath "w+"] puts -nonewline $f $editedText # puts "$f was saved" @@ -397,7 +399,7 @@ namespace eval FileOper { Tools::GetMenu .popup.tools Tools::GetMenu .frmMenu.mnuTools.m } - if [string match "*untitled*" $nbEditorItem] { + if {[string match "*untitled*" $nbEditorItem] || $type eq "saveas"} { FileOper::Close if {$type ne "close"} { FileOper::Edit $filePath @@ -627,5 +629,28 @@ namespace eval FileOper { # set selEnd [lindex [$txt tag ranges sel] 1] # puts [$txt get [$txt tag ranges sel]] # } - + + proc SaveDialog {} { + global env project activeProject + if [info exists activeProject] { + set dir $activeProject + } else { + set dir $env(HOME) + } + set fileName [tk_getSaveFile -initialdir $dir -filetypes $::types -parent .] + set fullPath [file join $dir $fileName] + set file [string range $fullPath [expr [string last "/" $fullPath]+1] end] + DebugPuts "FileOper::SaveDialog $fullPath" + regsub -all "." $file "_" node + set dir [file dirname $fullPath] + set file [file tail $fullPath] + set name [file rootname $file] + set ext [string range [file extension $file] 1 end] + if {$fullPath != ""} { + # puts $fullPath + return $fullPath + } else { + return + } + } } diff --git a/lib/helper.tcl b/lib/helper.tcl index dadd7c1..64346f8 100644 --- a/lib/helper.tcl +++ b/lib/helper.tcl @@ -337,4 +337,3 @@ namespace eval Helper { puts "DEBUG: $msg" } } - diff --git a/lib/menu.tcl b/lib/menu.tcl index 92643ea..1993f14 100644 --- a/lib/menu.tcl +++ b/lib/menu.tcl @@ -20,6 +20,8 @@ proc GetFileMenu {m} { } $m add command -label [::msgcat::mc "Save file"] -command {FileOper::Save}\ -accelerator "Ctrl+S" + $m add command -label [::msgcat::mc "Save as"] -command {FileOper::Save saveas}\ + -accelerator "Shift+Ctrl+S" $m add command -label [::msgcat::mc "Close file"] -command {FileOper::Close}\ -accelerator "Ctrl+w" $m add command -label [::msgcat::mc "Close all"] -command {FileOper::CloseAll} diff --git a/projman.tcl b/projman.tcl index 519f949..badd6a2 100755 --- a/projman.tcl +++ b/projman.tcl @@ -10,7 +10,7 @@ exec wish8.6 "$0" -- "$@" ###################################################### # Version: 2.0.0 # Release: beta3 -# Build: 29012026155729 +# Build: 30012026134326 ###################################################### # определим текущую версию, релиз и т.д. -- 2.49.1 From 478f1d156fa3fe4cfd7051af33d8fc7d41048243 Mon Sep 17 00:00:00 2001 From: svk Date: Fri, 30 Jan 2026 14:07:14 +0300 Subject: [PATCH 56/72] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B2=20=D0=B4=D0=B8=D0=B0=D0=BB=D0=BE=D0=B3=20FileOper::SaveF?= =?UTF-8?q?ile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/files.tcl | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/files.tcl b/lib/files.tcl index 04db052..4d301ed 100644 --- a/lib/files.tcl +++ b/lib/files.tcl @@ -364,7 +364,7 @@ namespace eval FileOper { set nbEditorWindow "[lindex $str 0].[lindex $str 1].[lindex $str 2]" # puts "FileOper::Save: current window $nbEditorWindow" } - # puts "FileOper::Save: $nbEditorWindow" + set nbEditorItem [$nbEditorWindow select] DebugPuts "Saved editor text: $nbEditorItem" if [string match "*untitled*" $nbEditorItem] { @@ -382,8 +382,13 @@ namespace eval FileOper { set treeItem "file::[string range $nbEditorItem [expr [string last "." $nbEditorItem] +1] end ]" set filePath [Tree::GetItemID $tree $treeItem] } + if {![winfo exists $nbEditorItem.frmText.t]} { + DebugPuts "winfo exists $nbEditorWindow.frmText.t equal [winfo exists $nbEditorWindow.frmText.t]" + return + } set editedText [$nbEditorItem.frmText.t get 0.0 end] if {$type eq "saveas"} {set filePath [FileOper::SaveDialog]} + if {$filePath eq "cancel"} {return} DebugPuts "FileOper::Save $filePath" set f [open $filePath "w+"] puts -nonewline $f $editedText @@ -638,9 +643,10 @@ namespace eval FileOper { set dir $env(HOME) } set fileName [tk_getSaveFile -initialdir $dir -filetypes $::types -parent .] + if {$fileName eq ""} {return "cancel"} set fullPath [file join $dir $fileName] set file [string range $fullPath [expr [string last "/" $fullPath]+1] end] - DebugPuts "FileOper::SaveDialog $fullPath" + DebugPuts "FileOper::SaveDialog $fileName $fullPath" regsub -all "." $file "_" node set dir [file dirname $fullPath] set file [file tail $fullPath] -- 2.49.1 From bded0b22b14535285ce1f02c9d9f0131ddef55c3 Mon Sep 17 00:00:00 2001 From: svk Date: Fri, 30 Jan 2026 14:08:05 +0300 Subject: [PATCH 57/72] =?UTF-8?q?=D0=9F=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/menu.tcl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/menu.tcl b/lib/menu.tcl index 1993f14..4526087 100644 --- a/lib/menu.tcl +++ b/lib/menu.tcl @@ -20,8 +20,7 @@ proc GetFileMenu {m} { } $m add command -label [::msgcat::mc "Save file"] -command {FileOper::Save}\ -accelerator "Ctrl+S" - $m add command -label [::msgcat::mc "Save as"] -command {FileOper::Save saveas}\ - -accelerator "Shift+Ctrl+S" + $m add command -label [::msgcat::mc "Save as"] -command {FileOper::Save saveas} $m add command -label [::msgcat::mc "Close file"] -command {FileOper::Close}\ -accelerator "Ctrl+w" $m add command -label [::msgcat::mc "Close all"] -command {FileOper::CloseAll} -- 2.49.1 From 3860db2c264b31616c7190d20cca16cb2a501451 Mon Sep 17 00:00:00 2001 From: svk Date: Fri, 30 Jan 2026 14:10:22 +0300 Subject: [PATCH 58/72] =?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 --- debian/changelog | 2 ++ projman.tcl | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index ff29f9b..2a8f9dd 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,7 @@ projman (2.0.0-beta3) stable; urgency=medium * Добавил диалог вменю "Сохранить как" + * Добавил проверки в диалог FileOper::SaveFile * Вынес код связанный с обработкой подсказок при вводе переменных и процедур в отдельный модуль. * Исправил работу со списком переменных из всплывающего окна. Теперь там можно выбрать из списка стрелками и вставить по Enter. Исправил обработку клавиш Вверх Вниз Ввод Отмена в окне со списком вариантов. @@ -495,3 +496,4 @@ projman (2.0.0-alfa0) stable; urgency=medium + diff --git a/projman.tcl b/projman.tcl index badd6a2..e708b6b 100755 --- a/projman.tcl +++ b/projman.tcl @@ -10,7 +10,7 @@ exec wish8.6 "$0" -- "$@" ###################################################### # Version: 2.0.0 # Release: beta3 -# Build: 30012026134326 +# Build: 30012026140811 ###################################################### # определим текущую версию, релиз и т.д. -- 2.49.1 From 7511a5445eb65e333928f6beb8f9fd99316bf234 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 5 Feb 2026 18:49:28 +0300 Subject: [PATCH 59/72] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D1=81=D0=BC=D0=B5=D0=BD=D1=83=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=20=D0=B2=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2=D0=BA=D0=B0=D1=85=20=D0=B2=D0=BA?= =?UTF-8?q?=D0=BB=D0=B0=D0=B4=D0=BE=D0=BA,=20=D1=82=D0=B5=D0=BF=D0=B5?= =?UTF-8?q?=D1=8C=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2=20=D0=B2=D0=BE=20=D0=B2=D0=BA=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B0=D1=85=20=D0=BA=D0=B0=D0=BA=20=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=BB=D0=B6=D0=BD=D1=8B=20=D0=B1=D1=8B=D1=82=D1=8C.=20?= =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D1=83=20Return=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B8=20=D1=84=D1=83=D0=BD=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0=20=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D1=85=D0=BE=D0=B4=D0=B0=20=D0=BF=D0=BE?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D0=B5=D0=B4=D1=83=D1=80=D0=B0?= =?UTF-8?q?=D0=BC/=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=D0=BC/=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B0=D0=BC=20=D0=B2=D0=BD=D1=83?= =?UTF-8?q?=D1=82=D1=80=D0=B8=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=BD=D0=B0=D0=B6=D0=B0=D1=82=D0=B8=D1=8E=20Control-j?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/editor.tcl | 2 +- lib/notebook.tcl | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/editor.tcl b/lib/editor.tcl index 1a2ebc5..a7c6a6f 100644 --- a/lib/editor.tcl +++ b/lib/editor.tcl @@ -694,7 +694,7 @@ namespace eval Editor { bind $txt <> "SetModifiedFlag $w $nb auto" bind $txt "Editor::SearchBrackets %W" bind $txt "Editor::SearchBrackets %W" - bind $txt "catch {Editor::GoToFunction $txt}" + bind $txt "catch {Editor::GoToFunction $txt}; break" bind $txt "catch {Editor::GoToFunction $txt}; break" bind $txt {Redo; break} bind $txt "catch {Editor::GoToFunction $txt}; break" diff --git a/lib/notebook.tcl b/lib/notebook.tcl index 91cd555..9ade731 100644 --- a/lib/notebook.tcl +++ b/lib/notebook.tcl @@ -13,6 +13,7 @@ namespace eval NB { proc InsertItem {nb item type} { switch $type { file { + set titleFileName [file tail $item] set item [string tolower $item] regsub -all {\.|/|\\|\s|:} $item "_" itemName # puts "$item -> $itemName" @@ -21,7 +22,7 @@ namespace eval NB { } else { set fm [ttk::frame $nb.$itemName] pack $fm -side top -expand true -fill both - $nb add $fm -text [file tail $item];# -image close_12x12 -compound right + $nb add $fm -text $titleFileName;# -image close_12x12 -compound right $nb select $fm } } -- 2.49.1 From 5dc1da5dbf94bf8c48041646dda84bc583939f2b Mon Sep 17 00:00:00 2001 From: svk Date: Fri, 6 Feb 2026 12:12:36 +0300 Subject: [PATCH 60/72] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20ch?= =?UTF-8?q?angelog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG | 1 + debian/changelog | 7 ++++++- lib/notebook.tcl | 2 +- redhat/build-rpm.sh | 4 +++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 024df15..dcc39b6 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ + projman (2.0.0-beta1) stable; urgency=medium * Сделан вывод отладочной информации по запросу. diff --git a/debian/changelog b/debian/changelog index 2a8f9dd..fd921cb 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +projman (2.0.0-beta3) stable; urgency=medium + + * Исправил смену регистра в заголовках вкладок + + -- svk Thu, 5 Feb 2026 18:49:28 +0300 + projman (2.0.0-beta3) stable; urgency=medium * Добавил диалог вменю "Сохранить как" @@ -496,4 +502,3 @@ projman (2.0.0-alfa0) stable; urgency=medium - diff --git a/lib/notebook.tcl b/lib/notebook.tcl index 9ade731..5157520 100644 --- a/lib/notebook.tcl +++ b/lib/notebook.tcl @@ -33,7 +33,7 @@ namespace eval NB { set fm [ttk::frame $nb.$item] pack $fm -side top -expand true -fill both $nb add $fm -text Git;# -image close_12x12 -compound right - $nb select $fm + $nb select $fm } } # puts "NB item - $fm" diff --git a/redhat/build-rpm.sh b/redhat/build-rpm.sh index 9457944..384fbff 100755 --- a/redhat/build-rpm.sh +++ b/redhat/build-rpm.sh @@ -18,6 +18,8 @@ cp projman.tcl projman sed -i "s+^set\ dir(lib)+set\ dir(lib)\ /usr/share/projman/lib ;#+g" projman sed -i "s+\[pwd\]+/usr/share/projman+g" projman +./changelog-gen.tcl --project-name projman --project-version ${VERSION} --project-release ${RELEASE} --out-file redhat/projman.spec --rpm --last + CUR_DIR=$(pwd) cd ../ @@ -31,7 +33,7 @@ cp redhat/projman.spec ${RPM_BUILD_DIR}/SPECS/projman.spec sed -i "s/.*Version:.*/Version:\t${VERSION}/" ${RPM_BUILD_DIR}/SPECS/projman.spec sed -i "s/.*Release:.*/Release:\t${RELEASE}/" ${RPM_BUILD_DIR}/SPECS/projman.spec -rpmbuild -ba "${RPM_BUILD_DIR}/SPECS/projman.spec" +fakeroot rpmbuild -ba "${RPM_BUILD_DIR}/SPECS/projman.spec" # cp ${RPM_BUILD_DIR}/RPMS/noarch/projman-${VERSION}-${RELEASE}.noarch.rpm /files/ # cp ${RPM_BUILD_DIR}/SRPMS/projman-${VERSION}-${RELEASE}.src.rpm /files/ -- 2.49.1 From 676a0e618570f421719655c7d7030f902dc65817 Mon Sep 17 00:00:00 2001 From: svk Date: Fri, 6 Feb 2026 12:40:46 +0300 Subject: [PATCH 61/72] =?UTF-8?q?changelog-gen:=20=D0=B4=D0=BE=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B0=D0=BB=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8E=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D0=B8?= =?UTF-8?q?=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20rmp.spec?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog-gen.tcl | 153 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 136 insertions(+), 17 deletions(-) diff --git a/changelog-gen.tcl b/changelog-gen.tcl index 78a6c0d..521f08b 100755 --- a/changelog-gen.tcl +++ b/changelog-gen.tcl @@ -106,9 +106,9 @@ proc ReadGitLog {} { } } -proc StoreProjectInfo {timeStamp} { +proc StoreProjectInfo {timeStamp changelogFormat} { global dir args - set cfgFile [open [file join $dir(cfg) $args(--project-name).conf] "w+"] + set cfgFile [open [file join $dir(cfg) $args(--project-name).$changelogFormat.conf] "w+"] puts $cfgFile "# set args(--project-version) \"$args(--project-version)\"" puts $cfgFile "# set args(--project-release) \"$args(--project-release)\"" puts $cfgFile "set lastCommitTimeStamp \"$timeStamp\"" @@ -141,37 +141,76 @@ proc GenerateChangelogDEB {} { set timeStamp [clock format [clock scan $timeStamp] -format {%a, %e %b %Y %H:%M:%S %z}] # puts "> $commiter" if {$index == 0} { - puts "$args(--project-name) ($args(--project-version)-$args(--project-release)) stable; urgency=medium\n" + # puts "$args(--project-name) ($args(--project-version)-$args(--project-release)) stable; urgency=medium\n" append outText "$args(--project-name) ($args(--project-version)-$args(--project-release)) stable; urgency=medium\n\n" set commiter [lindex $record 2] - StoreProjectInfo $timeStamp + StoreProjectInfo $timeStamp "deb" # puts "\n \[ [string trim $commiter] \]" } # puts ">> $commiter" if {$commiter ne [lindex $record 2]} { - puts "\n -- [string trim $commiter] <$email> $timeStamp" + # puts "\n -- [string trim $commiter] <$email> $timeStamp" append outText "\n -- [string trim $commiter] <$email> $timeStamp\n" - puts "\n$args(--project-name) ($args(--project-version)-$args(--project-release)) stable; urgency=medium\n" + # puts "\n$args(--project-name) ($args(--project-version)-$args(--project-release)) stable; urgency=medium\n" append outText "\n$args(--project-name) ($args(--project-version)-$args(--project-release)) stable; urgency=medium\n\n" set commiter [lindex $record 2] # puts "\n \[ [string trim $commiter] \]" } set commitTex [lindex $record 4] - puts " * $commitTex" + # puts " * $commitTex" append outText " * $commitTex\n" } - puts "\n -- [string trim $commiter] <$email> $timeStamp" + # puts "\n -- [string trim $commiter] <$email> $timeStamp" append outText "\n -- [string trim $commiter] <$email> $timeStamp\n" return $outText } proc GenerateChangelogRPM {} { - puts "GenerateChangelogRPM" - + global args + # puts "GenerateChangelogRPM" + set lastCommitTimeStamp "" + set commiter "" + set commitText "" + # ReadGitLog + set lst [lsort -integer -index 0 [ReadGitLog]] + # puts $lst + # exit + set outText "" + foreach l $lst { + set index [lindex $l 0] + set line [lindex $l 1] + # puts "$index - $line" + set record [split $line ","] + set timeStamp [string trim [lindex $record 1]] + set email [string trim [lindex $record 3]] + if {$lastCommitTimeStamp eq ""} { + set lastCommitTimeStamp [string trim [lindex $record 1]] + } + set timeStamp [clock format [clock scan $timeStamp] -format {%a %e %b %Y}] + if {$index == 0} { + set commiter [lindex $record 2] + append outText "$timeStamp [string trim $commiter] <$email> $args(--project-version)-$args(--project-release)\n" + StoreProjectInfo $timeStamp "deb" + } + if {$commiter ne [lindex $record 2]} { + append outText "\n" + append outText "$timeStamp [string trim $commiter] <$email> $args(--project-version)-$args(--project-release)\n" + set commiter [lindex $record 2] + } + + set commitTex [lindex $record 4] + # puts " * $commitTex" + append outText " * $commitTex\n" + + } + # puts "\n -- [string trim $commiter] <$email> $timeStamp" + # append outText "\n -- [string trim $commiter] <$email> $timeStamp\n" + return $outText } + proc GenerateChangelogTXT {} { global args set lastCommitTimeStamp "" @@ -189,14 +228,15 @@ proc GenerateChangelogTXT {} { if {$lastCommitTimeStamp eq ""} { set lastCommitTimeStamp [string trim [lindex $record 1]] } - set timeStamp [clock format [clock scan $timeStamp] -format {%a, %e %b %Y %H:%M:%S %z}] + # * Mon Nov 28 2022 Sergey Kalinin 2.0.0 + set timeStamp [clock format [clock scan $timeStamp] -format {%a %b %e %Y %H:%M:%S %z}] # puts "> $commiter" if {$index == 0} { append outText "$args(--project-name) ($args(--project-version)-$args(--project-release))\n" set commiter [lindex $record 2] puts "\n[string trim $commiter] <$email> $timeStamp" append outText "\n[string trim $commiter] <$email> $timeStamp\n" - StoreProjectInfo $timeStamp + StoreProjectInfo $timeStamp "txt" } if {$commiter ne [lindex $record 2]} { puts "\n[string trim $commiter] <$email> $timeStamp" @@ -254,6 +294,68 @@ proc StoreChangeLog {outText} { } else { set outFile [open $args(--out-file) "w+"] puts $outFile $outText + puts $outText + close $outFile + } +} + +proc StoreChangeLogRPM {outText} { + global args + if [file exists $args(--out-file)] { + file copy -force $args(--out-file) "$args(--out-file).tmp" + + set fh [open $args(--out-file) r] + set lines [split [read $fh] "\n"] + close $fh + + set result [list] + set inserted false + + foreach line $lines { + lappend result $line + + if {!$inserted && $line eq "%changelog"} { + lappend result $outText + set inserted true + } + } + + set fh [open $args(--out-file) w] + puts $fh [join $result "\n"] + close $fh + } +} + +proc StoreChangeLogRPM_ {outText} { + global args + + puts "Changelog generator write a file $args(--out-file)" + + if [file exists $args(--out-file)] { + file copy -force $args(--out-file) "$args(--out-file).tmp" + + set origOutFile [open "$args(--out-file).tmp" "r"] + set origText [read $origOutFile] + close $origOutFile + + set outFile [open $args(--out-file) "w"] + puts $outFile $outText + puts $outFile $origText + close $outFile + + if [info exists args(--last)] { + set outFile [open $args(--out-file) "r+"] + puts $outFile $outText + close $outFile + } else { + set outFile [open $args(--out-file) "w+"] + puts $outFile $outText + close $outFile + } + } else { + set outFile [open $args(--out-file) "w+"] + puts $outFile $outText + puts $outText close $outFile } } @@ -311,26 +413,43 @@ if ![info exists args(--project-release)] { exit } -if [file exists [file join $dir(cfg) $args(--project-name).conf]] { - source [file join $dir(cfg) $args(--project-name).conf] -} +puts "Running chngelog generator with folowing options:\n" foreach arg [array names args] { - puts "$arg $args($arg)" + puts "\t$arg $args($arg)" } if [info exists args(--deb)] { + if [file exists [file join $dir(cfg) $args(--project-name).deb.conf]] { + source [file join $dir(cfg) $args(--project-name).deb.conf] + } set outText [GenerateChangelogDEB] if [info exists args(--out-file)] { StoreChangeLog $outText + } else { + puts $outText } } if [info exists args(--rpm)] { - GenerateChangelogRPM + if [file exists [file join $dir(cfg) $args(--project-name).rpm.conf]] { + source [file join $dir(cfg) $args(--project-name).rpm.conf] + } + set outText [GenerateChangelogRPM] + # puts $outText + if [info exists args(--out-file)] { + StoreChangeLogRPM $outText + } else { + puts $outText + } } if [info exists args(--txt)] { + if [file exists [file join $dir(cfg) $args(--project-name).txt.conf]] { + source [file join $dir(cfg) $args(--project-name).txt.conf] + } set outText [GenerateChangelogTXT] if [info exists args(--out-file)] { StoreChangeLog $outText + } else { + puts $outText } } -- 2.49.1 From 04ba6663ee1d43ef0b5110d83acfb861ae4a78f7 Mon Sep 17 00:00:00 2001 From: svk Date: Fri, 6 Feb 2026 13:31:38 +0300 Subject: [PATCH 62/72] =?UTF-8?q?changelog-gen:=20=D0=B8=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=20=D0=B4=D0=B0=D1=82=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BE?= =?UTF-8?q?=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog-gen.tcl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/changelog-gen.tcl b/changelog-gen.tcl index 521f08b..04d60ad 100755 --- a/changelog-gen.tcl +++ b/changelog-gen.tcl @@ -113,7 +113,7 @@ proc StoreProjectInfo {timeStamp changelogFormat} { puts $cfgFile "# set args(--project-release) \"$args(--project-release)\"" puts $cfgFile "set lastCommitTimeStamp \"$timeStamp\"" puts $cfgFile "set lastCommitTimeStampSec [clock scan $timeStamp]" - close $cfgFile + close $cfgFile } @@ -188,11 +188,11 @@ proc GenerateChangelogRPM {} { if {$lastCommitTimeStamp eq ""} { set lastCommitTimeStamp [string trim [lindex $record 1]] } - set timeStamp [clock format [clock scan $timeStamp] -format {%a %e %b %Y}] + set timeStamp [clock format [clock scan $timeStamp] -format {%a, %e %b %Y %H:%M:%S %z}] if {$index == 0} { set commiter [lindex $record 2] append outText "$timeStamp [string trim $commiter] <$email> $args(--project-version)-$args(--project-release)\n" - StoreProjectInfo $timeStamp "deb" + StoreProjectInfo $timeStamp "rpm" } if {$commiter ne [lindex $record 2]} { append outText "\n" -- 2.49.1 From 2877ebc8a2967a1f61e8532a274fffea5b74f490 Mon Sep 17 00:00:00 2001 From: svk Date: Fri, 6 Feb 2026 13:57:07 +0300 Subject: [PATCH 63/72] =?UTF-8?q?changelog-gen:=20=D0=B8=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B4=D0=B0=D1=82=D1=83=20=D0=B5?= =?UTF-8?q?=D1=89=D0=B5=20=D1=80=D0=B0=D0=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog-gen.tcl | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/changelog-gen.tcl b/changelog-gen.tcl index 04d60ad..f1406f7 100755 --- a/changelog-gen.tcl +++ b/changelog-gen.tcl @@ -188,21 +188,22 @@ proc GenerateChangelogRPM {} { if {$lastCommitTimeStamp eq ""} { set lastCommitTimeStamp [string trim [lindex $record 1]] } - set timeStamp [clock format [clock scan $timeStamp] -format {%a, %e %b %Y %H:%M:%S %z}] + set timeStampForStore [clock format [clock scan $timeStamp] -format {%a, %e %b %Y %H:%M:%S %z}] + set timeStamp [clock format [clock scan $timeStamp] -format {%a %b %e %Y}] if {$index == 0} { set commiter [lindex $record 2] - append outText "$timeStamp [string trim $commiter] <$email> $args(--project-version)-$args(--project-release)\n" - StoreProjectInfo $timeStamp "rpm" + append outText "* $timeStamp [string trim $commiter] <$email> $args(--project-version)-$args(--project-release)\n" + StoreProjectInfo $timeStampForStore "rpm" } if {$commiter ne [lindex $record 2]} { append outText "\n" - append outText "$timeStamp [string trim $commiter] <$email> $args(--project-version)-$args(--project-release)\n" + append outText "* $timeStamp [string trim $commiter] <$email> $args(--project-version)-$args(--project-release)\n" set commiter [lindex $record 2] } set commitTex [lindex $record 4] # puts " * $commitTex" - append outText " * $commitTex\n" + append outText " - $commitTex\n" } # puts "\n -- [string trim $commiter] <$email> $timeStamp" -- 2.49.1 From 7d0b40d651e19fd7affe7add4a9872a476e68684 Mon Sep 17 00:00:00 2001 From: svk Date: Fri, 6 Feb 2026 14:07:53 +0300 Subject: [PATCH 64/72] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D1=83=20rpm.=20=D0=98?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20changelog-=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 13 ++- debian/changelog | 7 +- projman.tcl | 2 +- redhat/projman.spec | 214 +++++++++++++++++++++++++++++++++---- 4 files changed, 201 insertions(+), 35 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 95acb18..80953ac 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -67,7 +67,10 @@ jobs: echo "=== Сборка OpenBSD пакета ===" cd ../openbsd && ./build-package-bsd.sh - + + echo "=== Сборка RPM пакета ===" + cd ../redhat && ./build-rpm.sh + echo "=== Собранные файлы ===" find . -maxdepth 1 -name "projman*" -type f | xargs ls -la 2>/dev/null || echo "Файлы не найдены" @@ -187,7 +190,7 @@ jobs: echo "ID релиза для загрузки: $REL_ID" # Находим все файлы projman - FILES=$(find ../ -maxdepth 1 \( -name "*projman*deb" -o -name "*projman*tgz" \) -type f) + FILES=$(find ../ -maxdepth 1 \( -name "*projman*deb" -o -name "*projman*tgz" -o -name "*projman*rpm" \) -type f) if [ -z "$FILES" ]; then echo "Нет файлов projman для загрузки" exit 0 @@ -227,9 +230,9 @@ jobs: echo "Ответ API: $API_RESPONSE" if [ "$HTTP_STATUS" = "201" ] || [ "$HTTP_STATUS" = "200" ]; then - echo "✅ Файл загружен: $FILENAME" + echo "Файл загружен: $FILENAME" else - echo "❌ ОШИБКА загрузки: $FILENAME" + echo "ОШИБКА загрузки: $FILENAME" echo "Детали: $API_RESPONSE" fi @@ -266,4 +269,4 @@ jobs: fi echo "Собранные файлы:" - find ../ -maxdepth 1 \( -name "*projman*deb" -o -name "*projman*tgz" \) -type f | xargs ls -la 2>/dev/null || echo "Файлы не найдены" + find ../ -maxdepth 1 \( -name "*projman*deb" -o -name "*projman*tgz" -o -name "*projman*rpm"\) -type f | xargs ls -la 2>/dev/null || echo "Файлы не найдены" diff --git a/debian/changelog b/debian/changelog index fd921cb..c1cb5ad 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,11 +1,7 @@ projman (2.0.0-beta3) stable; urgency=medium + * changelog-gen: сделал вывод изменения в формате rpm.spec * Исправил смену регистра в заголовках вкладок - - -- svk Thu, 5 Feb 2026 18:49:28 +0300 - -projman (2.0.0-beta3) stable; urgency=medium - * Добавил диалог вменю "Сохранить как" * Добавил проверки в диалог FileOper::SaveFile * Вынес код связанный с обработкой подсказок при вводе переменных и процедур в отдельный модуль. @@ -501,4 +497,3 @@ projman (2.0.0-alfa0) stable; urgency=medium - diff --git a/projman.tcl b/projman.tcl index e708b6b..7823531 100755 --- a/projman.tcl +++ b/projman.tcl @@ -10,7 +10,7 @@ exec wish8.6 "$0" -- "$@" ###################################################### # Version: 2.0.0 # Release: beta3 -# Build: 30012026140811 +# Build: 06022026135717 ###################################################### # определим текущую версию, релиз и т.д. diff --git a/redhat/projman.spec b/redhat/projman.spec index 66a878a..c700d7f 100644 --- a/redhat/projman.spec +++ b/redhat/projman.spec @@ -6,7 +6,7 @@ License: GPL Group: Development/Tcl Url: https://nuk-svk.ru BuildArch: noarch -Source: %name-%version-%release.tar.gz +Source: %{name}-%{version}-%{release}.tar.gz Requires: tcl, tk, tklib, tcllib %description @@ -16,40 +16,208 @@ This a editor for programming in TCL/Tk (and other language). It includes a file Интегрированная среда для программирования на Tcl/Tk. Включает в себя - менеджер проектов, полнофункциональный редактор, систему навигации по файлам и структуре файлов и многое другое. %prep -%setup -n %name +%setup -n %{name} %build +# Пустая секция, если сборка не требуется %install -mkdir -p $RPM_BUILD_ROOT%_bindir -mkdir -p $RPM_BUILD_ROOT%_datadir/%name/lib/msgs -mkdir -p $RPM_BUILD_ROOT%_datadir/%name/theme -mkdir -p $RPM_BUILD_ROOT%{_datarootdir}/applications +# Создаем директории +mkdir -p %{buildroot}%{_bindir} +mkdir -p %{buildroot}%{_datadir}/%{name}/lib/msgs +mkdir -p %{buildroot}%{_datadir}/%{name}/theme +mkdir -p %{buildroot}%{_datadir}/applications +mkdir -p %{buildroot}%{_iconsdir}/hicolor/48x48/apps -install -p -m755 projman $RPM_BUILD_ROOT%_bindir/%name -install -p -m755 tkregexp.tcl $RPM_BUILD_ROOT%_bindir/tkregexp +# Копируем исполняемые файлы +install -p -m755 projman %{buildroot}%{_bindir}/%{name} +install -p -m755 tkregexp.tcl %{buildroot}%{_bindir}/tkregexp +install -p -m755 changelog-gen.tcl %{buildroot}%{_bindir}/changeloggen -# install -p -m644 *.tcl $RPM_BUILD_ROOT%_datadir/%name/ -install -p -m644 lib/*.tcl $RPM_BUILD_ROOT%_datadir/%name/lib/ -install -p -m644 lib/msgs/*.* $RPM_BUILD_ROOT%_datadir/%name/lib/msgs/ -install -p -m644 theme/*.tcl $RPM_BUILD_ROOT%_datadir/%name/theme -install -p -m644 projman.desktop $RPM_BUILD_ROOT%{_datarootdir}/applications +# Копируем библиотеки и ресурсы +install -p -m644 lib/*.tcl %{buildroot}%{_datadir}/%{name}/lib/ +install -p -m644 lib/msgs/*.* %{buildroot}%{_datadir}/%{name}/lib/msgs/ +install -p -m644 theme/*.tcl %{buildroot}%{_datadir}/%{name}/theme +# Копируем .desktop файл +install -p -m644 projman.desktop %{buildroot}%{_datadir}/applications/ + +# Копируем иконку в правильное место +install -p -m644 projman.png %{buildroot}%{_iconsdir}/hicolor/48x48/apps/projman.png + +# Обновляем кэш иконок (опционально для Debian) %post -%update_menus +if [ $1 -eq 1 ] ; then + if [ -x /usr/bin/gtk-update-icon-cache ]; then + /usr/bin/gtk-update-icon-cache -q %{_iconsdir}/hicolor || : + fi +fi %postun -%clean_menus +if [ $1 -eq 0 ] ; then + if [ -x /usr/bin/gtk-update-icon-cache ]; then + /usr/bin/gtk-update-icon-cache -q %{_iconsdir}/hicolor || : + fi +fi %files -%doc INSTALL CHANGELOG TODO LICENSE README.md -%_bindir/%name -%_bindir/tkregexp -%_datarootdir/applications/%name.desktop -%_datadir/%name - +%doc CHANGELOG TODO LICENSE README.md +%{_bindir}/%{name} +%{_bindir}/tkregexp +%{_bindir}/changeloggen +%{_datadir}/applications/projman.desktop +%{_datadir}/%{name} +%{_iconsdir}/hicolor/48x48/apps/projman.png %changelog -* Mon Nov 28 2022 Sergey Kalinin 2.0.0 - - Initial release +* Fri Feb 6 2026 svk 2.0.0-beta3 + - changelog-gen: сделал вывод изменения в формате rpm.spec + - Исправил смену регистра в заголовках вкладок + - Добавил проверки в диалог FileOper::SaveFile + - Добавил диалог 'Сохранить как' + - Добавил проверку на наличие символа переменной. + - Исправил работу со списком переменных из всплывающего окна. Теперь там можно выбрать из списка стрелками и вставить по Enter. + - Вынес код связанный с обработкой подсказок при вводе переменных и процедур в отдельный модуль. Исправил недоработку при выборе варианта из списка и вставке его в текст. Исправил обработку клавиш Ввер Вниз Ввод Отмена в окне со списком вариантов. + +* Tue Jan 27 2026 svk 2.0.0-beta2 + - Добавлено подключение (bind) сочетания клавишь указанных в настройках инструментов. + - Добавлена динамическая генерация меню 'Инструменты'. Теперь новые внешние инструменты доступны сразу после сохранения файла настроек tools.ini в редакторе. + - 2-я бета + - Исправлена ошибка с некорректным определением виджета в процедуре получения выделенного текста. + - Добавлено редактирование настроек внешних инструментов. И пункт в меню 'Инструменты'->'Настройки' + - Исправление ошибки с запуском внешних программ. + - Добавлено определение путей до внешних программ при подключении к редактору. + - Сделана обработка шаблонов командной строки и запуск внешних инструментов. + - Добавлен tkregexp для установки в /usr/bin + - Добавлена сборка пакетов для openbsd + +* Wed Jan 21 2026 svk 2.0.0-beta1 + - Сделан вывод отладочной информации по запросу. Переделка кода. + - Добавлены процедуры проверки наличия параметров конфигурации + - Добавил фокус ввода на 'терминал' если он открыт во вкладке (при переключении вкладок). + - Исправил вставку кавычек при выделении текста + - Исправил ошибку при отправке сигналов несуществующему процессу. + - Уменьшил всплывающее меню: вынес менюшки Файл и Вид в подменю. + - Изменил команду загрузки пакета в репу + - Исправлено поведение при сочетании клавиш Control-y (повторение последнего действия) + - Исправлен флаг модификации при открытии файла + - Исправил закрытие вкладок редактора и сохранение файла при разделении экрана. + - Добавлены настройки путей к программам для выполнения редактируемых файлов для каждого поддержимаего типа. И использование этих настроек при выполнении файла. + - Добавил вывод информации о версиях tcl и tk + - Добавил вывод номера версии tcl/tl в О Программе + - Исправил сохранение и закрытие нового файла. Теперь при сохранении файл будет переоткрыт под новым именем. + - Добавил проверку пакета Img. И поправил проверку типов изображений + - Переделал сигналы и сочетния + - Добавлен перевод фокуса ввода на прежнее окно после закрытия диалога выполнения. + - Добавлена передача сигналов для закрытия запущенного процесса + - Добавлен диалог настроек + - Добавил псевдо-терминал + - Добавлен диалог при открытии файлов отличных от текстовых + - Поправил тему оформления + - Исправлена работа в windows + - Уменьшил колдичество выводимой отладочной информации + - Добавлено определение пути до git в зависимости от платформы. + - Исправлено создание файла конфигурации + - Исправлено создание файла конфигурации. Добавлены номера версий в вызов tclsh8.6 и wish8.6. Убрана зависимостить на Threads. + - Исправлено чтение структуры проекта при открытии из меню 'Открыть недавнее' + - Bugfix release + - Bug fix with varhelper + - Added the "Open Recent" menu. The "recentlyEditedFolders" option in the configuration file contains a list of recently opened directories. The procedures for working with this list have also been added. + - Косметические изменения. + - Исправлены ошибки при вставке кавычек + - changelog-gen.tcl: Добавлена генерация текстового журнала изменений + - build-deb-projman.sh: добавлена генерация changelog из git log + - changelog-gen.tcl: Вывод в файл вынесен в отдельную процедуру + - changelog-gen.tcl: Добавлено создание резервной копии выходного файла. Исправлен вывод в файл. + - changelog-gen.tcl: Добавлены опции командной строки + - Добавлен запуск changelog-gen при сборке пакета + - Добавлено чстение журнала начиная с определенной даты + - Генерация списка изменений для debian приведена к корректному виду + - Исправлен фокус при создании нового файла. #3 + - Исправлена неправильная замена выражение при поиске + - Реализовал базовые функции генератора журнала изменений + - Добавлена иконка для jinja template + - Исправил остатки слияния веток + - Исправлено некорректное определение типа файла при открытии. + - Исправил открытие файлов с разными путями (~/ ./ ../) + - Добавил изображений программы + - Исправлена ошибка при создании нового файла. + - Добавил пиктограммы файлов + - Исправил процедуру Files::CloseAll ('Закрыть всё') + - Добавлена поддержка Lua + - Исправлена процедура (рас)комментирования + - Исправил ошибку при выходе в процедуре (Congig::Write) + - Добавил раскраски в ruby + - Добавлена возможность многострочных комментариев + - В Ruby lexer добавлен поиск переменных коде. + - Немного почистил. Добавлен поиск переменных по питоньим исходникам (lexer) + - Изменения в подсветке для INI + - Добавил подсветку для Desktop и Spec файлов + - Добавил вывод отладочной инфы в процедуру + - Исправил подсветку комментариев в TCL + - Оптимизация процедур + - Добавлена подсветка и навигация по HTML. Исправлена подсветка XML + - Добавил иконку для изображений + - Добавил иконки для perl + - Исправлена подсветка и навигация по коду для Ruby + - Исправлено сохранение сессии в редакторе (открытие папки и файлов при следующем запуске) + - Добавлена новая секция UserSession + - Исправление ошибки при открытии файла + - Добавлена поддержка INI-файлов (подсветка + - Добавлена поддержка perl + - Добавил икогнку для файлов git + - Добавлены иконки для ключей и сертификатов. Изменен поиск иконки (вощзвращает теерь с размером) + - Реализован двухпанельный режим работы (вертиикальное разделение) + - Исправлена ошибка при открытии ansible.cfg + - Добавил деактивацию кнопки 'Создать репу' если не выбран активный проект (не открыто ни одного каталога/папки) + - Добавлены команды git init и git config (зачаток). Изменен диалог клонирования репозитория (добавлена кнопка Создать репозиторий) + - Исправил ошибку git при открытии файла или каталога если репозиторий не инициализирован (нет .git каталога внутри проекта) + - Добавил скриты сборки rpm + - Добавлено обрамление выделенного текста прии нажатии '_' в markdown + - Исправление подсветки + - Добавлена поддержка markdown (подсветка + - Исправлена ошибка с закрытием файлов в редакторе при закрытии папки + - Переделана процедура определения активного проекта. Исправлено определение ветки git. Теперь можно нормально работать в двух и более открытых проектах (каталогах/папках) + - Доделан вид диалога поиска по файлам + - Исправлен поиск имени функции + - Добавлен диалог клонирования репозитория + - Добавил разделитель + - Исправлено переключение вкладок при закрытии + - Исправлено закрытиие вкладки Git по нажатию соотв. кнопки в панели инструментов + - Добавлен пункт 'Закрыть всё' + - Исправлено соответствие открытого файла в редакторе и выделение этого файла в дереве + - Исправлено переключение отображения панели (лево/право) в без перезапуска программы. + - Украшательства интерфейса - Реакция на нажатие кнопки в панели инструментов теперь зависит от контекста + - Добавлено включение отключение отображения Меню + - Добавлено копирование текущей строки в буфер по Atl+Y + - Исправлена ошибка с отображением файловой панели + - Добавлены и исправлены функции отображения меню + - Добавлен параметр statusBarShow - показ строки статуса + - Добавлены переводы + - Добавлена проверка параметров вызова файл или просто строка + - Добавлен вывод сообщений об ошибке в диалоге + - Добавлено обновления списка файлов в дереве + - Добавлена процедура вывода информационного сообщения + - Добавлена команда Git::Reset (git reset _file_) на кнопке в диалоге. Для отмены 'git add' + - Добавлена кнопка Обновление в диалог работы с Git + - Исправление процедуры поиска наименования функции + - Фиксы диалога работы с Git (работа с выделенными файлами в списках) + - Фиксы и тесты работы с git + - Исправление выборанескольких файлов в диалоге Git + - Исправление рег. выражения чтения файлов командой git status + - Исправлено рег. выпражение определения mime типа файла + - Добавил очистку текстовых полей при добавлении файлов в коммит + - Исправрелдение Git::Commit (индексация всех файлов в проекте) + - Исправления глюков + - Украшательства строки статуса + - Добавлен просмотрщик изображений + - Добавил рамку кону ввода номера + - Добавлен диалог перехода по номеру строки Ctrl-G + - Добавлено определение типа файла + - Добавил удаление артефактов сборки пакета + - Новая сборка + - Добавлена подсветка имен файлов в выводе git show + - Небольшие правки в подсказках по переменным + - Исправлена подсветка SHELL переменных а YAML файлах (ansible + -- 2.49.1 From 382e62df95c43f504d5522c6a94541e8e9c47812 Mon Sep 17 00:00:00 2001 From: svk Date: Fri, 6 Feb 2026 15:12:38 +0300 Subject: [PATCH 65/72] =?UTF-8?q?=D0=9E=D1=82=D0=BA=D0=BE=D1=80=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BB=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D1=83=20=D1=80=D0=BF=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- redhat/build-rpm.sh | 2 +- redhat/projman.spec | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/redhat/build-rpm.sh b/redhat/build-rpm.sh index 384fbff..9595617 100755 --- a/redhat/build-rpm.sh +++ b/redhat/build-rpm.sh @@ -41,4 +41,4 @@ fakeroot rpmbuild -ba "${RPM_BUILD_DIR}/SPECS/projman.spec" rm -v projman rm -r -v ${RPM_BUILD_DIR}/SPECS/projman.spec rm -r -v ${RPM_BUILD_DIR}/SOURCES/projman-${VERSION}-${RELEASE}.tar.gz -rm -r -v ${RPM_BUILD_DIR}/BUILD/projman +#rm -r -v ${RPM_BUILD_DIR}/BUILD/projman diff --git a/redhat/projman.spec b/redhat/projman.spec index c700d7f..8cf8344 100644 --- a/redhat/projman.spec +++ b/redhat/projman.spec @@ -70,6 +70,9 @@ fi %{_iconsdir}/hicolor/48x48/apps/projman.png %changelog +* Fri Feb 6 2026 svk 2.0.0-beta3 + - Добавил сборку rpm. Исправил changelog-и + * Fri Feb 6 2026 svk 2.0.0-beta3 - changelog-gen: сделал вывод изменения в формате rpm.spec - Исправил смену регистра в заголовках вкладок @@ -221,3 +224,4 @@ fi - Исправлена подсветка SHELL переменных а YAML файлах (ansible + -- 2.49.1 From e83507eb9b6c5db6ec94d800a1721d1af0b3733c Mon Sep 17 00:00:00 2001 From: svk Date: Fri, 6 Feb 2026 15:22:39 +0300 Subject: [PATCH 66/72] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BE=D0=BF=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D1=8B=D1=85=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- redhat/build-rpm.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/redhat/build-rpm.sh b/redhat/build-rpm.sh index 9595617..d57c5d7 100755 --- a/redhat/build-rpm.sh +++ b/redhat/build-rpm.sh @@ -35,8 +35,8 @@ sed -i "s/.*Release:.*/Release:\t${RELEASE}/" ${RPM_BUILD_DIR}/SPECS/projman.spe fakeroot rpmbuild -ba "${RPM_BUILD_DIR}/SPECS/projman.spec" -# cp ${RPM_BUILD_DIR}/RPMS/noarch/projman-${VERSION}-${RELEASE}.noarch.rpm /files/ -# cp ${RPM_BUILD_DIR}/SRPMS/projman-${VERSION}-${RELEASE}.src.rpm /files/ +cp ${RPM_BUILD_DIR}/RPMS/noarch/projman-${VERSION}-${RELEASE}.noarch.rpm ../ +cp ${RPM_BUILD_DIR}/SRPMS/projman-${VERSION}-${RELEASE}.src.rpm ../ rm -v projman rm -r -v ${RPM_BUILD_DIR}/SPECS/projman.spec -- 2.49.1 From c8547ec45b48e788d3da1c8da109b9bd804fab34 Mon Sep 17 00:00:00 2001 From: svk Date: Fri, 6 Feb 2026 18:03:04 +0300 Subject: [PATCH 67/72] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D1=83?= =?UTF-8?q?=20=D0=A1=20(=D0=BF=D0=BE=D0=B4=D1=81=D0=B2=D0=B5=D1=82=D0=BA?= =?UTF-8?q?=D0=B0,=20=D0=BD=D0=B0=D0=B2=D0=B8=D0=B3=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/editor.tcl | 6 ++++++ lib/highlight.tcl | 21 ++++++++++++++++++++- lib/lexers.tcl | 22 ++++++++++++++++++++++ projman.tcl | 2 +- redhat/projman.spec | 4 ++++ 5 files changed, 53 insertions(+), 2 deletions(-) diff --git a/lib/editor.tcl b/lib/editor.tcl index a7c6a6f..bf21d51 100644 --- a/lib/editor.tcl +++ b/lib/editor.tcl @@ -876,9 +876,15 @@ namespace eval Editor { for {set lineNumber 0} {$lineNumber <= [$txt count -lines 0.0 end]} {incr lineNumber} { set line [$txt get $lineNumber.0 $lineNumber.end] # Выбираем процедуры (функции, классы и т.д.) + # DebugPuts "Editor::RedaStructure: file type $fileType" + if {[dict exists $lexers $fileType procRegexpCommand] != 0 } { + # regexp -nocase -all -line -- {^\s*(?:(\w+)\s+)+(\w+)\s*\((.*?)\)\s*(?:;|\{)} $line match returns procName params + # regexp -nocase -all -line -lineanchor -linestop -- {^\s*(?:(\w+)\s+)+(\w+)\s*\((.*?)(,|\))} $line match v1 v2 v3 v4 if {[eval [dict get $lexers $fileType procRegexpCommand]]} { + DebugPuts "Editor::RedaStructure: regexp = [dict get $lexers $fileType procRegexpCommand]" set procName_ [string trim $procName] + DebugPuts "Editor::RedaStructure: find the proc $procName_" if {$treeItemName ne ""} { Tree::InsertItem $tree $treeItemName $procName_ "procedure" "$procName_ ($params)" } diff --git a/lib/highlight.tcl b/lib/highlight.tcl index 1f146de..0dc2a05 100644 --- a/lib/highlight.tcl +++ b/lib/highlight.tcl @@ -210,5 +210,24 @@ namespace eval Highlight {} { ctext::addHighlightClass $txt compile_errors #ff5050 {error Error ERROR invalid undefined cannot} ctext::addHighlightClassForRegexp $txt url lightblue {\w+://\w.+\w+} } - + proc C {txt} { + global lexers + ctext::addHighlightClassForRegexp $txt flags orange {-+[a-zA-Z\-_]+} + ctext::addHighlightClassForRegexp $txt arrows orange {(->)|(-<)} + ctext::addHighlightClass $txt stackControl #19a2a6 [dict get $lexers C commands] + ctext::addHighlightClass $txt types #7187d5 {string int int16 int32 int64 float bool byte size_t void char uint32_t uint32} + ctext::addHighlightClassWithOnlyCharStart $txt vars #4471ca "\&" + ctext::addHighlightClassWithOnlyCharStart $txt vars #4471ca "\*" + # ctext::addHighlightClassForRegexp $txt vars_extended #4471ca {\$\{[a-zA-Z0-9\_\-:\./\$\{\}]+\}} + ctext::addHighlightClass $txt variable_funcs gold {var type struct} + ctext::addHighlightClassForSpecialChars $txt brackets green {[]{}()} + ctext::addHighlightClassForRegexp $txt paths lightblue {\.[a-zA-Z0-9\_\-]+} + ctext::addHighlightClassForRegexp $txt comments #666666 {(//|/\*)[^\n\r]*} + ctext::addHighlightClassForSpecialChars $txt qoute #b84a0c {"'`} + ctext::addHighlightClass $txt bool #3e803b {nil false true NULL TRUE FALSE} + ctext::addHighlightClassForRegexp $txt qoute #b84a0c {("|'|`).*?("|'|`)} + ctext::addHighlightClassForRegexp $txt macros #f88ffb {#\w+} + ctext::addHighlightClassForRegexp $txt include #68ceff {<[\w./_-]+?>} + } + proc H {txt} {Highlight::C $txt} } diff --git a/lib/lexers.tcl b/lib/lexers.tcl index 6c58248..b5da785 100644 --- a/lib/lexers.tcl +++ b/lib/lexers.tcl @@ -104,5 +104,27 @@ dict set lexers LUA procFindString {function\s*?PROCNAME} dict set lexers LUA procRegexpCommand {regexp -nocase -all -- {^(local|)\s*?(function)\s([a-zA-Z0-9\-_:]+?)\s+\((.+?)\)} $line match v1 keyWord procName params} dict set lexers LUA varRegexpCommand {regexp -nocase -all -- {^(\s*?)([a-zA-Z0-9\-_\.]+)\s+=\s+(.+?)(\s*$|--)} $line match indent varName varValue lineEnd} +#-------------------------------------------------- +# C +dict set lexers C commentSymbol {//} +dict set lexers C commentMultilineSymbolBegin {/*} +dict set lexers C commentMultilineSymbolEnd {*/} +dict set lexers C procFindString {^\s*(?:(\w+)\s+)+(PROCNAME)\s*\((.*?)(,|\))} +dict set lexers C procRegexpCommand {regexp -nocase -all -line -- {^(?:(\w+)\s+)+(\w+)\s*\((.*?)(,|\))} $line match returns procName params v4} +# dict set lexers C procRegexpCommand {regexp -nocase -all -- {\s*?func\s*?(\(\w+\s*?\**?\w+\)|)\s*?(\w+)\((.*?)\)\s+?([a-zA-Z0-9\{\}\[\]\(\)-_.]*?|)\s*?\{} $line match linkName procName params returns} +# dict set lexers C varRegexpCommand {regexp -nocase -all -line -- {^\s*?var\s+([a-zA-Z0-9\-_$]+)\s+(.+?)(\s*$)} $line match varName varType lineEnd} +dict set lexers C commands {auto break case const continue default do else enum extern for goto if inline int long register restrict return signed sizeof static struct switch typedef typeof typeof_unqual union unsigned void volatile while} + +#-------------------------------------------------- +# H +dict set lexers C commentSymbol {//} +dict set lexers C commentMultilineSymbolBegin {/*} +dict set lexers C commentMultilineSymbolEnd {*/} +dict set lexers C procFindString {^\s*(?:(\w+)\s+)+(PROCNAME)\s*\((.*?)(,|\))} +dict set lexers C procRegexpCommand {regexp -nocase -all -line -- {^(?:(\w+)\s+)+(\w+)\s*\((.*?)(,|\))} $line match returns procName params v4} +# dict set lexers C procRegexpCommand {regexp -nocase -all -- {\s*?func\s*?(\(\w+\s*?\**?\w+\)|)\s*?(\w+)\((.*?)\)\s+?([a-zA-Z0-9\{\}\[\]\(\)-_.]*?|)\s*?\{} $line match linkName procName params returns} +# dict set lexers C varRegexpCommand {regexp -nocase -all -line -- {^\s*?var\s+([a-zA-Z0-9\-_$]+)\s+(.+?)(\s*$)} $line match varName varType lineEnd} +dict set lexers C commands {auto break case const continue default do else enum extern for goto if inline int long register restrict return signed sizeof static struct switch typedef typeof typeof_unqual union unsigned void volatile while} + # ------------------------------------------------- dict set lexers ALL varDirectory {variables vars group_vars host_vars defaults} diff --git a/projman.tcl b/projman.tcl index 7823531..9ce8ea7 100755 --- a/projman.tcl +++ b/projman.tcl @@ -10,7 +10,7 @@ exec wish8.6 "$0" -- "$@" ###################################################### # Version: 2.0.0 # Release: beta3 -# Build: 06022026135717 +# Build: 06022026152138 ###################################################### # определим текущую версию, релиз и т.д. diff --git a/redhat/projman.spec b/redhat/projman.spec index 8cf8344..83ea304 100644 --- a/redhat/projman.spec +++ b/redhat/projman.spec @@ -70,6 +70,9 @@ fi %{_iconsdir}/hicolor/48x48/apps/projman.png %changelog +* Fri Feb 6 2026 svk 2.0.0-beta3 + - Откорректировал сборку рпм + * Fri Feb 6 2026 svk 2.0.0-beta3 - Добавил сборку rpm. Исправил changelog-и @@ -225,3 +228,4 @@ fi + -- 2.49.1 From 723426b1d6a267400c4313e4d00d807a92579994 Mon Sep 17 00:00:00 2001 From: svk Date: Fri, 6 Feb 2026 18:42:47 +0300 Subject: [PATCH 68/72] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B8=D0=BA=D0=BE=D0=BD=D0=BA=D0=B8=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20'c'=20=D0=B8=20'h'.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D1=81=D0=BE=D1=87=D0=B8=D1=82=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20Alt-R=20=D0=B2=20=D1=80=D1=83=D1=81=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=80=D0=B0=D1=81=D0=BA=D0=BB=D0=B0=D0=B4=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/editor.tcl | 3 ++- lib/image_library.tcl | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/editor.tcl b/lib/editor.tcl index bf21d51..1be5bf2 100644 --- a/lib/editor.tcl +++ b/lib/editor.tcl @@ -681,7 +681,7 @@ namespace eval Editor { bind $txt "Editor::SelectionPaste $txt" bind $txt "SearchVariable $txt; break" bind $txt "SearchVariable $txt; break" - bind $txt "ImageBase64Encode $txt" + bind $txt "ImageBase64Encode" bind $txt "ImageBase64Encode $txt" bind $txt "Editor::InsertTabular $txt" bind $txt "Editor::DeleteTabular $txt" @@ -702,6 +702,7 @@ namespace eval Editor { bind $txt "$txt delete {insert wordstart} {insert wordend}" bind $txt "$txt delete {insert wordstart} {insert wordend}" bind $txt "$txt delete {insert linestart} {insert lineend + 1char}" + bind $txt "$txt delete {insert linestart} {insert lineend + 1char}" bind $txt "$txt delete {insert linestart} {insert lineend + 1char}" bind $txt "$txt delete {insert linestart} {insert lineend + 1char}" bind $txt "$txt delete {insert linestart} insert" diff --git a/lib/image_library.tcl b/lib/image_library.tcl index fd4f186..bd3ac6d 100644 --- a/lib/image_library.tcl +++ b/lib/image_library.tcl @@ -1947,3 +1947,24 @@ image create photo settings_24x24 -data { 3W5MPksIPgdckHTF1XAMeCrpRXAexPT6yYSddEj6eKSJJmk3IcFGqWby51AbSvpeqr+KPjcKC7GT hfgXbteIc85F7RUAAAAASUVORK5CYII= } +image create photo c_16x12 -data { + iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAAXNSR0IB2cksfwAAAARnQU1BAACx + jwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dE + APgAjwD7QQHXygAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB+oCBg8YOxzsqLgAAABWSURB + VCjPY2AgATDCGFeLi/+jS2r39jJiKIYp1O7tZUDSjKGBCYdtyCbCbWTB5T6oiShOYyHWT7icgRPg + VHy1uPg/eggRY/J/YsMZRR0jLlNweZI2AAAzbhnP2WkKCAAAAABJRU5ErkJggg== +} +image create photo h_16x12 -data { + iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAAXNSR0IB2cksfwAAAARnQU1BAACx + jwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dE + AAAAAAAA+UO7fwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB+oCBg8iNd79W8YAAABJSURB + VCjPY2AgB1wtLv5/tbj4Pz41TKQYSJJiRmRnYFOg3dvLSLTJyIawYDEJWSGM+Z+BgYGRCY/zGOkX + GkwMFID/UExIjDAAAEu2FECKwea9AAAAAElFTkSuQmCC +} +image create photo cpp_16x12 -data { + iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAMAAABIK2QJAAAAAXNSR0IB2cksfwAAAARnQU1BAACx + jwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAA9QTFRF + AAAAzAAAAAAA////////6rs+vwAAAAF0Uk5TAEDm2GYAAAABYktHRACIBR1IAAAACXBIWXMAAAsT + AAALEwEAmpwYAAAAB3RJTUUH6gIGDxU21/OqSAAAADVJREFUCNd9jUEOACAIw7D7/58VmNF4sAco + CbCIm5FsBTwsd+kmgVQu87p3OLfg/9AJJPFhAjDkAJmwKBolAAAAAElFTkSuQmCC +} -- 2.49.1 From 118638e42e5cfd1b705036ba3eb63641819522e7 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 12 Feb 2026 10:58:42 +0300 Subject: [PATCH 69/72] =?UTF-8?q?=D0=98=D1=81=D0=B8=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=B7=D0=B0=D0=BA=D1=80=D1=8B=D1=82=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B2=D0=BA=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20=D0=BE=D1=82=D0=BF=D1=83=D1=81=D0=BA=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8=20=D0=BC?= =?UTF-8?q?=D1=8B=D1=88=D0=B8=20=D0=BF=D1=80=D0=B8=20=D0=BD=D0=B0=D0=B6?= =?UTF-8?q?=D0=B0=D1=82=D0=B8=D0=B8=20=D0=BD=D0=B0=20=D0=BA=D1=80=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D0=BA.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/gui.tcl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/gui.tcl b/lib/gui.tcl index d5f0a8f..6e0351e 100644 --- a/lib/gui.tcl +++ b/lib/gui.tcl @@ -237,7 +237,7 @@ ttk::style layout TNotebook.Tab { } bind TNotebook "catch {NB::PressTab %W %x %y}\;[bind TNotebook ];break" # bind <> "NB::PressTab %W %x %y" -bind TNotebook "NB::PressTab %W %x %y" +# bind TNotebook "NB::PressTab %W %x %y" # bind TNotebook FileOper::Close # bind . "NB::NextTab $nbEditor" bind . "NB::NextTab $nbEditor 1" -- 2.49.1 From afa368c5196412205ac3869e4da0cb2bd88bb9d6 Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 12 Feb 2026 11:53:06 +0300 Subject: [PATCH 70/72] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BA=D1=80=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BB=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B3=D1=83=D0=BB=D1=8F=D1=80=D0=BA=D0=B8=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20=D0=A1?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/lexers.tcl | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/lexers.tcl b/lib/lexers.tcl index b5da785..6342fca 100644 --- a/lib/lexers.tcl +++ b/lib/lexers.tcl @@ -109,22 +109,23 @@ dict set lexers LUA varRegexpCommand {regexp -nocase -all -- {^(\s*?)([a-zA-Z0-9 dict set lexers C commentSymbol {//} dict set lexers C commentMultilineSymbolBegin {/*} dict set lexers C commentMultilineSymbolEnd {*/} -dict set lexers C procFindString {^\s*(?:(\w+)\s+)+(PROCNAME)\s*\((.*?)(,|\))} -dict set lexers C procRegexpCommand {regexp -nocase -all -line -- {^(?:(\w+)\s+)+(\w+)\s*\((.*?)(,|\))} $line match returns procName params v4} +dict set lexers C procFindString {(\w+)\s+(PROCNAME)\s*\((.*?)(,|\))(\W|$)} +dict set lexers C procRegexpCommand {regexp -nocase -all -line -- {^(?:(\w+)\s+)+(\*\w+|\w+)\s*\((.*?)(,|\))} $line match returns procName params v4} # dict set lexers C procRegexpCommand {regexp -nocase -all -- {\s*?func\s*?(\(\w+\s*?\**?\w+\)|)\s*?(\w+)\((.*?)\)\s+?([a-zA-Z0-9\{\}\[\]\(\)-_.]*?|)\s*?\{} $line match linkName procName params returns} # dict set lexers C varRegexpCommand {regexp -nocase -all -line -- {^\s*?var\s+([a-zA-Z0-9\-_$]+)\s+(.+?)(\s*$)} $line match varName varType lineEnd} dict set lexers C commands {auto break case const continue default do else enum extern for goto if inline int long register restrict return signed sizeof static struct switch typedef typeof typeof_unqual union unsigned void volatile while} #-------------------------------------------------- # H -dict set lexers C commentSymbol {//} -dict set lexers C commentMultilineSymbolBegin {/*} -dict set lexers C commentMultilineSymbolEnd {*/} -dict set lexers C procFindString {^\s*(?:(\w+)\s+)+(PROCNAME)\s*\((.*?)(,|\))} -dict set lexers C procRegexpCommand {regexp -nocase -all -line -- {^(?:(\w+)\s+)+(\w+)\s*\((.*?)(,|\))} $line match returns procName params v4} +dict set lexers H commentSymbol {//} +dict set lexers H commentMultilineSymbolBegin {/*} +dict set lexers H commentMultilineSymbolEnd {*/} +# dict set lexers C procFindString {^\s*(?:(\w+)\s+)+(PROCNAME)\s*\((.*?)(,|\))} +dict set lexers H procFindString {^\s*(?:(\w+)\s+)+(PROCNAME)\s*\((.*?)(,|\))} +dict set lexers H procRegexpCommand {regexp -nocase -all -line -- {^(?:(\w+)\s+)+(\*\w+|\w+)\s*\((.*?)(,|\))} $line match returns procName params v4} # dict set lexers C procRegexpCommand {regexp -nocase -all -- {\s*?func\s*?(\(\w+\s*?\**?\w+\)|)\s*?(\w+)\((.*?)\)\s+?([a-zA-Z0-9\{\}\[\]\(\)-_.]*?|)\s*?\{} $line match linkName procName params returns} # dict set lexers C varRegexpCommand {regexp -nocase -all -line -- {^\s*?var\s+([a-zA-Z0-9\-_$]+)\s+(.+?)(\s*$)} $line match varName varType lineEnd} -dict set lexers C commands {auto break case const continue default do else enum extern for goto if inline int long register restrict return signed sizeof static struct switch typedef typeof typeof_unqual union unsigned void volatile while} +dict set lexers H commands {auto break case const continue default do else enum extern for goto if inline int long register restrict return signed sizeof static struct switch typedef typeof typeof_unqual union unsigned void volatile while} # ------------------------------------------------- dict set lexers ALL varDirectory {variables vars group_vars host_vars defaults} -- 2.49.1 From 3d0ae84dc2f61fe131fb06da113c69454db6d5cc Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 12 Feb 2026 11:53:37 +0300 Subject: [PATCH 71/72] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=8D=D0=BA=D1=80=D0=B0=D0=BD=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20'*'=20=D0=B2=20=D0=B8=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/tree.tcl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/tree.tcl b/lib/tree.tcl index 2fc99ab..37ff5e8 100644 --- a/lib/tree.tcl +++ b/lib/tree.tcl @@ -132,8 +132,10 @@ namespace eval Tree { $nbEditor select $nbItem set txt $nbItem.frmText.t set findString [dict get $lexers [dict get $editors $txt fileType] procFindString] + DebugPuts "Tree::PressItem: $findString\n values: $values" + regsub -all {\*} $values {\\*} values regsub -all {PROCNAME} $findString $values str - + DebugPuts "Tree::PressItem: $str" Editor::FindFunction $txt "$str" } } -- 2.49.1 From b12381dbce23cb4984842dec1bdfdf436a147d0d Mon Sep 17 00:00:00 2001 From: svk Date: Thu, 12 Feb 2026 12:05:33 +0300 Subject: [PATCH 72/72] =?UTF-8?q?=D0=A1=D0=B1=D0=BE=D1=80=D0=BA=D0=B0=20be?= =?UTF-8?q?ta4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + debian/changelog | 13 +++++++++++++ projman.tcl | 4 ++-- redhat/projman.spec | 8 ++++++++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 62c1e53..20e2633 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Highlightning and source code navigation: * Markdown * YAML (Ansible support) * Lua +* C Highlightning: diff --git a/debian/changelog b/debian/changelog index c1cb5ad..88dcecf 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,16 @@ +projman (2.0.0-beta4) stable; urgency=medium + + * Добавил экранирование '*' в имени функции для поиска. + * Подкрректировал регулярки для работы с С. + * Исиправил закрытие вкладки при отпускании кнопки мыши при нажатии на крестик. + * Добавил иконки для 'c' и 'h'. Добавил сочитание Alt-R в русской раскладке + * Добавил поддержку С подсветка + * Добавил копирование готовых пакетов + * Откорректировал сборку рпм + * Добавил сборку rpm. Исправил changelog-и + + -- svk Fri, 6 Feb 2026 14:07:53 +0300 + projman (2.0.0-beta3) stable; urgency=medium * changelog-gen: сделал вывод изменения в формате rpm.spec diff --git a/projman.tcl b/projman.tcl index 9ce8ea7..89e5360 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: beta3 -# Build: 06022026152138 +# Release: beta4 +# Build: 12022026115443 ###################################################### # определим текущую версию, релиз и т.д. diff --git a/redhat/projman.spec b/redhat/projman.spec index 83ea304..1865e89 100644 --- a/redhat/projman.spec +++ b/redhat/projman.spec @@ -70,6 +70,14 @@ fi %{_iconsdir}/hicolor/48x48/apps/projman.png %changelog +* Thu Feb 12 2026 svk 2.0.0-beta4 + - Добавил экранирование '*' в имени функции для поиска. + - Подкрректировал регулярки для работы с С. + - Исправил закрытие вкладки при отпускании кнопки мыши при нажатии на крестик. + - Добавил иконки для 'c' и 'h'. Добавил сочитание Alt-R в русской раскладке + - Добавил поддержку С (подсветка) + - Добавил копирование готовых пакетов + * Fri Feb 6 2026 svk 2.0.0-beta3 - Откорректировал сборку рпм -- 2.49.1