diff options
author | Therzok <teromario@yahoo.com> | 2013-09-13 19:29:47 +0400 |
---|---|---|
committer | Lluis Sanchez <lluis@xamarin.com> | 2013-09-18 16:10:28 +0400 |
commit | b91ad1d6b7a246992d97fbb92294598bbc544193 (patch) | |
tree | b0082bf7b0c6150854f6fa10c9a4a218799650fb /main | |
parent | 69ae942d7fb0fc60d322cdceb826b2f714901840 (diff) |
[Svn] Fix Subversion 1.8 crashing whenever you open a solution.
Diffstat (limited to 'main')
4 files changed, 49 insertions, 48 deletions
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/LibSvnClient.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/LibSvnClient.cs index 28ff02b3cb..84519146c1 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/LibSvnClient.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/LibSvnClient.cs @@ -146,6 +146,8 @@ namespace MonoDevelop.VersionControl.Subversion.Unix { public abstract IntPtr client_get_wc_root (out IntPtr wcroot_abspath, string local_abspath, IntPtr ctx, IntPtr result_pool, IntPtr scratch_pool); + public abstract IntPtr repos_find_root_path (string path, IntPtr pool); + // TODO: Check if intptr public abstract IntPtr strerror (int statcode, byte[] buf, int bufsize); diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/LibSvnClient0.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/LibSvnClient0.cs index 5b25e1cb12..7775bdf7f9 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/LibSvnClient0.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/LibSvnClient0.cs @@ -302,7 +302,12 @@ namespace MonoDevelop.VersionControl.Subversion.Unix { { return svn_client_get_wc_root (out wcroot_abspath, local_abspath, ctx, result_pool, scratch_pool); } - + + public override IntPtr repos_find_root_path (string path, IntPtr pool) + { + return svn_repos_find_root_path (path, pool); + } + public override IntPtr strerror (int statcode, byte[] buf, int bufsize) { return svn_strerror (statcode, buf, bufsize); @@ -450,6 +455,8 @@ namespace MonoDevelop.VersionControl.Subversion.Unix { [DllImport(svnclientlib)] static extern IntPtr svn_client_get_wc_root (out IntPtr wcroot_abspath, string local_abspath, IntPtr ctx, IntPtr result_pool, IntPtr scratch_pool); + [DllImport(svnclientlib)] static extern IntPtr svn_repos_find_root_path (string path, IntPtr pool); + [DllImport(svnclientlib)] static extern IntPtr svn_strerror (int statcode, byte[] buf, int bufsize); [DllImport(svnclientlib)] static extern IntPtr svn_path_internal_style (string path, IntPtr pool); diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/LibSvnClient1.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/LibSvnClient1.cs index 2a35df1fea..1f51aab8b0 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/LibSvnClient1.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/LibSvnClient1.cs @@ -303,7 +303,12 @@ namespace MonoDevelop.VersionControl.Subversion.Unix { { return svn_client_get_wc_root (out wcroot_abspath, local_abspath, ctx, result_pool, scratch_pool); } - + + public override IntPtr repos_find_root_path (string path, IntPtr pool) + { + return svn_repos_find_root_path (path, pool); + } + public override IntPtr strerror (int statcode, byte[] buf, int bufsize) { return svn_strerror (statcode, buf, bufsize); @@ -451,6 +456,8 @@ namespace MonoDevelop.VersionControl.Subversion.Unix { [DllImport(svnclientlib)] static extern IntPtr svn_client_get_wc_root (out IntPtr wcroot_abspath, string local_abspath, IntPtr ctx, IntPtr result_pool, IntPtr scratch_pool); + [DllImport(svnclientlib)] static extern IntPtr svn_repos_find_root_path (string path, IntPtr pool); + [DllImport(svnclientlib)] static extern IntPtr svn_strerror (int statcode, byte[] buf, int bufsize); [DllImport(svnclientlib)] static extern IntPtr svn_path_internal_style (string path, IntPtr pool); diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs index 51aef5eefa..80dfc2b7af 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Subversion.Unix/MonoDevelop.VersionControl.Subversion.Unix/SvnClient.cs @@ -18,8 +18,9 @@ namespace MonoDevelop.VersionControl.Subversion.Unix public class SvnClient : SubversionVersionControl { internal static LibApr apr; - static Lazy<bool> isInstalled; + static readonly Lazy<bool> isInstalled; internal static LibSvnClient svn; + static readonly Lazy<bool> pre_1_7; internal static void CheckError (IntPtr error) { @@ -98,7 +99,19 @@ namespace MonoDevelop.VersionControl.Subversion.Unix } return true; } - + + internal static bool CheckVersion () + { + return GetVersion ().StartsWith ("1.6", StringComparison.Ordinal); + } + + public static string GetVersion () + { + IntPtr ptr = svn.client_version (); + LibSvnClient.svn_version_t ver = (LibSvnClient.svn_version_t)Marshal.PtrToStructure (ptr, typeof(LibSvnClient.svn_version_t)); + return ver.major + "." + ver.minor + "." + ver.patch; + } + static int GetLoadAprLib (int oldVersion) { // Get the version of the loaded libapr @@ -123,9 +136,14 @@ namespace MonoDevelop.VersionControl.Subversion.Unix get { return isInstalled.Value; } } + public static bool Pre_1_7 { + get { return pre_1_7.Value; } + } + static SvnClient () { isInstalled = new Lazy<bool> (CheckInstalled); + pre_1_7 = new Lazy<bool> (CheckVersion); } public override SubversionBackend CreateBackend () @@ -155,12 +173,16 @@ namespace MonoDevelop.VersionControl.Subversion.Unix public override string GetDirectoryDotSvn (FilePath path) { - UnixSvnBackend backend = CreateBackend () as UnixSvnBackend; - bool pre_1_7; - string new_path = backend.GetDirectoryDotSvnInternal (path, out pre_1_7); - if (pre_1_7) + if (Pre_1_7) return base.GetDirectoryDotSvn (path); - return new_path; + + IntPtr localpool = newpool (IntPtr.Zero); + try { + IntPtr res = svn.repos_find_root_path (path, localpool); + return Marshal.PtrToStringAnsi (res); + } finally { + apr.pool_destroy (localpool); + } } } @@ -193,7 +215,6 @@ namespace MonoDevelop.VersionControl.Subversion.Unix return SvnClient.newpool (parent); } - bool pre_1_7; bool disposed = false; IntPtr auth_baton; IntPtr pool; @@ -228,7 +249,6 @@ namespace MonoDevelop.VersionControl.Subversion.Unix public UnixSvnBackend () { - pre_1_7 = GetVersion ().StartsWith ("1.6", StringComparison.Ordinal); // Allocate the APR pool and the SVN client context. pool = newpool (IntPtr.Zero); @@ -266,7 +286,7 @@ namespace MonoDevelop.VersionControl.Subversion.Unix (int) Marshal.OffsetOf (typeof (LibSvnClient.svn_client_ctx_t), "config"), config_hash); - if (!pre_1_7) { + if (!SvnClient.Pre_1_7) { IntPtr scratch = newpool (IntPtr.Zero); svn.wc_context_create (out wc_ctx, config_hash, pool, scratch); Marshal.WriteIntPtr (ctx, @@ -455,9 +475,7 @@ namespace MonoDevelop.VersionControl.Subversion.Unix public override string GetVersion () { - IntPtr ptr = svn.client_version (); - LibSvnClient.svn_version_t ver = (LibSvnClient.svn_version_t) Marshal.PtrToStructure (ptr, typeof (LibSvnClient.svn_version_t)); - return ver.major + "." + ver.minor + "." + ver.patch; + return SvnClient.GetVersion (); } public override IEnumerable<DirectoryEntry> List (FilePath path, bool recurse, SvnRevision rev) @@ -1430,39 +1448,6 @@ namespace MonoDevelop.VersionControl.Subversion.Unix lockFileList.Add (file); } - internal string GetDirectoryDotSvnInternal (FilePath path, out bool pre_1_7) - { - pre_1_7 = this.pre_1_7; - if (pre_1_7) - return ""; - - IntPtr result; - IntPtr scratch = newpool (pool); - var localpool = TryStartOperation (null); - try { - string new_path = NormalizePath (path.FullPath, localpool); - try { - CheckError (svn.client_get_wc_root (out result, new_path, ctx, localpool, scratch)); - } catch (SubversionException e) { - // We are not in a working copy. - switch (e.ErrorCode) { - // SVN_ERR_WC_NOT_DIRECTORY - case 155007: - // SVN_ERR_WC_NOT_FILE - case 155008: - return ""; - } - - throw; - } - return Marshal.PtrToStringAnsi (result); - } finally { - apr.pool_destroy (localpool); - apr.pool_destroy (scratch); - TryEndOperation (); - } - } - public class StatusCollector { ArrayList statuses; |