Skip to content

Commit

Permalink
Merge branch 'latest' into release/latest
Browse files Browse the repository at this point in the history
  • Loading branch information
EvilBeaver committed Jan 23, 2024
2 parents 1165b5c + 71e2a0c commit 80590dd
Show file tree
Hide file tree
Showing 19 changed files with 1,276 additions and 793 deletions.
43 changes: 42 additions & 1 deletion Jenkinsfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ pipeline {
agent none

environment {
ReleaseNumber = '1.8.4'
ReleaseNumber = '1.9.0'
outputEnc = '65001'
}

Expand Down Expand Up @@ -254,6 +254,47 @@ pipeline {
}
}

stage ('Publishing release') {
when { anyOf {
// TODO сделать автовычисление маркера lts или latest и согласовать его с путём к папке на стр. 250 (TARGET=..._)
branch 'release/latest'
}
}

agent { label 'master' }

steps {

unstash 'winDist'
unstash 'debian'
unstash 'redhat'
unstash 'vsix'

dir('targetContent') {
sh '''
WIN=../built
DEB=../out/deb
RPM=../out/rpm
mkdir x64
mv $WIN/OneScript*-x64*.exe x64/
mv $WIN/OneScript*-x64*.zip x64/
mv $WIN/vscode/*.vsix x64/
mv $WIN/OneScript*-x86*.exe ./
mv $WIN/OneScript*-x86*.zip ./
mv $RPM/*.rpm x64/
mv $DEB/*.deb x64/
TARGET="/var/www/oscript.io/download/versions/latest/"
sudo rsync -rv --delete --exclude mddoc*.zip --exclude *.src.rpm . $TARGET
'''.stripIndent()

sh """
TARGET="/var/www/oscript.io/download/versions/${ReleaseNumber.replace('.', '_')}/"
sudo rsync -rv --delete --exclude mddoc*.zip --exclude *.src.rpm . \$TARGET
""".stripIndent()
}
}
}

