Skip to content

Commit 80590dd

Browse files
committed
Merge branch 'latest' into release/latest
2 parents 1165b5c + 71e2a0c commit 80590dd

File tree

19 files changed

+1276
-793
lines changed

19 files changed

+1276
-793
lines changed

Jenkinsfile

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ pipeline {
44
agent none
55

66
environment {
7-
ReleaseNumber = '1.8.4'
7+
ReleaseNumber = '1.9.0'
88
outputEnc = '65001'
99
}
1010

@@ -254,6 +254,47 @@ pipeline {
254254
}
255255
}
256256

257+
stage ('Publishing release') {
258+
when { anyOf {
259+
// TODO сделать автовычисление маркера lts или latest и согласовать его с путём к папке на стр. 250 (TARGET=..._)
260+
branch 'release/latest'
261+
}
262+
}
263+
264+
agent { label 'master' }
265+
266+
steps {
267+
268+
unstash 'winDist'
269+
unstash 'debian'
270+
unstash 'redhat'
271+
unstash 'vsix'
272+
273+
dir('targetContent') {
274+
sh '''
275+
WIN=../built
276+
DEB=../out/deb
277+
RPM=../out/rpm
278+
mkdir x64
279+
mv $WIN/OneScript*-x64*.exe x64/
280+
mv $WIN/OneScript*-x64*.zip x64/
281+
mv $WIN/vscode/*.vsix x64/
282+
mv $WIN/OneScript*-x86*.exe ./
283+
mv $WIN/OneScript*-x86*.zip ./
284+
mv $RPM/*.rpm x64/
285+
mv $DEB/*.deb x64/
286+
TARGET="/var/www/oscript.io/download/versions/latest/"
287+
sudo rsync -rv --delete --exclude mddoc*.zip --exclude *.src.rpm . $TARGET
288+
'''.stripIndent()
289+
290+
sh """
291+
TARGET="/var/www/oscript.io/download/versions/${ReleaseNumber.replace('.', '_')}/"
292+
sudo rsync -rv --delete --exclude mddoc*.zip --exclude *.src.rpm . \$TARGET
293+
""".stripIndent()
294+
}
295+
}
296+
}
297+
257298
stage ('Publishing artifacts to clouds'){
258299
when { branch 'release/latest' }
259300
agent { label 'windows' }

README.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,63 @@ OneScript позволяет создавать и выполнять текст
4646
- выполнить команду `mono ovm.exe install stable`
4747
- выполнить команду `mono ovm.exe use stable`
4848
- перезапустить терминал
49+
50+
# Ручная локальная сборка
51+
52+
## Подготовка
53+
54+
Ниже приведены ссылки на дистрибутивы, однако, учтите, что ссылки могут меняться со временем и их актуальность не гарантируется. Нужен dotnet SDK и компилятор C++, скачать можно из любого места, которое нагуглится.
55+
56+
* Установить [MS BuildTools](https://visualstudio.microsoft.com/ru/thank-you-downloading-visual-studio/?sku=buildtools&rel=16), при установке включить таргетинг на .net6, .net4.8, установить компилятор C++.
57+
* Установить [InnoSetup](https://jrsoftware.org/isdl.php)
58+
* Скачать [OneScriptDocumenter](https://github.com/EvilBeaver/OneScriptDocumenter/releases) и установить в произвольный каталог на диске
59+
* Создать произвольный каталог библиотек и разместить в нем библиотеки, которые нужно будет включить в поставку. Проще всего создать пустой каталог и установить в него пакеты менеджером opm
60+
61+
```bat
62+
opm install -d E:\my_libraries asserts
63+
opm install -d E:\my_libraries gitsync
64+
opm install -d E:\my_libraries fs
65+
```
66+
67+
## Сборка
68+
69+
Запустить Developer Command Prompt (появится в меню Пуск после установки MSBuildTools или Visual Studio). Перейти в каталог репозитория OneScript. Далее приведены команды в консоли Developer Command Prompt
70+
Сборка выполняется с помощью msbuild. Таргеты:
71+
72+
* CleanAll - очистка результатов предыдущих сборок
73+
* PrepareDistributionContent - сборка файлов для поставки в один каталог
74+
* CreateDistributions - упаковка файлов в разные типы дистрибутивов (zip, exe, nuget)
75+
76+
**Параметры сборки**
77+
78+
* ReleaseNumber - номер релиза, который будет прописан в файлах
79+
* OneScriptDocumenter - путь к exe файлу OneScriptDocumenter.exe (если не указать, документация не собирается)
80+
* StandardLibraryPacks - путь к каталогу, который будет являться поставляемым каталогом библиотек (библиотеки оттуда будут размещены в дистрибутиве в подпапке lib). Если не указан, библиотеки в дистрибутив не включаются.
81+
* InnoSetupPath - путь к каталогу установки InnoSetup. Обязателен, если собираем инсталлятор (таргет CreateDistributions)
82+
83+
Все поставляемые файлы будут размещены в каталоге `built` в корне репозитория 1Script
84+
85+
### Сборка содержимого дистрибутивов в отдельном каталоге
86+
87+
```bat
88+
msbuild Build.csproj /t:CleanAll;PrepareDistributionContent
89+
```
90+
91+
### Сборка с ручным указанием версии
92+
93+
```bat
94+
msbuild Build.csproj /t:CleanAll;PrepareDistributionContent /p:ReleaseNumber=1.99.6
95+
```
96+
97+
#### Сборка библиотек и документации
98+
99+
```bat
100+
msbuild Build.csproj /t:CleanAll;PrepareDistributionContent /p:ReleaseNumber=1.99.6 /p:OneScriptDocumenter=path-to-documenter.exe /p:StandardLibraryPacks=E:\my_libraries
101+
```
102+
103+
#### Сборка библиотек, документации и инсталлятора
104+
105+
```bat
106+
msbuild Build.csproj /t:CleanAll;PrepareDistributionContent;CreateDistributions /p:ReleaseNumber=1.99.6 /p:OneScriptDocumenter=path-to-documenter.exe /p:StandardLibraryPacks=E:\my_libraries /p:InnoSetupPath=path-to-innosetup-install-dir
107+
```
108+

src/OneScript.Core.Tests/ValuesTest.cs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ public void BooleanEquality()
2828

2929
Assert.True(BooleanValue.True.CompareTo(BooleanValue.False) > 0);
3030

31-
Assert.Throws<RuntimeException>(() => BooleanValue.True.AsDate());
32-
Assert.Throws<RuntimeException>(() => BooleanValue.True.AsObject());
31+
Assert.Throws<TypeConvertionException>(() => BooleanValue.True.AsDate());
32+
Assert.Throws<TypeConvertionException>(() => BooleanValue.True.AsObject());
3333
}
3434

3535
[Theory]
@@ -68,8 +68,8 @@ public void NumbersEquality()
6868
Assert.True(num4.CompareTo(num3) < 0);
6969

7070
Assert.Equal("12.5", num1.AsString());
71-
Assert.Throws<RuntimeException>(() => num1.AsDate());
72-
Assert.Throws<RuntimeException>(() => num1.AsObject());
71+
Assert.Throws<TypeConvertionException>(() => num1.AsDate());
72+
Assert.Throws<TypeConvertionException>(() => num1.AsObject());
7373
}
7474

7575
[Fact]
@@ -103,8 +103,8 @@ public void StringValueTests()
103103
var numString = ValueFactory.Create("012.12");
104104
Assert.True(numString.AsNumber() == 12.12m);
105105

106-
Assert.Throws<RuntimeException>(() => dateString.AsObject());
107-
Assert.Throws<RuntimeException>(() => trueString.AsNumber());
106+
Assert.Throws<TypeConvertionException>(() => dateString.AsObject());
107+
Assert.Throws<TypeConvertionException>(() => trueString.AsNumber());
108108
}
109109

110110
[Fact]
@@ -114,10 +114,10 @@ public void Undefined_Value_Test()
114114
Assert.True(value.DataType == DataType.Undefined);
115115
Assert.True(value.AsString() == "");
116116

117-
Assert.Throws<RuntimeException>(() => value.AsNumber());
118-
Assert.Throws<RuntimeException>(() => value.AsBoolean());
119-
Assert.Throws<RuntimeException>(() => value.AsObject());
120-
Assert.Throws<RuntimeException>(() => value.AsDate());
117+
Assert.Throws<TypeConvertionException>(() => value.AsNumber());
118+
Assert.Throws<TypeConvertionException>(() => value.AsBoolean());
119+
Assert.Throws<TypeConvertionException>(() => value.AsObject());
120+
Assert.Throws<TypeConvertionException>(() => value.AsDate());
121121
}
122122

