Integrate changes made directly to master

This commit is contained in:
Rob Mensching
2022-06-01 23:15:25 -07:00
5 changed files with 71 additions and 30 deletions

View File

@@ -34,7 +34,7 @@ Section [NuGet Package Metadata](../using/nuget-package-metadata.md) provides ad
3. **Add lib & net45** - add the `lib` folder and the `net45` folder to the project. Squirrel is expecting a single `lib / net45` directory provided regardless of whether your app is a `net45` application.
4. **Add Release Files** - add all the files from `bin\Release` needed by MyApp to execute (including the various files required by Squirrel).
* **Include MyApp Files:** MyApp.exe, MyApp.exe.config, any non-standard .NET dll's needed by MyApp.exe.
* **Include Squirrel Files:** Squirrel.dll, Splat.dll, NuGet.Squirrel.dll, Mono.Cecil.\*, DeltaCompressionDotNet.\*, ICSharpCode.SharpZipLib.\*
* **Include Squirrel Files:** Squirrel.dll, Splat.dll, NuGet.Squirrel.dll, Mono.Cecil.\*, DeltaCompressionDotNet.\*,
* **Exclude:** *.vshost.\*, *.pdb files
5. **Save the NuGet Package File** - save the NuGet package file to where you can easily access later (e.g., `MyApp.sln` directory). Follow the given naming format (e.g., `MyApp.1.0.0.nupkg`).

View File

@@ -1,24 +1,36 @@
| [docs](..) / [using](.) / machine-wide-installs.md
|:---|
| [docs](..) / [using](.) / machine-wide-installs.md
|:---|
# Machine-wide Installs
Squirrel's Releasify command generates an MSI file suitable for installation via Group Policy. This MSI isn't a general-purpose installer, this means that once you run the MSI, users from now on will get the app installed, on next Login.
So, most normal users should continue to run the Setup.exe's generated by Releasify, but if you want to have an IT Admin Friendly version, you can hand off the MSI
Most users of Squirrel won't have to do anything new to enable this behavior, though certain NuGet package IDs / names might cause problems with MSI.
**Source:** See [issue #466](https://github.com/Squirrel/Squirrel.Windows/issues/466) for more details.
### Disabling MSI Generation
Generating MSIs can be disabled via the --no-msi flag as shown below:
~~~powershell
PM> Squirrel --releasify MyApp.1.0.0.nupkg --no-msi
~~~
---
| Return: [Table of Contents](../readme.md) |
|----|
Squirrel's Releasify command generates an MSI file suitable for installation via Group Policy. This MSI isn't a general-purpose installer, this means that once you run the MSI, users from now on will get the app installed, on next Login.
So, most normal users should continue to run the Setup.exe's generated by Releasify, but if you want to have an IT Admin Friendly version, you can hand off the MSI
## Common pitfalls
### Missing data in `.nuspec`
Most users of Squirrel won't have to do anything new to enable this behavior, though certain NuGet package IDs / names might cause problems with MSI.
**Source:** See [issue #466](https://github.com/Squirrel/Squirrel.Windows/issues/466) for more details.
### Nothing happens on login
In cases where the end user has previously installed your application, the installer that runs on login will not re-install your application on every login. This can easily be the case if you as a developer is testing out both the EXE and the MSI.
Squirrel leaves behind an almost-empty `%LocalAppData%\MyApp` folder after an uninstall. Deleting this folder (the entire folder, not just the contents) will allow the installer that runs on login to install successfully.
**Source:**: See [issue #555](https://github.com/Squirrel/Squirrel.Windows/issues/555#issuecomment-253265130) for details.
## Disabling MSI Generation
Generating MSIs can be disabled via the --no-msi flag as shown below:
~~~powershell
PM> Squirrel --releasify MyApp.1.0.0.nupkg --no-msi
~~~
---
| Return: [Table of Contents](../readme.md) |
|----|

View File

@@ -240,11 +240,14 @@ namespace Squirrel.Bsdiff
long diffEndPosition = output.Position;
WriteInt64(diffEndPosition - controlEndPosition, header, 16);
// write compressed extra data
using (WrappingStream wrappingStream = new WrappingStream(output, Ownership.None))
using (var bz2Stream = new BZip2Stream(wrappingStream, CompressionMode.Compress))
// write compressed extra data, if any
if (eblen > 0)
{
bz2Stream.Write(eb, 0, eblen);
using (WrappingStream wrappingStream = new WrappingStream(output, Ownership.None))
using (var bz2Stream = new BZip2Stream(wrappingStream, CompressionMode.Compress))
{
bz2Stream.Write(eb, 0, eblen);
}
}
// seek to the beginning, write the header, then seek back to end
@@ -326,10 +329,13 @@ namespace Squirrel.Bsdiff
compressedDiffStream.Seek(c_headerSize + controlLength, SeekOrigin.Current);
compressedExtraStream.Seek(c_headerSize + controlLength + diffLength, SeekOrigin.Current);
// the stream might end here if there is no extra data
var hasExtraData = compressedExtraStream.Position < compressedExtraStream.Length;
// decompress each part (to read it)
using (var controlStream = new BZip2Stream(compressedControlStream, CompressionMode.Decompress))
using (var diffStream = new BZip2Stream(compressedDiffStream, CompressionMode.Decompress))
using (var extraStream = new BZip2Stream(compressedExtraStream, CompressionMode.Decompress))
using (var extraStream = hasExtraData ? new BZip2Stream(compressedExtraStream, CompressionMode.Decompress) : null)
{
long[] control = new long[3];
byte[] buffer = new byte[8];

View File

@@ -601,7 +601,7 @@ namespace Squirrel.Update
String.Format("sign {0} \"{1}\"", signingOpts, exePath), CancellationToken.None);
if (processResult.Item1 != 0) {
var optsWithPasswordHidden = new Regex(@"/p\s+\w+").Replace(signingOpts, "/p ********");
var optsWithPasswordHidden = new Regex(@"/p\s+\S+").Replace(signingOpts, "/p ********");
var msg = String.Format("Failed to sign, command invoked was: '{0} sign {1} {2}'",
exe, optsWithPasswordHidden, exePath);

View File

@@ -290,5 +290,28 @@ namespace Squirrel.Tests.Core
tempFiles.ForEach(File.Delete);
}
}
[Fact]
public void HandleBsDiffWithoutExtraData()
{
var baseFileData = new byte[] { 1, 1, 1, 1 };
var newFileData = new byte[] { 2, 1, 1, 1 };
byte[] patchData;
using (var patchOut = new MemoryStream())
{
Bsdiff.BinaryPatchUtility.Create(baseFileData, newFileData, patchOut);
patchData = patchOut.ToArray();
}
using (var toPatch = new MemoryStream(baseFileData))
using (var patched = new MemoryStream())
{
Bsdiff.BinaryPatchUtility.Apply(toPatch, () => new MemoryStream(patchData), patched);
Assert.Equal(newFileData, patched.ToArray());
}
}
}
}