stage ('Publishing artifacts to clouds'){
when { branch 'release/latest' }
agent { label 'windows' }
Expand Down
60 changes: 60 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,63 @@ OneScript позволяет создавать и выполнять текст
- выполнить команду `mono ovm.exe install stable`
- выполнить команду `mono ovm.exe use stable`
- перезапустить терминал

# Ручная локальная сборка

## Подготовка

Ниже приведены ссылки на дистрибутивы, однако, учтите, что ссылки могут меняться со временем и их актуальность не гарантируется. Нужен dotnet SDK и компилятор C++, скачать можно из любого места, которое нагуглится.

* Установить [MS BuildTools](https://visualstudio.microsoft.com/ru/thank-you-downloading-visual-studio/?sku=buildtools&rel=16), при установке включить таргетинг на .net6, .net4.8, установить компилятор C++.
* Установить [InnoSetup](https://jrsoftware.org/isdl.php)
* Скачать [OneScriptDocumenter](https://github.com/EvilBeaver/OneScriptDocumenter/releases) и установить в произвольный каталог на диске
* Создать произвольный каталог библиотек и разместить в нем библиотеки, которые нужно будет включить в поставку. Проще всего создать пустой каталог и установить в него пакеты менеджером opm

```bat
opm install -d E:\my_libraries asserts
opm install -d E:\my_libraries gitsync
opm install -d E:\my_libraries fs
```

## Сборка

Запустить Developer Command Prompt (появится в меню Пуск после установки MSBuildTools или Visual Studio). Перейти в каталог репозитория OneScript. Далее приведены команды в консоли Developer Command Prompt
Сборка выполняется с помощью msbuild. Таргеты:

* CleanAll - очистка результатов предыдущих сборок
* PrepareDistributionContent - сборка файлов для поставки в один каталог
* CreateDistributions - упаковка файлов в разные типы дистрибутивов (zip, exe, nuget)

**Параметры сборки**

* ReleaseNumber - номер релиза, который будет прописан в файлах
* OneScriptDocumenter - путь к exe файлу OneScriptDocumenter.exe (если не указать, документация не собирается)
* StandardLibraryPacks - путь к каталогу, который будет являться поставляемым каталогом библиотек (библиотеки оттуда будут размещены в дистрибутиве в подпапке lib). Если не указан, библиотеки в дистрибутив не включаются.
* InnoSetupPath - путь к каталогу установки InnoSetup. Обязателен, если собираем инсталлятор (таргет CreateDistributions)

Все поставляемые файлы будут размещены в каталоге `built` в корне репозитория 1Script

### Сборка содержимого дистрибутивов в отдельном каталоге

```bat
msbuild Build.csproj /t:CleanAll;PrepareDistributionContent
```

### Сборка с ручным указанием версии

```bat
msbuild Build.csproj /t:CleanAll;PrepareDistributionContent /p:ReleaseNumber=1.99.6
```

#### Сборка библиотек и документации

```bat
msbuild Build.csproj /t:CleanAll;PrepareDistributionContent /p:ReleaseNumber=1.99.6 /p:OneScriptDocumenter=path-to-documenter.exe /p:StandardLibraryPacks=E:\my_libraries
```

#### Сборка библиотек, документации и инсталлятора

```bat
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
```

36 changes: 18 additions & 18 deletions src/OneScript.Core.Tests/ValuesTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ public void BooleanEquality()

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

Assert.Throws<RuntimeException>(() => BooleanValue.True.AsDate());
Assert.Throws<RuntimeException>(() => BooleanValue.True.AsObject());
Assert.Throws<TypeConvertionException>(() => BooleanValue.True.AsDate());
Assert.Throws<TypeConvertionException>(() => BooleanValue.True.AsObject());
}

[Theory]
Expand Down Expand Up @@ -68,8 +68,8 @@ public void NumbersEquality()
Assert.True(num4.CompareTo(num3) < 0);

Assert.Equal("12.5", num1.AsString());
Assert.Throws<RuntimeException>(() => num1.AsDate());
Assert.Throws<RuntimeException>(() => num1.AsObject());
Assert.Throws<TypeConvertionException>(() => num1.AsDate());
Assert.Throws<TypeConvertionException>(() => num1.AsObject());
}

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

Assert.Throws<RuntimeException>(() => dateString.AsObject());
Assert.Throws<RuntimeException>(() => trueString.AsNumber());
Assert.Throws<TypeConvertionException>(() => dateString.AsObject());
Assert.Throws<TypeConvertionException>(() => trueString.AsNumber());
}

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

Assert.Throws<RuntimeException>(() => value.AsNumber());
Assert.Throws<RuntimeException>(() => value.AsBoolean());
Assert.Throws<RuntimeException>(() => value.AsObject());
Assert.Throws<RuntimeException>(() => value.AsDate());
Assert.Throws<TypeConvertionException>(() => value.AsNumber());
Assert.Throws<TypeConvertionException>(() => value.AsBoolean());
Assert.Throws<TypeConvertionException>(() => value.AsObject());
Assert.Throws<TypeConvertionException>(() => value.AsDate());
}

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

Assert.Throws<RuntimeException>(() => value.AsNumber());
Assert.Throws<RuntimeException>(() => value.AsBoolean());
Assert.Throws<RuntimeException>(() => value.AsObject());
Assert.Throws<RuntimeException>(() => value.AsDate());
Assert.Throws<TypeConvertionException>(() => value.AsNumber());
Assert.Throws<TypeConvertionException>(() => value.AsBoolean());
Assert.Throws<TypeConvertionException>(() => value.AsObject());
Assert.Throws<TypeConvertionException>(() => value.AsDate());
}

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

Assert.Throws<RuntimeException>(() => typeValue.AsNumber());
Assert.Throws<RuntimeException>(() => typeValue.AsBoolean());
Assert.Throws<RuntimeException>(() => typeValue.AsObject());
Assert.Throws<RuntimeException>(() => typeValue.AsDate());
Assert.Throws<TypeConvertionException>(() => typeValue.AsNumber());
Assert.Throws<TypeConvertionException>(() => typeValue.AsBoolean());
Assert.Throws<TypeConvertionException>(() => typeValue.AsObject());
Assert.Throws<TypeConvertionException>(() => typeValue.AsDate());

}

