1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-01-26 05:37:27 +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
//
// Returns:
// Map Of KeyAndValue - Serialized JSON response from Neocities
// Structure of KeyAndValue - synchronization error information
Function SynchronizeFolders(Val Token, Val LocalFolder, Val RemoteFolder = "") Export
OPI_TypeConversion.GetLine(LocalFolder);
OPI_TypeConversion.GetLine(RemoteFolder);
Message("Start synchronization...");
If ValueIsFilled(RemoteFolder) Then
RemoteFolder = ?(StrEndsWith(RemoteFolder, "/"), RemoteFolder, RemoteFolder + "/");
EndIf;
LocalFolder = StrReplace(LocalFolder, "\", "/");
LocalFolder = ?(StrEndsWith(LocalFolder, "/"), LocalFolder, LocalFolder + "/");
RemoteFiles = GetFilesList(Token, RemoteFolder);
LocalFiles = FindFiles(LocalFolder, "*", True);
If Not RemoteFiles["result"] = "success" Then
Return RemoteFiles;
EndIf;
LocalPaths = New Map;
LocalFolders = New Map;
ArrayOfDeletions = New Array;
LocalPaths = New Map;
LocalSubfolders = New Map;
For Each LocalFile In LocalFiles Do
GetLocalPathsSets(LocalFolder, RemoteFolder, LocalPaths, LocalSubfolders);
CurrentAbsPath = LocalFile.FullName;
CurrentRelPath = Right(CurrentAbsPath, StrLen(CurrentAbsPath) - StrLen(LocalFolder));
CurrentRelPath = RemoteFolder + CurrentRelPath;
ArrayOfDeletions = GetDeletedFiles(RemoteFiles, LocalPaths, LocalSubfolders);
Result = MakeSynchronization(Token, ArrayOfDeletions, LocalPaths);
CurrentRelPath = StrReplace(CurrentRelPath, "\", "/");
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);
//@skip-check constructor-function-return-section
Return Result;
EndFunction
@ -363,4 +314,100 @@ Function CreateRequestHeaders(Val Token)
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

View File

@ -3048,6 +3048,7 @@ Procedure NC_FilesManagment() Export
Neocities_UploadFiles(TestParameters);
Neocities_GetFilesList(TestParameters);
Neocities_DeleteSelectedFiles(TestParameters);
Neocities_SynchronizeFolders(TestParameters);
EndProcedure
@ -4060,6 +4061,13 @@ Procedure Check_NCFolderFiles(Val Result, Val Count)
EndProcedure
Procedure Check_NCSync(Val Result)
OPI_TestDataRetrieval.ExpectsThat(Result["errors"]).Равно(0);
OPI_TestDataRetrieval.ExpectsThat(Result["items"].Count()).Равно(0);
EndProcedure
#EndRegion
#Region AtomicTests
@ -13225,6 +13233,23 @@ Procedure Neocities_GetToken(FunctionParameters)
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

View File

@ -267,83 +267,34 @@ EndFunction
// RemoteFolder - String - Remote receiver catalog. Root by default - remote
//
// Returns:
// Map Of KeyAndValue - Serialized JSON response from Neocities
// Structure of KeyAndValue - synchronization error information
Function SynchronizeFolders(Val Token, Val LocalFolder, Val RemoteFolder = "") Export
OPI_TypeConversion.GetLine(LocalFolder);
OPI_TypeConversion.GetLine(RemoteFolder);
// !OInt Message("Start synchronization...");
If ValueIsFilled(RemoteFolder) Then
RemoteFolder = ?(StrEndsWith(RemoteFolder, "/"), RemoteFolder, RemoteFolder + "/");
EndIf;
LocalFolder = StrReplace(LocalFolder, "\", "/");
LocalFolder = ?(StrEndsWith(LocalFolder, "/"), LocalFolder, LocalFolder + "/");
RemoteFiles = GetFilesList(Token, RemoteFolder);
LocalFiles = FindFiles(LocalFolder, "*", True);
If Not RemoteFiles["result"] = "success" Then
Return RemoteFiles;
EndIf;
LocalPaths = New Map;
LocalFolders = New Map;
ArrayOfDeletions = New Array;
LocalPaths = New Map;
LocalSubfolders = New Map;
For Each LocalFile In LocalFiles Do
GetLocalPathsSets(LocalFolder, RemoteFolder, LocalPaths, LocalSubfolders);
CurrentAbsPath = LocalFile.FullName;
CurrentRelPath = Right(CurrentAbsPath, StrLen(CurrentAbsPath) - StrLen(LocalFolder));
CurrentRelPath = RemoteFolder + CurrentRelPath;
ArrayOfDeletions = GetDeletedFiles(RemoteFiles, LocalPaths, LocalSubfolders);
Result = MakeSynchronization(Token, ArrayOfDeletions, LocalPaths);
CurrentRelPath = StrReplace(CurrentRelPath, "\", "/");
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);
//@skip-check constructor-function-return-section
Return Result;
EndFunction
@ -363,4 +314,100 @@ Function CreateRequestHeaders(Val Token)
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

View File

@ -3048,6 +3048,7 @@ Procedure NC_FilesManagment() Export
Neocities_UploadFiles(TestParameters);
Neocities_GetFilesList(TestParameters);
Neocities_DeleteSelectedFiles(TestParameters);
Neocities_SynchronizeFolders(TestParameters);
EndProcedure
@ -4060,6 +4061,13 @@ Procedure Check_NCFolderFiles(Val Result, Val Count)
EndProcedure
Procedure Check_NCSync(Val Result)
OPI_TestDataRetrieval.ExpectsThat(Result["errors"]).Равно(0);
OPI_TestDataRetrieval.ExpectsThat(Result["items"].Count()).Равно(0);
EndProcedure
#EndRegion
#Region AtomicTests
@ -13225,6 +13233,23 @@ Procedure Neocities_GetToken(FunctionParameters)
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

View File

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