Skip to content

Commit 3972cb8

Browse files
authored
fix EvilBeaver#1514 Замена dotnetzip на другой форк
2 parents 0cc0345 + 2ab4e87 commit 3972cb8

File tree

10 files changed

+104
-12
lines changed

10 files changed

+104
-12
lines changed

.gitattributes

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
*.sh text eol=lf
22
install/opm text eol=lf
33
install/oscript text eol=lf
4-
*.zip filter=lfs diff=lfs merge=lfs -text
4+
#*.zip filter=lfs diff=lfs merge=lfs -text

src/OneScript.StandardLibrary/OneScript.StandardLibrary.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
</PropertyGroup>
2525

2626
<ItemGroup>
27-
<PackageReference Include="DotNetZip" Version="1.13.3" />
2827
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
28+
<PackageReference Include="ProDotNetZip" Version="1.20.0" />
2929
</ItemGroup>
3030

3131
<ItemGroup>

src/OneScript.StandardLibrary/Text/TextEncodingEnum.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ private TextEncodingEnum(TypeDescriptor typeRepresentation, TypeDescriptor value
5555

5656
public EnumerationValue GetValue(Encoding encoding)
5757
{
58-
if (encoding.Equals(Encoding.GetEncoding(866)))
58+
if (encoding.Equals(Encoding.GetEncoding(866)) || encoding.CodePage == 866)
5959
return Oem;
6060

61-
if (encoding.Equals(Encoding.GetEncoding(1251)))
61+
if (encoding.Equals(Encoding.GetEncoding(1251)) || encoding.CodePage == 1251)
6262
return Ansi;
6363

6464
if (encoding.Equals(new UnicodeEncoding(false, true)))
@@ -72,8 +72,8 @@ public EnumerationValue GetValue(Encoding encoding)
7272

7373
if (encoding.Equals(Encoding.Default))
7474
return System;
75-
76-
throw RuntimeException.InvalidArgumentValue();
75+
76+
throw RuntimeException.InvalidArgumentValue(encoding);
7777
}
7878

7979
public static TextEncodingEnum CreateInstance(ITypeManager typeManager)
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*----------------------------------------------------------
2+
This Source Code Form is subject to the terms of the
3+
Mozilla Public License, v.2.0. If a copy of the MPL
4+
was not distributed with this file, You can obtain one
5+
at http://mozilla.org/MPL/2.0/.
6+
----------------------------------------------------------*/
7+
8+
using System;
9+
using System.Reflection;
10+
using System.Text;
11+
using Ionic.Zip;
12+
13+
namespace OneScript.StandardLibrary.Zip
14+
{
15+
internal static class DotNetZipEncoding
16+
{
17+
private static volatile bool _encodingIsSet;
18+
private static readonly object _locker = new object();
19+
20+
static DotNetZipEncoding()
21+
{
22+
_encodingIsSet = false;
23+
}
24+
25+
public static void SetDefault(Encoding encoding)
26+
{
27+
if (_encodingIsSet)
28+
return;
29+
30+
lock (_locker)
31+
{
32+
if (_encodingIsSet)
33+
return;
34+
35+
SetDefaultEncodingViaProperty(encoding);
36+
_encodingIsSet = true;
37+
}
38+
}
39+
40+
private static void SetDefaultEncodingViaProperty(Encoding encoding)
41+
{
42+
ZipFile.DefaultEncoding = encoding;
43+
}
44+
45+
private static void SetDefaultEncodingViaReflection(Encoding encoding)
46+
{
47+
const string fieldName = "_defaultEncoding";
48+
49+
var field = typeof(ZipFile).GetField(fieldName, BindingFlags.Static | BindingFlags.NonPublic);
50+
if (field == null)
51+
throw new InvalidOperationException("Field for default encoding not found");
52+
53+
field.SetValue(null, encoding);
54+
55+
if (!Equals(ZipFile.DefaultEncoding, encoding))
56+
{
57+
throw new InvalidOperationException(
58+
"Field is set, but property DefaultEncoding hasn't changed. Probably another property implementation in library");
59+
}
60+
}
61+
}
62+
}

src/OneScript.StandardLibrary/Zip/ZipReader.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ private void CheckIfOpened()
5252
public void Open(IValue filenameOrStream, string password = null, FileNamesEncodingInZipFile encoding = FileNamesEncodingInZipFile.Auto)
5353
{
5454
// fuck non-russian encodings on non-ascii files
55-
ZipFile.DefaultEncoding = Encoding.GetEncoding(866);
55+
DotNetZipEncoding.SetDefault(Encoding.GetEncoding(866));
5656

5757
if (filenameOrStream.SystemType == BasicTypes.String)
5858
{
@@ -104,6 +104,13 @@ public void ExtractAll(string where, ZipRestoreFilePathsMode restorePaths = defa
104104
public void Extract(ZipFileEntryContext entry, string destination, ZipRestoreFilePathsMode restorePaths = default, string password = null)
105105
{
106106
CheckIfOpened();
107+
if (entry == null)
108+
{
109+
// Передали Неопределено
110+
// TODO сделать более строгий маршалинг с учетом всех тыщ особенностей для строк и прочего
111+
throw RuntimeException.InvalidNthArgumentType(1);
112+
}
113+
107114
var realEntry = entry.GetZipEntry();
108115
_zip.FlattenFoldersOnExtract = restorePaths == ZipRestoreFilePathsMode.DontRestore;
109116
realEntry.Password = password;

src/OneScript.StandardLibrary/Zip/ZipWriter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void Open(
5252
ZipEncryptionMethod? encryptionMethod = default,
5353
FileNamesEncodingInZipFile encoding = FileNamesEncodingInZipFile.Auto)
5454
{
55-
ZipFile.DefaultEncoding = Encoding.GetEncoding(866); // fuck non-russian encodings on non-ascii files
55+
DotNetZipEncoding.SetDefault(Encoding.GetEncoding(866)); // fuck non-russian encodings on non-ascii files
5656
_filename = filename;
5757
_zip = new ZipFile();
5858
_zip.AlternateEncoding = Encoding.UTF8;

tests/native-api.os

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
Сборка = Новый Файл(ПутьБиблиотеки);
5151

5252
Если Не Сборка.Существует() Тогда
53-
ВызватьИсключение "Не собрана прокси-библиотека для NativeApi";
53+
ВызватьИсключение СтрШаблон("Не собрана прокси-библиотека для NativeApi: %1", ПутьБиблиотеки);
5454
КонецЕсли;
5555

5656
КонецПроцедуры

tests/zip/fixtures/testUTF8.zip

196 Bytes
Binary file not shown.

tests/zip.os renamed to tests/zip/test-zip.os

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@
3131
ВсеТесты.Добавить("ТестДолжен_ПроверитьПарольРусскиеБуквыФайловАрхива");
3232
ВсеТесты.Добавить("ТестДолжен_ПроверитьШифрованиеЗипАрхива");
3333

34+
//Отключен до исправления библиотеки
35+
// https://github.com/EvilBeaver/OneScript/issues/870
36+
//ВсеТесты.Добавить("ТестДолжен_ПроверитьСимволыЮникодаВИменахФайлов");
37+
3438
Возврат ВсеТесты;
3539

3640
КонецФункции
@@ -101,8 +105,8 @@
101105

102106
Попытка
103107
юТест.ПроверитьРавенство("", Чтение.Элементы[0].Путь);
104-
юТест.ПроверитьРавенство("zip.os", Чтение.Элементы[0].Имя);
105-
юТест.ПроверитьРавенство("zip", Чтение.Элементы[0].ИмяБезРасширения);
108+
юТест.ПроверитьРавенство("test-zip.os", Чтение.Элементы[0].Имя);
109+
юТест.ПроверитьРавенство("test-zip", Чтение.Элементы[0].ИмяБезРасширения);
106110
Исключение
107111
Чтение.Закрыть();
108112
ВызватьИсключение;
@@ -353,7 +357,7 @@
353357

354358
ИмяРусскогоФайла = "ОбщиеФункции.os";
355359

356-
ПутьРусскогоФайла = ОбъединитьПути(ФайлСкрипта.Путь, "testlib", ИмяРусскогоФайла);
360+
ПутьРусскогоФайла = ОбъединитьПути(ФайлСкрипта.Путь, "../testlib", ИмяРусскогоФайла);
357361

358362
ИмяАрхива = СоздатьВременныйФайл("zip");
359363
Архив = Новый ЗаписьZipФайла(ИмяАрхива);
@@ -702,3 +706,22 @@
702706
Файл = Новый Файл(НеверныйПутьФайла);
703707
юТест.ПроверитьЛожь(Файл.Существует(), СообщениеОшибки + НеверныйПутьФайла);
704708
КонецПроцедуры
709+
710+
// https://github.com/EvilBeaver/OneScript/issues/870
711+
Процедура ТестДолжен_ПроверитьСимволыЮникодаВИменахФайлов() Экспорт
712+
ФайлАрхива = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "testUTF8.zip");
713+
714+
ВременныйКаталог = СоздатьВременныйФайл();
715+
СоздатьКаталог(ВременныйКаталог);
716+
717+
ФайлZip = Новый ЧтениеZipФайла(ФайлАрхива);
718+
Попытка
719+
ФайлZip.ИзвлечьВсе(ВременныйКаталог);
720+
Исключение
721+
ФайлZip.Закрыть();
722+
ВызватьИсключение;
723+
КонецПопытки;
724+
725+
ФайлZip.Закрыть();
726+
727+
КонецПроцедуры
File renamed without changes.

0 commit comments

Comments
 (0)