Esempio n. 1
0
        /// <summary> Links the source code from the source <c> sourceProj </c> file to the destination <c> destProj </c> file.
        ///     <para> Tweaks relative file paths so the project can find them. </para>
        ///     Adds a <c> &lt;Link&gt; </c> for the destination project Solution Explorer. </summary>
        internal void LinkCode()
        {
            string oldXml = destProjXml.ReadLinkedXml();

            destProjXml.ClearOldLinkedCode();

            var totalCodezLinked = 0;

            if (!SourceProjList?.Any() ?? true)
            {
                Log.WriteLine("[Warning] No Source Projects found. done.", ConsoleColor.Cyan);
                return;
            }

            foreach (string sourcePath in SourceProjList)
            {
                var codezLinked = 0;

                try
                {
                    string sourceProjAbsolutePath = PathMaker.IsAbsolutePath(sourcePath)
                                                        ? sourcePath
                                                        : Path.Combine(DestProjDirectory, sourcePath);

                    string sourceProjDirectory = Path.GetDirectoryName(sourceProjAbsolutePath);

                    string destDirectoryForRelativePath = DestProjDirectory.EndsWith("\\", StringComparison.Ordinal)
                                                              ? DestProjDirectory
                                                              : DestProjDirectory + "\\";

                    string linkRelativeSource = PathMaker.MakeRelativePath(destDirectoryForRelativePath, sourceProjAbsolutePath);

                    var sourceProjParser = new SourceProjLoader(sourceProjAbsolutePath);

                    destProjXml.EndPlaceHolder.AddBeforeSelf(new XComment("Linked from " + linkRelativeSource));
                    Log.WriteLine("Recycling from: " + sourceProjAbsolutePath + Environment.NewLine +
                                  "            to: " + DestProjAbsolutePath + Environment.NewLine, ConsoleColor.Cyan);

                    List <string> alreadyIncluded = (from sourceItemsGroup in destProjXml.ItemGroups
                                                     from sourceItems in sourceItemsGroup.Elements()
                                                     where !Settings.ItemElementsToSkip?.Contains(sourceItems.Name.LocalName.ToLower()) ?? false
                                                     select sourceItems.Attribute("Include") ?? sourceItems.Attribute("Exclude")
                                                     into attribute
                                                     where attribute != null
                                                     select attribute.Value.ToLower()).ToList();


                    foreach (XElement sourceItemGroup in sourceProjParser.ItemGroups)
                    {
                        var newLinkedItemGroup = new XElement(Settings.MSBuild + "ItemGroup");

                        foreach (XElement sourceItem in sourceItemGroup.Elements())
                        {
                            string sourceElementName = sourceItem.Name.LocalName;

                            if (Settings.ItemElementsToSkip.Contains(sourceElementName.ToLower()))
                            {
                                continue;
                            }

                            XAttribute attrib = sourceItem.Attribute("Include") ?? sourceItem.Attribute("Exclude");

                            if (attrib == null)
                            {
                                continue; // these are not the droids
                            }
                            string originalSourcePath        = attrib.Value;
                            string trimmedOriginalSourcePath = originalSourcePath.Trim();

                            if (alreadyIncluded.Contains(trimmedOriginalSourcePath, StringComparer.OrdinalIgnoreCase))
                            {
                                Log.WriteLine("Skipped: " + originalSourcePath + Environment.NewLine +
                                              "    from: " + sourceProjAbsolutePath + Environment.NewLine +
                                              "because there is a file with the same path in the destination project." + Environment.NewLine, ConsoleColor.Gray);
                                continue;
                            }

                            List <string> include = InclusionsList.Where(i => Operators.LikeString(trimmedOriginalSourcePath, i, CompareMethod.Text)).ToList();
                            //                                                               OW my eyes!

                            string        sourceFileName = Path.GetFileName(trimmedOriginalSourcePath); // wildcards blow up Path.GetFullPath()
                            string        originalFolder = Path.GetDirectoryName(originalSourcePath);
                            List <string> exclusions     = ExclusionsList.Where(x => x != null &&
                                                                                (x.Contains(sourceFileName?.ToLower()) ||
                                                                                 x.Contains(originalSourcePath?.ToLower()) ||
                                                                                 x.Contains(sourceFileName) ||
                                                                                 x.Contains(originalSourcePath))).ToList();
                            if (exclusions.Any())
                            {
                                Log.WriteLine("Excluded: " + originalSourcePath + Environment.NewLine +
                                              "    from: " + sourceProjAbsolutePath + Environment.NewLine +
                                              "because you said to Exclude: " + exclusions.FirstOrDefault(), ConsoleColor.DarkYellow);
                                continue;
                            }

                            if (!InclusionsList.Any() || include.Any()) // empty inclusions list means include everything unless explicity excluded
                            {
                                if (!PathMaker.IsAbsolutePath(originalSourcePath))
                                {
                                    string sourcePathFromDestination = "";

                                    try
                                    {
                                        string sourceAbsolutePath = Path.GetFullPath(sourceProjDirectory + "\\" + originalFolder) + "\\" + sourceFileName;


                                        sourcePathFromDestination = PathMaker.MakeRelativePath(DestProjDirectory.Trim('\\') + "\\", sourceAbsolutePath);

                                        /*
                                         * Log.WriteLine($"dest proj directory ....   {DestProjDirectory}");
                                         * Log.WriteLine($"original source path....   {originalSourcePath}");
                                         * Log.WriteLine($"original folder ........   {originalFolder}");
                                         * Log.WriteLine($"source  proj directory..   {sourceProjDirectory}");
                                         * Log.WriteLine($"sourceFileName .........   {sourceFileName}");
                                         * Log.WriteLine($"sourceAbsolutePath .....   {sourceAbsolutePath}");
                                         * Log.WriteLine($"source path ........       {sourcePathFromDestination}");
                                         */
                                    }

                                    catch (ArgumentException badArg)
                                    {
                                        // Log.WriteException(badArg);
                                        if (badArg.Message.Contains("Illegal characters in path"))
                                        {
                                            if (Regex.IsMatch(originalSourcePath, @"^[a-zA-Z]:\\")) // is already an absolute path
                                            {
                                                sourcePathFromDestination = originalSourcePath;
                                            }

                                            else if (Regex.IsMatch(originalSourcePath, @"\*\*")) // it is **\*.* or something  awkward like that.
                                            {
                                                string relativeFolderPathFromDestination = PathMaker.MakeRelativePath(DestProjDirectory + "\\", sourceProjDirectory);
                                                sourcePathFromDestination = relativeFolderPathFromDestination + "\\" + originalSourcePath;
                                                var linkElement = new XElement(Settings.MSBuild + "Link", @"%(RecursiveDir)%(Filename)%(Extension)");
                                                sourceItem.Add(linkElement);
                                            } // wtf: I bet that's a bug
                                            else
                                            {
                                                try
                                                {
                                                    string originalFolderrr = originalSourcePath.Substring(0, originalSourcePath.LastIndexOf("\\", StringComparison.Ordinal));
                                                    string relativeFolderPathFromDestination = PathMaker.MakeRelativePath(DestProjDirectory + "\\", originalFolderrr);
                                                    sourcePathFromDestination = relativeFolderPathFromDestination + originalSourcePath.Substring(originalSourcePath.LastIndexOf("\\", StringComparison.Ordinal));
                                                }
                                                catch (Exception e)
                                                {
                                                    App.Crash(e, "FAILed Recycling. GetFullPath: " + sourceProjDirectory + "\\" + originalSourcePath);
                                                }
                                            }
                                        }
                                        else
                                        {
                                            try
                                            {
                                                string originalFolderr = originalSourcePath.Substring(0, originalSourcePath.LastIndexOf("\\"));
                                                string relativeFolderPathFromDestination = PathMaker.MakeRelativePath(DestProjDirectory + "\\", originalFolderr);
                                                sourcePathFromDestination = relativeFolderPathFromDestination + originalSourcePath.Substring(originalSourcePath.LastIndexOf("\\"));
                                            }
                                            catch (Exception e)
                                            {
                                                App.Crash(e, "FAILed Recycling. GetFullPath: " + sourceProjDirectory + "\\" + originalSourcePath);
                                            }
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        App.Crash(e, "FAILed Recycling. GetFullPath: " + sourceProjDirectory + "\\" + originalSourcePath);
                                    }

                                    if (!Settings.ItemElementsDoNotMakeRelativePath.Contains(sourceElementName.ToLower()))
                                    {
                                        attrib.Value = sourcePathFromDestination;
                                    }
                                }

                                XElement[] links = sourceItem.Descendants(Settings.MSBuild + "Link").ToArray();

                                // Folders, mostly
                                if (!(links.Any() || Settings.ItemElementsDoNotBreakLink.Contains(sourceElementName.ToLower())))
                                {
                                    var linkElement = new XElement(Settings.MSBuild + "Link", originalSourcePath);
                                    sourceItem.Add(linkElement);
                                    Log.WriteLine($"linking {originalSourcePath}", ConsoleColor.DarkGreen, ConsoleColor.Black);
                                }

                                newLinkedItemGroup.Add(sourceItem);
                                codezLinked++;
                                alreadyIncluded.Add(originalSourcePath);
                            }
                            else
                            {
                                Log.WriteLine("Excluded: " + originalSourcePath + Environment.NewLine +
                                              "    from: " + sourceProjAbsolutePath + Environment.NewLine +
                                              "because it did not match anything on the Include: list " + Environment.NewLine, ConsoleColor.Gray, ConsoleColor.DarkRed);
                            }
                        }

                        if (newLinkedItemGroup.HasElements)
                        {
                            destProjXml.EndPlaceHolder.AddBeforeSelf(newLinkedItemGroup);
                        }
                    }

                    destProjXml.EndPlaceHolder.AddBeforeSelf(new XComment("End Link from " + linkRelativeSource + Environment.NewLine +
                                                                          "Linked " + codezLinked + " codez."));
                    totalCodezLinked += codezLinked;
                    // so we don't link things twice...
                    destProjXml.Keepers.RemoveAll(k => k.Attribute("Include").Value.Contains(sourceProjDirectory));

                    // copy Source project Resources so *.resx files don't break. Warning: Last one wins so weird race condition lives here
                    string sourceResources = sourceProjDirectory + "\\Resources";

                    if (Directory.Exists(sourceResources))
                    {
                        string destResourcesPath = DestProjDirectory + "\\Resources";
                        Log.WriteLine($"Copying all Resource Files from {sourceResources} to {destResourcesPath}.", ConsoleColor.Green);

                        if (!Directory.Exists(destResourcesPath))
                        {
                            Directory.CreateDirectory(destResourcesPath);
                        }

                        foreach (string sourceFile in Directory.GetFiles(sourceResources))
                        {
                            string excluded = ExclusionsList.FirstOrDefault(e => e == sourceFile.ToLower() || e == sourceFile);

                            if (excluded != null)
                            {
                                Log.WriteLine($"Excluded:          {sourceFile}{Environment.NewLine}" +
                                              $"from: Resources in Destination Project{Environment.NewLine}"
                                              + $"because you said to Exclude:{excluded} ", ConsoleColor.White, ConsoleColor.DarkRed);
                            }

                            string destFile = destResourcesPath + "\\" + Path.GetFileName(sourceFile);
                            if (File.Exists(destFile))
                            {
                                long sourceSize = new FileInfo(sourceFile).Length;
                                long destSize   = new FileInfo(destFile).Length;
                                if (sourceSize != destSize) // ie. it is probably a different file.
                                {
                                    Log.WriteLine($"[Warning] Overwriting {destFile}", ConsoleColor.Red);
                                    Log.WriteLine($"Source: {sourceSize} bytes, Dest: {destSize} Bytes.", ConsoleColor.Yellow);
                                }
                            }

                            File.Copy(sourceFile, Path.Combine(destResourcesPath, Path.GetFileName(sourceFile)), true);
                            Log.WriteLine($"Copied {sourceFile}", ConsoleColor.Green);
                        }

                        Log.WriteLine($"Copied all Files from {sourceResources} to {destResourcesPath}." + Environment.NewLine, ConsoleColor.Green);
                    }
                }
                catch (Exception e)
                {
                    App.Crash(e, "Recycling " + sourcePath + " to " + DestProjAbsolutePath);
                }
            } // end foreach source project


            destProjXml.EndPlaceHolder.AddBeforeSelf(new XComment("End of Linked Code" /*+ DateTime.Now.ToString("U") */ + Environment.NewLine +
                                                                  "See CodeLinkerLog.txt for details. CodeLinker by " + Settings.SourceCodeUrl));

            bool hasChanged = oldXml != destProjXml.ReadLinkedXml();

            destProjXml.PreserveKeepersAndReport(ExclusionsList);

            if (hasChanged)
            {
                destProjXml.Save();
                Log.WriteLine("Linked " + totalCodezLinked + " codez from " + SourceProjList.Count + " source Project(s).", ConsoleColor.Green);
            }
            else
            {
                Log.WriteLine("No changes, didn't save.", ConsoleColor.Cyan, ConsoleColor.DarkBlue);
            }

            Log.WriteLine("-------------------------------------------------------", ConsoleColor.DarkGray);
            Log.WriteLine();
        }
        /// <summary> Links the source code from the source <c> sourceProj </c> file to the destination <c> destProj </c> file.
        ///     <para> Tweaks relative file paths so the project can find them. </para>
        ///     Adds a <c> &lt;Link&gt; </c> for the destination project Solution Explorer. </summary>
        internal void LinkCode()
        {
            string oldXml = destProjXml.ReadLinkedXml();

            destProjXml.ClearOldLinkedCode();

            var totalCodezLinked = 0;

            List <string> alreadyIncluded = (from sourceItemGroup in destProjXml.ItemGroups
                                             from sourceItem in sourceItemGroup.Elements()
                                             where !Settings.ItemElementsToSkip.Contains(sourceItem.Name.LocalName.ToLower())
                                             select sourceItem.Attribute("Include") ?? sourceItem.Attribute("Exclude")
                                             into attrib
                                             where attrib != null
                                             select attrib.Value.ToLower()).ToList();

            if (alreadyIncluded.Count > 1)
            {
                Log.WriteLine("These are already include so will not be linked...", ConsoleColor.White, ConsoleColor.DarkGray);
                Log.WriteLine(alreadyIncluded, ConsoleColor.Gray);
            }

            foreach (string sourcePath in SourceProjList)
            {
                var codezLinked = 0;

                try
                {
                    string sourceProjAbsolutePath = PathMaker.IsAbsolutePath(sourcePath)
                                                        ? sourcePath
                                                        : Path.Combine(DestProjDirectory, sourcePath);

                    string sourceProjDirectory = Path.GetDirectoryName(sourceProjAbsolutePath);

                    string destDirectoryForRelativePath = DestProjDirectory.EndsWith("\\")
                                                              ? DestProjDirectory
                                                              : DestProjDirectory + "\\";

                    string linkRelativeSource = PathMaker.MakeRelativePath(destDirectoryForRelativePath, sourceProjAbsolutePath);

                    var sourceProjParser = new SourceProjParser(sourceProjAbsolutePath);

                    destProjXml.EndPlaceHolder.AddBeforeSelf(new XComment("Linked from " + linkRelativeSource));
                    Log.WriteLine("Recycling from: " + sourceProjAbsolutePath + Environment.NewLine +
                                  "            to: " + DestProjAbsolutePath + Environment.NewLine, ConsoleColor.Cyan);


                    foreach (XElement sourceItemGroup in sourceProjParser.ItemGroups)
                    {
                        var newLinkedItemGroup = new XElement(Settings.MSBuild + "ItemGroup");

                        foreach (XElement sourceItem in sourceItemGroup.Elements())
                        {
                            string sourceElementName = sourceItem.Name.LocalName;

                            if (Settings.ItemElementsToSkip.Contains(sourceElementName.ToLower()))
                            {
                                continue;
                            }

                            XAttribute attrib = sourceItem.Attribute("Include") ?? sourceItem.Attribute("Exclude");

                            if (attrib != null)
                            {
                                string originalSourcePath        = attrib.Value;
                                string trimmedOriginalSourcePath = originalSourcePath.Trim().ToLower();



                                if (alreadyIncluded.IndexOf(trimmedOriginalSourcePath) > -1)
                                {
                                    Log.WriteLine("Skipped: " + originalSourcePath + Environment.NewLine +
                                                  "    from: " + sourceProjAbsolutePath + Environment.NewLine +
                                                  "because there is a file with the same path in the destination project." + Environment.NewLine, ConsoleColor.Gray);
                                    continue;
                                }

                                List <string> include =
                                    InclusionsList.Where(i => Operators.LikeString(trimmedOriginalSourcePath, i, CompareMethod.Text)).ToList();
                                // OW my eyes!

                                if (!InclusionsList.Any() || include.Any())
                                {
                                    if (!PathMaker.IsAbsolutePath(originalSourcePath))
                                    {
                                        var sourcePathFromDestination = "";
                                        try
                                        {
                                            string sourceFileName = Path.GetFileName(originalSourcePath); // wildcards blow up Path.GetFullPath()
                                            string originalFolder = originalSourcePath;

                                            List <string> excludedFiles =
                                                ExclusionsList.Where(x => x.Contains(sourceFileName.ToLower())).ToList();
                                            // ExclusionsList.Where(x => Operators.LikeString(trimmedOriginalSourcePath, x, CompareMethod.Text)).ToList();
                                            //  OW my eyes!

                                            var excludedPaths = ExclusionsList.Where(x => x.Contains(originalSourcePath.ToLower())).ToArray();
                                            if (excludedPaths?.Any() ?? false)
                                            {
                                                excludedFiles.AddRange(excludedPaths);
                                            }

                                            if (excludedFiles.Any())
                                            {
                                                Log.WriteLine("Excluded: " + originalSourcePath + Environment.NewLine +
                                                              "    from: " + sourceProjAbsolutePath + Environment.NewLine +
                                                              "because you said to Exclude: " + excludedFiles.FirstOrDefault(), ConsoleColor.White, ConsoleColor.DarkRed);
                                                continue;
                                            }

                                            if (!string.IsNullOrEmpty(sourceFileName))
                                            {
                                                originalFolder = originalSourcePath.Replace(sourceFileName, "");
                                            }

                                            string sourceAbsolutePath = Path.GetFullPath(sourceProjDirectory + "\\" + originalFolder) + sourceFileName;

                                            sourcePathFromDestination = PathMaker.MakeRelativePath(DestProjDirectory + "\\", sourceAbsolutePath);
                                        }

                                        catch (ArgumentException badArg)
                                        {
                                            if (badArg.Message.Contains("Illegal characters in path"))
                                            {
                                                if (Regex.IsMatch(originalSourcePath, @"^[a-zA-Z]:\\")) // is already an absolute path
                                                {
                                                    sourcePathFromDestination = originalSourcePath;
                                                }

                                                else if (Regex.IsMatch(originalSourcePath, @"\*\*")) // it is **\*.* or something  awkward like that.
                                                {
                                                    string relativeFolderPathFromDestination = PathMaker.MakeRelativePath(DestProjDirectory + "\\", sourceProjDirectory);
                                                    sourcePathFromDestination = relativeFolderPathFromDestination + "\\" + originalSourcePath;
                                                    var linkElement = new XElement(Settings.MSBuild + "Link", @"%(RecursiveDir)%(Filename)%(Extension)");
                                                    sourceItem.Add(linkElement);
                                                }
                                                else
                                                {
                                                    try
                                                    {
                                                        string originalFolder = originalSourcePath.Substring(0, originalSourcePath.LastIndexOf("\\"));
                                                        string relativeFolderPathFromDestination = PathMaker.MakeRelativePath(DestProjDirectory + "\\", originalFolder);
                                                        sourcePathFromDestination = relativeFolderPathFromDestination + originalSourcePath.Substring(originalSourcePath.LastIndexOf("\\"));
                                                    }
                                                    catch (Exception e)
                                                    {
                                                        App.Crash(e, "Recycling. GetFullPath: " + sourceProjDirectory + "\\" + originalSourcePath);
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                try
                                                {
                                                    string originalFolder = originalSourcePath.Substring(0, originalSourcePath.LastIndexOf("\\"));
                                                    string relativeFolderPathFromDestination = PathMaker.MakeRelativePath(DestProjDirectory + "\\", originalFolder);
                                                    sourcePathFromDestination = relativeFolderPathFromDestination + originalSourcePath.Substring(originalSourcePath.LastIndexOf("\\"));
                                                }
                                                catch (Exception e)
                                                {
                                                    App.Crash(e, "Recycling. GetFullPath: " + sourceProjDirectory + "\\" + originalSourcePath);
                                                }
                                            }
                                        }
                                        catch (Exception e)
                                        {
                                            App.Crash(e, "Recycling. GetFullPath: " + sourceProjDirectory + "\\" + originalSourcePath);
                                        }



                                        if (!Settings.ItemElementsDoNotMakeRelativePath.Contains(sourceElementName.ToLower()))
                                        {
                                            attrib.Value = sourcePathFromDestination;
                                        }
                                    }

                                    XElement[] links = sourceItem.Descendants(Settings.MSBuild + "Link").ToArray();

                                    // Folders, mostly
                                    if (!(links.Any() || Settings.ItemElementsDoNotBreakLink.Contains(sourceElementName.ToLower())))
                                    {
                                        var linkElement = new XElement(Settings.MSBuild + "Link", _linkPrefix + originalSourcePath);
                                        sourceItem.Add(linkElement);
                                    }

                                    foreach (XElement link in links)
                                    {
                                        link.Value = _linkPrefix + link.Value;
                                    }

                                    var dependentOn = sourceItem.Descendants(Settings.MSBuild + "DependentUpon").ToArray();

                                    /*foreach (XElement dependent in dependentOn)
                                     * {
                                     *  dependent.Value = _linkPrefix + dependent.Value;
                                     *  sourceItem.Add(dependent);
                                     * }*/

                                    newLinkedItemGroup.Add(sourceItem);
                                    codezLinked++;
                                    alreadyIncluded.Add(originalSourcePath);
                                }
                                else
                                {
                                    Log.WriteLine("Excluded: " + originalSourcePath + Environment.NewLine +
                                                  "    from: " + sourceProjAbsolutePath + Environment.NewLine +
                                                  "because it did not match anything on the Include: list " + Environment.NewLine, ConsoleColor.Gray, ConsoleColor.DarkRed);
                                }
                            }
                        }

                        if (newLinkedItemGroup.HasElements)
                        {
                            destProjXml.EndPlaceHolder.AddBeforeSelf(newLinkedItemGroup);
                        }
                    }
                    destProjXml.EndPlaceHolder.AddBeforeSelf(new XComment("End Link from " + linkRelativeSource + Environment.NewLine +
                                                                          "Linked " + codezLinked + " codez."));
                    totalCodezLinked += codezLinked;
                    // so we don't link things twice...
                    destProjXml.Keepers.RemoveAll(k => k.Attribute("Include").Value.Contains(sourceProjDirectory));

                    // copy Source project Resources so *.resx files don't break. Warning: Last one wins so weird race condition lives here
                    string sourceResources = sourceProjDirectory + "\\Resources";
                    if (Directory.Exists(sourceResources))
                    {
                        string destResourcesPath = DestProjDirectory + "\\Resources";
                        Log.WriteLine($"Copying all Files from {sourceResources} to {destResourcesPath}.", ConsoleColor.Green);

                        if (!Directory.Exists(destResourcesPath))
                        {
                            Directory.CreateDirectory(destResourcesPath);
                        }

                        foreach (string sourceFile in Directory.GetFiles(sourceResources))
                        {
                            string destFile = destResourcesPath + "\\" + Path.GetFileName(sourceFile);
                            if (File.Exists(destFile))
                            {
                                long sourceSize = new FileInfo(sourceFile).Length;
                                long destSize   = new FileInfo(destFile).Length;
                                if (sourceSize != destSize) // ie. it is probably a different file.
                                {
                                    Log.WriteLine($"WARNING: Overwriting {destFile}", ConsoleColor.Red);
                                    Log.WriteLine($"Source: {sourceSize} bytes, Dest: {destSize} Bytes.", ConsoleColor.Yellow);
                                }
                            }

                            File.Copy(sourceFile, Path.Combine(destResourcesPath, Path.GetFileName(sourceFile)), true);
                            Log.WriteLine($"Copied {sourceFile}", ConsoleColor.Green);
                        }

                        Log.WriteLine($"Copied all Files from {sourceResources} to {destResourcesPath}." + Environment.NewLine, ConsoleColor.Green);
                    }
                }
                catch (Exception e)
                {
                    App.Crash(e, "Recycling " + sourcePath + " to " + DestProjAbsolutePath);
                }
            } // end foreach source project


            destProjXml.EndPlaceHolder.AddBeforeSelf(new XComment("End of Linked Code" + Environment.NewLine +
                                                                  "See CodeLinkerLog.txt for details. CodeLinker by " + Settings.SourceCodeUrl +
                                                                  " "));

            if (oldXml != destProjXml.ReadLinkedXml())
            {
                destProjXml.Save();
                Log.WriteLine("Linked " + totalCodezLinked + " codez from " + SourceProjList.Count + " source Project(s).", ConsoleColor.Green);
            }
            else
            {
                Log.WriteLine("No changes, didn't save.", ConsoleColor.Cyan, ConsoleColor.DarkBlue);
            }

            Log.WriteLine("-------------------------------------------------------", ConsoleColor.DarkGray);
            Log.WriteLine();
        }
Esempio n. 3
0
        /// <summary> Links the source code from the source <c>sourceProj</c> file to the destination <c>destProj</c> file.
        ///           <para> Tweaks relative file paths so the project can find them. </para>
        ///           Adds a <c>&lt;Link&gt;</c> for the destination project Solution Explorer.</summary>
        internal void LinkCode()
        {
            string oldXml = destProjXml.ReadLinkedXml();

            destProjXml.ClearOldLinkedCode();

            int totalCodezLinked = 0;

            foreach (string sourcePath in SourceProjList)
            {
                int codezLinked = 0;

                try
                {
                    string sourceProjAbsolutePath = (PathMaker.IsAbsolutePath(sourcePath))
            ? sourcePath
            : Path.Combine(DestProjDirectory, sourcePath);

                    string sourceProjDirectory = Path.GetDirectoryName(sourceProjAbsolutePath);

                    string destDirectoryForRelativePath = DestProjDirectory.EndsWith("\\")
            ? DestProjDirectory
            : DestProjDirectory + "\\";

                    string linkRelativeSource = PathMaker.MakeRelativePath(destDirectoryForRelativePath, sourceProjAbsolutePath);

                    SourceProjParser sourceProjParser = new SourceProjParser(sourceProjAbsolutePath);

                    destProjXml.EndPlaceHolder.AddBeforeSelf(new XComment("Linked from " + linkRelativeSource));
                    Log.WriteLine("Recycling from: " + sourceProjAbsolutePath + Environment.NewLine +
                                  "            to: " + DestProjAbsolutePath + Environment.NewLine);


                    foreach (XElement sourceItemGroup in sourceProjParser.ItemGroups)
                    {
                        XElement newLinkedItemGroup = new XElement(Settings.MSBuild + "ItemGroup");

                        foreach (XElement sourceItem in sourceItemGroup.Elements())
                        {
                            string sourceElementName = sourceItem.Name.LocalName;

                            if (Settings.ItemElementsToSkip.Contains(sourceElementName.ToLower()))
                            {
                                continue;
                            }

                            XAttribute attrib = sourceItem.Attribute("Include") ?? sourceItem.Attribute("Exclude");

                            if (attrib != null)
                            {
                                string originalSourcePath        = attrib.Value;
                                string trimmedOriginalSourcePath = originalSourcePath.Trim().ToLower();

                                IEnumerable <string> exclude =
                                    ExclusionsList.Where(x => Operators.LikeString(trimmedOriginalSourcePath, x, CompareMethod.Text)).ToList(); // OW my eyes!

                                if (exclude.Any())
                                {
                                    Log.WriteLine("Excluded: " + originalSourcePath + Environment.NewLine +
                                                  "    from: " + sourceProjAbsolutePath + Environment.NewLine +
                                                  "because you said to Exclude: " + exclude.FirstOrDefault() + Environment.NewLine);
                                    continue;
                                }

                                List <string> include =
                                    InclusionsList.Where(i => Operators.LikeString(trimmedOriginalSourcePath, i, CompareMethod.Text)).ToList(); // OW my eyes!

                                if (!InclusionsList.Any() || include.Any())
                                {
                                    if (!PathMaker.IsAbsolutePath(originalSourcePath))
                                    {
                                        string sourceAbsolutePath = "";
                                        try
                                        {
                                            string sourceFileName = Path.GetFileName(originalSourcePath); // wildcards blow up Path.GetFullPath()
                                            string originalFolder = originalSourcePath;

                                            if (!string.IsNullOrEmpty(sourceFileName))
                                            {
                                                originalFolder = originalSourcePath.Replace(sourceFileName, "");
                                            }
                                            sourceAbsolutePath = Path.GetFullPath(sourceProjDirectory + "\\" + originalFolder) + sourceFileName;
                                        }
                                        catch (Exception e)
                                        {
                                            App.Crash(e, "Recycling. GetFullPath: " + sourceProjDirectory + "\\" + originalSourcePath);
                                        }

                                        string relativePathFromDestination = PathMaker.MakeRelativePath(DestProjDirectory + "\\", sourceAbsolutePath);

                                        if (!Settings.ItemElementsDoNotMakeRelativePath.Contains(sourceElementName.ToLower()))
                                        {
                                            attrib.Value = relativePathFromDestination;
                                        }
                                    }

                                    IEnumerable <XElement> links = sourceItem.Descendants(Settings.MSBuild + "Link");

                                    if (!(links.Any() || Settings.ItemElementsDoNotBreakLink.Contains(sourceElementName.ToLower()))) // Folders, mostly
                                    {
                                        XElement linkElement = new XElement(Settings.MSBuild + "Link", originalSourcePath);
                                        sourceItem.Add(linkElement);
                                    }
                                    newLinkedItemGroup.Add(sourceItem);
                                    codezLinked++;
                                }
                                else
                                {
                                    Log.WriteLine("Excluded: " + originalSourcePath + Environment.NewLine +
                                                  "    from: " + sourceProjAbsolutePath + Environment.NewLine +
                                                  "because it did not match anything on the Include: list " + Environment.NewLine);
                                }
                            }
                        }

                        if (newLinkedItemGroup.HasElements)
                        {
                            destProjXml.EndPlaceHolder.AddBeforeSelf(newLinkedItemGroup);
                        }
                    }
                    destProjXml.EndPlaceHolder.AddBeforeSelf(new XComment("End Link from " + linkRelativeSource + Environment.NewLine +
                                                                          "Linked " + codezLinked + " codez."));
                    totalCodezLinked += codezLinked;

                    destProjXml.Keepers.RemoveAll(k => k.Attribute("Include").Value.Contains(sourceProjDirectory));
                }
                catch (Exception e)
                {
                    App.Crash(e, "Recycling " + sourcePath + " to " + DestProjAbsolutePath);
                }
            }


            destProjXml.EndPlaceHolder.AddBeforeSelf(new XComment("End of Linked Code" + Environment.NewLine +
                                                                  "See CodeLinkerLog.txt for details. CodeLinker by " + Settings.SourceCodeUrl + " "));

            if (oldXml != destProjXml.ReadLinkedXml())
            {
                destProjXml.Save();
                Log.WriteLine("Linked " + totalCodezLinked + " codez from " + SourceProjList.Count + " source Project(s).");
            }
            else
            {
                Log.WriteLine("No changes, didn't save.");
            }

            Log.WriteLine("----------------------------");
            Log.WriteLine();
        }