diff --git a/Packaging.Targets.Tests/ArchiveBuilderTests.cs b/Packaging.Targets.Tests/ArchiveBuilderTests.cs
index 0556ca2..f6a1795 100644
--- a/Packaging.Targets.Tests/ArchiveBuilderTests.cs
+++ b/Packaging.Targets.Tests/ArchiveBuilderTests.cs
@@ -92,7 +92,7 @@ namespace Packaging.Targets.Tests
Assert.Equal(string.Empty, script.LinkTo);
// -rwxr-xr-x
- Assert.Equal(LinuxFileMode.S_IXOTH | LinuxFileMode.S_IROTH | LinuxFileMode.S_IXGRP | LinuxFileMode.S_IRGRP | LinuxFileMode.S_IXUSR | LinuxFileMode.S_IWUSR | LinuxFileMode.S_IRUSR, script.Mode);
+ Assert.Equal(LinuxFileMode.S_IXOTH | LinuxFileMode.S_IROTH | LinuxFileMode.S_IXGRP | LinuxFileMode.S_IRGRP | LinuxFileMode.S_IXUSR | LinuxFileMode.S_IWUSR | LinuxFileMode.S_IRUSR | LinuxFileMode.S_IFREG, script.Mode);
Assert.Equal("root", script.Owner);
Assert.False(script.RemoveOnUninstall);
Assert.Equal(Path.Combine("archive", "script.sh"), script.SourceFilename);
diff --git a/Packaging.Targets/ArchiveBuilder.cs b/Packaging.Targets/ArchiveBuilder.cs
index 9c82370..23b6a0f 100644
--- a/Packaging.Targets/ArchiveBuilder.cs
+++ b/Packaging.Targets/ArchiveBuilder.cs
@@ -359,10 +359,22 @@ namespace Packaging.Targets
if (overridenFileMode != null)
{
- // We expect the user to specify the file mode in its octal representation.
+ // We expect the user to specify the file mode in its octal representation,
+ // such as 755. We don't expect users to specify the higher bits (e.g.
+ // S_IFREG).
try
{
mode = (LinuxFileMode)Convert.ToUInt32(overridenFileMode, 8);
+
+ LinuxFileMode fileType = mode & LinuxFileMode.FileTypeMask;
+
+ if (fileType != LinuxFileMode.None && fileType != LinuxFileMode.S_IFREG)
+ {
+ this.Log.LogWarning($"An invalid file type of '{fileType}' has been set for file '{name}'. The file type will be reset to IFREG.");
+ }
+
+ // Override the file type mask and hardcode it to S_IFREG.
+ mode = (mode & ~LinuxFileMode.FileTypeMask) | LinuxFileMode.S_IFREG;
}
catch (Exception)
{
@@ -375,7 +387,7 @@ namespace Packaging.Targets
FileSize = (uint)fileStream.Length,
Group = fileMetadata.GetGroup(),
Owner = fileMetadata.GetOwner(),
- Modified = File.GetLastAccessTimeUtc(entry),
+ Modified = File.GetLastWriteTimeUtc(entry),
SourceFilename = entry,
TargetPath = name,
Sha256 = hash,
diff --git a/Packaging.Targets/IO/LinuxFileMode.cs b/Packaging.Targets/IO/LinuxFileMode.cs
index 1579b8b..3e3144c 100644
--- a/Packaging.Targets/IO/LinuxFileMode.cs
+++ b/Packaging.Targets/IO/LinuxFileMode.cs
@@ -9,6 +9,11 @@ namespace Packaging.Targets.IO
[Flags]
public enum LinuxFileMode : ushort
{
+ ///
+ /// No file mode has been specified.
+ ///
+ None = 0,
+
///
/// Set user ID on execution
///
diff --git a/molecule/framework-dependent/framework-dependent-app/framework-dependent-app.csproj b/molecule/framework-dependent/framework-dependent-app/framework-dependent-app.csproj
index 7f45bb1..c1aca1e 100644
--- a/molecule/framework-dependent/framework-dependent-app/framework-dependent-app.csproj
+++ b/molecule/framework-dependent/framework-dependent-app/framework-dependent-app.csproj
@@ -20,5 +20,11 @@
+
+
+
+ /etc/dotnet-packaging/LICENSE
+
diff --git a/molecule/framework-dependent/molecule/default/tests/test_default.py b/molecule/framework-dependent/molecule/default/tests/test_default.py
index 11a6806..390befb 100644
--- a/molecule/framework-dependent/molecule/default/tests/test_default.py
+++ b/molecule/framework-dependent/molecule/default/tests/test_default.py
@@ -26,3 +26,8 @@ def test_hidden_file_is_ignored(host):
def test_empty_file_is_ignored(host):
assert \
not host.file("/usr/share/framework-dependent-app/empty").exists
+
+
+def test_license_is_deployed_with_permissions_and_sticky_bit(host):
+ assert host.file("/etc/dotnet-packaging/LICENSE").exists
+ assert host.file("/etc/dotnet-packaging/LICENSE").mode == 0o1755
diff --git a/molecule/self-contained/molecule/default/tests/test_default.py b/molecule/self-contained/molecule/default/tests/test_default.py
index 66ef4d3..c56c698 100644
--- a/molecule/self-contained/molecule/default/tests/test_default.py
+++ b/molecule/self-contained/molecule/default/tests/test_default.py
@@ -26,3 +26,8 @@ def test_hidden_file_is_ignored(host):
def test_empty_file_is_ignored(host):
assert \
not host.file("/usr/share/self-contained-app/empty").exists
+
+
+def test_license_is_deployed_with_permissions_and_sticky_bit(host):
+ assert host.file("/etc/dotnet-packaging/LICENSE").exists
+ assert host.file("/etc/dotnet-packaging/LICENSE").mode == 0o1755
diff --git a/molecule/self-contained/self-contained-app/self-contained-app.csproj b/molecule/self-contained/self-contained-app/self-contained-app.csproj
index 970fb85..972604a 100644
--- a/molecule/self-contained/self-contained-app/self-contained-app.csproj
+++ b/molecule/self-contained/self-contained-app/self-contained-app.csproj
@@ -21,5 +21,12 @@
+
+
+
+ /etc/dotnet-packaging/LICENSE
+