chore: snapshot current working tree changes

Save all currently accumulated repository changes as a backup snapshot for Gitea so no local work is lost.
This commit is contained in:
Fedor
2026-03-26 14:19:01 +03:00
parent aec27abeb0
commit 01c4fe80b5
1557 changed files with 2090933 additions and 20934 deletions

View File

@@ -2834,12 +2834,15 @@ function CopyEntityFiles($crmid, $folder) {
// Поддерживает как локальные файлы, так и файлы в S3
global $adb;
// Упрощенный запрос - все документы
// Расширенный запрос - получаем все необходимые поля для работы с S3
$query = 'select
r.crmid,
r.notesid,
n.title,
n.filename
n.filename,
n.filelocationtype,
n.s3_bucket,
n.s3_key
from vtiger_senotesrel r
left join vtiger_notes n on n.notesid = r.notesid
left join vtiger_crmentity e on e.crmid = r.notesid
@@ -2853,9 +2856,13 @@ function CopyEntityFiles($crmid, $folder) {
if ($num_rows > 0) {
for ($i=0; $i<$num_rows; $i++) {
$notesid = $adb->query_result($result, $i, 'notesid');
$title = $adb->query_result($result, $i, 'title');
$filename = $adb->query_result($result, $i, 'filename');
try {
$notesid = $adb->query_result($result, $i, 'notesid');
$title = $adb->query_result($result, $i, 'title');
$filename = $adb->query_result($result, $i, 'filename');
$filelocationtype = $adb->query_result($result, $i, 'filelocationtype');
$s3_bucket = $adb->query_result($result, $i, 's3_bucket');
$s3_key = $adb->query_result($result, $i, 's3_key');
// Формируем короткое имя файла для сохранения
// Используем title из базы, но переводим в латиницу и сокращаем
@@ -2898,51 +2905,84 @@ function CopyEntityFiles($crmid, $folder) {
$destination = $folder.'/'.$save_filename;
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' CopyEntityFiles: обрабатываем файл '.($i+1).'/'.$num_rows.' - '.$filename.PHP_EOL, FILE_APPEND);
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' CopyEntityFiles: Notes ID='.$notesid.', Title='.$title.PHP_EOL, FILE_APPEND);
// Пытаемся скачать файл напрямую через HTTP
$file_content = '';
$success = false;
// Проверяем что это URL
if (filter_var($filename, FILTER_VALIDATE_URL)) {
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' Пытаемся скачать файл по URL: '.$filename.PHP_EOL, FILE_APPEND);
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' CopyEntityFiles: обрабатываем файл '.($i+1).'/'.$num_rows.' - '.$filename.PHP_EOL, FILE_APPEND);
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' CopyEntityFiles: Notes ID='.$notesid.', Title='.$title.', filelocationtype='.$filelocationtype.', s3_bucket='.$s3_bucket.', s3_key='.$s3_key.PHP_EOL, FILE_APPEND);
// Скачиваем файл через cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $filename);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
// Пытаемся скачать файл напрямую через HTTP
$file_content = '';
$success = false;
$download_url = '';
$file_content = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
if ($file_content !== false && $http_code == 200) {
$success = true;
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' Файл скачан успешно через HTTP, размер: '.strlen($file_content).' байт'.PHP_EOL, FILE_APPEND);
} else {
$file_content = "Ошибка скачивания файла:\n";
$file_content .= "HTTP Code: $http_code\n";
$file_content .= "Error: $error\n";
$file_content .= "URL: $filename\n";
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' Ошибка скачивания HTTP: '.$error.PHP_EOL, FILE_APPEND);
// Приоритет 1: Если есть s3_bucket и s3_key, формируем URL для S3
if (!empty($s3_bucket) && !empty($s3_key)) {
$download_url = 'https://s3.twcstorage.ru/'.$s3_bucket.'/'.$s3_key;
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' Файл в S3, формируем URL: '.$download_url.PHP_EOL, FILE_APPEND);
}
} else {
$file_content = "Информация о файле:\n";
$file_content .= "Title: $title\n";
$file_content .= "Notes ID: $notesid\n";
$file_content .= "Filename: $filename\n";
$file_content .= "Примечание: Не является URL\n";
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' Файл не является URL: '.$filename.PHP_EOL, FILE_APPEND);
// Приоритет 2: Если filename уже содержит URL (начинается с http:// или https://)
elseif (!empty($filename) && (strpos($filename, 'http://') === 0 || strpos($filename, 'https://') === 0)) {
$download_url = $filename;
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' Используем URL из filename: '.$download_url.PHP_EOL, FILE_APPEND);
}
// Приоритет 3: Проверяем через filter_var (для совместимости)
elseif (!empty($filename) && filter_var($filename, FILTER_VALIDATE_URL)) {
$download_url = $filename;
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' URL распознан через filter_var: '.$download_url.PHP_EOL, FILE_APPEND);
}
// Если есть URL для скачивания, пытаемся скачать
if (!empty($download_url)) {
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' Пытаемся скачать файл по URL: '.$download_url.PHP_EOL, FILE_APPEND);
// Скачиваем файл через cURL с улучшенной обработкой ошибок
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $download_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 60); // Увеличиваем таймаут до 60 секунд
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Отключаем проверку SSL для S3
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$file_content = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
$content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
curl_close($ch);
if ($file_content !== false && $http_code == 200 && strlen($file_content) > 100) {
// Проверяем, что это не HTML страница с ошибкой (минимальный размер 100 байт)
$success = true;
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' Файл из S3 скачан успешно, размер: '.strlen($file_content).' байт'.PHP_EOL, FILE_APPEND);
} else {
// Логируем ошибку, но не сохраняем текстовое сообщение
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' ОШИБКА скачивания: HTTP Code='.$http_code.', Error='.$error.', Content-Type='.$content_type.', Size='.strlen($file_content).' байт'.PHP_EOL, FILE_APPEND);
$file_content = false; // Помечаем как неудачу
$success = false;
}
} else {
// Нет URL для скачивания - это локальный файл или ошибка
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' ПРЕДУПРЕЖДЕНИЕ: Не удалось определить URL для файла. Filename='.$filename.', filelocationtype='.$filelocationtype.PHP_EOL, FILE_APPEND);
$file_content = false;
$success = false;
}
// Сохраняем файл только если скачивание успешно
if ($success && $file_content !== false) {
$write_result = file_put_contents($destination, $file_content);
if ($write_result !== false) {
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' Файл сохранен: '.$destination.' ('.strlen($file_content).' байт)'.PHP_EOL, FILE_APPEND);
} else {
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' ОШИБКА: Не удалось сохранить файл в '.$destination.PHP_EOL, FILE_APPEND);
}
} else {
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' ПРОПУЩЕН: Файл не сохранен из-за ошибки скачивания (Notes ID='.$notesid.')'.PHP_EOL, FILE_APPEND);
}
} catch (Exception $e) {
// Обработка исключений - логируем и продолжаем работу
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' ИСКЛЮЧЕНИЕ при обработке файла Notes ID='.$notesid.': '.$e->getMessage().PHP_EOL, FILE_APPEND);
continue; // Пропускаем этот файл и продолжаем со следующим
}
file_put_contents($destination, $file_content);
file_put_contents('logs/CopyToS3.log', date('Y-m-d H:i:s').' Файл сохранен: '.$destination.' ('.strlen($file_content).' байт)'.PHP_EOL, FILE_APPEND);
}
}