public override bool Execute()
        {
            StringBuilder builder = new StringBuilder();

            // we always generate global configs
            builder.AppendLine("is_global = true");

            // collect the properties into a global section
            foreach (var prop in PropertyItems)
            {
                builder
                .Append("build_property.")
                .Append(prop.ItemSpec)
                .Append(" = ")
                .AppendLine(prop.GetMetadata("Value"));
            }

            // group the metadata items by their full path
            var groupedItems = MetadataItems.GroupBy(
                i => NormalizeWithForwardSlash(i.GetMetadata("FullPath"))
                );

            foreach (var group in groupedItems)
            {
                // write the section for this item
                builder.AppendLine().Append("[");
                EncodeString(builder, group.Key);
                builder.AppendLine("]");

                foreach (var item in group)
                {
                    string itemType     = item.GetMetadata("ItemType");
                    string metadataName = item.GetMetadata("MetadataName");
                    if (
                        !string.IsNullOrWhiteSpace(itemType) &&
                        !string.IsNullOrWhiteSpace(metadataName)
                        )
                    {
                        builder
                        .Append("build_metadata.")
                        .Append(itemType)
                        .Append(".")
                        .Append(metadataName)
                        .Append(" = ")
                        .AppendLine(item.GetMetadata(metadataName));
                    }
                }
            }

            ConfigFileContents = builder.ToString();
            return(true);
        }