123123
[Fact]
@@ -127,10 +127,10 @@ public void Null_Value_Test()
127127
Assert.True(value.DataType == DataType.GenericValue);
128128
Assert.True(value.AsString() == "");
129129

130-
Assert.Throws<RuntimeException>(() => value.AsNumber());
131-
Assert.Throws<RuntimeException>(() => value.AsBoolean());
132-
Assert.Throws<RuntimeException>(() => value.AsObject());
133-
Assert.Throws<RuntimeException>(() => value.AsDate());
130+
Assert.Throws<TypeConvertionException>(() => value.AsNumber());
131+
Assert.Throws<TypeConvertionException>(() => value.AsBoolean());
132+
Assert.Throws<TypeConvertionException>(() => value.AsObject());
133+
Assert.Throws<TypeConvertionException>(() => value.AsDate());
134134
}
135135

136136
[Fact]
@@ -144,10 +144,10 @@ public void Type_Value_Test()
144144
Assert.True(typeValue.DataType == DataType.Type);
145145
Assert.True(typeValue.AsString() == "Строка");
146146

147-
Assert.Throws<RuntimeException>(() => typeValue.AsNumber());
148-
Assert.Throws<RuntimeException>(() => typeValue.AsBoolean());
149-
Assert.Throws<RuntimeException>(() => typeValue.AsObject());
150-
Assert.Throws<RuntimeException>(() => typeValue.AsDate());
147+
Assert.Throws<TypeConvertionException>(() => typeValue.AsNumber());
148+
Assert.Throws<TypeConvertionException>(() => typeValue.AsBoolean());
149+
Assert.Throws<TypeConvertionException>(() => typeValue.AsObject());
150+
Assert.Throws<TypeConvertionException>(() => typeValue.AsDate());
151151