Expand Down
122 changes: 106 additions & 16 deletions src/ScriptEngine.HostedScript/Library/Binary/BinaryDataBuffer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -97,11 +97,7 @@ public override void SetIndexedValue(IValue index, IValue val)
/// </summary>
/// <value>Булево (Boolean)</value>
[ContextProperty("ТолькоЧтение", "ReadOnly")]
public bool ReadOnly
{
get { return _readOnly; }

}
public bool ReadOnly => _readOnly;

/// <summary>
///
Expand Down Expand Up @@ -521,27 +517,121 @@ public ulong ReadInt64(int position, IValue byteOrder = null)


/// <summary>
/// Разделить буфер на части по заданному разделителю.
///
/// НЕ РЕАЛИЗОВАН
/// Разделить буфер на части по заданному разделителю или массиву разделителей.
/// </summary>
///
/// <remarks>
///
/// По двоичному буферу
/// </remarks>
///
/// <param name="separator">
/// Разделитель. </param>
///
/// <returns name="Array"/>
/// <returns name="Array">Массив из буферов двоичных данных</returns>
///
[ContextMethod("Разделить", "Split")]
public IValue Split(IValue separator)
public ArrayImpl Split(IValue separator)
{
throw new NotImplementedException();
var buffers = ParseParam(separator);

// Функция поиска требует, чтобы буферы были в порядке убывания размера
buffers.Sort((a, b) => b._buffer.LongLength.CompareTo(a._buffer.LongLength));
return SplitBuffer(buffers.ToArray());
}

private static List<BinaryDataBuffer> ParseParam(IValue separator)
{
var rawSeparator = separator?.GetRawValue();
switch (rawSeparator)
{
case BinaryDataBuffer buffer:
return new List<BinaryDataBuffer> { CheckedBuffer(buffer) };

case ArrayImpl array:
{
var buffers = new List<BinaryDataBuffer>();

foreach (var element in array)
{
buffers.AddRange(ParseParam(element));
}

return buffers;
}

default:
throw RuntimeException.InvalidArgumentType();
}
}

private static BinaryDataBuffer CheckedBuffer(BinaryDataBuffer buffer)
{
if (buffer.Size == 0)
{
throw RuntimeException.InvalidArgumentValue();
}

return buffer;
}

private ArrayImpl SplitBuffer(BinaryDataBuffer[] splitter)
{
var result = new List<BinaryDataBuffer>();
long start = 0;
var foundPosition = FindFirst(splitter, start);
while (foundPosition.pos != -1)
{
var length = foundPosition.pos - start;
result.Add(new BinaryDataBuffer(Copy(start, length), ByteOrder));
start = foundPosition.pos + foundPosition.buffer.Size;
foundPosition = FindFirst(splitter, start);
}

// хвостовой элемент
result.Add(new BinaryDataBuffer(Copy(start, _buffer.LongLength - start)));
return new ArrayImpl(result);
}

/// <summary>
/// Ищет ближайшее вхождение любого из буферов. Если на одной позиции находятся два и более буфера, берется бОльший.
/// </summary>
/// <param name="buffers">Массив искомых буферов</param>
/// <param name="start">Начальная позиция поиска</param>
/// <returns>Буфер и позиция или null, если нет вхождений</returns>
private (BinaryDataBuffer buffer, long pos) FindFirst(BinaryDataBuffer[] buffers, long start)
{
var maxI = Size - buffers[buffers.Length - 1].Size;
for (var i = start; i < maxI; i++)
{
foreach (var expectedBuffer in buffers)
{
if (SubsequenceEquals(_buffer, i, expectedBuffer._buffer))
{
return (expectedBuffer, i);
}
}
}

return (null, -1);
}

private byte[] Copy(long start, long length)
{
if (length == 0) return Array.Empty<byte>();
var partition = new byte[length];
Array.Copy(_buffer, start, partition, 0, length);
return partition;
}

private static bool SubsequenceEquals(byte[] sequence, long start, byte[] subsequence)
{
for (long j = 0; j < subsequence.LongLength; j++)
{
if (subsequence[j] != sequence[start + j])
{
return false;
}
}

return true;
}

/// <summary>
///
/// Создает копию массива.
Expand Down
Loading

0 comments on commit 80590dd

Please sign in to comment.