diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/ShortFileName.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/ShortFileName.cs
index 03ae846cf3..2a8e07835b 100644
--- a/src/AddIns/BackendBindings/WixBinding/Project/Src/ShortFileName.cs
+++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/ShortFileName.cs
@@ -140,6 +140,23 @@ namespace ICSharpCode.WixBinding
return truncatedName;
}
+ ///
+ /// Determines whether the specified filename is a long name
+ /// and should be converted into a short name.
+ ///
+ public static bool IsLongFileName(string fileName)
+ {
+ if (fileName == null) {
+ return false;
+ }
+
+ string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName);
+ string extension = Path.GetExtension(fileName);
+
+ return fileNameWithoutExtension.Length > MaximumFileNameWithoutExtensionLength ||
+ extension.Length > MaximumFileNameExtensionLength;
+ }
+
///
/// Truncates the filename start and adds "_N" where N produces a filename that
/// does not exist.
diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/WixComponentElement.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/WixComponentElement.cs
index c1765a614b..f7c79e1f21 100644
--- a/src/AddIns/BackendBindings/WixBinding/Project/Src/WixComponentElement.cs
+++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/WixComponentElement.cs
@@ -95,6 +95,7 @@ namespace ICSharpCode.WixBinding
// Add the parent folder to the id.
string parentDirectory = WixDirectoryElement.GetLastDirectoryName(Path.GetDirectoryName(fileName));
parentDirectory = FirstCharacterToUpperInvariant(parentDirectory);
+ parentDirectory = WixFileElement.GenerateId(parentDirectory);
id = String.Concat(parentDirectory, id);
if (!document.ComponentIdExists(id)) {
return id;
diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/WixFileElement.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/WixFileElement.cs
index 16b0434f42..87a27f7080 100644
--- a/src/AddIns/BackendBindings/WixBinding/Project/Src/WixFileElement.cs
+++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/WixFileElement.cs
@@ -184,7 +184,7 @@ namespace ICSharpCode.WixBinding
string longFileName = null;
string shortFileName = Path.GetFileName(sourceFileName);
string idFileName = shortFileName;
- if (shortFileName.Length > ShortFileName.MaximumFileNameLength) {
+ if (ShortFileName.IsLongFileName(shortFileName)) {
longFileName = shortFileName;
shortFileName = ShortFileName.Convert(shortFileName, ShortFileNameExists);
idFileName = longFileName;
@@ -217,7 +217,7 @@ namespace ICSharpCode.WixBinding
// Add the file's parent directory to the id.
string parentDirectoryName = WixDirectoryElement.GetLastDirectoryName(parentDirectory);
if (parentDirectoryName.Length > 0) {
- id = String.Concat(parentDirectoryName, ".", id);
+ id = String.Concat(WixFileElement.GenerateId(parentDirectoryName), ".", id);
if (!document.FileIdExists(id)) {
return id;
}
diff --git a/src/AddIns/BackendBindings/WixBinding/Test/DirectoryImport/DuplicateComponentIdTestFixture.cs b/src/AddIns/BackendBindings/WixBinding/Test/DirectoryImport/DuplicateComponentIdTestFixture.cs
index 39a935af52..cf49ea0727 100644
--- a/src/AddIns/BackendBindings/WixBinding/Test/DirectoryImport/DuplicateComponentIdTestFixture.cs
+++ b/src/AddIns/BackendBindings/WixBinding/Test/DirectoryImport/DuplicateComponentIdTestFixture.cs
@@ -31,17 +31,19 @@ namespace WixBinding.Tests.DirectoryImport
WixComponentElement readmeComponentElement;
WixComponentElement licenseComponentElement;
WixComponentElement exeComponentElement;
+ WixNamespaceManager nsManager;
string directory = @"C:\Projects\Test\MyApp";
+ string directory2 = @"C:\Projects\Test\a-app";
string[] files = new string[] {"MyApp.exe", "readme.txt", "license.txt"};
- [TestFixtureSetUp]
- public void SetUpFixture()
+ [SetUp]
+ public void Init()
{
base.InitFixture();
editor.AddDirectory(directory);
- WixNamespaceManager nsManager = new WixNamespaceManager(editor.Document.NameTable);
- appDirectoryElement = (WixDirectoryElement)editor.Document.RootDirectory.SelectSingleNode("w:Directory[@Name='MyApp']", nsManager);;
+ nsManager = new WixNamespaceManager(editor.Document.NameTable);
+ appDirectoryElement = (WixDirectoryElement)editor.Document.RootDirectory.SelectSingleNode("w:Directory[@Name='MyApp']", nsManager);
readmeComponentElement = (WixComponentElement)appDirectoryElement.SelectSingleNode("w:Component[w:File/@Name='readme.txt']", nsManager);
licenseComponentElement = (WixComponentElement)appDirectoryElement.SelectSingleNode("w:Component[w:File/@Name='license.txt']", nsManager);
exeComponentElement = (WixComponentElement)appDirectoryElement.SelectSingleNode("w:Component[w:File/@Name='MyApp.exe']", nsManager);
@@ -68,10 +70,24 @@ namespace WixBinding.Tests.DirectoryImport
Assert.AreEqual("MyAppMyAppExe2", exeComponentElement.Id);
}
+ [Test]
+ public void AddDirectoryWithHyphen()
+ {
+ view.SelectedElement = null;
+ editor.AddDirectory(directory2);
+
+ WixDirectoryElement directoryElement = (WixDirectoryElement)editor.Document.RootDirectory.SelectSingleNode("w:Directory[@Name='a-app']", nsManager);
+ WixComponentElement exeComponentElement = (WixComponentElement)directoryElement.SelectSingleNode("w:Component[w:File/@Name='MyApp.exe']", nsManager);
+
+ Assert.AreEqual("A_appMyAppExe", exeComponentElement.Id);
+ }
+
public override string[] GetFiles(string path)
{
if (path == directory) {
return files;
+ } else if (path == directory2) {
+ return files;
}
return new string[0];
}
diff --git a/src/AddIns/BackendBindings/WixBinding/Test/Document/ExistingFileIdGenerationTests.cs b/src/AddIns/BackendBindings/WixBinding/Test/Document/ExistingFileIdGenerationTests.cs
index 8089b96b1a..35b63f7800 100644
--- a/src/AddIns/BackendBindings/WixBinding/Test/Document/ExistingFileIdGenerationTests.cs
+++ b/src/AddIns/BackendBindings/WixBinding/Test/Document/ExistingFileIdGenerationTests.cs
@@ -84,6 +84,14 @@ namespace WixBinding.Tests.Document
Assert.IsFalse(doc.FileIdExists("lice'nse.txt"));
}
+ [Test]
+ public void FileIdAlreadyExistsAndParentDirectoryUsingHyphen()
+ {
+ WixFileElement fileElement = new WixFileElement(doc, @"C:/Projects/Setup/a-docs/readme.rtf");
+ Assert.AreEqual("a_docs.readme.rtf", fileElement.Id);
+ }
+
+
string GetWixXml()
{
return "\r\n" +
@@ -104,6 +112,7 @@ namespace WixBinding.Tests.Document
"\t\t\t\t\t\t\t\r\n" +
"\t\t\t\t\t\t\t\r\n" +
"\t\t\t\t\t\t\t\r\n" +
+ "\t\t\t\t\t\t\t\r\n" +
"\t\t\t\t\t\t\r\n" +
"\t\t\t\t\t\r\n" +
"\t\t\t\r\n" +
diff --git a/src/AddIns/BackendBindings/WixBinding/Test/Document/ExistingShortFileNameTests.cs b/src/AddIns/BackendBindings/WixBinding/Test/Document/ExistingShortFileNameTests.cs
index 3248fce911..9f33c37c54 100644
--- a/src/AddIns/BackendBindings/WixBinding/Test/Document/ExistingShortFileNameTests.cs
+++ b/src/AddIns/BackendBindings/WixBinding/Test/Document/ExistingShortFileNameTests.cs
@@ -50,6 +50,30 @@ namespace WixBinding.Tests.Document
WixFileElement fileElement = (WixFileElement)myAppComponent.LastChild;
Assert.AreEqual("CHANGE_1.XML", fileElement.ShortName);
}
+
+ ///
+ /// Tests that the short name generated is correct when
+ /// the file extension has only two characters.
+ ///
+ [Test]
+ public void TwoCharacterExtension()
+ {
+ myAppComponent.AddFile(@"C:\Projects\Setup\doc\ebcdic-it.so");
+ WixFileElement fileElement = (WixFileElement)myAppComponent.LastChild;
+ Assert.AreEqual("EBCDIC_1.SO", fileElement.ShortName);
+ }
+
+ ///
+ /// Tests that the short name generated is correct when
+ /// the file extension has more than three characters.
+ ///
+ [Test]
+ public void FourCharacterExtension()
+ {
+ myAppComponent.AddFile(@"C:\Projects\Setup\doc\abc.text");
+ WixFileElement fileElement = (WixFileElement)myAppComponent.LastChild;
+ Assert.AreEqual("ABC.TEX", fileElement.ShortName);
+ }
string GetWixXml()
{
diff --git a/src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/ShortFileNameGeneratorTests.cs b/src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/ShortFileNameGeneratorTests.cs
index 172d92d900..f32f02f376 100644
--- a/src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/ShortFileNameGeneratorTests.cs
+++ b/src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/ShortFileNameGeneratorTests.cs
@@ -97,6 +97,18 @@ namespace WixBinding.Tests.PackageFiles
string name = "boo.exe.config";
Assert.AreEqual("BOOEXE.CON", ShortFileName.Convert(name));
}
+
+ [Test]
+ public void NullFileNameIsNotTooLong()
+ {
+ Assert.IsFalse(ShortFileName.IsLongFileName(null));
+ }
+
+ [Test]
+ public void EmptyStringIsNotTooLong()
+ {
+ Assert.IsFalse(ShortFileName.IsLongFileName(String.Empty));
+ }
bool GetFileNameExists(string fileName)
{