152152
}
153153

src/ScriptEngine.HostedScript/Library/Binary/BinaryDataBuffer.cs

Lines changed: 106 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,7 @@ public override void SetIndexedValue(IValue index, IValue val)
9797
/// </summary>
9898
/// <value>Булево (Boolean)</value>
9999
[ContextProperty("ТолькоЧтение", "ReadOnly")]
100-
public bool ReadOnly
101-
{
102-
get { return _readOnly; }
103-
104-
}
100+
public bool ReadOnly => _readOnly;
105101

106102
/// <summary>
107103
///
@@ -521,27 +517,121 @@ public ulong ReadInt64(int position, IValue byteOrder = null)
521517

522518

523519
/// <summary>
524-
/// Разделить буфер на части по заданному разделителю.
525-
///
526-
/// НЕ РЕАЛИЗОВАН
520+
/// Разделить буфер на части по заданному разделителю или массиву разделителей.
527521
/// </summary>
528522
///
529-
/// <remarks>
530-
///
531-
/// По двоичному буферу
532-
/// </remarks>
533-
///
534523
/// <param name="separator">
535524
/// Разделитель. </param>
536525
///
537-
/// <returns name="Array"/>
526+
/// <returns name="Array">Массив из буферов двоичных данных</returns>
538527
///
539528
[ContextMethod("Разделить", "Split")]
540-
public IValue Split(IValue separator)
529+
public ArrayImpl Split(IValue separator)
541530
{
542-
throw new NotImplementedException();
531+
var buffers = ParseParam(separator);
532+
533+
// Функция поиска требует, чтобы буферы были в порядке убывания размера
534+
buffers.Sort((a, b) => b._buffer.LongLength.CompareTo(a._buffer.LongLength));
535+
return SplitBuffer(buffers.ToArray());
536+
}
537+
538+
private static List<BinaryDataBuffer> ParseParam(IValue separator)
539+
{
540+
var rawSeparator = separator?.GetRawValue();
541+
switch (rawSeparator)
542+
{
543+
case BinaryDataBuffer buffer:
544+
return new List<BinaryDataBuffer> { CheckedBuffer(buffer) };
545+
546+
case ArrayImpl array:
547+
{
548+
var buffers = new List<BinaryDataBuffer>();
549+
550+
foreach (var element in array)
551+
{
552+
buffers.AddRange(ParseParam(element));
553+
}
554+
555+
return buffers;
556+
}
557+
558+
default:
559+
throw RuntimeException.InvalidArgumentType();
560+
}
561+
}
562+
563+
private static BinaryDataBuffer CheckedBuffer(BinaryDataBuffer buffer)
564+
{
565+
if (buffer.Size == 0)
566+
{
567+
throw RuntimeException.InvalidArgumentValue();
568+
}
569+
570+
return buffer;
571+
}
572+
573+
private ArrayImpl SplitBuffer(BinaryDataBuffer[] splitter)
574+
{
575+
var result = new List<BinaryDataBuffer>();
576+
long start = 0;
577+
var foundPosition = FindFirst(splitter, start);
578+
while (foundPosition.pos != -1)
579+
{
580+
var length = foundPosition.pos - start;
581+
result.Add(new BinaryDataBuffer(Copy(start, length), ByteOrder));
582+
start = foundPosition.pos + foundPosition.buffer.Size;
583+
foundPosition = FindFirst(splitter, start);
584+
}
585+
586+
// хвостовой элемент
587+
result.Add(new BinaryDataBuffer(Copy(start, _buffer.LongLength - start)));
588+
return new ArrayImpl(result);
589+
}
590+
591+
/// <summary>
592+
/// Ищет ближайшее вхождение любого из буферов. Если на одной позиции находятся два и более буфера, берется бОльший.
593+
/// </summary>
594+
/// <param name="buffers">Массив искомых буферов</param>
595+
/// <param name="start">Начальная позиция поиска</param>
596+
/// <returns>Буфер и позиция или null, если нет вхождений</returns>
597+
private (BinaryDataBuffer buffer, long pos) FindFirst(BinaryDataBuffer[] buffers, long start)
598+
{
599+
var maxI = Size - buffers[buffers.Length - 1].Size;
600+
for (var i = start; i < maxI; i++)
601+
{
602+
foreach (var expectedBuffer in buffers)
603+
{
604+
if (SubsequenceEquals(_buffer, i, expectedBuffer._buffer))
605+
{
606+
return (expectedBuffer, i);
607+
}
608+
}
609+
}
610+
611+
return (null, -1);
612+
}
613+
614+
private byte[] Copy(long start, long length)
615+
{
616+
if (length == 0) return Array.Empty<byte>();
617+
var partition = new byte[length];
618+
Array.Copy(_buffer, start, partition, 0, length);
619+
return partition;
543620
}
544621

622+
private static bool SubsequenceEquals(byte[] sequence, long start, byte[] subsequence)
623+
{
624+
for (long j = 0; j < subsequence.LongLength; j++)
625+
{
626+
if (subsequence[j] != sequence[start + j])
627+
{
628+
return false;
629+
}
630+
}
631+
632+
return true;
633+
}
634+
545635
/// <summary>
546636
///
547637
/// Создает копию массива.

0 commit comments

Comments
 (0)