From 7ac335974baa44a8575bebb71ae2fbc0902d10e7 Mon Sep 17 00:00:00 2001 From: Roman Kelesidis Date: Thu, 26 Jun 2025 13:31:41 +0300 Subject: [PATCH 1/9] refactor: Use `DEFAULT_CHARSET` constant instead of hardcoded string (#2011) --- bt/announce.php | 4 ++-- bt/scrape.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bt/announce.php b/bt/announce.php index ea1cca19a..3c74e554f 100644 --- a/bt/announce.php +++ b/bt/announce.php @@ -115,7 +115,7 @@ $stopped = ($event === 'stopped'); // Check info_hash length if (strlen($info_hash) !== 20) { - msg_die('Invalid info_hash: ' . (mb_check_encoding($info_hash, 'UTF8') ? $info_hash : $info_hash_hex)); + msg_die('Invalid info_hash: ' . (mb_check_encoding($info_hash, DEFAULT_CHARSET) ? $info_hash : $info_hash_hex)); } /** @@ -257,7 +257,7 @@ if ($lp_info) { // Verify if torrent registered on tracker and user authorized if (empty($row['topic_id'])) { - msg_die('Torrent not registered, info_hash = ' . (mb_check_encoding($info_hash, 'UTF8') ? $info_hash : $info_hash_hex)); + msg_die('Torrent not registered, info_hash = ' . (mb_check_encoding($info_hash, DEFAULT_CHARSET) ? $info_hash : $info_hash_hex)); } if (empty($row['user_id'])) { msg_die('Please LOG IN and RE-DOWNLOAD this torrent (user not found)'); diff --git a/bt/scrape.php b/bt/scrape.php index dd94ab8ff..d11ea0981 100644 --- a/bt/scrape.php +++ b/bt/scrape.php @@ -32,7 +32,7 @@ $info_hash_hex = bin2hex($info_hash); // Check info_hash length if (strlen($info_hash) !== 20) { - msg_die('Invalid info_hash: ' . (mb_check_encoding($info_hash, 'UTF8') ? $info_hash : $info_hash_hex)); + msg_die('Invalid info_hash: ' . (mb_check_encoding($info_hash, DEFAULT_CHARSET) ? $info_hash : $info_hash_hex)); } // Handle multiple hashes @@ -97,7 +97,7 @@ if (!empty($info_hash_count)) { // Verify if torrent registered on tracker if (empty($torrents)) { - msg_die('Torrent not registered, info_hash = ' . (mb_check_encoding($info_hash, 'UTF8') ? $info_hash : $info_hash_hex)); + msg_die('Torrent not registered, info_hash = ' . (mb_check_encoding($info_hash, DEFAULT_CHARSET) ? $info_hash : $info_hash_hex)); } die(\Arokettu\Bencode\Bencode::encode($torrents)); From 915e1d817c61d2a4f0691b24ec1bc6577a9cd44b Mon Sep 17 00:00:00 2001 From: Roman Kelesidis Date: Sun, 29 Jun 2025 15:01:20 +0300 Subject: [PATCH 2/9] fix(TorrentFileList): Avoid `array_merge` reindexing for numeric folder names (#2014) Co-authored-by: zxc <17812947+metalwarrior88@users.noreply.github.com> --- src/Legacy/TorrentFileList.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Legacy/TorrentFileList.php b/src/Legacy/TorrentFileList.php index b3fcaeccc..f87c18f48 100644 --- a/src/Legacy/TorrentFileList.php +++ b/src/Legacy/TorrentFileList.php @@ -54,7 +54,7 @@ class TorrentFileList if ($this->multiple) { if (!empty($this->files_ary['/'])) { - $this->files_ary = array_merge($this->files_ary, $this->files_ary['/']); + $this->files_ary = $this->files_ary + $this->files_ary['/']; unset($this->files_ary['/']); } $filelist = $html->array2html($this->files_ary); From 9e3f3588f2e868d9e60c75f8b759b8cc51a7e658 Mon Sep 17 00:00:00 2001 From: Roman Kelesidis Date: Mon, 30 Jun 2025 10:49:42 +0300 Subject: [PATCH 3/9] release: v2.8.2 --- CHANGELOG.md | 11 +++++++++++ library/config.php | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7229399e0..103c54572 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,17 @@ # 📖 Change Log +## [v2.8.2](https://github.com/torrentpier/torrentpier/compare/v2.8.1..v2.8.2) (2025-06-30) + +### 🐛 Bug Fixes + +- *(TorrentFileList)* Avoid `array_merge` reindexing for numeric folder names ([#2014](https://github.com/torrentpier/torrentpier/pull/2014)) - ([915e1d8](https://github.com/torrentpier/torrentpier/commit/915e1d817c61d2a4f0691b24ec1bc6577a9cd44b)) + +### 🚜 Refactor + +- Use `DEFAULT_CHARSET` constant instead of hardcoded string ([#2011](https://github.com/torrentpier/torrentpier/pull/2011)) - ([7ac3359](https://github.com/torrentpier/torrentpier/commit/7ac335974baa44a8575bebb71ae2fbc0902d10e7)) + + ## [v2.8.1](https://github.com/torrentpier/torrentpier/compare/v2.8.0..v2.8.1) (2025-06-24) ### 🐛 Bug Fixes diff --git a/library/config.php b/library/config.php index 4837186f0..9cba785ad 100644 --- a/library/config.php +++ b/library/config.php @@ -18,8 +18,8 @@ $reserved_port = env('TP_PORT', 80); $bb_cfg = []; // Version info -$bb_cfg['tp_version'] = 'v2.8.1'; -$bb_cfg['tp_release_date'] = '24-06-2025'; +$bb_cfg['tp_version'] = 'v2.8.2'; +$bb_cfg['tp_release_date'] = '30-06-2025'; $bb_cfg['tp_release_codename'] = 'Cattle'; // Increase version number after changing JS or CSS From d4d82101dd67c9f4cd86e0f6f909495696974354 Mon Sep 17 00:00:00 2001 From: Roman Kelesidis Date: Wed, 2 Jul 2025 10:31:07 +0300 Subject: [PATCH 4/9] refactor(TorrentFileList): Reduce duplication in root directory unset logic (#2027) --- src/Legacy/TorrentFileList.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Legacy/TorrentFileList.php b/src/Legacy/TorrentFileList.php index f87c18f48..26617a595 100644 --- a/src/Legacy/TorrentFileList.php +++ b/src/Legacy/TorrentFileList.php @@ -53,8 +53,10 @@ class TorrentFileList $this->build_filelist_array(); if ($this->multiple) { - if (!empty($this->files_ary['/'])) { - $this->files_ary = $this->files_ary + $this->files_ary['/']; + if (isset($this->files_ary['/'])) { + if (!empty($this->files_ary['/'])) { + $this->files_ary = $this->files_ary + $this->files_ary['/']; + } unset($this->files_ary['/']); } $filelist = $html->array2html($this->files_ary); From fd46d3d04ad3ab1453256b2ab620508e2ba33586 Mon Sep 17 00:00:00 2001 From: Roman Kelesidis Date: Thu, 3 Jul 2025 10:35:30 +0300 Subject: [PATCH 5/9] feat(lang): Added `RTL` languages support (#2031) --- library/config.php | 2 ++ library/includes/page_header.php | 1 + styles/templates/admin/index.tpl | 2 +- styles/templates/default/page_header.tpl | 2 +- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/library/config.php b/library/config.php index 9cba785ad..cfea5268e 100644 --- a/library/config.php +++ b/library/config.php @@ -204,6 +204,7 @@ $bb_cfg['lang'] = [ 'ar' => [ 'name' => 'Arabic', 'locale' => 'ar_SA.UTF-8', + 'rtl' => true, ], 'hy' => [ 'name' => 'Armenian', @@ -280,6 +281,7 @@ $bb_cfg['lang'] = [ 'he' => [ 'name' => 'Hebrew', 'locale' => 'he_IL.UTF-8', + 'rtl' => true, ], 'hi' => [ 'name' => 'Hindi', diff --git a/library/includes/page_header.php b/library/includes/page_header.php index e3bdc3e12..1ecfbafe6 100644 --- a/library/includes/page_header.php +++ b/library/includes/page_header.php @@ -117,6 +117,7 @@ $template->assign_vars([ 'USER_HIDE_CAT' => (BB_SCRIPT == 'index'), 'USER_LANG' => $userdata['user_lang'], + 'USER_LANG_DIRECTION' => (isset($bb_cfg['lang'][$userdata['user_lang']]['rtl']) && $bb_cfg['lang'][$userdata['user_lang']]['rtl'] === true) ? 'rtl' : 'ltr', 'INCLUDE_BBCODE_JS' => !empty($page_cfg['include_bbcode_js']), 'USER_OPTIONS_JS' => IS_GUEST ? '{}' : json_encode($user->opt_js, JSON_THROW_ON_ERROR), diff --git a/styles/templates/admin/index.tpl b/styles/templates/admin/index.tpl index 3c8f30941..b4608f091 100644 --- a/styles/templates/admin/index.tpl +++ b/styles/templates/admin/index.tpl @@ -1,7 +1,7 @@ - + diff --git a/styles/templates/default/page_header.tpl b/styles/templates/default/page_header.tpl index 0ec5fb8f5..a4b2db8bf 100644 --- a/styles/templates/default/page_header.tpl +++ b/styles/templates/default/page_header.tpl @@ -1,5 +1,5 @@ - + From 51f2c70d81b910012cdecd111b5b92c1dfd0d6f6 Mon Sep 17 00:00:00 2001 From: Roman Kelesidis Date: Thu, 3 Jul 2025 10:48:25 +0300 Subject: [PATCH 6/9] feat(updater): Added exceptions logging (#2026) * feat(updater): Added exceptions logging * refactor(updater): Use `sha256` hash if available --- admin/index.php | 2 +- .../datastore/build_check_updates.php | 21 ++++-- library/includes/functions.php | 4 +- src/Updater.php | 71 ++++++++++++++++--- styles/templates/admin/index.tpl | 2 +- 5 files changed, 80 insertions(+), 20 deletions(-) diff --git a/admin/index.php b/admin/index.php index 3d3ddba58..33cb3411d 100644 --- a/admin/index.php +++ b/admin/index.php @@ -90,7 +90,7 @@ if (isset($_GET['pane']) && $_GET['pane'] == 'left') { 'NEW_VERSION_SIZE' => $update_data['latest_version_size'], 'NEW_VERSION_DL_LINK' => $update_data['latest_version_dl_link'], 'NEW_VERSION_LINK' => $update_data['latest_version_link'], - 'NEW_VERSION_MD5' => $update_data['latest_version_checksum'] + 'NEW_VERSION_HASH' => $update_data['latest_version_checksum'] ]); } diff --git a/library/includes/datastore/build_check_updates.php b/library/includes/datastore/build_check_updates.php index 416a9d4f7..bdad01400 100644 --- a/library/includes/datastore/build_check_updates.php +++ b/library/includes/datastore/build_check_updates.php @@ -16,9 +16,16 @@ if (!config()->get('tp_updater_settings.enabled')) { } $data = []; +$data[] = ['latest_check_timestamp' => TIMENOW]; -$updaterDownloader = new \TorrentPier\Updater(); -$updaterDownloader = $updaterDownloader->getLastVersion(config()->get('tp_updater_settings.allow_pre_releases')); +try { + $updaterDownloader = new \TorrentPier\Updater(); + $updaterDownloader = $updaterDownloader->getLastVersion(config()->get('tp_updater_settings.allow_pre_releases')); +} catch (Exception $exception) { + bb_log('[Updater] Exception: ' . $exception->getMessage() . LOG_LF); + $this->store('check_updates', $data); + return; +} $getVersion = \TorrentPier\Helpers\VersionHelper::removerPrefix($updaterDownloader['tag_name']); $currentVersion = \TorrentPier\Helpers\VersionHelper::removerPrefix(config()->get('tp_version')); @@ -26,6 +33,7 @@ $currentVersion = \TorrentPier\Helpers\VersionHelper::removerPrefix(config()->ge // Has update! if (\z4kn4fein\SemVer\Version::greaterThan($getVersion, $currentVersion)) { $latestBuildFileLink = $updaterDownloader['assets'][0]['browser_download_url']; + $SHAFileHash = $updaterDownloader['assets'][0]['digest'] ?? ''; // Check updater file $updaterFile = readUpdaterFile(); @@ -39,10 +47,12 @@ if (\z4kn4fein\SemVer\Version::greaterThan($getVersion, $currentVersion)) { ]), UPDATER_FILE, replace_content: true); } - // Get MD5 checksum + // Get MD5 / sha256 checksum $buildFileChecksum = ''; - if (isset($latestBuildFileLink)) { - $buildFileChecksum = strtoupper(md5_file($latestBuildFileLink)); + if (!empty($SHAFileHash)) { + $buildFileChecksum = $SHAFileHash; + } else { + $buildFileChecksum = 'MD5: ' . strtoupper(md5_file($latestBuildFileLink)); } // Build data array @@ -56,5 +66,4 @@ if (\z4kn4fein\SemVer\Version::greaterThan($getVersion, $currentVersion)) { ]; } -$data[] = ['latest_check_timestamp' => TIMENOW]; $this->store('check_updates', $data); diff --git a/library/includes/functions.php b/library/includes/functions.php index 79c187db0..c0302e66b 100644 --- a/library/includes/functions.php +++ b/library/includes/functions.php @@ -2212,10 +2212,10 @@ function infoByIP(string $ipAddress, int $port = 0): array ]; } } else { - bb_log("[FreeIPAPI] Failed to get IP info for: $ipAddress"); + bb_log("[FreeIPAPI] Failed to get IP info for: $ipAddress" . LOG_LF); } } catch (Exception $e) { - bb_log("[FreeIPAPI] " . $e->getMessage()); + bb_log("[FreeIPAPI] " . $e->getMessage() . LOG_LF); } if (empty($data)) { diff --git a/src/Updater.php b/src/Updater.php index 5ccba7843..3d64db47d 100644 --- a/src/Updater.php +++ b/src/Updater.php @@ -38,6 +38,13 @@ class Updater */ public string $savePath; + /** + * LTS version pattern (v2.8.*) + * + * @var string + */ + private const LTS_VERSION_PATTERN = '/^v2\.8\.\d+$/'; + /** * Stream context * @@ -130,23 +137,67 @@ class Updater } /** - * Returns information of latest TorrentPier version available + * Returns information of latest TorrentPier LTS version (v2.8.*) available + * + * @param bool $allowPreReleases + * @return array + * @throws Exception + */ + public function getLastVersion(bool $allowPreReleases = true): array + { + // Filter releases to get only LTS versions (v2.8.*) + $ltsVersions = array_filter($this->jsonResponse, function ($release) { + return preg_match(self::LTS_VERSION_PATTERN, $release['tag_name']); + }); + + if (empty($ltsVersions)) { + throw new Exception('No LTS versions (v2.8.*) found'); + } + + // Sort LTS versions by version number (descending) + usort($ltsVersions, function ($a, $b) { + return version_compare($b['tag_name'], $a['tag_name']); + }); + + if (!$allowPreReleases) { + foreach ($ltsVersions as $release) { + if (isset($release['prerelease']) && $release['prerelease']) { + continue; + } + return $release; + } + + // If no stable LTS versions found + throw new Exception('No stable LTS versions (v2.8.*) found'); + } + + return $ltsVersions[0]; + } + + /** + * Get all available LTS versions (v2.8.*) * * @param bool $allowPreReleases * @return array */ - public function getLastVersion(bool $allowPreReleases = true): array + public function getAllLTSVersions(bool $allowPreReleases = true): array { - if (!$allowPreReleases) { - foreach ($this->jsonResponse as $index) { - if (isset($index['prerelease']) && $index['prerelease']) { - continue; - } + // Filter releases to get only LTS versions (v2.8.*) + $ltsVersions = array_filter($this->jsonResponse, function ($release) use ($allowPreReleases) { + $isLTSVersion = preg_match(self::LTS_VERSION_PATTERN, $release['tag_name']); - return $index; + if (!$allowPreReleases && isset($release['prerelease']) && $release['prerelease']) { + return false; } - } - return $this->jsonResponse[0]; + return $isLTSVersion; + }); + + // Sort LTS versions by version number (descending) + usort($ltsVersions, function ($a, $b) { + return version_compare($b['tag_name'], $a['tag_name']); + }); + + return array_values($ltsVersions); } } diff --git a/styles/templates/admin/index.tpl b/styles/templates/admin/index.tpl index b4608f091..f29030591 100644 --- a/styles/templates/admin/index.tpl +++ b/styles/templates/admin/index.tpl @@ -160,7 +160,7 @@ {L_UPDATE_AVAILABLE}: - {updater.NEW_VERSION_NUMBER} ({L_SIZE}: {updater.NEW_VERSION_SIZE}) · {L_DOWNLOAD} · {L_CHANGELOG} · MD5: {updater.NEW_VERSION_MD5} + {updater.NEW_VERSION_NUMBER} ({L_SIZE}: {updater.NEW_VERSION_SIZE}) · {L_DOWNLOAD} · {L_CHANGELOG} · {updater.NEW_VERSION_HASH} From 423fb65dbf9fab480ea40ac2df767d5e0f1e0219 Mon Sep 17 00:00:00 2001 From: Roman Kelesidis Date: Thu, 3 Jul 2025 10:51:21 +0300 Subject: [PATCH 7/9] release: v2.8.3 --- CHANGELOG.md | 12 ++++++++++++ library/config.php | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 103c54572..deebe3d07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,18 @@ # 📖 Change Log +## [v2.8.3](https://github.com/torrentpier/torrentpier/compare/v2.8.2..v2.8.3) (2025-07-03) + +### 🚀 Features + +- *(lang)* Added `RTL` languages support ([#2031](https://github.com/torrentpier/torrentpier/pull/2031)) - ([fd46d3d](https://github.com/torrentpier/torrentpier/commit/fd46d3d04ad3ab1453256b2ab620508e2ba33586)) +- *(updater)* Added exceptions logging ([#2026](https://github.com/torrentpier/torrentpier/pull/2026)) - ([51f2c70](https://github.com/torrentpier/torrentpier/commit/51f2c70d81b910012cdecd111b5b92c1dfd0d6f6)) + +### 🚜 Refactor + +- *(TorrentFileList)* Reduce duplication in root directory unset logic ([#2027](https://github.com/torrentpier/torrentpier/pull/2027)) - ([d4d8210](https://github.com/torrentpier/torrentpier/commit/d4d82101dd67c9f4cd86e0f6f909495696974354)) + + ## [v2.8.2](https://github.com/torrentpier/torrentpier/compare/v2.8.1..v2.8.2) (2025-06-30) ### 🐛 Bug Fixes diff --git a/library/config.php b/library/config.php index cfea5268e..75732614c 100644 --- a/library/config.php +++ b/library/config.php @@ -18,8 +18,8 @@ $reserved_port = env('TP_PORT', 80); $bb_cfg = []; // Version info -$bb_cfg['tp_version'] = 'v2.8.2'; -$bb_cfg['tp_release_date'] = '30-06-2025'; +$bb_cfg['tp_version'] = 'v2.8.3'; +$bb_cfg['tp_release_date'] = '03-07-2025'; $bb_cfg['tp_release_codename'] = 'Cattle'; // Increase version number after changing JS or CSS From 6e7e3dd9efde5f8dda4435f186e054697c85fd05 Mon Sep 17 00:00:00 2001 From: Roman Kelesidis Date: Fri, 4 Jul 2025 00:07:09 +0300 Subject: [PATCH 8/9] fix: handle Nette DateTime objects in birthday validation (#2032) * fix: handle Nette DateTime objects in birthday validation * Update register.php * Update User.php --- library/includes/ucp/register.php | 1 + library/includes/ucp/viewprofile.php | 2 ++ src/Legacy/Common/User.php | 1 + viewtopic.php | 3 ++- 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/library/includes/ucp/register.php b/library/includes/ucp/register.php index 53d5bae2b..62f1f7ed0 100644 --- a/library/includes/ucp/register.php +++ b/library/includes/ucp/register.php @@ -142,6 +142,7 @@ switch ($mode) { if (!$pr_data = DB()->fetch_row($sql)) { bb_die($lang['PROFILE_NOT_FOUND']); } + $pr_data['user_birthday'] = $pr_data['user_birthday']->format('Y-m-d'); if (IN_DEMO_MODE && isset($_COOKIE['user_lang'])) { $pr_data['user_lang'] = $_COOKIE['user_lang']; } diff --git a/library/includes/ucp/viewprofile.php b/library/includes/ucp/viewprofile.php index 3d4605e68..e9f8903a7 100644 --- a/library/includes/ucp/viewprofile.php +++ b/library/includes/ucp/viewprofile.php @@ -30,6 +30,8 @@ if (!$profiledata = get_userdata($_GET[POST_USERS_URL], profile_view: true)) { bb_die($lang['NO_USER_ID_SPECIFIED']); } +$profiledata['user_birthday'] = $profiledata['user_birthday']->format('Y-m-d'); + if (!$ranks = $datastore->get('ranks')) { $datastore->update('ranks'); $ranks = $datastore->get('ranks'); diff --git a/src/Legacy/Common/User.php b/src/Legacy/Common/User.php index 52bfafc01..77e844004 100644 --- a/src/Legacy/Common/User.php +++ b/src/Legacy/Common/User.php @@ -232,6 +232,7 @@ class User } } + $this->data['user_birthday'] = $this->data['user_birthday']->format('Y-m-d'); return $this->data; } diff --git a/viewtopic.php b/viewtopic.php index 806327ded..6e7a2b9d2 100644 --- a/viewtopic.php +++ b/viewtopic.php @@ -565,6 +565,7 @@ for ($i = 0; $i < $total_posts; $i++) { $poster_from = ($postrow[$i]['user_from'] && !$poster_guest) ? $postrow[$i]['user_from'] : ''; $poster_joined = !$poster_guest ? $lang['JOINED'] . ': ' . bb_date($postrow[$i]['user_regdate'], 'Y-m-d H:i') : ''; $poster_longevity = !$poster_guest ? delta_time($postrow[$i]['user_regdate']) : ''; + $poster_birthday = $postrow[$i]['user_birthday']->format('Y-m-d'); $post_id = $postrow[$i]['post_id']; $mc_type = (int)$postrow[$i]['mc_type']; $mc_comment = $postrow[$i]['mc_comment']; @@ -715,7 +716,7 @@ for ($i = 0; $i < $total_posts; $i++) { 'DELETE' => $delpost_btn, 'IP' => $ip_btn, - 'POSTER_BIRTHDAY' => user_birthday_icon($postrow[$i]['user_birthday'], $postrow[$i]['user_id']), + 'POSTER_BIRTHDAY' => user_birthday_icon($poster_birthday, $postrow[$i]['user_id']), 'MC_COMMENT' => $mc_type ? bbcode2html($mc_comment) : '', 'MC_BBCODE' => $mc_type ? $mc_comment : '', From 144aa0558d11062c102224c5fd94c1ab8f994da9 Mon Sep 17 00:00:00 2001 From: Roman Kelesidis Date: Wed, 16 Jul 2025 10:15:09 +0300 Subject: [PATCH 9/9] chore: Removed deploy pipeline (#2047) --- .github/workflows/ci.yml | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 88eacf309..d4fd0b722 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,32 +43,3 @@ jobs: with: name: TorrentPier-master path: ${{ steps.create-zip.outputs.ZIP_NAME }} - - deploy: - name: 🎉 Deploy - runs-on: ubuntu-22.04 - steps: - - name: 🚚 Get latest code - uses: actions/checkout@v4 - - - name: 🔩 Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: '8.2' - - - name: 🖇 Install Composer dependencies - run: composer install --no-dev --no-progress --prefer-dist --optimize-autoloader - - - name: 📂 Sync files - uses: SamKirkland/FTP-Deploy-Action@v4.3.5 - with: - server: ${{ secrets.FTP_SERVER }} - username: ${{ secrets.FTP_USERNAME }} - password: ${{ secrets.FTP_PASSWORD }} - server-dir: ${{ secrets.FTP_DIR }} - protocol: ${{ secrets.FTP_PROTOCOL }} - port: ${{ secrets.FTP_PORT }} - exclude: | - **/.git* - **/.git*/** - .env