From cda463c61198f0c572477d908c4bdc730acf5cd7 Mon Sep 17 00:00:00 2001
From: Andrey Smirnoff <37037851+mashed-potatoes@users.noreply.github.com>
Date: Mon, 29 Mar 2021 22:45:42 +0500
Subject: [PATCH] v2.1.0 (#49)
Widevine, rm BID & SN; read the factory key (WVL)
---
.gitmodules | 9 ++
HiSiBootloaders | 1 +
Potato.Fastboot | 1 +
Potato.ImageFlasher | 1 +
PotatoNV-next.sln | 20 ++++
PotatoNV-next/Controls/NVForm.xaml | 9 --
PotatoNV-next/Controls/NVForm.xaml.cs | 10 --
PotatoNV-next/Core.cs | 118 ++++++++++++++++-------
PotatoNV-next/MainWindow.xaml | 1 -
PotatoNV-next/MainWindow.xaml.cs | 2 -
PotatoNV-next/PotatoNV-next.csproj | 24 +++--
PotatoNV-next/Properties/AssemblyInfo.cs | 4 +-
PotatoNV-next/Utils/IntegrityCheck.cs | 41 --------
PotatoNV-next/packages.config | 2 -
PotatoNV-next/post-build.ps1 | 3 +
README.md | 29 +++---
appveyor.yml | 13 ++-
17 files changed, 163 insertions(+), 125 deletions(-)
create mode 100644 .gitmodules
create mode 160000 HiSiBootloaders
create mode 160000 Potato.Fastboot
create mode 160000 Potato.ImageFlasher
delete mode 100644 PotatoNV-next/Utils/IntegrityCheck.cs
create mode 100644 PotatoNV-next/post-build.ps1
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..a106a05
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,9 @@
+[submodule "Potato.ImageFlasher"]
+ path = Potato.ImageFlasher
+ url = https://github.com/mashed-potatoes/Potato.ImageFlasher.git
+[submodule "Potato.Fastboot"]
+ path = Potato.Fastboot
+ url = https://github.com/mashed-potatoes/Potato.Fastboot.git
+[submodule "HiSiBootloaders"]
+ path = HiSiBootloaders
+ url = https://github.com/mashed-potatoes/HiSiBootloaders.git
diff --git a/HiSiBootloaders b/HiSiBootloaders
new file mode 160000
index 0000000..013b9ae
--- /dev/null
+++ b/HiSiBootloaders
@@ -0,0 +1 @@
+Subproject commit 013b9ae4039c1e873734377904e7dc2699a2cb48
diff --git a/Potato.Fastboot b/Potato.Fastboot
new file mode 160000
index 0000000..6267600
--- /dev/null
+++ b/Potato.Fastboot
@@ -0,0 +1 @@
+Subproject commit 6267600aa0507c3475f8bd270dacfac93a335b87
diff --git a/Potato.ImageFlasher b/Potato.ImageFlasher
new file mode 160000
index 0000000..49b4ab4
--- /dev/null
+++ b/Potato.ImageFlasher
@@ -0,0 +1 @@
+Subproject commit 49b4ab4bc93f58da1c93e492032edfc8cfa24c10
diff --git a/PotatoNV-next.sln b/PotatoNV-next.sln
index 9889836..98feeaf 100644
--- a/PotatoNV-next.sln
+++ b/PotatoNV-next.sln
@@ -5,6 +5,10 @@ VisualStudioVersion = 16.0.30011.22
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PotatoNV-next", "PotatoNV-next\PotatoNV-next.csproj", "{2F103DCF-DFBA-48B0-BEA4-D4B845532A42}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Potato.Fastboot", "Potato.Fastboot\Potato.Fastboot\Potato.Fastboot.csproj", "{6C04F303-A659-4872-8136-D5C1D48A8F75}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Potato.ImageFlasher", "Potato.ImageFlasher\Potato.ImageFlasher\Potato.ImageFlasher.csproj", "{B74D03CC-AC13-447A-BCD8-C2044DA84EEB}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -21,6 +25,22 @@ Global
{2F103DCF-DFBA-48B0-BEA4-D4B845532A42}.Release|Any CPU.Build.0 = Release|Any CPU
{2F103DCF-DFBA-48B0-BEA4-D4B845532A42}.Release|x64.ActiveCfg = Release|x64
{2F103DCF-DFBA-48B0-BEA4-D4B845532A42}.Release|x64.Build.0 = Release|x64
+ {6C04F303-A659-4872-8136-D5C1D48A8F75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6C04F303-A659-4872-8136-D5C1D48A8F75}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6C04F303-A659-4872-8136-D5C1D48A8F75}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6C04F303-A659-4872-8136-D5C1D48A8F75}.Debug|x64.Build.0 = Debug|Any CPU
+ {6C04F303-A659-4872-8136-D5C1D48A8F75}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6C04F303-A659-4872-8136-D5C1D48A8F75}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6C04F303-A659-4872-8136-D5C1D48A8F75}.Release|x64.ActiveCfg = Release|Any CPU
+ {6C04F303-A659-4872-8136-D5C1D48A8F75}.Release|x64.Build.0 = Release|Any CPU
+ {B74D03CC-AC13-447A-BCD8-C2044DA84EEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B74D03CC-AC13-447A-BCD8-C2044DA84EEB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B74D03CC-AC13-447A-BCD8-C2044DA84EEB}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B74D03CC-AC13-447A-BCD8-C2044DA84EEB}.Debug|x64.Build.0 = Debug|Any CPU
+ {B74D03CC-AC13-447A-BCD8-C2044DA84EEB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B74D03CC-AC13-447A-BCD8-C2044DA84EEB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B74D03CC-AC13-447A-BCD8-C2044DA84EEB}.Release|x64.ActiveCfg = Release|Any CPU
+ {B74D03CC-AC13-447A-BCD8-C2044DA84EEB}.Release|x64.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/PotatoNV-next/Controls/NVForm.xaml b/PotatoNV-next/Controls/NVForm.xaml
index d0e3650..2c65940 100644
--- a/PotatoNV-next/Controls/NVForm.xaml
+++ b/PotatoNV-next/Controls/NVForm.xaml
@@ -14,19 +14,10 @@
-
-
-
-
-
-
-
-
-
diff --git a/PotatoNV-next/Controls/NVForm.xaml.cs b/PotatoNV-next/Controls/NVForm.xaml.cs
index 9dc9fc6..610f84f 100644
--- a/PotatoNV-next/Controls/NVForm.xaml.cs
+++ b/PotatoNV-next/Controls/NVForm.xaml.cs
@@ -48,9 +48,7 @@ public class FormEventArgs : EventArgs
{
public UsbController.Device.DMode TargetMode { get; set; }
public string Target { get; set; }
- public string BoardID { get; set; }
public string UnlockCode { get; set; }
- public string SerialNumber { get; set; }
public bool DisableFBLOCK { get; set; }
public Bootloader Bootloader { get; set; } = null;
}
@@ -113,10 +111,6 @@ private void StartButton_Click(object sender, RoutedEventArgs e)
Assert(deviceBootloader.SelectedIndex != -1, "Couldn't find any valid bootloader!");
- Assert(VerifyNVValue(nvSerialNumber.Text), "Serial number is not valid.");
-
- Assert(VerifyNVValue(nvBidNumber.Text), "BoardID is not valid.");
-
Assert(VerifyNVValue(nvUnlockCode.Text, true), "Unlock code is not valid.");
}
catch
@@ -132,9 +126,7 @@ private void StartButton_Click(object sender, RoutedEventArgs e)
? UsbController.Device.DMode.Fastboot
: UsbController.Device.DMode.DownloadVCOM,
Target = deviceList.SelectedItem.ToString(),
- BoardID = nvBidNumber.Text,
UnlockCode = nvUnlockCode.Text,
- SerialNumber = nvSerialNumber.Text,
DisableFBLOCK = disableFBLOCK.IsChecked.Value
};
@@ -150,8 +142,6 @@ private void NVForm_IsEnabledChanged(object sender, DependencyPropertyChangedEve
{
deviceList.IsEnabled = IsEnabled;
deviceBootloader.IsEnabled = IsEnabled;
- nvBidNumber.IsEnabled = IsEnabled;
- nvSerialNumber.IsEnabled = IsEnabled;
nvUnlockCode.IsEnabled = IsEnabled;
disableFBLOCK.IsEnabled = IsEnabled;
startButton.IsEnabled = IsEnabled;
diff --git a/PotatoNV-next/Core.cs b/PotatoNV-next/Core.cs
index ec4eeff..3ae0247 100644
--- a/PotatoNV-next/Core.cs
+++ b/PotatoNV-next/Core.cs
@@ -18,6 +18,11 @@ class Core
private Fastboot fb;
private Controls.NVForm.FormEventArgs args;
+ private void LogResponse(Fastboot.Response response)
+ {
+ Log.Debug($"response: {Encoding.UTF8.GetString(response.RawData)}");
+ }
+
private void FlashBootloader(Bootloader bootloader, string port)
{
var flasher = new ImageFlasher();
@@ -27,23 +32,20 @@ private void FlashBootloader(Bootloader bootloader, string port)
int asize = 0, dsize = 0;
foreach (var image in bootloader.Images)
- {
- Log.Debug($"VrStat of {image.Role}: {image.IsValid}");
-
+ {
if (!image.IsValid)
{
- throw new Exception($"Image `{image.Role}` is invalid!");
+ throw new Exception($"Image `{image.Role}` is not valid!");
}
asize += image.Size;
}
- Log.Success("Verification passed!");
Log.Debug($"Opening {port}...");
flasher.Open(port);
- Log.Info($"Uploading {bootloader.Name} bootloader");
+ Log.Info($"Uploading {bootloader.Name}...");
foreach (var image in bootloader.Images)
{
@@ -60,39 +62,43 @@ private void FlashBootloader(Bootloader bootloader, string port)
flasher.Close();
- Log.Success("Bootloader uploaded");
Log.SetProgressBar(false);
}
private void ReadInfo()
{
var serial = fb.GetSerialNumber();
- Log.Info($"- Serial number: {serial}");
+ Log.Info($"Serial number: {serial}");
var bsn = fb.Command("oem read_bsn");
- Log.Info($"- Board ID: {bsn.Payload}");
+ if (bsn.Status == Fastboot.Status.Okay)
+ {
+ Log.Info($"Board ID: {bsn.Payload}");
+ }
var model = fb.Command("oem get-product-model");
- Log.Info($"- Model: {model.Payload}");
+ Log.Info($"Model: {model.Payload}");
var build = fb.Command("oem get-build-number");
- Log.Info($"- Build number: {build.Payload.Replace(":", "")}");
+ Log.Info($"Build number: {build.Payload.Replace(":", "")}");
var regex = new Regex(@"FB[\w: ]{1,}UNLOCKED");
var fblock = fb.Command("oem lock-state info");
var state = regex.IsMatch(fblock.Payload);
- Log.Info($"- FBLOCK state: {(state ? "unlocked" : "locked")}");
+ Log.Info($"FBLOCK state: {(state ? "unlocked" : "locked")}");
+ LogResponse(fblock);
if (!state)
{
- throw new Exception("FBLOCK is locked!");
+ Log.Error("FBLOCK is locked!");
+ // throw new Exception("FBLOCK is locked!");
}
}
- private void SetNVMEProp(string prop, byte[] value, string role = null)
+ private void SetNVMEProp(string prop, byte[] value)
{
- Log.Info($"- Writing {role ?? prop}");
+ Log.Info($"Writing {prop}...");
var cmd = new List();
@@ -101,17 +107,14 @@ private void SetNVMEProp(string prop, byte[] value, string role = null)
var res = fb.Command(cmd.ToArray());
+ LogResponse(res);
+
if (!res.Payload.Contains("set nv ok"))
{
- throw new Exception($"Failed to set prop: {res.Payload}");
+ throw new Exception($"Failed to set: {res.Payload}");
}
}
- private void SetNVMEProp(string prop, string value, string role = null)
- {
- SetNVMEProp(prop, Encoding.ASCII.GetBytes(value), role);
- }
-
public static byte[] GetSHA256(string str)
{
using (var sha256 = SHA256.Create())
@@ -120,20 +123,66 @@ public static byte[] GetSHA256(string str)
}
}
- private void WriteNVME()
+ private void SetHWDogCertify(byte state)
{
- SetNVMEProp("FBLOCK", new[] { (byte)(args.DisableFBLOCK ? 0 : 1) }, "FBLOCK state");
+ foreach (var command in new[] { "hwdog certify set", "backdoor set" })
+ {
+ Log.Info($"Trying {command}...");
+ var res = fb.Command($"oem {command} {state}");
+ LogResponse(res);
+ if (res.Status == Fastboot.Status.Okay || res.Payload.Contains("equal"))
+ {
+ Log.Success($"{command}: success");
+ return;
+ }
+ }
+ Log.Error("Failed to set FBLOCK state!");
+ }
- SetNVMEProp("USRKEY", GetSHA256(args.UnlockCode), "User key");
+ private void WidevineLock()
+ {
+ Log.Debug("WV Lock");
+ var res = fb.Command("getvar:nve:WVLOCK");
+ LogResponse(res);
+ if (res.Status != Fastboot.Status.Fail && res.Payload.Replace("\n", "").Trim() != "UUUUUUUUUUUUUUUU")
+ {
+ Log.Info($"Read factory key: {res.Payload}");
+ }
- if (!string.IsNullOrWhiteSpace(args.SerialNumber))
+ try
{
- SetNVMEProp("SN", args.SerialNumber, "Serial number");
+ SetNVMEProp("WVLOCK", Encoding.ASCII.GetBytes(args.UnlockCode));
+ }
+ catch
+ {
+ Log.Error("Failed to set the WVLOCK.");
+ }
+ }
+
+ private void WriteNVME()
+ {
+ var fblockState = (byte)(args.DisableFBLOCK ? 0 : 1);
+
+ try
+ {
+ SetNVMEProp("FBLOCK", new[] { fblockState });
+ }
+ catch (Exception ex)
+ {
+ Log.Error("Failed to set the FBLOCK, using the alternative method...");
+ Log.Debug(ex.Message);
+ SetHWDogCertify(fblockState);
}
- if (!string.IsNullOrWhiteSpace(args.BoardID))
+ try
+ {
+ SetNVMEProp("USRKEY", GetSHA256(args.UnlockCode));
+ WidevineLock();
+ }
+ catch (Exception ex)
{
- SetNVMEProp("BOARDID", args.BoardID, "Board ID");
+ Log.Error("Failed to set the key.");
+ Log.Debug(ex.Message);
}
}
@@ -146,28 +195,23 @@ private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
if (args.TargetMode == UsbController.Device.DMode.DownloadVCOM)
{
- Log.Info("--> Flashing bootloader");
FlashBootloader(args.Bootloader, args.Target.Split(':')[0]);
Log.Info("Waiting for any device...");
fb.Wait();
}
- Log.Info("--> Reading information");
- Log.Info("Connecting to fastboot device...");
+ Log.Info("Connecting...");
fb.Connect();
ReadInfo();
-
- Log.Info("--> Updating NVME");
WriteNVME();
- Log.Success("Update done!");
Log.Info("Rebooting...");
fb.Command("reboot");
- Log.Info($"Bootloader unlock code: {args.UnlockCode}");
+ Log.Info($"New bootloader unlock code: {args.UnlockCode}");
fb.Disconnect();
}
@@ -176,6 +220,10 @@ private void Worker_DoWork(object sender, DoWorkEventArgs e)
Log.Error(ex.Message);
Log.Debug(ex.StackTrace);
}
+ finally
+ {
+ fb.Disconnect();
+ }
}
public void StartProcess(Controls.NVForm.FormEventArgs args)
diff --git a/PotatoNV-next/MainWindow.xaml b/PotatoNV-next/MainWindow.xaml
index b61d177..e80522f 100644
--- a/PotatoNV-next/MainWindow.xaml
+++ b/PotatoNV-next/MainWindow.xaml
@@ -17,7 +17,6 @@
diff --git a/PotatoNV-next/MainWindow.xaml.cs b/PotatoNV-next/MainWindow.xaml.cs
index 35e31c9..3583d7c 100644
--- a/PotatoNV-next/MainWindow.xaml.cs
+++ b/PotatoNV-next/MainWindow.xaml.cs
@@ -54,8 +54,6 @@ private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam
public MainWindow()
{
- IntegrityCheck.Run();
-
Icon = MediaConverter.ImageSourceFromBitmap(Properties.Resources.Fire.ToBitmap());
InitializeComponent();
diff --git a/PotatoNV-next/PotatoNV-next.csproj b/PotatoNV-next/PotatoNV-next.csproj
index 8c2fe47..4fb9480 100644
--- a/PotatoNV-next/PotatoNV-next.csproj
+++ b/PotatoNV-next/PotatoNV-next.csproj
@@ -81,12 +81,6 @@
..\packages\LibUsbDotNet.2.2.29\lib\net45\LibUsbDotNet.LibUsbDotNet.dll
-
- ..\packages\Potato.Fastboot.1.1.0\lib\net472\Potato.Fastboot.dll
-
-
- ..\packages\Potato.ImageFlasher.1.0.1\lib\net472\Potato.ImageFlasher.dll
-
@@ -122,7 +116,6 @@
-
@@ -194,6 +187,21 @@
-
+
+
+ {6c04f303-a659-4872-8136-d5c1d48a8f75}
+ Potato.Fastboot
+
+
+ {b74d03cc-ac13-447a-bcd8-c2044da84eeb}
+ Potato.ImageFlasher
+
+
+
+ PowerShell -noprofile -executionpolicy bypass -file "$(ProjectDir)post-build.ps1" $(TargetDir) $(SolutionDir)
+
+
+ git submodule update --remote
+
\ No newline at end of file
diff --git a/PotatoNV-next/Properties/AssemblyInfo.cs b/PotatoNV-next/Properties/AssemblyInfo.cs
index 5ee9200..8f04256 100644
--- a/PotatoNV-next/Properties/AssemblyInfo.cs
+++ b/PotatoNV-next/Properties/AssemblyInfo.cs
@@ -20,5 +20,5 @@
ResourceDictionaryLocation.SourceAssembly
)]
-[assembly: AssemblyVersion("2.0.1.0")]
-[assembly: AssemblyFileVersion("2.0.1.0")]
+[assembly: AssemblyVersion("2.1.0.0")]
+[assembly: AssemblyFileVersion("2.1.0.0")]
diff --git a/PotatoNV-next/Utils/IntegrityCheck.cs b/PotatoNV-next/Utils/IntegrityCheck.cs
deleted file mode 100644
index 9ecd9ce..0000000
--- a/PotatoNV-next/Utils/IntegrityCheck.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Windows;
-
-namespace PotatoNV_next.Utils
-{
- class IntegrityCheck
- {
- protected static string[] Checks = new string[] {
- "libusb-1.0.dll",
- "LibUsbDotNet.LibUsbDotNet.dll",
- "Potato.Fastboot.dll",
- "Potato.ImageFlasher.dll",
- "bootloaders/"
- };
-
- public static void Run()
- {
- var issues = new List();
-
- foreach (var f in Checks)
- {
- var isDir = f.EndsWith("/");
- var path = Path.Combine(Environment.CurrentDirectory, f);
-
- if (isDir ? !Directory.Exists(path) : !File.Exists(path))
- {
- issues.Add($"{f}: not found");
- continue;
- }
- }
-
- if (issues.Count > 0)
- {
- MessageBox.Show(string.Join("\n", issues), "Integrity check failed", MessageBoxButton.OK, MessageBoxImage.Error);
- Environment.Exit(1);
- }
- }
- }
-}
diff --git a/PotatoNV-next/packages.config b/PotatoNV-next/packages.config
index 2578302..0c8e39f 100644
--- a/PotatoNV-next/packages.config
+++ b/PotatoNV-next/packages.config
@@ -1,6 +1,4 @@
-
-
\ No newline at end of file
diff --git a/PotatoNV-next/post-build.ps1 b/PotatoNV-next/post-build.ps1
new file mode 100644
index 0000000..1c44fdf
--- /dev/null
+++ b/PotatoNV-next/post-build.ps1
@@ -0,0 +1,3 @@
+$out = "$($args[0])\bootloaders"
+New-Item -ItemType Directory -Force -Path $out
+Get-ChildItem -Directory -Path "$($args[1])\HiSiBootloaders" | Copy-Item -Destination $out -Recurse -Container -Verbose
diff --git a/README.md b/README.md
index 6effe1f..c87000e 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,5 @@
# PotatoNV
+
[](https://ci.appveyor.com/project/mashed-potatoes/potatonv)


@@ -19,28 +20,30 @@ Click below to download the latest version:
-## List of tested devices
+## Tested devices
Device | Model | Bootloader
------ | --- | ----- |
-Honor 7X | `BND` | Kirin 659 (A)
-Honor 8 Pro / V9 | `DUK` | Kirin 960
-Honor 9 Lite | `LLD` | Kirin 659 (A)
+Honor 5C / 7 Lite | `NEM` | Kirin 65x (A)
+Honor 7X | `BND` | Kirin 65x (A)
+Honor 8 | `FRD` | Kirin 950
+Honor 8 Pro / V9 | `DUK` | Kirin 950
+Honor 9 Lite | `LLD` | Kirin 65x (A)
Honor 9 | `STF` | Kirin 960
Huawei Mate 9 | `MHA` | Kirin 960
Huawei Mate 9 Pro | `LON` | Kirin 960
-Huawei MediaPad M5 Lite | `BAH2` | Kirin 659 (B)
+Huawei MediaPad M5 Lite | `BAH2` | Kirin 65x (B)
Huawei MediaPad M5 | `CMR` | Kirin 960
-Huawei MediaPad T5 | `AGS2` | Kirin 659 (A)
-Huawei Nova 2 | `PIC` | Kirin 659 (A)
-Huawei Nova 2i / Mate 10 Lite | `RNE` | Kirin 659 (B)
+Huawei MediaPad T5 | `AGS2` | Kirin 65x (A)
+Huawei Nova 2 | `PIC` | Kirin 65x (A)
+Huawei Nova 2i / Mate 10 Lite | `RNE` | Kirin 65x (B)
Huawei Nova 2s | `HWI` | Kirin 960
-Huawei P Smart 2018 | `FIG` | Kirin 659 (B)
+Huawei P Smart 2018 | `FIG` | Kirin 65x (B)
Huawei P10 | `VTR` | Kirin 960
-Huawei P20 Lite / Nova 3e | `ANE` | Kirin 659 (A)
-Huawei P8 Lite (2017) | `PRA` | Kirin 659 (A)
-Huawei P9 Lite | `VNS` | Kirin 659 (A)
-Huawei Y9 (2018) | `FLA` | Kirin 659 (A)
+Huawei P20 Lite / Nova 3e | `ANE` | Kirin 65x (A)
+Huawei P8 Lite (2017) | `PRA` | Kirin 65x (A)
+Huawei P9 Lite | `VNS` | Kirin 65x (A)
+Huawei Y9 (2018) | `FLA` | Kirin 65x (A)
## License
diff --git a/appveyor.yml b/appveyor.yml
index bde6a94..e6e1a34 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,8 +1,17 @@
-version: 2.0.0-{build}
+version: 2.1.0-{build}
configuration: Debug
-clone_depth: 1
+clone_script:
+ - cmd: >-
+ git clone -q --branch=%APPVEYOR_REPO_BRANCH% https://github.com/%APPVEYOR_REPO_NAME%.git %APPVEYOR_BUILD_FOLDER%
+ && cd %APPVEYOR_BUILD_FOLDER%
+ && git checkout -qf %APPVEYOR_REPO_COMMIT%
+ && git submodule update --init --recursive
before_build:
- cmd: nuget restore
build:
project: PotatoNV-next.sln
verbosity: normal
+artifacts:
+ - path: PotatoNV-next\bin\$(configuration)
+ name: PotatoNV-appveyor
+ type: zip