mirror of
https://github.com/velopack/velopack.git
synced 2025-10-25 15:19:22 +00:00
@@ -53,12 +53,9 @@ namespace Squirrel
|
||||
/// <returns>List with the elements that share the same maximum key value.</returns>
|
||||
public static IList<TSource> MaxBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IComparer<TKey> comparer)
|
||||
{
|
||||
if (source == null)
|
||||
throw new ArgumentNullException("source");
|
||||
if (keySelector == null)
|
||||
throw new ArgumentNullException("keySelector");
|
||||
if (comparer == null)
|
||||
throw new ArgumentNullException("comparer");
|
||||
if (source == null) throw new ArgumentNullException("source");
|
||||
if (keySelector == null) throw new ArgumentNullException("keySelector");
|
||||
if (comparer == null) throw new ArgumentNullException("comparer");
|
||||
|
||||
return ExtremaBy(source, keySelector, (key, minValue) => comparer.Compare(key, minValue));
|
||||
}
|
||||
@@ -67,27 +64,21 @@ namespace Squirrel
|
||||
{
|
||||
var result = new List<TSource>();
|
||||
|
||||
using (var e = source.GetEnumerator())
|
||||
{
|
||||
if (!e.MoveNext())
|
||||
throw new InvalidOperationException("Source sequence doesn't contain any elements.");
|
||||
using (var e = source.GetEnumerator()) {
|
||||
if (!e.MoveNext()) throw new InvalidOperationException("Source sequence doesn't contain any elements.");
|
||||
|
||||
var current = e.Current;
|
||||
var resKey = keySelector(current);
|
||||
result.Add(current);
|
||||
|
||||
while (e.MoveNext())
|
||||
{
|
||||
while (e.MoveNext()) {
|
||||
var cur = e.Current;
|
||||
var key = keySelector(cur);
|
||||
|
||||
var cmp = compare(key, resKey);
|
||||
if (cmp == 0)
|
||||
{
|
||||
if (cmp == 0) {
|
||||
result.Add(cur);
|
||||
}
|
||||
else if (cmp > 0)
|
||||
{
|
||||
} else if (cmp > 0) {
|
||||
result = new List<TSource> { cur };
|
||||
resKey = key;
|
||||
}
|
||||
@@ -106,10 +97,8 @@ namespace Squirrel
|
||||
/// <returns>Sequence exhibiting the specified side-effects upon enumeration.</returns>
|
||||
public static IEnumerable<TSource> Do<TSource>(this IEnumerable<TSource> source, Action<TSource> onNext)
|
||||
{
|
||||
if (source == null)
|
||||
throw new ArgumentNullException("source");
|
||||
if (onNext == null)
|
||||
throw new ArgumentNullException("onNext");
|
||||
if (source == null) throw new ArgumentNullException("source");
|
||||
if (onNext == null) throw new ArgumentNullException("onNext");
|
||||
|
||||
return DoHelper(source, onNext, _ => { }, () => { });
|
||||
}
|
||||
@@ -124,12 +113,9 @@ namespace Squirrel
|
||||
/// <returns>Sequence exhibiting the specified side-effects upon enumeration.</returns>
|
||||
public static IEnumerable<TSource> Do<TSource>(this IEnumerable<TSource> source, Action<TSource> onNext, Action onCompleted)
|
||||
{
|
||||
if (source == null)
|
||||
throw new ArgumentNullException("source");
|
||||
if (onNext == null)
|
||||
throw new ArgumentNullException("onNext");
|
||||
if (onCompleted == null)
|
||||
throw new ArgumentNullException("onCompleted");
|
||||
if (source == null) throw new ArgumentNullException("source");
|
||||
if (onNext == null) throw new ArgumentNullException("onNext");
|
||||
if (onCompleted == null) throw new ArgumentNullException("onCompleted");
|
||||
|
||||
return DoHelper(source, onNext, _ => { }, onCompleted);
|
||||
}
|
||||
@@ -144,12 +130,9 @@ namespace Squirrel
|
||||
/// <returns>Sequence exhibiting the specified side-effects upon enumeration.</returns>
|
||||
public static IEnumerable<TSource> Do<TSource>(this IEnumerable<TSource> source, Action<TSource> onNext, Action<Exception> onError)
|
||||
{
|
||||
if (source == null)
|
||||
throw new ArgumentNullException("source");
|
||||
if (onNext == null)
|
||||
throw new ArgumentNullException("onNext");
|
||||
if (onError == null)
|
||||
throw new ArgumentNullException("onError");
|
||||
if (source == null) throw new ArgumentNullException("source");
|
||||
if (onNext == null) throw new ArgumentNullException("onNext");
|
||||
if (onError == null) throw new ArgumentNullException("onError");
|
||||
|
||||
return DoHelper(source, onNext, onError, () => { });
|
||||
}
|
||||
@@ -165,34 +148,25 @@ namespace Squirrel
|
||||
/// <returns>Sequence exhibiting the specified side-effects upon enumeration.</returns>
|
||||
public static IEnumerable<TSource> Do<TSource>(this IEnumerable<TSource> source, Action<TSource> onNext, Action<Exception> onError, Action onCompleted)
|
||||
{
|
||||
if (source == null)
|
||||
throw new ArgumentNullException("source");
|
||||
if (onNext == null)
|
||||
throw new ArgumentNullException("onNext");
|
||||
if (onError == null)
|
||||
throw new ArgumentNullException("onError");
|
||||
if (onCompleted == null)
|
||||
throw new ArgumentNullException("onCompleted");
|
||||
if (source == null) throw new ArgumentNullException("source");
|
||||
if (onNext == null) throw new ArgumentNullException("onNext");
|
||||
if (onError == null) throw new ArgumentNullException("onError");
|
||||
if (onCompleted == null) throw new ArgumentNullException("onCompleted");
|
||||
|
||||
return DoHelper(source, onNext, onError, onCompleted);
|
||||
}
|
||||
|
||||
private static IEnumerable<TSource> DoHelper<TSource>(this IEnumerable<TSource> source, Action<TSource> onNext, Action<Exception> onError, Action onCompleted)
|
||||
{
|
||||
using (var e = source.GetEnumerator())
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
using (var e = source.GetEnumerator()) {
|
||||
while (true) {
|
||||
var current = default(TSource);
|
||||
try
|
||||
{
|
||||
try {
|
||||
if (!e.MoveNext())
|
||||
break;
|
||||
|
||||
current = e.Current;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
} catch (Exception ex) {
|
||||
onError(ex);
|
||||
throw;
|
||||
}
|
||||
@@ -214,19 +188,16 @@ namespace Squirrel
|
||||
/// <returns>Sequence starting with the specified prefix value, followed by the source sequence.</returns>
|
||||
public static IEnumerable<TSource> StartWith<TSource>(this IEnumerable<TSource> source, params TSource[] values)
|
||||
{
|
||||
if (source == null)
|
||||
throw new ArgumentNullException("source");
|
||||
if (source == null) throw new ArgumentNullException("source");
|
||||
|
||||
return source.StartWith_(values);
|
||||
}
|
||||
|
||||
static IEnumerable<TSource> StartWith_<TSource>(this IEnumerable<TSource> source, params TSource[] values)
|
||||
{
|
||||
foreach (var x in values)
|
||||
yield return x;
|
||||
foreach (var x in values) yield return x;
|
||||
|
||||
foreach (var item in source)
|
||||
yield return item;
|
||||
foreach (var item in source) yield return item;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -239,10 +210,8 @@ namespace Squirrel
|
||||
/// <returns>Sequence that contains the elements from the source sequence with distinct key values.</returns>
|
||||
public static IEnumerable<TSource> Distinct<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
|
||||
{
|
||||
if (source == null)
|
||||
throw new ArgumentNullException("source");
|
||||
if (keySelector == null)
|
||||
throw new ArgumentNullException("keySelector");
|
||||
if (source == null) throw new ArgumentNullException("source");
|
||||
if (keySelector == null) throw new ArgumentNullException("keySelector");
|
||||
|
||||
return source.Distinct_(keySelector, EqualityComparer<TKey>.Default);
|
||||
}
|
||||
@@ -258,12 +227,9 @@ namespace Squirrel
|
||||
/// <returns>Sequence that contains the elements from the source sequence with distinct key values.</returns>
|
||||
public static IEnumerable<TSource> Distinct<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
|
||||
{
|
||||
if (source == null)
|
||||
throw new ArgumentNullException("source");
|
||||
if (keySelector == null)
|
||||
throw new ArgumentNullException("keySelector");
|
||||
if (comparer == null)
|
||||
throw new ArgumentNullException("comparer");
|
||||
if (source == null) throw new ArgumentNullException("source");
|
||||
if (keySelector == null) throw new ArgumentNullException("keySelector");
|
||||
if (comparer == null) throw new ArgumentNullException("comparer");
|
||||
|
||||
return source.Distinct_(keySelector, comparer);
|
||||
}
|
||||
@@ -272,11 +238,10 @@ namespace Squirrel
|
||||
{
|
||||
var set = new HashSet<TKey>(comparer);
|
||||
|
||||
foreach (var item in source)
|
||||
{
|
||||
foreach (var item in source) {
|
||||
var key = keySelector(item);
|
||||
if (set.Add(key))
|
||||
yield return item;
|
||||
|
||||
if (set.Add(key)) yield return item;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,8 +8,7 @@ namespace Squirrel
|
||||
{
|
||||
public static string ExtractTitle(this IPackage package)
|
||||
{
|
||||
if (package == null)
|
||||
return String.Empty;
|
||||
if (package == null) return String.Empty;
|
||||
|
||||
var title = package.Title;
|
||||
return !String.IsNullOrWhiteSpace(title) ? title : package.Id;
|
||||
@@ -17,9 +16,8 @@ namespace Squirrel
|
||||
|
||||
public static FrameworkVersion DetectFrameworkVersion(this IPackage package)
|
||||
{
|
||||
return package.GetFiles().Any(x => x.Path.Contains("lib") && x.Path.Contains("45"))
|
||||
? FrameworkVersion.Net45
|
||||
: FrameworkVersion.Net40;
|
||||
return package.GetFiles().Any(x => x.Path.Contains("lib") && x.Path.Contains("45")) ?
|
||||
FrameworkVersion.Net45 : FrameworkVersion.Net40;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,19 +54,17 @@ namespace Squirrel
|
||||
|
||||
[IgnoreDataMember]
|
||||
public string PackageName {
|
||||
get {
|
||||
return Filename.Substring(0, Filename.IndexOfAny(new[] { '-', '.' }));
|
||||
}
|
||||
get { return Filename.Substring(0, Filename.IndexOfAny(new[] { '-', '.' })); }
|
||||
}
|
||||
|
||||
public string GetReleaseNotes(string packageDirectory)
|
||||
{
|
||||
var zp = new ZipPackage(Path.Combine(packageDirectory, Filename));
|
||||
|
||||
var t = zp.Id;
|
||||
|
||||
if (String.IsNullOrWhiteSpace(zp.ReleaseNotes))
|
||||
if (String.IsNullOrWhiteSpace(zp.ReleaseNotes)) {
|
||||
throw new Exception(String.Format("Invalid 'ReleaseNotes' value in nuspec file at '{0}'", Path.Combine(packageDirectory, Filename)));
|
||||
}
|
||||
|
||||
return zp.ReleaseNotes;
|
||||
}
|
||||
@@ -186,15 +184,14 @@ namespace Squirrel
|
||||
|
||||
public static ReleasePackage GetPreviousRelease(IEnumerable<ReleaseEntry> releaseEntries, IReleasePackage package, string targetDir)
|
||||
{
|
||||
if (releaseEntries == null || !releaseEntries.Any())
|
||||
return null;
|
||||
if (releaseEntries == null || !releaseEntries.Any()) return null;
|
||||
|
||||
return releaseEntries
|
||||
.Where(x => x.IsDelta == false)
|
||||
.Where(x => x.Version < package.ToVersion())
|
||||
.OrderByDescending(x => x.Version)
|
||||
.Select(x => new ReleasePackage(Path.Combine(targetDir, x.Filename), true))
|
||||
.FirstOrDefault();
|
||||
.Where(x => x.IsDelta == false)
|
||||
.Where(x => x.Version < package.ToVersion())
|
||||
.OrderByDescending(x => x.Version)
|
||||
.Select(x => new ReleasePackage(Path.Combine(targetDir, x.Filename), true))
|
||||
.FirstOrDefault();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,8 +17,8 @@ namespace Squirrel
|
||||
public static Version ToVersion(this string fileName)
|
||||
{
|
||||
var parts = (new FileInfo(fileName)).Name
|
||||
.Replace(".nupkg", "").Replace("-delta", "")
|
||||
.Split('.', '-').Reverse();
|
||||
.Replace(".nupkg", "").Replace("-delta", "")
|
||||
.Split('.', '-').Reverse();
|
||||
|
||||
var numberRegex = new Regex(@"^\d+$");
|
||||
|
||||
@@ -28,13 +28,11 @@ namespace Squirrel
|
||||
.Reverse()
|
||||
.ToArray();
|
||||
|
||||
if (versionFields.Length < 2 || versionFields.Length > 4)
|
||||
{
|
||||
if (versionFields.Length < 2 || versionFields.Length > 4) {
|
||||
return null;
|
||||
}
|
||||
|
||||
switch (versionFields.Length)
|
||||
{
|
||||
switch (versionFields.Length) {
|
||||
case 2:
|
||||
return new Version(versionFields[0], versionFields[1]);
|
||||
case 3:
|
||||
|
||||
@@ -34,14 +34,12 @@ namespace Squirrel
|
||||
|
||||
static int? GetAssemblySquirrelAwareVersion(string executable)
|
||||
{
|
||||
try
|
||||
{
|
||||
try {
|
||||
var assembly = AssemblyDefinition.ReadAssembly(executable);
|
||||
if (!assembly.HasCustomAttributes) return null;
|
||||
|
||||
var attrs = assembly.CustomAttributes;
|
||||
var attribute = attrs.FirstOrDefault(x =>
|
||||
{
|
||||
var attribute = attrs.FirstOrDefault(x => {
|
||||
if (x.AttributeType.FullName != typeof(AssemblyMetadataAttribute).FullName) return false;
|
||||
if (x.ConstructorArguments.Count != 2) return false;
|
||||
return x.ConstructorArguments[0].Value.ToString() == "SquirrelAwareVersion";
|
||||
@@ -50,8 +48,7 @@ namespace Squirrel
|
||||
if (attribute == null) return null;
|
||||
|
||||
int result;
|
||||
if (!Int32.TryParse(attribute.ConstructorArguments[1].Value.ToString(), NumberStyles.Integer, CultureInfo.CurrentCulture, out result))
|
||||
{
|
||||
if (!Int32.TryParse(attribute.ConstructorArguments[1].Value.ToString(), NumberStyles.Integer, CultureInfo.CurrentCulture, out result)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -72,8 +69,7 @@ namespace Squirrel
|
||||
if (!NativeMethods.GetFileVersionInfo(executable, IntPtr.Zero, size, buf)) return null;
|
||||
|
||||
IntPtr result; int resultSize;
|
||||
if (!NativeMethods.VerQueryValue(buf, "\\StringFileInfo\\040904B0\\SquirrelAwareVersion", out result, out resultSize))
|
||||
{
|
||||
if (!NativeMethods.VerQueryValue(buf, "\\StringFileInfo\\040904B0\\SquirrelAwareVersion", out result, out resultSize)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -32,9 +32,10 @@ namespace Squirrel
|
||||
// NB: When bootstrapping, CurrentlyInstalledVersion is null!
|
||||
CurrentlyInstalledVersion = currentlyInstalledVersion;
|
||||
ReleasesToApply = (releasesToApply ?? Enumerable.Empty<ReleaseEntry>()).ToList();
|
||||
FutureReleaseEntry = ReleasesToApply.Any()
|
||||
? ReleasesToApply.MaxBy(x => x.Version).FirstOrDefault()
|
||||
: null;
|
||||
FutureReleaseEntry = ReleasesToApply.Any() ?
|
||||
ReleasesToApply.MaxBy(x => x.Version).FirstOrDefault() :
|
||||
null;
|
||||
|
||||
AppFrameworkVersion = appFrameworkVersion;
|
||||
|
||||
this.PackageDirectory = packageDirectory;
|
||||
@@ -65,13 +66,15 @@ namespace Squirrel
|
||||
return new UpdateInfo(currentVersion, Enumerable.Empty<ReleaseEntry>(), packageDirectory, appFrameworkVersion);
|
||||
}
|
||||
|
||||
var newerThanUs = availableReleases.Where(x => x.Version > currentVersion.Version)
|
||||
.OrderBy(v => v.Version);
|
||||
var newerThanUs = availableReleases
|
||||
.Where(x => x.Version > currentVersion.Version)
|
||||
.OrderBy(v => v.Version);
|
||||
|
||||
var deltasSize = newerThanUs.Where(x => x.IsDelta).Sum(x => x.Filesize);
|
||||
|
||||
return (deltasSize < latestFull.Filesize && deltasSize > 0)
|
||||
? new UpdateInfo(currentVersion, newerThanUs.Where(x => x.IsDelta).ToArray(), packageDirectory, appFrameworkVersion)
|
||||
: new UpdateInfo(currentVersion, new[] { latestFull }, packageDirectory, appFrameworkVersion);
|
||||
return (deltasSize < latestFull.Filesize && deltasSize > 0) ?
|
||||
new UpdateInfo(currentVersion, newerThanUs.Where(x => x.IsDelta).ToArray(), packageDirectory, appFrameworkVersion) :
|
||||
new UpdateInfo(currentVersion, new[] { latestFull }, packageDirectory, appFrameworkVersion);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,8 +51,7 @@ namespace Squirrel
|
||||
{
|
||||
var currentRelease = getReleases().MaxBy(x => x.Name.ToVersion()).FirstOrDefault();
|
||||
|
||||
if (currentRelease.Exists)
|
||||
{
|
||||
if (currentRelease.Exists) {
|
||||
var version = currentRelease.Name.ToVersion();
|
||||
|
||||
await SquirrelAwareExecutableDetector.GetAllSquirrelAwareApps(currentRelease.FullName)
|
||||
|
||||
@@ -26,8 +26,7 @@ namespace Squirrel.Tests.Core
|
||||
|
||||
var existingTypes = GetContentTypes(expected);
|
||||
|
||||
try
|
||||
{
|
||||
try {
|
||||
File.Copy(inputFile, tempFile);
|
||||
|
||||
var actual = new XmlDocument();
|
||||
@@ -38,9 +37,7 @@ namespace Squirrel.Tests.Core
|
||||
var actualTypes = GetContentTypes(actual);
|
||||
|
||||
Assert.Equal(existingTypes, actualTypes);
|
||||
}
|
||||
finally
|
||||
{
|
||||
} finally {
|
||||
File.Delete(tempFile);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -205,8 +205,7 @@ namespace Squirrel.Tests.Core
|
||||
var assemblyName = AssemblyName.GetAssemblyName(outputFile);
|
||||
Assert.Equal(1, assemblyName.Version.Major);
|
||||
Assert.Equal(5, assemblyName.Version.Minor);
|
||||
}
|
||||
finally {
|
||||
} finally {
|
||||
File.Delete(outputPackage);
|
||||
File.Delete(outputFile);
|
||||
}
|
||||
@@ -242,8 +241,7 @@ namespace Squirrel.Tests.Core
|
||||
var fixture = new ReleasePackage(inputPackage);
|
||||
(new DirectoryInfo(sourceDir)).Exists.ShouldBeTrue();
|
||||
|
||||
try
|
||||
{
|
||||
try {
|
||||
fixture.CreateReleasePackage(outputPackage, sourceDir);
|
||||
|
||||
this.Log().Info("Resulting package is at {0}", outputPackage);
|
||||
@@ -264,9 +262,7 @@ namespace Squirrel.Tests.Core
|
||||
Assert.Contains("dir\\item-in-subdirectory.txt", contentFilePaths);
|
||||
|
||||
Assert.Equal(1, pkg.GetLibFiles().Count());
|
||||
}
|
||||
finally
|
||||
{
|
||||
} finally {
|
||||
File.Delete(outputPackage);
|
||||
}
|
||||
}
|
||||
@@ -281,8 +277,7 @@ namespace Squirrel.Tests.Core
|
||||
var rightPackage = "Caliburn.Micro.1.5.2.nupkg";
|
||||
var rightPackagePath = IntegrationTestHelper.GetPath("fixtures", rightPackage);
|
||||
|
||||
try
|
||||
{
|
||||
try {
|
||||
var sourceDir = IntegrationTestHelper.GetPath("fixtures", "packages");
|
||||
(new DirectoryInfo(sourceDir)).Exists.ShouldBeTrue();
|
||||
|
||||
@@ -298,9 +293,7 @@ namespace Squirrel.Tests.Core
|
||||
.FirstOrDefault(f => f.TargetFramework == FrameworkTargetVersion.Net45);
|
||||
|
||||
Assert.NotNull(dependency);
|
||||
}
|
||||
finally
|
||||
{
|
||||
} finally {
|
||||
File.Delete(outputPackage);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,8 +85,7 @@ namespace Squirrel.Tests
|
||||
"Squirrel.Core.1.0.0.0-full.nupkg",
|
||||
"Squirrel.Core.1.1.0.0-delta.nupkg",
|
||||
"Squirrel.Core.1.1.0.0-full.nupkg",
|
||||
}.ForEach(x =>
|
||||
{
|
||||
}.ForEach(x => {
|
||||
var path = IntegrationTestHelper.GetPath("fixtures", x);
|
||||
File.Copy(path, Path.Combine(localPackages, x));
|
||||
File.Copy(path, Path.Combine(remotePackages, x));
|
||||
@@ -125,8 +124,7 @@ namespace Squirrel.Tests
|
||||
"Squirrel.Core.1.0.0.0-full.nupkg",
|
||||
"Squirrel.Core.1.1.0.0-delta.nupkg",
|
||||
"Squirrel.Core.1.1.0.0-full.nupkg",
|
||||
}.ForEach(x =>
|
||||
{
|
||||
}.ForEach(x => {
|
||||
var path = IntegrationTestHelper.GetPath("fixtures", x);
|
||||
File.Copy(path, Path.Combine(localPackages, x));
|
||||
});
|
||||
@@ -134,8 +132,7 @@ namespace Squirrel.Tests
|
||||
new[] {
|
||||
"Squirrel.Core.1.0.0.0-full.nupkg",
|
||||
"Squirrel.Core.1.1.0.0-full.nupkg",
|
||||
}.ForEach(x =>
|
||||
{
|
||||
}.ForEach(x => {
|
||||
var path = IntegrationTestHelper.GetPath("fixtures", x);
|
||||
File.Copy(path, Path.Combine(remotePackages, x));
|
||||
});
|
||||
|
||||
@@ -30,7 +30,6 @@ namespace Squirrel.Tests.Core
|
||||
{
|
||||
string tempDir;
|
||||
using (Utility.WithTempDirectory(out tempDir)) {
|
||||
|
||||
for (var i = 0; i < 50; i++) {
|
||||
var directory = Path.Combine(tempDir, newId());
|
||||
CreateSampleDirectory(directory);
|
||||
@@ -64,6 +63,7 @@ namespace Squirrel.Tests.Core
|
||||
|
||||
static void CreateSampleDirectory(string directory)
|
||||
{
|
||||
Random prng = new Random();
|
||||
while (true) {
|
||||
Directory.CreateDirectory(directory);
|
||||
|
||||
@@ -73,12 +73,13 @@ namespace Squirrel.Tests.Core
|
||||
File.WriteAllText(file, Guid.NewGuid().ToString());
|
||||
}
|
||||
|
||||
if (new Random().NextDouble() > 0.5) {
|
||||
if (prng.NextDouble() > 0.5) {
|
||||
var childDirectory = Path.Combine(directory, newId());
|
||||
if (childDirectory.Length > 248) return;
|
||||
directory = childDirectory;
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user