From 4142d8b256a5b8407643bdb72a53038e0ff69a60 Mon Sep 17 00:00:00 2001 From: Ankit Jain Date: Fri, 16 Jul 2010 14:27:14 +0000 Subject: [PATCH] * AbsoluteToRelativePath: New. * RelativeToAbsolutePath: New. Taken from monodevelop. * GetReservedMetadata: Correctly handle 'RelativeDir' . svn path=/trunk/mcs/; revision=160483 --- .../Mono.XBuild.Utilities/ChangeLog | 6 +++ .../ReservedNameUtils.cs | 47 ++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/mcs/class/Microsoft.Build.Utilities/Mono.XBuild.Utilities/ChangeLog b/mcs/class/Microsoft.Build.Utilities/Mono.XBuild.Utilities/ChangeLog index ea036dc93cf..eb6e69141a8 100644 --- a/mcs/class/Microsoft.Build.Utilities/Mono.XBuild.Utilities/ChangeLog +++ b/mcs/class/Microsoft.Build.Utilities/Mono.XBuild.Utilities/ChangeLog @@ -1,3 +1,9 @@ +2010-07-16 Ankit Jain + + * AbsoluteToRelativePath: New. + * RelativeToAbsolutePath: New. Taken from monodevelop. + * GetReservedMetadata: Correctly handle 'RelativeDir' . + 2010-02-19 Ankit Jain * ReservedNameUtils.cs (GetReservedMetadata): Add dictionary param diff --git a/mcs/class/Microsoft.Build.Utilities/Mono.XBuild.Utilities/ReservedNameUtils.cs b/mcs/class/Microsoft.Build.Utilities/Mono.XBuild.Utilities/ReservedNameUtils.cs index e8379f00be0..9ce022af7c7 100644 --- a/mcs/class/Microsoft.Build.Utilities/Mono.XBuild.Utilities/ReservedNameUtils.cs +++ b/mcs/class/Microsoft.Build.Utilities/Mono.XBuild.Utilities/ReservedNameUtils.cs @@ -31,6 +31,7 @@ using System; using System.Collections; using System.Collections.Specialized; using System.IO; +using System.Text; namespace Mono.XBuild.Utilities { @@ -89,7 +90,7 @@ namespace Mono.XBuild.Utilities { case "extension": return Path.GetExtension (itemSpec); case "relativedir": - return WithTrailingSlash (Path.GetDirectoryName (itemSpec)); + return WithTrailingSlash (AbsoluteToRelativePath (Environment.CurrentDirectory, Path.GetDirectoryName (itemSpec))); case "directory": string fullpath = Path.GetFullPath (itemSpec); return WithTrailingSlash ( @@ -129,11 +130,55 @@ namespace Mono.XBuild.Utilities { static string WithTrailingSlash (string path) { + if (String.IsNullOrEmpty (path)) + return String.Empty; + if (path.Length > 0) return path + Path.DirectorySeparatorChar; else return path; } + + readonly static char[] separators = { Path.DirectorySeparatorChar, Path.VolumeSeparatorChar, Path.AltDirectorySeparatorChar }; + static string AbsoluteToRelativePath (string baseDirectoryPath, string absPath) + { + if (!Path.IsPathRooted (absPath)) + return absPath; + + absPath = Path.GetFullPath (absPath); + baseDirectoryPath = Path.GetFullPath (baseDirectoryPath.TrimEnd (Path.DirectorySeparatorChar)); + + string[] bPath = baseDirectoryPath.Split (separators); + string[] aPath = absPath.Split (separators); + int indx = 0; + + for (; indx < System.Math.Min (bPath.Length, aPath.Length); indx++) { + if (!bPath[indx].Equals(aPath[indx])) + break; + } + + if (indx == 0) + return absPath; + + StringBuilder result = new StringBuilder (); + + for (int i = indx; i < bPath.Length; i++) { + result.Append (".."); + if (i + 1 < bPath.Length || aPath.Length - indx > 0) + result.Append (Path.DirectorySeparatorChar); + } + + + result.Append (String.Join(Path.DirectorySeparatorChar.ToString(), aPath, indx, aPath.Length - indx)); + if (result.Length == 0) + return "."; + return result.ToString (); + } + + static string RelativeToAbsolutePath (string baseDirectoryPath, string relPath) + { + return Path.GetFullPath (Path.Combine (baseDirectoryPath, relPath)); + } } } -- 2.25.1