1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-06-06 23:46:28 +02:00

NC: Доработка синхронизации

This commit is contained in:
Anton Titovets 2024-09-24 10:12:25 +03:00
parent 0db9edfb0a
commit 63f0ffab6b
13 changed files with 4300 additions and 3983 deletions

View File

@ -0,0 +1,3 @@
{
"Token": "7419cd51de4037f7..."
}

View File

@ -0,0 +1,6 @@
 Token = "7419cd51de4037f7...";
LocalFolder = "C:\test_site";
RemoteFolder = "test";
Result = OPI_Neocities.SynchronizeFolders(Token, LocalFolder, RemoteFolder);

View File

@ -0,0 +1,3 @@
{
"Токен": "7419cd51de4037f7..."
}

View File

@ -0,0 +1,6 @@
 Токен = "7419cd51de4037f7...";
ЛокальныйКаталог = "C:\test_site";
УдаленныйКаталог = "test";
Результат = OPI_Neocities.СинхронизироватьКаталоги(Токен, ЛокальныйКаталог, УдаленныйКаталог);

File diff suppressed because it is too large Load Diff

View File

@ -267,83 +267,34 @@ EndFunction
// RemoteFolder - String - Remote receiver catalog. Root by default - remote // RemoteFolder - String - Remote receiver catalog. Root by default - remote
// //
// Returns: // Returns:
// Map Of KeyAndValue - Serialized JSON response from Neocities // Structure of KeyAndValue - synchronization error information
Function SynchronizeFolders(Val Token, Val LocalFolder, Val RemoteFolder = "") Export Function SynchronizeFolders(Val Token, Val LocalFolder, Val RemoteFolder = "") Export
OPI_TypeConversion.GetLine(LocalFolder); OPI_TypeConversion.GetLine(LocalFolder);
OPI_TypeConversion.GetLine(RemoteFolder); OPI_TypeConversion.GetLine(RemoteFolder);
Message("Start synchronization...");
If ValueIsFilled(RemoteFolder) Then If ValueIsFilled(RemoteFolder) Then
RemoteFolder = ?(StrEndsWith(RemoteFolder, "/"), RemoteFolder, RemoteFolder + "/"); RemoteFolder = ?(StrEndsWith(RemoteFolder, "/"), RemoteFolder, RemoteFolder + "/");
EndIf; EndIf;
LocalFolder = StrReplace(LocalFolder, "\", "/");
LocalFolder = ?(StrEndsWith(LocalFolder, "/"), LocalFolder, LocalFolder + "/");
RemoteFiles = GetFilesList(Token, RemoteFolder); RemoteFiles = GetFilesList(Token, RemoteFolder);
LocalFiles = FindFiles(LocalFolder, "*", True);
If Not RemoteFiles["result"] = "success" Then If Not RemoteFiles["result"] = "success" Then
Return RemoteFiles; Return RemoteFiles;
EndIf; EndIf;
LocalPaths = New Map; LocalPaths = New Map;
LocalFolders = New Map; LocalSubfolders = New Map;
ArrayOfDeletions = New Array;
For Each LocalFile In LocalFiles Do GetLocalPathsSets(LocalFolder, RemoteFolder, LocalPaths, LocalSubfolders);
CurrentAbsPath = LocalFile.FullName; ArrayOfDeletions = GetDeletedFiles(RemoteFiles, LocalPaths, LocalSubfolders);
CurrentRelPath = Right(CurrentAbsPath, StrLen(CurrentAbsPath) - StrLen(LocalFolder)); Result = MakeSynchronization(Token, ArrayOfDeletions, LocalPaths);
CurrentRelPath = RemoteFolder + CurrentRelPath;
CurrentRelPath = StrReplace(CurrentRelPath, "\", "/"); //@skip-check constructor-function-return-section
Return Result;
If LocalFile.IsDirectory() Then
LocalFolders.Insert(CurrentRelPath, CurrentAbsPath);
Else
LocalPaths.Insert(CurrentRelPath, CurrentAbsPath);
EndIf;
EndDo;
For Each RemoteFile In RemoteFiles["files"] Do
PathOfRemote = RemoteFile["path"];
If RemoteFile["is_directory"] Then
ExistingRemote = LocalFolders[PathOfRemote];
Else
ExistingRemote = LocalPaths[PathOfRemote];
EndIf;
If ExistingRemote = Undefined Then
ArrayOfDeletions.Add(PathOfRemote);
EndIf;
EndDo;
If Not ArrayOfDeletions.Count() = 0 Then
Response = OPI_Neocities.DeleteSelectedFiles(Token, ArrayOfDeletions);
If Not Response["result"] = "success" Then
Return Response;
Else
DeletingMessage = StrTemplate("Removed %1 unnecessary files", String(ArrayOfDeletions.Count()));
Message(DeletingMessage);
EndIf;
EndIf;
For Each LocalPath In LocalPaths Do
Response = OPI_Neocities.UploadFile(Token, LocalPath.Key, LocalPath.Value);
Message(LocalPath.Key + Chars.LF + Response["message"] + Chars.LF);
EndDo;
Return OPI_Neocities.GetSiteData(Token);
EndFunction EndFunction
@ -363,4 +314,100 @@ Function CreateRequestHeaders(Val Token)
EndFunction EndFunction
Function GetDeletedFiles(RemoteFiles, LocalPaths, LocalSubfolders)
ArrayOfDeletions = New Array;
For Each RemoteFile In RemoteFiles["files"] Do
PathOfRemote = RemoteFile["path"];
If RemoteFile["is_directory"] Then
ExistingRemote = LocalSubfolders[PathOfRemote];
Else
ExistingRemote = LocalPaths[PathOfRemote];
EndIf;
If ExistingRemote = Undefined Then
ArrayOfDeletions.Add(PathOfRemote);
EndIf;
EndDo;
Return ArrayOfDeletions;
EndFunction
//@skip-check module-unused-local-variable
Function MakeSynchronization(Token, ArrayOfDeletions, LocalPaths)
ErrorsArray = New Array;
If Not ArrayOfDeletions.Count() = 0 Then
Response = OPI_Neocities.DeleteSelectedFiles(Token, ArrayOfDeletions);
If Not Response["result"] = "success" Then
ErrorsArray.Add(Response);
Else
DeletingMessage = StrTemplate("Removed %1 unnecessary files", String(ArrayOfDeletions.Count()));
Message(DeletingMessage);
EndIf;
EndIf;
Total = OPI_Tools.NumberToString(LocalPaths.Count());
Counter = 0;
For Each LocalPath In LocalPaths Do
Response = OPI_Neocities.UploadFile(Token, LocalPath.Key, LocalPath.Value);
If Not Response["result"] = "success" Then
ErrorsArray.Add(Response);
Else
Progress = "[" + OPI_Tools.NumberToString(Counter) + "/" + Total + "] ";
Message(Progress + LocalPath.Key + Chars.LF + Response["message"] + Chars.LF);
EndIf;
Counter = Counter + 1;
EndDo;
Return New Structure("errors,items", ErrorsArray.Count(), ErrorsArray);
EndFunction
Procedure GetLocalPathsSets(LocalFolder, RemoteFolder, LocalPaths, LocalSubfolders)
LocalFolder = StrReplace(LocalFolder, "\", "/");
LocalFolder = ?(StrEndsWith(LocalFolder, "/"), LocalFolder, LocalFolder + "/");
LocalFiles = FindFiles(LocalFolder, "*", True);
For Each LocalFile In LocalFiles Do
CurrentAbsPath = LocalFile.FullName;
CurrentRelPath = Right(CurrentAbsPath, StrLen(CurrentAbsPath) - StrLen(LocalFolder));
CurrentRelPath = RemoteFolder + CurrentRelPath;
CurrentRelPath = StrReplace(CurrentRelPath, "\", "/");
If LocalFile.IsDirectory() Then
LocalSubfolders.Insert(CurrentRelPath, CurrentAbsPath);
Else
LocalPaths.Insert(CurrentRelPath, CurrentAbsPath);
EndIf;
EndDo;
EndProcedure
#EndRegion #EndRegion

View File

@ -3048,6 +3048,7 @@ Procedure NC_FilesManagment() Export
Neocities_UploadFiles(TestParameters); Neocities_UploadFiles(TestParameters);
Neocities_GetFilesList(TestParameters); Neocities_GetFilesList(TestParameters);
Neocities_DeleteSelectedFiles(TestParameters); Neocities_DeleteSelectedFiles(TestParameters);
Neocities_SynchronizeFolders(TestParameters);
EndProcedure EndProcedure
@ -4060,6 +4061,13 @@ Procedure Check_NCFolderFiles(Val Result, Val Count)
EndProcedure EndProcedure
Procedure Check_NCSync(Val Result)
OPI_TestDataRetrieval.ExpectsThat(Result["errors"]).Равно(0);
OPI_TestDataRetrieval.ExpectsThat(Result["items"].Count()).Равно(0);
EndProcedure
#EndRegion #EndRegion
#Region AtomicTests #Region AtomicTests
@ -13225,6 +13233,23 @@ Procedure Neocities_GetToken(FunctionParameters)
EndProcedure EndProcedure
Procedure Neocities_SynchronizeFolders(FunctionParameters)
Token = FunctionParameters["NC_Token"];
LocalFolder = "C:\test_site";
RemoteFolder = "test";
Result = OPI_Neocities.SynchronizeFolders(Token, LocalFolder, RemoteFolder);
// END
OPI_TestDataRetrieval.WriteLog(Result, "SynchronizeFolders", "Neocities");
Check_NCSync(Result);
EndProcedure
#EndRegion #EndRegion
#EndRegion #EndRegion

View File

@ -267,83 +267,34 @@ EndFunction
// RemoteFolder - String - Remote receiver catalog. Root by default - remote // RemoteFolder - String - Remote receiver catalog. Root by default - remote
// //
// Returns: // Returns:
// Map Of KeyAndValue - Serialized JSON response from Neocities // Structure of KeyAndValue - synchronization error information
Function SynchronizeFolders(Val Token, Val LocalFolder, Val RemoteFolder = "") Export Function SynchronizeFolders(Val Token, Val LocalFolder, Val RemoteFolder = "") Export
OPI_TypeConversion.GetLine(LocalFolder); OPI_TypeConversion.GetLine(LocalFolder);
OPI_TypeConversion.GetLine(RemoteFolder); OPI_TypeConversion.GetLine(RemoteFolder);
// !OInt Message("Start synchronization...");
If ValueIsFilled(RemoteFolder) Then If ValueIsFilled(RemoteFolder) Then
RemoteFolder = ?(StrEndsWith(RemoteFolder, "/"), RemoteFolder, RemoteFolder + "/"); RemoteFolder = ?(StrEndsWith(RemoteFolder, "/"), RemoteFolder, RemoteFolder + "/");
EndIf; EndIf;
LocalFolder = StrReplace(LocalFolder, "\", "/");
LocalFolder = ?(StrEndsWith(LocalFolder, "/"), LocalFolder, LocalFolder + "/");
RemoteFiles = GetFilesList(Token, RemoteFolder); RemoteFiles = GetFilesList(Token, RemoteFolder);
LocalFiles = FindFiles(LocalFolder, "*", True);
If Not RemoteFiles["result"] = "success" Then If Not RemoteFiles["result"] = "success" Then
Return RemoteFiles; Return RemoteFiles;
EndIf; EndIf;
LocalPaths = New Map; LocalPaths = New Map;
LocalFolders = New Map; LocalSubfolders = New Map;
ArrayOfDeletions = New Array;
For Each LocalFile In LocalFiles Do GetLocalPathsSets(LocalFolder, RemoteFolder, LocalPaths, LocalSubfolders);
CurrentAbsPath = LocalFile.FullName; ArrayOfDeletions = GetDeletedFiles(RemoteFiles, LocalPaths, LocalSubfolders);
CurrentRelPath = Right(CurrentAbsPath, StrLen(CurrentAbsPath) - StrLen(LocalFolder)); Result = MakeSynchronization(Token, ArrayOfDeletions, LocalPaths);
CurrentRelPath = RemoteFolder + CurrentRelPath;
CurrentRelPath = StrReplace(CurrentRelPath, "\", "/"); //@skip-check constructor-function-return-section
Return Result;
If LocalFile.IsDirectory() Then
LocalFolders.Insert(CurrentRelPath, CurrentAbsPath);
Else
LocalPaths.Insert(CurrentRelPath, CurrentAbsPath);
EndIf;
EndDo;
For Each RemoteFile In RemoteFiles["files"] Do
PathOfRemote = RemoteFile["path"];
If RemoteFile["is_directory"] Then
ExistingRemote = LocalFolders[PathOfRemote];
Else
ExistingRemote = LocalPaths[PathOfRemote];
EndIf;
If ExistingRemote = Undefined Then
ArrayOfDeletions.Add(PathOfRemote);
EndIf;
EndDo;
If Not ArrayOfDeletions.Count() = 0 Then
Response = OPI_Neocities.DeleteSelectedFiles(Token, ArrayOfDeletions);
If Not Response["result"] = "success" Then
Return Response;
Else
DeletingMessage = StrTemplate("Removed %1 unnecessary files", String(ArrayOfDeletions.Count()));
// !OInt Message(DeletingMessage);
EndIf;
EndIf;
For Each LocalPath In LocalPaths Do
Response = OPI_Neocities.UploadFile(Token, LocalPath.Key, LocalPath.Value);
// !OInt Message(LocalPath.Key + Chars.LF + Response["message"] + Chars.LF);
EndDo;
Return OPI_Neocities.GetSiteData(Token);
EndFunction EndFunction
@ -363,4 +314,100 @@ Function CreateRequestHeaders(Val Token)
EndFunction EndFunction
Function GetDeletedFiles(RemoteFiles, LocalPaths, LocalSubfolders)
ArrayOfDeletions = New Array;
For Each RemoteFile In RemoteFiles["files"] Do
PathOfRemote = RemoteFile["path"];
If RemoteFile["is_directory"] Then
ExistingRemote = LocalSubfolders[PathOfRemote];
Else
ExistingRemote = LocalPaths[PathOfRemote];
EndIf;
If ExistingRemote = Undefined Then
ArrayOfDeletions.Add(PathOfRemote);
EndIf;
EndDo;
Return ArrayOfDeletions;
EndFunction
//@skip-check module-unused-local-variable
Function MakeSynchronization(Token, ArrayOfDeletions, LocalPaths)
ErrorsArray = New Array;
If Not ArrayOfDeletions.Count() = 0 Then
Response = OPI_Neocities.DeleteSelectedFiles(Token, ArrayOfDeletions);
If Not Response["result"] = "success" Then
ErrorsArray.Add(Response);
Else
DeletingMessage = StrTemplate("Removed %1 unnecessary files", String(ArrayOfDeletions.Count()));
// !OInt Message(DeletingMessage);
EndIf;
EndIf;
Total = OPI_Tools.NumberToString(LocalPaths.Count());
Counter = 0;
For Each LocalPath In LocalPaths Do
Response = OPI_Neocities.UploadFile(Token, LocalPath.Key, LocalPath.Value);
If Not Response["result"] = "success" Then
ErrorsArray.Add(Response);
Else
Progress = "[" + OPI_Tools.NumberToString(Counter) + "/" + Total + "] ";
// !OInt Message(Progress + LocalPath.Key + Chars.LF + Response["message"] + Chars.LF);
EndIf;
Counter = Counter + 1;
EndDo;
Return New Structure("errors,items", ErrorsArray.Count(), ErrorsArray);
EndFunction
Procedure GetLocalPathsSets(LocalFolder, RemoteFolder, LocalPaths, LocalSubfolders)
LocalFolder = StrReplace(LocalFolder, "\", "/");
LocalFolder = ?(StrEndsWith(LocalFolder, "/"), LocalFolder, LocalFolder + "/");
LocalFiles = FindFiles(LocalFolder, "*", True);
For Each LocalFile In LocalFiles Do
CurrentAbsPath = LocalFile.FullName;
CurrentRelPath = Right(CurrentAbsPath, StrLen(CurrentAbsPath) - StrLen(LocalFolder));
CurrentRelPath = RemoteFolder + CurrentRelPath;
CurrentRelPath = StrReplace(CurrentRelPath, "\", "/");
If LocalFile.IsDirectory() Then
LocalSubfolders.Insert(CurrentRelPath, CurrentAbsPath);
Else
LocalPaths.Insert(CurrentRelPath, CurrentAbsPath);
EndIf;
EndDo;
EndProcedure
#EndRegion #EndRegion

View File

@ -3048,6 +3048,7 @@ Procedure NC_FilesManagment() Export
Neocities_UploadFiles(TestParameters); Neocities_UploadFiles(TestParameters);
Neocities_GetFilesList(TestParameters); Neocities_GetFilesList(TestParameters);
Neocities_DeleteSelectedFiles(TestParameters); Neocities_DeleteSelectedFiles(TestParameters);
Neocities_SynchronizeFolders(TestParameters);
EndProcedure EndProcedure
@ -4060,6 +4061,13 @@ Procedure Check_NCFolderFiles(Val Result, Val Count)
EndProcedure EndProcedure
Procedure Check_NCSync(Val Result)
OPI_TestDataRetrieval.ExpectsThat(Result["errors"]).Равно(0);
OPI_TestDataRetrieval.ExpectsThat(Result["items"].Count()).Равно(0);
EndProcedure
#EndRegion #EndRegion
#Region AtomicTests #Region AtomicTests
@ -13225,6 +13233,23 @@ Procedure Neocities_GetToken(FunctionParameters)
EndProcedure EndProcedure
Procedure Neocities_SynchronizeFolders(FunctionParameters)
Token = FunctionParameters["NC_Token"];
LocalFolder = "C:\test_site";
RemoteFolder = "test";
Result = OPI_Neocities.SynchronizeFolders(Token, LocalFolder, RemoteFolder);
// END
OPI_TestDataRetrieval.WriteLog(Result, "SynchronizeFolders", "Neocities");
Check_NCSync(Result);
EndProcedure
#EndRegion #EndRegion
#EndRegion #EndRegion

View File

@ -267,83 +267,34 @@
// УдаленныйКаталог - Строка - Удаленный каталог приемника. Корень, если не заполнено - remote // УдаленныйКаталог - Строка - Удаленный каталог приемника. Корень, если не заполнено - remote
// //
// Возвращаемое значение: // Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Neocities // Структура Из КлючИЗначение - информация об ошибках синхронизации
Функция СинхронизироватьКаталоги(Знач Токен, Знач ЛокальныйКаталог, Знач УдаленныйКаталог = "") Экспорт Функция СинхронизироватьКаталоги(Знач Токен, Знач ЛокальныйКаталог, Знач УдаленныйКаталог = "") Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ЛокальныйКаталог); OPI_ПреобразованиеТипов.ПолучитьСтроку(ЛокальныйКаталог);
OPI_ПреобразованиеТипов.ПолучитьСтроку(УдаленныйКаталог); OPI_ПреобразованиеТипов.ПолучитьСтроку(УдаленныйКаталог);
Сообщить("Начало синхронизации...");
Если ЗначениеЗаполнено(УдаленныйКаталог) Тогда Если ЗначениеЗаполнено(УдаленныйКаталог) Тогда
УдаленныйКаталог = ?(СтрЗаканчиваетсяНа(УдаленныйКаталог, "/"), УдаленныйКаталог, УдаленныйКаталог + "/"); УдаленныйКаталог = ?(СтрЗаканчиваетсяНа(УдаленныйКаталог, "/"), УдаленныйКаталог, УдаленныйКаталог + "/");
КонецЕсли; КонецЕсли;
ЛокальныйКаталог = СтрЗаменить(ЛокальныйКаталог, "\", "/");
ЛокальныйКаталог = ?(СтрЗаканчиваетсяНа(ЛокальныйКаталог, "/"), ЛокальныйКаталог, ЛокальныйКаталог + "/");
УдаленныеФайлы = ПолучитьСписокФайлов(Токен, УдаленныйКаталог); УдаленныеФайлы = ПолучитьСписокФайлов(Токен, УдаленныйКаталог);
ЛокальныеФайлы = НайтиФайлы(ЛокальныйКаталог, "*", Истина);
Если Не УдаленныеФайлы["result"] = "success" Тогда Если Не УдаленныеФайлы["result"] = "success" Тогда
Возврат УдаленныеФайлы; Возврат УдаленныеФайлы;
КонецЕсли; КонецЕсли;
ЛокальныеПути = Новый Соответствие; ЛокальныеПути = Новый Соответствие;
ЛокальныеКаталоги = Новый Соответствие; ЛокальныеПодкаталоги = Новый Соответствие;
МассивУдаляемых = Новый Массив;
Для Каждого ЛокальныйФайл Из ЛокальныеФайлы Цикл ПолучитьНаборыЛокальныхПутей(ЛокальныйКаталог, УдаленныйКаталог, ЛокальныеПути, ЛокальныеПодкаталоги);
ТекущийАбсПуть = ЛокальныйФайл.ПолноеИмя; МассивУдаляемых = ПолучитьУдаляемыеФайлы(УдаленныеФайлы, ЛокальныеПути, ЛокальныеПодкаталоги);
ТекущийОтнПуть = Прав(ТекущийАбсПуть, СтрДлина(ТекущийАбсПуть) - СтрДлина(ЛокальныйКаталог)); Результат = ВыполнитьСинхронизацию(Токен, МассивУдаляемых, ЛокальныеПути);
ТекущийОтнПуть = УдаленныйКаталог + ТекущийОтнПуть;
ТекущийОтнПуть = СтрЗаменить(ТекущийОтнПуть, "\", "/"); //@skip-check constructor-function-return-section
Возврат Результат;
Если ЛокальныйФайл.ЭтоКаталог() Тогда
ЛокальныеКаталоги.Вставить(ТекущийОтнПуть, ТекущийАбсПуть);
Иначе
ЛокальныеПути.Вставить(ТекущийОтнПуть, ТекущийАбсПуть);
КонецЕсли;
КонецЦикла;
Для Каждого УдаленныйФайл Из УдаленныеФайлы["files"] Цикл
ПутьУдаленного = УдаленныйФайл["path"];
Если УдаленныйФайл["is_directory"] Тогда
СуществующийУдаленный = ЛокальныеКаталоги[ПутьУдаленного];
Иначе
СуществующийУдаленный = ЛокальныеПути[ПутьУдаленного];
КонецЕсли;
Если СуществующийУдаленный = Неопределено Тогда
МассивУдаляемых.Добавить(ПутьУдаленного);
КонецЕсли;
КонецЦикла;
Если Не МассивУдаляемых.Количество() = 0 Тогда
Ответ = OPI_Neocities.УдалитьВыбранныеФайлы(Токен, МассивУдаляемых);
Если Не Ответ["result"] = "success" Тогда
Возврат Ответ;
Иначе
СообщениеУдаления = СтрШаблон("Удалено %1 лишних файлов", Строка(МассивУдаляемых.Количество()));
Сообщить(СообщениеУдаления);
КонецЕсли;
КонецЕсли;
Для Каждого ЛокальныйПуть Из ЛокальныеПути Цикл
Ответ = OPI_Neocities.ЗагрузитьФайл(Токен, ЛокальныйПуть.Ключ, ЛокальныйПуть.Значение);
Сообщить(ЛокальныйПуть.Ключ + Символы.ПС + Ответ["message"] + Символы.ПС);
КонецЦикла;
Возврат OPI_Neocities.ПолучитьДанныеОСайте(Токен);
КонецФункции КонецФункции
@ -363,4 +314,100 @@
КонецФункции КонецФункции
Функция ПолучитьУдаляемыеФайлы(УдаленныеФайлы, ЛокальныеПути, ЛокальныеПодкаталоги)
МассивУдаляемых = Новый Массив;
Для Каждого УдаленныйФайл Из УдаленныеФайлы["files"] Цикл
ПутьУдаленного = УдаленныйФайл["path"];
Если УдаленныйФайл["is_directory"] Тогда
СуществующийУдаленный = ЛокальныеПодкаталоги[ПутьУдаленного];
Иначе
СуществующийУдаленный = ЛокальныеПути[ПутьУдаленного];
КонецЕсли;
Если СуществующийУдаленный = Неопределено Тогда
МассивУдаляемых.Добавить(ПутьУдаленного);
КонецЕсли;
КонецЦикла;
Возврат МассивУдаляемых;
КонецФункции
//@skip-check module-unused-local-variable
Функция ВыполнитьСинхронизацию(Токен, МассивУдаляемых, ЛокальныеПути)
МассивОшибок = Новый Массив;
Если Не МассивУдаляемых.Количество() = 0 Тогда
Ответ = OPI_Neocities.УдалитьВыбранныеФайлы(Токен, МассивУдаляемых);
Если Не Ответ["result"] = "success" Тогда
МассивОшибок.Добавить(Ответ);
Иначе
СообщениеУдаления = СтрШаблон("Удалено %1 лишних файлов", Строка(МассивУдаляемых.Количество()));
Сообщить(СообщениеУдаления);
КонецЕсли;
КонецЕсли;
Всего = OPI_Инструменты.ЧислоВСтроку(ЛокальныеПути.Количество());
Счетчик = 0;
Для Каждого ЛокальныйПуть Из ЛокальныеПути Цикл
Ответ = OPI_Neocities.ЗагрузитьФайл(Токен, ЛокальныйПуть.Ключ, ЛокальныйПуть.Значение);
Если Не Ответ["result"] = "success" Тогда
МассивОшибок.Добавить(Ответ);
Иначе
Прогресс = "[" + OPI_Инструменты.ЧислоВСтроку(Счетчик) + "/" + Всего + "] ";
Сообщить(Прогресс + ЛокальныйПуть.Ключ + Символы.ПС + Ответ["message"] + Символы.ПС);
КонецЕсли;
Счетчик = Счетчик + 1;
КонецЦикла;
Возврат Новый Структура("errors,items", МассивОшибок.Количество(), МассивОшибок);
КонецФункции
Процедура ПолучитьНаборыЛокальныхПутей(ЛокальныйКаталог, УдаленныйКаталог, ЛокальныеПути, ЛокальныеПодкаталоги)
ЛокальныйКаталог = СтрЗаменить(ЛокальныйКаталог, "\", "/");
ЛокальныйКаталог = ?(СтрЗаканчиваетсяНа(ЛокальныйКаталог, "/"), ЛокальныйКаталог, ЛокальныйКаталог + "/");
ЛокальныеФайлы = НайтиФайлы(ЛокальныйКаталог, "*", Истина);
Для Каждого ЛокальныйФайл Из ЛокальныеФайлы Цикл
ТекущийАбсПуть = ЛокальныйФайл.ПолноеИмя;
ТекущийОтнПуть = Прав(ТекущийАбсПуть, СтрДлина(ТекущийАбсПуть) - СтрДлина(ЛокальныйКаталог));
ТекущийОтнПуть = УдаленныйКаталог + ТекущийОтнПуть;
ТекущийОтнПуть = СтрЗаменить(ТекущийОтнПуть, "\", "/");
Если ЛокальныйФайл.ЭтоКаталог() Тогда
ЛокальныеПодкаталоги.Вставить(ТекущийОтнПуть, ТекущийАбсПуть);
Иначе
ЛокальныеПути.Вставить(ТекущийОтнПуть, ТекущийАбсПуть);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти #КонецОбласти

View File

@ -3048,6 +3048,7 @@
Neocities_ЗагрузитьФайлы(ПараметрыТеста); Neocities_ЗагрузитьФайлы(ПараметрыТеста);
Neocities_ПолучитьСписокФайлов(ПараметрыТеста); Neocities_ПолучитьСписокФайлов(ПараметрыТеста);
Neocities_УдалитьВыбранныеФайлы(ПараметрыТеста); Neocities_УдалитьВыбранныеФайлы(ПараметрыТеста);
Neocities_СинхронизироватьКаталоги(ПараметрыТеста);
КонецПроцедуры КонецПроцедуры
@ -4060,6 +4061,13 @@
КонецПроцедуры КонецПроцедуры
Процедура Проверка_НССинхронизация(Знач Результат)
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["errors"]).Равно(0);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"].Количество()).Равно(0);
КонецПроцедуры
#КонецОбласти #КонецОбласти
#Область АтомарныеТесты #Область АтомарныеТесты
@ -13225,6 +13233,23 @@
КонецПроцедуры КонецПроцедуры
Процедура Neocities_СинхронизироватьКаталоги(ПараметрыФункции)
Токен = ПараметрыФункции["NC_Token"];
ЛокальныйКаталог = "C:\test_site";
УдаленныйКаталог = "test";
Результат = OPI_Neocities.СинхронизироватьКаталоги(Токен, ЛокальныйКаталог, УдаленныйКаталог);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СинхронизироватьКаталоги", "Neocities");
Проверка_НССинхронизация(Результат);
КонецПроцедуры
#КонецОбласти #КонецОбласти
#КонецОбласти #КонецОбласти

View File

@ -267,83 +267,34 @@
// УдаленныйКаталог - Строка - Удаленный каталог приемника. Корень, если не заполнено - remote // УдаленныйКаталог - Строка - Удаленный каталог приемника. Корень, если не заполнено - remote
// //
// Возвращаемое значение: // Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Neocities // Структура Из КлючИЗначение - информация об ошибках синхронизации
Функция СинхронизироватьКаталоги(Знач Токен, Знач ЛокальныйКаталог, Знач УдаленныйКаталог = "") Экспорт Функция СинхронизироватьКаталоги(Знач Токен, Знач ЛокальныйКаталог, Знач УдаленныйКаталог = "") Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(ЛокальныйКаталог); OPI_ПреобразованиеТипов.ПолучитьСтроку(ЛокальныйКаталог);
OPI_ПреобразованиеТипов.ПолучитьСтроку(УдаленныйКаталог); OPI_ПреобразованиеТипов.ПолучитьСтроку(УдаленныйКаталог);
// !OInt Сообщить("Начало синхронизации...");
Если ЗначениеЗаполнено(УдаленныйКаталог) Тогда Если ЗначениеЗаполнено(УдаленныйКаталог) Тогда
УдаленныйКаталог = ?(СтрЗаканчиваетсяНа(УдаленныйКаталог, "/"), УдаленныйКаталог, УдаленныйКаталог + "/"); УдаленныйКаталог = ?(СтрЗаканчиваетсяНа(УдаленныйКаталог, "/"), УдаленныйКаталог, УдаленныйКаталог + "/");
КонецЕсли; КонецЕсли;
ЛокальныйКаталог = СтрЗаменить(ЛокальныйКаталог, "\", "/");
ЛокальныйКаталог = ?(СтрЗаканчиваетсяНа(ЛокальныйКаталог, "/"), ЛокальныйКаталог, ЛокальныйКаталог + "/");
УдаленныеФайлы = ПолучитьСписокФайлов(Токен, УдаленныйКаталог); УдаленныеФайлы = ПолучитьСписокФайлов(Токен, УдаленныйКаталог);
ЛокальныеФайлы = НайтиФайлы(ЛокальныйКаталог, "*", Истина);
Если Не УдаленныеФайлы["result"] = "success" Тогда Если Не УдаленныеФайлы["result"] = "success" Тогда
Возврат УдаленныеФайлы; Возврат УдаленныеФайлы;
КонецЕсли; КонецЕсли;
ЛокальныеПути = Новый Соответствие; ЛокальныеПути = Новый Соответствие;
ЛокальныеКаталоги = Новый Соответствие; ЛокальныеПодкаталоги = Новый Соответствие;
МассивУдаляемых = Новый Массив;
Для Каждого ЛокальныйФайл Из ЛокальныеФайлы Цикл ПолучитьНаборыЛокальныхПутей(ЛокальныйКаталог, УдаленныйКаталог, ЛокальныеПути, ЛокальныеПодкаталоги);
ТекущийАбсПуть = ЛокальныйФайл.ПолноеИмя; МассивУдаляемых = ПолучитьУдаляемыеФайлы(УдаленныеФайлы, ЛокальныеПути, ЛокальныеПодкаталоги);
ТекущийОтнПуть = Прав(ТекущийАбсПуть, СтрДлина(ТекущийАбсПуть) - СтрДлина(ЛокальныйКаталог)); Результат = ВыполнитьСинхронизацию(Токен, МассивУдаляемых, ЛокальныеПути);
ТекущийОтнПуть = УдаленныйКаталог + ТекущийОтнПуть;
ТекущийОтнПуть = СтрЗаменить(ТекущийОтнПуть, "\", "/"); //@skip-check constructor-function-return-section
Возврат Результат;
Если ЛокальныйФайл.ЭтоКаталог() Тогда
ЛокальныеКаталоги.Вставить(ТекущийОтнПуть, ТекущийАбсПуть);
Иначе
ЛокальныеПути.Вставить(ТекущийОтнПуть, ТекущийАбсПуть);
КонецЕсли;
КонецЦикла;
Для Каждого УдаленныйФайл Из УдаленныеФайлы["files"] Цикл
ПутьУдаленного = УдаленныйФайл["path"];
Если УдаленныйФайл["is_directory"] Тогда
СуществующийУдаленный = ЛокальныеКаталоги[ПутьУдаленного];
Иначе
СуществующийУдаленный = ЛокальныеПути[ПутьУдаленного];
КонецЕсли;
Если СуществующийУдаленный = Неопределено Тогда
МассивУдаляемых.Добавить(ПутьУдаленного);
КонецЕсли;
КонецЦикла;
Если Не МассивУдаляемых.Количество() = 0 Тогда
Ответ = OPI_Neocities.УдалитьВыбранныеФайлы(Токен, МассивУдаляемых);
Если Не Ответ["result"] = "success" Тогда
Возврат Ответ;
Иначе
СообщениеУдаления = СтрШаблон("Удалено %1 лишних файлов", Строка(МассивУдаляемых.Количество()));
// !OInt Сообщить(СообщениеУдаления);
КонецЕсли;
КонецЕсли;
Для Каждого ЛокальныйПуть Из ЛокальныеПути Цикл
Ответ = OPI_Neocities.ЗагрузитьФайл(Токен, ЛокальныйПуть.Ключ, ЛокальныйПуть.Значение);
// !OInt Сообщить(ЛокальныйПуть.Ключ + Символы.ПС + Ответ["message"] + Символы.ПС);
КонецЦикла;
Возврат OPI_Neocities.ПолучитьДанныеОСайте(Токен);
КонецФункции КонецФункции
@ -363,4 +314,100 @@
КонецФункции КонецФункции
Функция ПолучитьУдаляемыеФайлы(УдаленныеФайлы, ЛокальныеПути, ЛокальныеПодкаталоги)
МассивУдаляемых = Новый Массив;
Для Каждого УдаленныйФайл Из УдаленныеФайлы["files"] Цикл
ПутьУдаленного = УдаленныйФайл["path"];
Если УдаленныйФайл["is_directory"] Тогда
СуществующийУдаленный = ЛокальныеПодкаталоги[ПутьУдаленного];
Иначе
СуществующийУдаленный = ЛокальныеПути[ПутьУдаленного];
КонецЕсли;
Если СуществующийУдаленный = Неопределено Тогда
МассивУдаляемых.Добавить(ПутьУдаленного);
КонецЕсли;
КонецЦикла;
Возврат МассивУдаляемых;
КонецФункции
//@skip-check module-unused-local-variable
Функция ВыполнитьСинхронизацию(Токен, МассивУдаляемых, ЛокальныеПути)
МассивОшибок = Новый Массив;
Если Не МассивУдаляемых.Количество() = 0 Тогда
Ответ = OPI_Neocities.УдалитьВыбранныеФайлы(Токен, МассивУдаляемых);
Если Не Ответ["result"] = "success" Тогда
МассивОшибок.Добавить(Ответ);
Иначе
СообщениеУдаления = СтрШаблон("Удалено %1 лишних файлов", Строка(МассивУдаляемых.Количество()));
// !OInt Сообщить(СообщениеУдаления);
КонецЕсли;
КонецЕсли;
Всего = OPI_Инструменты.ЧислоВСтроку(ЛокальныеПути.Количество());
Счетчик = 0;
Для Каждого ЛокальныйПуть Из ЛокальныеПути Цикл
Ответ = OPI_Neocities.ЗагрузитьФайл(Токен, ЛокальныйПуть.Ключ, ЛокальныйПуть.Значение);
Если Не Ответ["result"] = "success" Тогда
МассивОшибок.Добавить(Ответ);
Иначе
Прогресс = "[" + OPI_Инструменты.ЧислоВСтроку(Счетчик) + "/" + Всего + "] ";
// !OInt Сообщить(Прогресс + ЛокальныйПуть.Ключ + Символы.ПС + Ответ["message"] + Символы.ПС);
КонецЕсли;
Счетчик = Счетчик + 1;
КонецЦикла;
Возврат Новый Структура("errors,items", МассивОшибок.Количество(), МассивОшибок);
КонецФункции
Процедура ПолучитьНаборыЛокальныхПутей(ЛокальныйКаталог, УдаленныйКаталог, ЛокальныеПути, ЛокальныеПодкаталоги)
ЛокальныйКаталог = СтрЗаменить(ЛокальныйКаталог, "\", "/");
ЛокальныйКаталог = ?(СтрЗаканчиваетсяНа(ЛокальныйКаталог, "/"), ЛокальныйКаталог, ЛокальныйКаталог + "/");
ЛокальныеФайлы = НайтиФайлы(ЛокальныйКаталог, "*", Истина);
Для Каждого ЛокальныйФайл Из ЛокальныеФайлы Цикл
ТекущийАбсПуть = ЛокальныйФайл.ПолноеИмя;
ТекущийОтнПуть = Прав(ТекущийАбсПуть, СтрДлина(ТекущийАбсПуть) - СтрДлина(ЛокальныйКаталог));
ТекущийОтнПуть = УдаленныйКаталог + ТекущийОтнПуть;
ТекущийОтнПуть = СтрЗаменить(ТекущийОтнПуть, "\", "/");
Если ЛокальныйФайл.ЭтоКаталог() Тогда
ЛокальныеПодкаталоги.Вставить(ТекущийОтнПуть, ТекущийАбсПуть);
Иначе
ЛокальныеПути.Вставить(ТекущийОтнПуть, ТекущийАбсПуть);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти #КонецОбласти

View File

@ -3048,6 +3048,7 @@
Neocities_ЗагрузитьФайлы(ПараметрыТеста); Neocities_ЗагрузитьФайлы(ПараметрыТеста);
Neocities_ПолучитьСписокФайлов(ПараметрыТеста); Neocities_ПолучитьСписокФайлов(ПараметрыТеста);
Neocities_УдалитьВыбранныеФайлы(ПараметрыТеста); Neocities_УдалитьВыбранныеФайлы(ПараметрыТеста);
Neocities_СинхронизироватьКаталоги(ПараметрыТеста);
КонецПроцедуры КонецПроцедуры
@ -4060,6 +4061,13 @@
КонецПроцедуры КонецПроцедуры
Процедура Проверка_НССинхронизация(Знач Результат)
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["errors"]).Равно(0);
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"].Количество()).Равно(0);
КонецПроцедуры
#КонецОбласти #КонецОбласти
#Область АтомарныеТесты #Область АтомарныеТесты
@ -13225,6 +13233,23 @@
КонецПроцедуры КонецПроцедуры
Процедура Neocities_СинхронизироватьКаталоги(ПараметрыФункции)
Токен = ПараметрыФункции["NC_Token"];
ЛокальныйКаталог = "C:\test_site";
УдаленныйКаталог = "test";
Результат = OPI_Neocities.СинхронизироватьКаталоги(Токен, ЛокальныйКаталог, УдаленныйКаталог);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СинхронизироватьКаталоги", "Neocities");
Проверка_НССинхронизация(Результат);
КонецПроцедуры
#КонецОбласти #КонецОбласти
#КонецОбласти #КонецОбласти