* AbsoluteToRelativePath: New.
authorAnkit Jain <radical@corewars.org>
Fri, 16 Jul 2010 14:27:14 +0000 (14:27 -0000)
committerAnkit Jain <radical@corewars.org>
Fri, 16 Jul 2010 14:27:14 +0000 (14:27 -0000)
* RelativeToAbsolutePath: New. Taken from monodevelop.
* GetReservedMetadata: Correctly handle 'RelativeDir' .

svn path=/trunk/mcs/; revision=160483

mcs/class/Microsoft.Build.Utilities/Mono.XBuild.Utilities/ChangeLog
mcs/class/Microsoft.Build.Utilities/Mono.XBuild.Utilities/ReservedNameUtils.cs

index ea036dc93cf6e91f4915c248fb80bc2da73ac27a..eb6e69141a8142e0d539e62a9feab1284b7f58c3 100644 (file)
@@ -1,3 +1,9 @@
+2010-07-16  Ankit Jain  <jankit@novell.com>
+
+       * AbsoluteToRelativePath: New.
+       * RelativeToAbsolutePath: New. Taken from monodevelop.
+       * GetReservedMetadata: Correctly handle 'RelativeDir' .
+
 2010-02-19  Ankit Jain  <jankit@novell.com>
 
        * ReservedNameUtils.cs (GetReservedMetadata): Add dictionary param
index e8379f00be0c623d4c7c1bce5d4c4d985b3126c0..9ce022af7c791a35a72577ed608542d6df2d89a0 100644 (file)
@@ -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));
+               }
        }
 }