diff options
28 files changed, 444 insertions, 541 deletions
diff --git a/extras/MonoDevelop.MonoMac/MonoDevelop.MonoMac/MonoMac.dll b/extras/MonoDevelop.MonoMac/MonoDevelop.MonoMac/MonoMac.dll Binary files differindex 4be0ac4e78..d845e06167 100755 --- a/extras/MonoDevelop.MonoMac/MonoDevelop.MonoMac/MonoMac.dll +++ b/extras/MonoDevelop.MonoMac/MonoDevelop.MonoMac/MonoMac.dll diff --git a/extras/MonoDevelop.MonoMac/MonoDevelop.MonoMac/MonoMac.dll.mdb b/extras/MonoDevelop.MonoMac/MonoDevelop.MonoMac/MonoMac.dll.mdb Binary files differindex 8a67860d96..b1fad54ad6 100644 --- a/extras/MonoDevelop.MonoMac/MonoDevelop.MonoMac/MonoMac.dll.mdb +++ b/extras/MonoDevelop.MonoMac/MonoDevelop.MonoMac/MonoMac.dll.mdb diff --git a/extras/MonoDevelop.MonoMac/MonoDevelop.MonoMac/MonoMacBuildExtension.cs b/extras/MonoDevelop.MonoMac/MonoDevelop.MonoMac/MonoMacBuildExtension.cs index 963d744e6a..65fde0d050 100644 --- a/extras/MonoDevelop.MonoMac/MonoDevelop.MonoMac/MonoMacBuildExtension.cs +++ b/extras/MonoDevelop.MonoMac/MonoDevelop.MonoMac/MonoMacBuildExtension.cs @@ -263,7 +263,8 @@ namespace MonoDevelop.MonoMac args.AddQuoted (file.Input); args.Add ("--compile"); args.AddQuoted (file.Output); - var psi = new ProcessStartInfo ("ibtool", args.ToString ()); + var ibtoolPath = AppleSdkSettings.DeveloperRoot.Combine ("usr", "bin", "ibtool"); + var psi = new ProcessStartInfo (ibtoolPath, args.ToString ()); monitor.Log.WriteLine (psi.FileName + " " + psi.Arguments); int code; try { diff --git a/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs b/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs index 57150de807..c194ebb071 100644 --- a/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs +++ b/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs @@ -242,6 +242,10 @@ namespace Mono.Debugger.Soft public int Size { get; set; } + + public int Filter { + get; set; + } } class ThreadModifier : Modifier { @@ -370,7 +374,7 @@ namespace Mono.Debugger.Soft * with newer runtimes, and vice versa. */ internal const int MAJOR_VERSION = 2; - internal const int MINOR_VERSION = 15; + internal const int MINOR_VERSION = 16; enum WPSuspendPolicy { NONE = 0, @@ -2039,6 +2043,8 @@ namespace Mono.Debugger.Soft w.WriteId ((mod as StepModifier).Thread); w.WriteInt ((mod as StepModifier).Size); w.WriteInt ((mod as StepModifier).Depth); + if (Version.AtLeast (2, 16)) + w.WriteInt ((mod as StepModifier).Filter); } else if (mod is ThreadModifier) { w.WriteByte ((byte)ModifierKind.THREAD_ONLY); w.WriteId ((mod as ThreadModifier).Thread); diff --git a/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/MethodMirror.cs b/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/MethodMirror.cs index 614b236638..3e69d95c6d 100644 --- a/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/MethodMirror.cs +++ b/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/MethodMirror.cs @@ -168,13 +168,11 @@ namespace Mono.Debugger.Soft } } + // Since protocol version 2.12 public bool IsGenericMethod { get { - if (vm.Version.AtLeast (2, 12)) { - return GetInfo ().is_generic_method; - } else { - return Name.IndexOf ('`') != -1; - } + vm.CheckProtocolVersion (2, 12); + return GetInfo ().is_generic_method; } } diff --git a/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/StepEventRequest.cs b/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/StepEventRequest.cs index e33486e80f..b193a05c9b 100644 --- a/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/StepEventRequest.cs +++ b/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/StepEventRequest.cs @@ -14,11 +14,20 @@ namespace Mono.Debugger.Soft Line = 1 } + /* + * Filter which kinds of methods to skip during single stepping + */ + public enum StepFilter { + None = 0, + StaticCtor = 1 + } + public sealed class StepEventRequest : EventRequest { ThreadMirror step_thread; StepDepth depth; StepSize size; + StepFilter filter; internal StepEventRequest (VirtualMachine vm, ThreadMirror thread) : base (vm, EventType.Step) { if (thread == null) @@ -31,7 +40,7 @@ namespace Mono.Debugger.Soft public override void Enable () { var mods = new List <Modifier> (); - mods.Add (new StepModifier () { Thread = step_thread.Id, Depth = (int)Depth, Size = (int)Size }); + mods.Add (new StepModifier () { Thread = step_thread.Id, Depth = (int)Depth, Size = (int)Size, Filter = (int)Filter }); SendReq (mods); } @@ -60,5 +69,15 @@ namespace Mono.Debugger.Soft size = value; } } + + public StepFilter Filter { + get { + return filter; + } + set { + CheckDisabled (); + filter = value; + } + } } }
\ No newline at end of file diff --git a/main/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/SoftDebuggerAdaptor.cs b/main/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/SoftDebuggerAdaptor.cs index f1b6f377ed..15b11450cf 100644 --- a/main/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/SoftDebuggerAdaptor.cs +++ b/main/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/SoftDebuggerAdaptor.cs @@ -49,7 +49,7 @@ namespace Mono.Debugging.Soft SoftEvaluationContext cx = (SoftEvaluationContext) ctx; if (obj == null) - return string.Empty; + return null; if (obj is StringMirror) return ((StringMirror)obj).Value; @@ -70,7 +70,7 @@ namespace Mono.Debugging.Soft MethodMirror method = OverloadResolve (cx, "ToString", ob.Type, new TypeMirror[0], true, false, false); if (method != null && method.DeclaringType.FullName != "System.Object") { StringMirror res = cx.RuntimeInvoke (method, obj, new Value[0]) as StringMirror; - return res != null ? res.Value : string.Empty; + return res != null ? res.Value : null; } } else if ((obj is StructMirror) && cx.Options.AllowTargetInvoke) { @@ -78,7 +78,7 @@ namespace Mono.Debugging.Soft MethodMirror method = OverloadResolve (cx, "ToString", ob.Type, new TypeMirror[0], true, false, false); if (method != null && method.DeclaringType.FullName != "System.ValueType") { StringMirror res = cx.RuntimeInvoke (method, obj, new Value[0]) as StringMirror; - return res != null ? res.Value : string.Empty; + return res != null ? res.Value : null; } } @@ -267,26 +267,30 @@ namespace Mono.Debugging.Soft if (cx.Frame.Method.IsStatic) return false; TypeMirror tm = cx.Frame.Method.DeclaringType; - return IsGeneratedClosureOrIteratorType (tm); - } - - static bool IsGeneratedClosureOrIteratorType (TypeMirror tm) - { - return IsGeneratedClosureType (tm) || IsGeneratedIteratorType (tm); + return IsGeneratedType (tm); } - static bool IsGeneratedClosureType (TypeMirror tm) - { - return tm.Name.IndexOf (">c__") != -1; + internal static bool IsGeneratedType (TypeMirror tm) + { + // + // This should cover all C# generated special containers + // - anonymous methods + // - lambdas + // - iterators + // - async methods + // + // which allow stepping into + // + return tm.Name[0] == '<' && + // mcs is of the form <${NAME}>.c__{KIND}${NUMBER} + (tm.Name.IndexOf (">c__") > 0 || + // csc is of form <${NAME}>d__${NUMBER} + tm.Name.IndexOf (">d__") > 0); } - - static bool IsGeneratedIteratorType (TypeMirror tm) + + internal static string GetNameFromGeneratedType (TypeMirror tm) { - return - //mcs - tm.Name.IndexOf (">c__Iterator") != -1 - //csc is of form <NAME>d__NUMBER - || (tm.Name.StartsWith ("<") && tm.Name.IndexOf (">d__") > -1); + return tm.Name.Substring (1, tm.Name.IndexOf ('>') - 1); } static bool IsHoistedThisReference (FieldInfoMirror field) @@ -310,7 +314,7 @@ namespace Mono.Debugging.Soft return // mcs - local.Name.Length == 0 || local.Name.StartsWith ("<") || local.Name.StartsWith ("$locvar") + local.Name.Length == 0 || local.Name[0] == '<' || local.Name.StartsWith ("$locvar") // csc || local.Name.StartsWith ("CS$<>"); } @@ -347,7 +351,7 @@ namespace Mono.Debugging.Soft return new ValueReference [0]; TypeMirror tm = (TypeMirror) vthis.Type; - bool isIterator = IsGeneratedIteratorType (tm); + bool isIterator = IsGeneratedType (tm); var list = new List<ValueReference> (); TypeMirror type = (TypeMirror) vthis.Type; @@ -457,7 +461,7 @@ namespace Mono.Debugging.Soft foreach (LocalVariable local in locals) { if (local.IsArg) continue; - if (IsClosureReferenceLocal (local) && IsGeneratedClosureType (local.Type)) { + if (IsClosureReferenceLocal (local) && IsGeneratedType (local.Type)) { foreach (var gv in GetHoistedLocalVariables (cx, new VariableValueReference (cx, local.Name, local))) { yield return gv; } diff --git a/main/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/SoftDebuggerBacktrace.cs b/main/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/SoftDebuggerBacktrace.cs index add869a4cd..c0521becd9 100644 --- a/main/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/SoftDebuggerBacktrace.cs +++ b/main/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/SoftDebuggerBacktrace.cs @@ -35,6 +35,18 @@ using Mono.Debugging.Evaluation; namespace Mono.Debugging.Soft { + internal class SoftDebuggerStackFrame : Mono.Debugging.Client.StackFrame { + public Mono.Debugger.Soft.StackFrame StackFrame { + get; private set; + } + + public SoftDebuggerStackFrame (Mono.Debugger.Soft.StackFrame frame, string addressSpace, SourceLocation location, string language, bool isExternalCode, bool hasDebugInfo, string fullModuleName, string fullTypeName) + : base (frame.ILOffset, addressSpace, location, language, isExternalCode, hasDebugInfo, fullModuleName, fullTypeName) + { + StackFrame = frame; + } + } + public class SoftDebuggerBacktrace: BaseBacktrace { MDB.StackFrame[] frames; @@ -113,17 +125,48 @@ namespace Mono.Debugging.Soft methodName = method.Name; } + // Compiler generated anonymous/lambda methods + bool special_method = false; + if (methodName [0] == '<' && methodName.Contains (">m__")) { + int nidx = methodName.IndexOf (">m__") + 2; + methodName = "AnonymousMethod" + methodName.Substring (nidx, method.Name.Length - nidx); + special_method = true; + } + if (type != null) { - methodName = session.Adaptor.GetDisplayTypeName (type.FullName) + "." + methodName; + string typeDisplayName = session.Adaptor.GetDisplayTypeName (type.FullName); + + if (SoftDebuggerAdaptor.IsGeneratedType (type)) { + // The user-friendly method name is embedded in the generated type name + var mn = SoftDebuggerAdaptor.GetNameFromGeneratedType (type); + + // Strip off the generated type name + int dot = typeDisplayName.LastIndexOf ('.'); + var tname = typeDisplayName.Substring (0, dot); + + // Keep any type arguments + int targs = typeDisplayName.LastIndexOf ('<'); + if (targs > dot + 1) + mn += typeDisplayName.Substring (targs, typeDisplayName.Length - targs); + + typeDisplayName = tname; + + if (special_method) + typeDisplayName += "." + mn; + else + methodName = mn; + } + + methodName = typeDisplayName + "." + methodName; + typeFQN = type.Module.FullyQualifiedName; typeFullName = type.FullName; } var location = new DC.SourceLocation (methodName, fileName, frame.LineNumber); - var lang = frame.Method != null ? "Managed" : "Native"; var external = session.IsExternalCode (frame); - return new DC.StackFrame (frame.ILOffset, method.FullName, location, lang, external, true, typeFQN, typeFullName); + return new SoftDebuggerStackFrame (frame, method.FullName, location, "Managed", external, true, typeFQN, typeFullName); } protected override EvaluationContext GetEvaluationContext (int frameIndex, EvaluationOptions options) diff --git a/main/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/SoftDebuggerSession.cs b/main/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/SoftDebuggerSession.cs index 32688cebfe..a2c3a08329 100644 --- a/main/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/SoftDebuggerSession.cs +++ b/main/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/SoftDebuggerSession.cs @@ -57,6 +57,7 @@ namespace Mono.Debugging.Soft ThreadInfo[] current_threads; bool exited; bool started; + bool autoStepInto; internal int StackVersion; StepEventRequest currentStepRequest; ExceptionEventRequest unhandledExceptionRequest; @@ -1030,6 +1031,7 @@ namespace Mono.Debugging.Soft var req = vm.CreateStepRequest (current_thread); req.Depth = depth; req.Size = size; + req.Filter = StepFilter.StaticCtor; if (assemblyFilters != null && assemblyFilters.Count > 0) req.AssemblyFilter = assemblyFilters; req.Enabled = true; @@ -1125,12 +1127,31 @@ namespace Mono.Debugging.Soft } } + static bool IsStepIntoRequest (StepEventRequest stepRequest) + { + return stepRequest.Depth == StepDepth.Into; + } + + static bool IsStepOutRequest (StepEventRequest stepRequest) + { + return stepRequest.Depth == StepDepth.Out; + } + + static bool IsPropertyOrOperatorMethod (MDB.MethodMirror method) + { + string name = method.Name; + + return method.IsSpecialName && name.StartsWith ("get_") || name.StartsWith ("set_") || name.StartsWith ("op_"); + } + void HandleBreakEventSet (Event[] es, bool dequeuing) { if (dequeuing && exited) return; bool resume = true; + bool steppedOut = false; + bool steppedInto = false; ObjectMirror exception = null; TargetEventType etype = TargetEventType.TargetStopped; BreakEvent breakEvent = null; @@ -1158,13 +1179,18 @@ namespace Mono.Debugging.Soft BreakInfo binfo; if (breakpoints.TryGetValue (be.Request, out binfo)) breakEvent = binfo.BreakEvent; + autoStepInto = false; resume = false; } } else if (e.EventType == EventType.Step) { + var stepRequest = e.Request as StepEventRequest; + steppedInto = IsStepIntoRequest (stepRequest); + steppedOut = IsStepOutRequest (stepRequest); etype = TargetEventType.TargetStopped; resume = false; } else if (e.EventType == EventType.UserBreak) { etype = TargetEventType.TargetStopped; + autoStepInto = false; resume = false; } else { throw new Exception ("Break eventset had unexpected event type " + e.GetType ()); @@ -1181,17 +1207,37 @@ namespace Mono.Debugging.Soft currentStepRequest.Enabled = false; currentStepRequest = null; } + current_thread = recent_thread = es[0].Thread; - var args = new TargetEventArgs (etype); - args.Process = OnGetProcesses () [0]; - args.Thread = GetThread (args.Process, current_thread); - args.Backtrace = GetThreadBacktrace (current_thread); - args.BreakEvent = breakEvent; if (exception != null) activeExceptionsByThread [current_thread.ThreadId] = exception; - OnTargetEvent (args); + var backtrace = GetThreadBacktrace (current_thread); + bool stepOut = false; + + if (steppedInto && Options.StepOverPropertiesAndOperators && backtrace.FrameCount > 0) { + var frame = backtrace.GetFrame (0) as SoftDebuggerStackFrame; + + stepOut = frame != null && IsPropertyOrOperatorMethod (frame.StackFrame.Method); + } + + if (stepOut) { + // We will want to call StepInto once StepOut returns... + autoStepInto = true; + Step (StepDepth.Out, StepSize.Min); + } else if (steppedOut && autoStepInto) { + autoStepInto = false; + Step (StepDepth.Into, StepSize.Min); + } else { + var args = new TargetEventArgs (etype); + args.Process = OnGetProcesses () [0]; + args.Thread = GetThread (args.Process, current_thread); + args.Backtrace = backtrace; + args.BreakEvent = breakEvent; + + OnTargetEvent (args); + } } } @@ -1683,21 +1729,30 @@ namespace Mono.Debugging.Soft string srcFile = location.SourceFile; if (srcFile != null && PathComparer.Compare (PathToFileName (NormalizePath (srcFile)), file) == 0) { + rangeLastLine = location.LineNumber; + if (rangeFirstLine == -1) + rangeFirstLine = location.LineNumber; + // If we are inserting a breakpoint in line L, but L+1 has the same IL offset as L, // pick the L+1 location, since that's where the debugger is going to stop. - if (location.LineNumber == line) { - if (target_loc == null) + if (location.LineNumber >= line && line >= rangeFirstLine) { + if (target_loc != null) { + if (location.LineNumber > line) { + if (target_loc.LineNumber - line > location.LineNumber - line) { + // Grab the location closest to the requested line + target_loc = location; + } else if (location.ILOffset == target_loc.ILOffset) { + // Grab the last location with the same ILOffset + target_loc = location; + } + } else { + // Line number matches exactly + target_loc = location; + } + } else { target_loc = location; + } } - else if (target_loc != null) { - if (target_loc.ILOffset == location.ILOffset) - target_loc = location; - else - break; - } - rangeLastLine = location.LineNumber; - if (rangeFirstLine == -1) - rangeFirstLine = location.LineNumber; } else { if (rangeFirstLine != -1 && line >= rangeFirstLine && line <= rangeLastLine) insideTypeRange = true; diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerOptionsPanelWidget.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerOptionsPanelWidget.cs index f735c45aff..96b2f9e47d 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerOptionsPanelWidget.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggerOptionsPanelWidget.cs @@ -56,6 +56,7 @@ namespace MonoDevelop.Debugger this.Build (); options = DebuggingService.GetUserOptions (); projectCodeOnly.Active = options.ProjectAssembliesOnly; + stepOverPropertiesAndOperators.Active = options.StepOverPropertiesAndOperators; checkAllowEval.Active = options.EvaluationOptions.AllowTargetInvoke; checkToString.Active = options.EvaluationOptions.AllowToStringCalls; checkShowBaseGroup.Active = !options.EvaluationOptions.FlattenHierarchy; @@ -83,7 +84,8 @@ namespace MonoDevelop.Debugger ops.GroupStaticMembers = checkGroupStatic.Active; int t = (int) spinTimeout.Value; ops.EvaluationTimeout = t; - + + options.StepOverPropertiesAndOperators = stepOverPropertiesAndOperators.Active; options.ProjectAssembliesOnly = projectCodeOnly.Active; options.EvaluationOptions = ops; diff --git a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs index 84652280a3..2bb7636f0f 100644 --- a/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs +++ b/main/src/addins/MonoDevelop.Debugger/MonoDevelop.Debugger/DebuggingService.cs @@ -446,23 +446,26 @@ namespace MonoDevelop.Debugger public static DebuggerSessionOptions GetUserOptions () { - EvaluationOptions eops = EvaluationOptions.DefaultOptions; - eops.AllowTargetInvoke = PropertyService.Get ("MonoDevelop.Debugger.DebuggingService.AllowTargetInvoke", true); - eops.AllowToStringCalls = PropertyService.Get ("MonoDevelop.Debugger.DebuggingService.AllowToStringCalls", true); - eops.EvaluationTimeout = PropertyService.Get ("MonoDevelop.Debugger.DebuggingService.EvaluationTimeout", 2500); - eops.FlattenHierarchy = PropertyService.Get ("MonoDevelop.Debugger.DebuggingService.FlattenHierarchy", false); - eops.GroupPrivateMembers = PropertyService.Get ("MonoDevelop.Debugger.DebuggingService.GroupPrivateMembers", true); - eops.GroupStaticMembers = PropertyService.Get ("MonoDevelop.Debugger.DebuggingService.GroupStaticMembers", true); - eops.MemberEvaluationTimeout = eops.EvaluationTimeout * 2; + EvaluationOptions eval = EvaluationOptions.DefaultOptions; + eval.AllowTargetInvoke = PropertyService.Get ("MonoDevelop.Debugger.DebuggingService.AllowTargetInvoke", true); + eval.AllowToStringCalls = PropertyService.Get ("MonoDevelop.Debugger.DebuggingService.AllowToStringCalls", true); + eval.EvaluationTimeout = PropertyService.Get ("MonoDevelop.Debugger.DebuggingService.EvaluationTimeout", 2500); + eval.FlattenHierarchy = PropertyService.Get ("MonoDevelop.Debugger.DebuggingService.FlattenHierarchy", false); + eval.GroupPrivateMembers = PropertyService.Get ("MonoDevelop.Debugger.DebuggingService.GroupPrivateMembers", true); + eval.GroupStaticMembers = PropertyService.Get ("MonoDevelop.Debugger.DebuggingService.GroupStaticMembers", true); + eval.MemberEvaluationTimeout = eval.EvaluationTimeout * 2; return new DebuggerSessionOptions () { + StepOverPropertiesAndOperators = PropertyService.Get ("MonoDevelop.Debugger.DebuggingService.StepOverPropertiesAndOperators", true), ProjectAssembliesOnly = PropertyService.Get ("MonoDevelop.Debugger.DebuggingService.ProjectAssembliesOnly", true), - EvaluationOptions = eops, + EvaluationOptions = eval, }; } public static void SetUserOptions (DebuggerSessionOptions options) { + PropertyService.Set ("MonoDevelop.Debugger.DebuggingService.StepOverPropertiesAndOperators", options.StepOverPropertiesAndOperators); PropertyService.Set ("MonoDevelop.Debugger.DebuggingService.ProjectAssembliesOnly", options.ProjectAssembliesOnly); + PropertyService.Set ("MonoDevelop.Debugger.DebuggingService.AllowTargetInvoke", options.EvaluationOptions.AllowTargetInvoke); PropertyService.Set ("MonoDevelop.Debugger.DebuggingService.AllowToStringCalls", options.EvaluationOptions.AllowToStringCalls); PropertyService.Set ("MonoDevelop.Debugger.DebuggingService.EvaluationTimeout", options.EvaluationOptions.EvaluationTimeout); diff --git a/main/src/addins/MonoDevelop.Debugger/gtk-gui/MonoDevelop.Debugger.DebuggerOptionsPanelWidget.cs b/main/src/addins/MonoDevelop.Debugger/gtk-gui/MonoDevelop.Debugger.DebuggerOptionsPanelWidget.cs index 11fe84d30e..431616def3 100644 --- a/main/src/addins/MonoDevelop.Debugger/gtk-gui/MonoDevelop.Debugger.DebuggerOptionsPanelWidget.cs +++ b/main/src/addins/MonoDevelop.Debugger/gtk-gui/MonoDevelop.Debugger.DebuggerOptionsPanelWidget.cs @@ -7,6 +7,7 @@ namespace MonoDevelop.Debugger private global::Gtk.Notebook notebook1; private global::Gtk.VBox vbox3; private global::Gtk.CheckButton projectCodeOnly; + private global::Gtk.CheckButton stepOverPropertiesAndOperators; private global::Gtk.CheckButton checkAllowEval; private global::Gtk.CheckButton checkToString; private global::Gtk.CheckButton checkShowBaseGroup; @@ -52,6 +53,19 @@ namespace MonoDevelop.Debugger w1.Expand = false; w1.Fill = false; // Container child vbox3.Gtk.Box+BoxChild + this.stepOverPropertiesAndOperators = new global::Gtk.CheckButton (); + this.stepOverPropertiesAndOperators.CanFocus = true; + this.stepOverPropertiesAndOperators.Name = "stepOverPropertiesAndOperators"; + this.stepOverPropertiesAndOperators.Label = global::Mono.Unix.Catalog.GetString ("Step over properties and operators"); + this.stepOverPropertiesAndOperators.Active = true; + this.stepOverPropertiesAndOperators.DrawIndicator = true; + this.stepOverPropertiesAndOperators.UseUnderline = true; + this.vbox3.Add (this.stepOverPropertiesAndOperators); + global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.stepOverPropertiesAndOperators])); + w2.Position = 1; + w2.Expand = false; + w2.Fill = false; + // Container child vbox3.Gtk.Box+BoxChild this.checkAllowEval = new global::Gtk.CheckButton (); this.checkAllowEval.CanFocus = true; this.checkAllowEval.Name = "checkAllowEval"; @@ -60,10 +74,10 @@ namespace MonoDevelop.Debugger this.checkAllowEval.DrawIndicator = true; this.checkAllowEval.UseUnderline = true; this.vbox3.Add (this.checkAllowEval); - global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.checkAllowEval])); - w2.Position = 1; - w2.Expand = false; - w2.Fill = false; + global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.checkAllowEval])); + w3.Position = 2; + w3.Expand = false; + w3.Fill = false; // Container child vbox3.Gtk.Box+BoxChild this.checkToString = new global::Gtk.CheckButton (); this.checkToString.CanFocus = true; @@ -72,10 +86,10 @@ namespace MonoDevelop.Debugger this.checkToString.DrawIndicator = true; this.checkToString.UseUnderline = true; this.vbox3.Add (this.checkToString); - global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.checkToString])); - w3.Position = 2; - w3.Expand = false; - w3.Fill = false; + global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.checkToString])); + w4.Position = 3; + w4.Expand = false; + w4.Fill = false; // Container child vbox3.Gtk.Box+BoxChild this.checkShowBaseGroup = new global::Gtk.CheckButton (); this.checkShowBaseGroup.CanFocus = true; @@ -84,10 +98,10 @@ namespace MonoDevelop.Debugger this.checkShowBaseGroup.DrawIndicator = true; this.checkShowBaseGroup.UseUnderline = true; this.vbox3.Add (this.checkShowBaseGroup); - global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.checkShowBaseGroup])); - w4.Position = 3; - w4.Expand = false; - w4.Fill = false; + global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.checkShowBaseGroup])); + w5.Position = 4; + w5.Expand = false; + w5.Fill = false; // Container child vbox3.Gtk.Box+BoxChild this.checkGroupPrivate = new global::Gtk.CheckButton (); this.checkGroupPrivate.CanFocus = true; @@ -96,10 +110,10 @@ namespace MonoDevelop.Debugger this.checkGroupPrivate.DrawIndicator = true; this.checkGroupPrivate.UseUnderline = true; this.vbox3.Add (this.checkGroupPrivate); - global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.checkGroupPrivate])); - w5.Position = 4; - w5.Expand = false; - w5.Fill = false; + global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.checkGroupPrivate])); + w6.Position = 5; + w6.Expand = false; + w6.Fill = false; // Container child vbox3.Gtk.Box+BoxChild this.checkGroupStatic = new global::Gtk.CheckButton (); this.checkGroupStatic.CanFocus = true; @@ -108,10 +122,10 @@ namespace MonoDevelop.Debugger this.checkGroupStatic.DrawIndicator = true; this.checkGroupStatic.UseUnderline = true; this.vbox3.Add (this.checkGroupStatic); - global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.checkGroupStatic])); - w6.Position = 5; - w6.Expand = false; - w6.Fill = false; + global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.checkGroupStatic])); + w7.Position = 6; + w7.Expand = false; + w7.Fill = false; // Container child vbox3.Gtk.Box+BoxChild this.tableEval = new global::Gtk.Table (((uint)(1)), ((uint)(3)), false); this.tableEval.Name = "tableEval"; @@ -122,20 +136,20 @@ namespace MonoDevelop.Debugger this.label3.Name = "label3"; this.label3.LabelProp = global::Mono.Unix.Catalog.GetString ("ms"); this.tableEval.Add (this.label3); - global::Gtk.Table.TableChild w7 = ((global::Gtk.Table.TableChild)(this.tableEval [this.label3])); - w7.LeftAttach = ((uint)(2)); - w7.RightAttach = ((uint)(3)); - w7.XOptions = ((global::Gtk.AttachOptions)(4)); - w7.YOptions = ((global::Gtk.AttachOptions)(4)); + global::Gtk.Table.TableChild w8 = ((global::Gtk.Table.TableChild)(this.tableEval [this.label3])); + w8.LeftAttach = ((uint)(2)); + w8.RightAttach = ((uint)(3)); + w8.XOptions = ((global::Gtk.AttachOptions)(4)); + w8.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child tableEval.Gtk.Table+TableChild this.label60 = new global::Gtk.Label (); this.label60.Name = "label60"; this.label60.Xalign = 0F; this.label60.LabelProp = global::Mono.Unix.Catalog.GetString ("Evaluation Timeout:"); this.tableEval.Add (this.label60); - global::Gtk.Table.TableChild w8 = ((global::Gtk.Table.TableChild)(this.tableEval [this.label60])); - w8.XOptions = ((global::Gtk.AttachOptions)(4)); - w8.YOptions = ((global::Gtk.AttachOptions)(4)); + global::Gtk.Table.TableChild w9 = ((global::Gtk.Table.TableChild)(this.tableEval [this.label60])); + w9.XOptions = ((global::Gtk.AttachOptions)(4)); + w9.YOptions = ((global::Gtk.AttachOptions)(4)); // Container child tableEval.Gtk.Table+TableChild this.spinTimeout = new global::Gtk.SpinButton (0, 1000000, 100); this.spinTimeout.CanFocus = true; @@ -144,16 +158,16 @@ namespace MonoDevelop.Debugger this.spinTimeout.ClimbRate = 100; this.spinTimeout.Numeric = true; this.tableEval.Add (this.spinTimeout); - global::Gtk.Table.TableChild w9 = ((global::Gtk.Table.TableChild)(this.tableEval [this.spinTimeout])); - w9.LeftAttach = ((uint)(1)); - w9.RightAttach = ((uint)(2)); - w9.XOptions = ((global::Gtk.AttachOptions)(4)); - w9.YOptions = ((global::Gtk.AttachOptions)(4)); + global::Gtk.Table.TableChild w10 = ((global::Gtk.Table.TableChild)(this.tableEval [this.spinTimeout])); + w10.LeftAttach = ((uint)(1)); + w10.RightAttach = ((uint)(2)); + w10.XOptions = ((global::Gtk.AttachOptions)(4)); + w10.YOptions = ((global::Gtk.AttachOptions)(4)); this.vbox3.Add (this.tableEval); - global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.tableEval])); - w10.Position = 6; - w10.Expand = false; - w10.Fill = false; + global::Gtk.Box.BoxChild w11 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.tableEval])); + w11.Position = 7; + w11.Expand = false; + w11.Fill = false; this.notebook1.Add (this.vbox3); // Notebook tab this.label4 = new global::Gtk.Label (); @@ -174,19 +188,19 @@ namespace MonoDevelop.Debugger this.label2.LabelProp = global::Mono.Unix.Catalog.GetString ("This priority list will be used by MonoDevelop when selecting the engine to be used for debugging an application."); this.label2.Wrap = true; this.vbox2.Add (this.label2); - global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.label2])); - w12.Position = 0; - w12.Expand = false; - w12.Fill = false; + global::Gtk.Box.BoxChild w13 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.label2])); + w13.Position = 0; + w13.Expand = false; + w13.Fill = false; // Container child vbox2.Gtk.Box+BoxChild this.prioritylist = new global::MonoDevelop.Ide.Gui.Components.PriorityList (); this.prioritylist.Name = "prioritylist"; this.vbox2.Add (this.prioritylist); - global::Gtk.Box.BoxChild w13 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.prioritylist])); - w13.Position = 1; - this.notebook1.Add (this.vbox2); - global::Gtk.Notebook.NotebookChild w14 = ((global::Gtk.Notebook.NotebookChild)(this.notebook1 [this.vbox2])); + global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.prioritylist])); w14.Position = 1; + this.notebook1.Add (this.vbox2); + global::Gtk.Notebook.NotebookChild w15 = ((global::Gtk.Notebook.NotebookChild)(this.notebook1 [this.vbox2])); + w15.Position = 1; // Notebook tab this.label1 = new global::Gtk.Label (); this.label1.Name = "label1"; diff --git a/main/src/addins/MonoDevelop.Debugger/gtk-gui/gui.stetic b/main/src/addins/MonoDevelop.Debugger/gtk-gui/gui.stetic index ce0a036834..c00dfb31f7 100644 --- a/main/src/addins/MonoDevelop.Debugger/gtk-gui/gui.stetic +++ b/main/src/addins/MonoDevelop.Debugger/gtk-gui/gui.stetic @@ -1275,7 +1275,7 @@ </widget> </child> </widget> - <widget class="Gtk.Bin" id="MonoDevelop.Debugger.DebuggerOptionsPanelWidget" design-size="523 250"> + <widget class="Gtk.Bin" id="MonoDevelop.Debugger.DebuggerOptionsPanelWidget" design-size="523 270"> <property name="MemberName" /> <property name="Visible">False</property> <child> @@ -1306,6 +1306,23 @@ </packing> </child> <child> + <widget class="Gtk.CheckButton" id="stepOverPropertiesAndOperators"> + <property name="MemberName" /> + <property name="CanFocus">True</property> + <property name="Label" translatable="yes">Step over properties and operators</property> + <property name="Active">True</property> + <property name="DrawIndicator">True</property> + <property name="HasLabel">True</property> + <property name="UseUnderline">True</property> + </widget> + <packing> + <property name="Position">1</property> + <property name="AutoSize">True</property> + <property name="Expand">False</property> + <property name="Fill">False</property> + </packing> + </child> + <child> <widget class="Gtk.CheckButton" id="checkAllowEval"> <property name="MemberName" /> <property name="CanFocus">True</property> @@ -1317,7 +1334,7 @@ <signal name="Toggled" handler="OnCheckAllowEvalToggled" /> </widget> <packing> - <property name="Position">1</property> + <property name="Position">2</property> <property name="AutoSize">True</property> <property name="Expand">False</property> <property name="Fill">False</property> @@ -1333,7 +1350,7 @@ <property name="UseUnderline">True</property> </widget> <packing> - <property name="Position">2</property> + <property name="Position">3</property> <property name="AutoSize">True</property> <property name="Expand">False</property> <property name="Fill">False</property> @@ -1349,7 +1366,7 @@ <property name="UseUnderline">True</property> </widget> <packing> - <property name="Position">3</property> + <property name="Position">4</property> <property name="AutoSize">True</property> <property name="Expand">False</property> <property name="Fill">False</property> @@ -1365,7 +1382,7 @@ <property name="UseUnderline">True</property> </widget> <packing> - <property name="Position">4</property> + <property name="Position">5</property> <property name="AutoSize">True</property> <property name="Expand">False</property> <property name="Fill">False</property> @@ -1381,7 +1398,7 @@ <property name="UseUnderline">True</property> </widget> <packing> - <property name="Position">5</property> + <property name="Position">6</property> <property name="AutoSize">True</property> <property name="Expand">False</property> <property name="Fill">False</property> @@ -1456,7 +1473,7 @@ </child> </widget> <packing> - <property name="Position">6</property> + <property name="Position">7</property> <property name="AutoSize">True</property> <property name="Expand">False</property> <property name="Fill">False</property> diff --git a/main/src/addins/MonoDevelop.MacDev/AppleSdkSettings.cs b/main/src/addins/MonoDevelop.MacDev/AppleSdkSettings.cs index 5f1a857704..3be40ae38c 100644 --- a/main/src/addins/MonoDevelop.MacDev/AppleSdkSettings.cs +++ b/main/src/addins/MonoDevelop.MacDev/AppleSdkSettings.cs @@ -51,7 +51,7 @@ namespace MonoDevelop.MacDev // Put newer SDKs at the top as we scan from 0 -> List.Count static readonly IList<string> DefaultRoots = new List<string> { - "/Applications/Xcode.app/Contents/Developer", + "/Applications/Xcode.app", "/Developer" }; static DateTime lastWritten; @@ -61,20 +61,41 @@ namespace MonoDevelop.MacDev return Environment.GetEnvironmentVariable ("MD_APPLE_SDK_ROOT"); } - internal static bool ValidateSdkLocation (FilePath location, out FilePath versionPlist) + static void GetNewPaths (FilePath root, out FilePath xcode, out FilePath vplist, out FilePath devroot) { - versionPlist = location.Combine ("..", "version.plist"); - if (System.IO.File.Exists (versionPlist)) + xcode = root; + vplist = root.Combine ("Contents", "version.plist"); + devroot = root.Combine ("Contents", "Developer"); + } + + static void GetOldPaths (FilePath root, out FilePath xcode, out FilePath vplist, out FilePath devroot) + { + xcode = root.Combine ("Applications", "Xcode.app"); + vplist = root.Combine ("Library", "version.plist"); + devroot = root; + } + + static bool ValidatePaths (FilePath xcode, FilePath vplist, FilePath devroot) + { + return Directory.Exists (xcode) + && Directory.Exists (devroot) + && File.Exists (vplist) + && File.Exists (xcode.Combine ("Contents", "Info.plist")); + } + + internal static bool ValidateSdkLocation (FilePath location, out FilePath xcode, out FilePath vplist, out FilePath devroot) + { + GetNewPaths (location, out xcode, out vplist, out devroot); + if (ValidatePaths (xcode, vplist, devroot)) return true; - versionPlist = location.Combine ("Library", "version.plist"); - if (System.IO.File.Exists (versionPlist)) + GetOldPaths (location, out xcode, out vplist, out devroot); + if (ValidatePaths (xcode, vplist, devroot)) return true; - versionPlist = FilePath.Empty; return false; } - + internal static void SetConfiguredSdkLocation (FilePath location) { if (location.IsNullOrEmpty || location == DefaultRoots.First ()) @@ -114,43 +135,33 @@ namespace MonoDevelop.MacDev { SetInvalid (); - var versionInfo = FilePath.Empty; DeveloperRoot = Environment.GetEnvironmentVariable ("MD_APPLE_SDK_ROOT"); if (DeveloperRoot.IsNullOrEmpty) { DeveloperRoot = GetConfiguredSdkLocation (); } + bool foundSdk = false; + FilePath xcode, vplist, devroot; + if (DeveloperRoot.IsNullOrEmpty) { foreach (var v in DefaultRoots) { - if (ValidateSdkLocation (v, out versionInfo)) { - DeveloperRootVersionPlist = versionInfo; - DeveloperRoot = v; + if (ValidateSdkLocation (v, out xcode, out vplist, out devroot)) { + foundSdk = true; break; } else { - LoggingService.LogDebug ("Apple iOS Sdk not found at '{0}'", v); + LoggingService.LogDebug ("Apple iOS SDK not found at '{0}'", v); } } - } else if (DeveloperRoot.FileName == "Xcode.app") { - // If the user supplied path ends with 'Xcode.app' then we should assume - // it's the standard one and so need to append 'Contents/Developer' - DeveloperRoot = DeveloperRoot.Combine ("Contents", "Developer"); - } - - var parent = DeveloperRoot; - while (!parent.IsNullOrEmpty) { - if (parent.FileName == "Xcode.app") { - XcodePath = parent; - break; - } - parent = parent.ParentDirectory; + } else { + foundSdk = ValidateSdkLocation (DeveloperRoot, out xcode, out vplist, out devroot); } - - if (XcodePath.IsNullOrEmpty) { - XcodePath = DeveloperRoot.Combine ("Applications", "Xcode.app"); - } - - if (DeveloperRoot.IsNullOrEmpty || !ValidateSdkLocation (DeveloperRoot, out versionInfo)) { - DeveloperRootVersionPlist = versionInfo; + + if (foundSdk) { + XcodePath = xcode; + DeveloperRoot = devroot; + DeveloperRootVersionPlist = vplist; + } else { + SetInvalid (); return; } diff --git a/main/src/addins/MonoDevelop.MacDev/AppleSdkSettingsPanel.cs b/main/src/addins/MonoDevelop.MacDev/AppleSdkSettingsPanel.cs index ffcd507c15..3807ac93c7 100644 --- a/main/src/addins/MonoDevelop.MacDev/AppleSdkSettingsPanel.cs +++ b/main/src/addins/MonoDevelop.MacDev/AppleSdkSettingsPanel.cs @@ -43,8 +43,8 @@ namespace MonoDevelop.MacDev public override bool ValidateSdkLocation (FilePath location) { - FilePath versionInfoPlist; - return AppleSdkSettings.ValidateSdkLocation (location, out versionInfoPlist); + FilePath xcode, vplist, devroot; + return AppleSdkSettings.ValidateSdkLocation (location, out xcode, out vplist, out devroot); } public override FilePath LoadSdkLocationSetting () diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/Makefile.am b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/Makefile.am index 4b90865bce..1759861107 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/Makefile.am +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/Makefile.am @@ -41,6 +41,7 @@ FILES = \ MonoDevelop.VersionControl.Git/CredentialsDialog.cs \ MonoDevelop.VersionControl.Git/EditBranchDialog.cs \ MonoDevelop.VersionControl.Git/EditRemoteDialog.cs \ + MonoDevelop.VersionControl.Git/FilteredStatus.cs \ MonoDevelop.VersionControl.Git/GitClient.cs \ MonoDevelop.VersionControl.Git/GitCommitDialogExtension.cs \ MonoDevelop.VersionControl.Git/GitCommitDialogExtensionWidget.cs \ @@ -57,7 +58,6 @@ FILES = \ MonoDevelop.VersionControl.Git/MergeDialog.cs \ MonoDevelop.VersionControl.Git/NewStashDialog.cs \ MonoDevelop.VersionControl.Git/PushDialog.cs \ - MonoDevelop.VersionControl.Git/RepositoryStatus.cs \ MonoDevelop.VersionControl.Git/Stash.cs \ MonoDevelop.VersionControl.Git/StashManagerDialog.cs \ MonoDevelop.VersionControl.Git/UserInfoConflictDialog.cs diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git.csproj b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git.csproj index 7fc3fb17d8..0a019b3e54 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git.csproj +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git.csproj @@ -61,7 +61,6 @@ <Compile Include="gtk-gui\MonoDevelop.VersionControl.Git.EditRemoteDialog.cs" /> <Compile Include="gtk-gui\MonoDevelop.VersionControl.Git.MergeDialog.cs" /> <Compile Include="MonoDevelop.VersionControl.Git\Change.cs" /> - <Compile Include="MonoDevelop.VersionControl.Git\RepositoryStatus.cs" /> <Compile Include="MonoDevelop.VersionControl.Git\MergeDialog.cs" /> <Compile Include="MonoDevelop.VersionControl.Git\Stash.cs" /> <Compile Include="MonoDevelop.VersionControl.Git\GitUtil.cs" /> @@ -79,6 +78,7 @@ <Compile Include="gtk-gui\MonoDevelop.VersionControl.Git.GitCommitDialogExtensionWidget.cs" /> <Compile Include="MonoDevelop.VersionControl.Git\GitCommitDialogExtension.cs" /> <Compile Include="MonoDevelop.VersionControl.Git\GitSupportFeature.cs" /> + <Compile Include="MonoDevelop.VersionControl.Git\FilteredStatus.cs" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\..\..\core\MonoDevelop.Core\MonoDevelop.Core.csproj"> diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/FilteredStatus.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/FilteredStatus.cs new file mode 100644 index 0000000000..7099028d12 --- /dev/null +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/FilteredStatus.cs @@ -0,0 +1,80 @@ +// +// SpecificStatus.cs +// +// Author: +// Alan McGovern <alan@xamarin.com> +// +// Copyright (c) 2012 Xamarin Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Linq; + +using NGit; +using NGit.Treewalk; +using NGit.Treewalk.Filter; + +namespace MonoDevelop.VersionControl.Git +{ + class FilteredStatus : NGit.Api.StatusCommand + { + WorkingTreeIterator iter; + + IEnumerable<string> Files { + get; set; + } + + public FilteredStatus (NGit.Repository repository) + : base (repository) + { + + } + + public FilteredStatus (NGit.Repository repository, IEnumerable<string> files) + : base (repository) + { + Files = files; + } + + public override NGit.Api.StatusCommand SetWorkingTreeIt (WorkingTreeIterator workingTreeIt) + { + iter = workingTreeIt; + return this; + } + + public override NGit.Api.Status Call () + { + if (iter == null) + iter = new FileTreeIterator(repo); + + IndexDiff diff = new IndexDiff(repo, Constants.HEAD, iter); + if (Files != null) { + var filters = Files.Where (f => f != ".").ToArray (); + if (filters.Length > 0) + diff.SetFilter (PathFilterGroup.CreateFromStrings (filters)); + } + + diff.Diff (); + return new NGit.Api.Status(diff); + } + } +} + diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs index 2850a1f95c..45ade91b23 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs @@ -266,12 +266,18 @@ namespace MonoDevelop.VersionControl.Git else rev = null; - RepositoryStatus status; - if (localFileNames != null) - status = GitUtil.GetFileStatus (repo, localFileNames); - else - status = GitUtil.GetDirectoryStatus (repo, localDirectory, recursive); - + IEnumerable<string> paths; + if (localFileNames == null) { + if (recursive) + paths = new [] { (string) localDirectory }; + else + paths = Directory.GetFiles (localDirectory); + } else { + paths = localFileNames.Select (f => (string)f); + } + paths = paths.Select (f => ToGitPath (f)); + + var status = new FilteredStatus (repo, paths).Call (); HashSet<string> added = new HashSet<string> (); Action<IEnumerable<string>, VersionStatus> AddFiles = delegate(IEnumerable<string> files, VersionStatus fstatus) { foreach (string file in files) { @@ -284,13 +290,14 @@ namespace MonoDevelop.VersionControl.Git } }; - AddFiles (status.Added, VersionStatus.Versioned | VersionStatus.ScheduledAdd); - AddFiles (status.Modified, VersionStatus.Versioned | VersionStatus.Modified); - AddFiles (status.Removed, VersionStatus.Versioned | VersionStatus.ScheduledDelete); - AddFiles (status.Missing, VersionStatus.Versioned | VersionStatus.ScheduledDelete); - AddFiles (status.MergeConflict, VersionStatus.Versioned | VersionStatus.Conflicted); - AddFiles (status.Untracked, VersionStatus.Unversioned); - + AddFiles (status.GetAdded (), VersionStatus.Versioned | VersionStatus.ScheduledAdd); + AddFiles (status.GetChanged (), VersionStatus.Versioned | VersionStatus.Modified); + AddFiles (status.GetModified (), VersionStatus.Versioned | VersionStatus.Modified); + AddFiles (status.GetRemoved (), VersionStatus.Versioned | VersionStatus.ScheduledDelete); + AddFiles (status.GetMissing (), VersionStatus.Versioned | VersionStatus.ScheduledDelete); + AddFiles (status.GetConflicting (), VersionStatus.Versioned | VersionStatus.Conflicted); + AddFiles (status.GetUntracked (), VersionStatus.Unversioned); + // Existing files for which git did not report an status are supposed to be tracked foreach (FilePath file in existingFiles) { VersionInfo vi = new VersionInfo (file, "", false, VersionStatus.Versioned, rev, VersionStatus.Versioned, null); diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitUtil.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitUtil.cs index 8f9912e4ec..367faeac92 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitUtil.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitUtil.cs @@ -164,17 +164,7 @@ namespace MonoDevelop.VersionControl.Git } } } - - public static RepositoryStatus GetDirectoryStatus (NGit.Repository repo, string dir, bool recursive) - { - return new RepositoryStatus (repo, null, repo.ToGitPath (dir), recursive); - } - - public static RepositoryStatus GetFileStatus (NGit.Repository repo, IEnumerable<FilePath> fileNames) - { - return new RepositoryStatus (repo, repo.ToGitPath (fileNames), null, false); - } - + public static ObjectId CreateCommit (NGit.Repository rep, string message, IList<ObjectId> parents, ObjectId indexTreeId, PersonIdent author, PersonIdent committer) { try { diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/RepositoryStatus.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/RepositoryStatus.cs deleted file mode 100644 index 43d216dbba..0000000000 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/RepositoryStatus.cs +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright (C) 2007, Dave Watson <dwatson@mimvista.com> - * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com> - * Copyright (C) 2010, Henon <meinrad.recheis@gmail.com> - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * - Neither the name of the Git Development Community nor the - * names of its contributors may be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Linq; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using NGit; -using NGit.Revwalk; -using NGit.Treewalk; -using NGit.Dircache; -using NGit.Treewalk.Filter; - -namespace MonoDevelop.VersionControl.Git -{ - class SpecificStatus : NGit.Api.StatusCommand - { - WorkingTreeIterator iter; - IEnumerable<string> Files { - get; set; - } - - public SpecificStatus (NGit.Repository repository) - : base (repository) - { - } - - public SpecificStatus (NGit.Repository repository, IEnumerable<string> files) - : base (repository) - { - Files = files; - } - - public override NGit.Api.StatusCommand SetWorkingTreeIt (WorkingTreeIterator workingTreeIt) - { - iter = workingTreeIt; - return this; - } - - public override NGit.Api.Status Call () - { - if (iter == null) - iter = new FileTreeIterator(repo); - - IndexDiff diff = new IndexDiff(repo, Constants.HEAD, iter); - if (Files != null) { - var filters = Files.Select (PathFilter.Create).ToArray (); - if (filters.Length > 1) - diff.SetFilter (OrTreeFilter.Create (filters)); - else - diff.SetFilter (filters [0]); - } - - diff.Diff (); - return new NGit.Api.Status(diff); - } - } - - public class RepositoryStatus - { - private string _root_path; - private bool _recursive; - private IEnumerable<string> _file_paths; - private bool changesExist; - - internal RepositoryStatus(NGit.Repository repository, IEnumerable<string> singleFiles, string rootDir, bool recursive) - { - Repository = repository; - _root_path = rootDir; - _recursive = recursive; - _file_paths = singleFiles; - Update(); - } - - public NGit.Repository Repository - { - get; - private set; - } - - public bool ChangesExist { - get { return changesExist; } - } - - /// <summary> - /// List of files added to the index, which are not in the current commit - /// </summary> - public HashSet<string> Added { get; private set; } - - /// <summary> - /// List of files added to the index, which are already in the current commit with different content - /// </summary> - public HashSet<string> Staged { get; private set; } - - /// <summary> - /// List of files removed from the index but are existent in the current commit - /// </summary> - public HashSet<string> Removed { get; private set; } - - /// <summary> - /// List of files existent in the index but are missing in the working directory - /// </summary> - public HashSet<string> Missing { get; private set; } - - /// <summary> - /// List of files with unstaged modifications. A file may be modified and staged at the same time if it has been modified after adding. - /// </summary> - public HashSet<string> Modified { get; private set; } - - /// <summary> - /// List of files existing in the working directory but are neither tracked in the index nor in the current commit. - /// </summary> - public HashSet<string> Untracked { get; private set; } - - /// <summary> - /// List of files with staged modifications that conflict. - /// </summary> - public HashSet<string> MergeConflict { get; private set; } - - ///// <summary> - ///// Returns the number of files checked into the git repository - ///// </summary> - //public int IndexSize { get { return _index.Members.Count; } } - - public bool AnyDifferences { get; private set; } - - /// <summary> - /// Recalculates the status - /// </summary> - public void Update() - { - AnyDifferences = false; - Added = new HashSet<string>(); - Staged = new HashSet<string>(); - Removed = new HashSet<string>(); - Missing = new HashSet<string>(); - Modified = new HashSet<string>(); - Untracked = new HashSet<string>(); - MergeConflict = new HashSet<string>(); - - if (_file_paths != null) - UpdateSingleFiles (_file_paths.ToList ()); - else if (_recursive) - UpdateDirectory (new string[] { _root_path }, true); - else - UpdateDirectory (new string[] { _root_path }, false); - } - - void UpdateSingleFiles (List<string> singleFiles) - { - // NGIT HACK: We verify that all the files listed in the result of - // the GitStatus call are actually in the list of files we're interested - // in. This is because NGit cannot properly filter the git tree and - // incorrectly includes extra directories. See bug # - var status = new SpecificStatus (Repository, singleFiles).Call (); - - foreach (var v in status.GetAdded ()) - if (singleFiles.Contains (v)) - Added.Add (v); - - foreach (var v in status.GetChanged ()) - if (singleFiles.Contains (v)) - Modified.Add (v); - - foreach (var v in status.GetConflicting ()) - if (singleFiles.Contains (v)) - MergeConflict.Add (v); - - foreach (var v in status.GetMissing ()) - if (singleFiles.Contains (v)) - Missing.Add (v); - - foreach (var v in status.GetModified ()) - if (singleFiles.Contains (v)) - Modified.Add (v); - - foreach (var v in status.GetRemoved ()) - if (singleFiles.Contains (v)) - Removed.Add (v); - - foreach (var v in status.GetUntracked ()) - if (singleFiles.Contains (v)) - Untracked.Add (v); - } - - /// <summary> - /// Run the diff operation. Until this is called, all lists will be empty - /// </summary> - /// <returns>true if anything is different between index, tree, and workdir</returns> - private void UpdateDirectory (IEnumerable<string> paths, bool recursive) - { - RevWalk rw = new RevWalk (Repository); - ObjectId id = Repository.Resolve (Constants.HEAD); - var commit = id != null ? rw.ParseCommit (id) : null; - - TreeWalk treeWalk = new TreeWalk (Repository); - treeWalk.Reset (); - treeWalk.Recursive = recursive; - - if (commit != null) - treeWalk.AddTree (commit.Tree); - else - treeWalk.AddTree (new EmptyTreeIterator()); - - DirCache dc = Repository.ReadDirCache (); - treeWalk.AddTree (new DirCacheIterator (dc)); - - FileTreeIterator workTree = new FileTreeIterator (Repository.WorkTree, Repository.FileSystem, WorkingTreeOptions.KEY.Parse(Repository.GetConfig())); - treeWalk.AddTree (workTree); - - List<TreeFilter> filters = new List<TreeFilter> (); - filters.Add (new SkipWorkTreeFilter(1)); - - var pathFilters = paths.Where (p => p != ".").Select (p => PathFilter.Create (p)).ToArray (); - if (pathFilters.Length > 1) { - filters.Add (OrTreeFilter.Create (pathFilters)); // Use an OR to join all path filters - } else if (pathFilters.Length == 1) - filters.Add (pathFilters[0]); - - if (filters.Count > 1) - treeWalk.Filter = AndTreeFilter.Create(filters); - else - treeWalk.Filter = filters[0]; - - while (treeWalk.Next()) - { - AbstractTreeIterator treeIterator = treeWalk.GetTree<AbstractTreeIterator>(0); - DirCacheIterator dirCacheIterator = treeWalk.GetTree<DirCacheIterator>(1); - WorkingTreeIterator workingTreeIterator = treeWalk.GetTree<WorkingTreeIterator>(2); - NGit.FileMode fileModeTree = treeWalk.GetFileMode(0); - - if (treeWalk.IsSubtree) { - treeWalk.EnterSubtree (); - continue; - } - - int stage = dirCacheIterator != null ? dirCacheIterator.GetDirCacheEntry ().Stage : 0; - if (stage > 1) - continue; - else if (stage == 1) { - MergeConflict.Add(dirCacheIterator.EntryPathString); - changesExist = true; - continue; - } - - if (treeIterator != null) - { - if (dirCacheIterator != null) - { - if (!treeIterator.EntryObjectId.Equals(dirCacheIterator.EntryObjectId)) - { - // in repo, in index, content diff => changed - Modified.Add(dirCacheIterator.EntryPathString); - changesExist = true; - } - } - else - { - // in repo, not in index => removed - if (!fileModeTree.Equals(NGit.FileMode.TYPE_TREE)) - { - Removed.Add(treeIterator.EntryPathString); - changesExist = true; - } - } - } - else - { - if (dirCacheIterator != null) - { - // not in repo, in index => added - Added.Add(dirCacheIterator.EntryPathString); - changesExist = true; - } - else - { - // not in repo, not in index => untracked - if (workingTreeIterator != null && !workingTreeIterator.IsEntryIgnored()) - { - Untracked.Add(workingTreeIterator.EntryPathString); - changesExist = true; - } - } - } - if (dirCacheIterator != null) - { - if (workingTreeIterator == null) - { - // in index, not in workdir => missing - Missing.Add(dirCacheIterator.EntryPathString); - changesExist = true; - } - else - { - // Workaround to file time resolution issues - long itime = dirCacheIterator.GetDirCacheEntry ().LastModified; - long ftime = workingTreeIterator.GetEntryLastModified (); - if (itime / 1000 != ftime / 1000) { - if (!dirCacheIterator.IdEqual(workingTreeIterator)) - { - // in index, in workdir, content differs => modified - Modified.Add(dirCacheIterator.EntryPathString); - changesExist = true; - } - } - } - } - } - } - } -} diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/StatusView.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/StatusView.cs index 75eab0ff56..becc721ecb 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/StatusView.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/MonoDevelop.VersionControl.Views/StatusView.cs @@ -446,12 +446,17 @@ namespace MonoDevelop.VersionControl.Views diffRenderer.Reset (); if (statuses.Count > 0) { - foreach (VersionInfo n in statuses) { - if (FileVisible (n)) { - if (firstLoad) - changeSet.AddFile (n); - AppendFileInfo (n); + try { + filelist.FreezeChildNotify (); + foreach (VersionInfo n in statuses) { + if (FileVisible (n)) { + if (firstLoad) + changeSet.AddFile (n); + AppendFileInfo (n); + } } + } finally { + filelist.ThawChildNotify (); } } UpdateControlStatus (); diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/gtk-gui/MonoDevelop.VersionControl.Dialogs.CommitDialog.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl/gtk-gui/MonoDevelop.VersionControl.Dialogs.CommitDialog.cs index 0db51e582f..3b37dd72b3 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/gtk-gui/MonoDevelop.VersionControl.Dialogs.CommitDialog.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/gtk-gui/MonoDevelop.VersionControl.Dialogs.CommitDialog.cs @@ -82,8 +82,6 @@ namespace MonoDevelop.VersionControl.Dialogs global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.mainBox [this.scrolledwindow2])); w7.PackType = ((global::Gtk.PackType)(1)); w7.Position = 3; - w7.Expand = false; - w7.Fill = false; // Container child mainBox.Gtk.Box+BoxChild this.label2 = new global::Gtk.Label (); this.label2.Name = "label2"; diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl/gtk-gui/gui.stetic b/main/src/addins/VersionControl/MonoDevelop.VersionControl/gtk-gui/gui.stetic index 1a570cd459..6d4283d615 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl/gtk-gui/gui.stetic +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl/gtk-gui/gui.stetic @@ -1131,9 +1131,7 @@ <packing> <property name="PackType">End</property> <property name="Position">3</property> - <property name="AutoSize">False</property> - <property name="Expand">False</property> - <property name="Fill">False</property> + <property name="AutoSize">True</property> </packing> </child> <child> diff --git a/main/src/core/Mono.Debugging/Mono.Debugging.Client/DebuggerSessionOptions.cs b/main/src/core/Mono.Debugging/Mono.Debugging.Client/DebuggerSessionOptions.cs index 5993a61f71..695d0093a5 100644 --- a/main/src/core/Mono.Debugging/Mono.Debugging.Client/DebuggerSessionOptions.cs +++ b/main/src/core/Mono.Debugging/Mono.Debugging.Client/DebuggerSessionOptions.cs @@ -32,6 +32,7 @@ namespace Mono.Debugging.Client public class DebuggerSessionOptions { public EvaluationOptions EvaluationOptions { get; set; } + public bool StepOverPropertiesAndOperators { get; set; } public bool ProjectAssembliesOnly { get; set; } } } diff --git a/main/src/core/Mono.Debugging/Mono.Debugging.Evaluation/ObjectValueAdaptor.cs b/main/src/core/Mono.Debugging/Mono.Debugging.Evaluation/ObjectValueAdaptor.cs index 5359cc15cf..ddadf6b18b 100644 --- a/main/src/core/Mono.Debugging/Mono.Debugging.Evaluation/ObjectValueAdaptor.cs +++ b/main/src/core/Mono.Debugging/Mono.Debugging.Evaluation/ObjectValueAdaptor.cs @@ -851,7 +851,7 @@ namespace Mono.Debugging.Evaluation if (ctx.Options.AllowToStringCalls) { string res = CallToString (ctx, obj); - if (string.IsNullOrEmpty (res)) + if (res == null) return new EvaluationResult ("null"); return new EvaluationResult ("{" + res + "}"); diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/GtkAlertDialog.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/GtkAlertDialog.cs index 8050967734..675a012a3d 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/GtkAlertDialog.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Dialogs/GtkAlertDialog.cs @@ -74,12 +74,7 @@ namespace MonoDevelop.Ide.Gui.Dialogs // Table 3.3 this.hbox.Spacing = 12; this.hbox.BorderWidth = 6; - - // Table 3.4 - if (this.image != null) - this.image.Yalign = 0.00f; - //this.image.IconSize = Gtk.IconSize.Dialog; - + // Table 3.5 this.label.UseMarkup = true; this.label.Wrap = true; @@ -105,6 +100,7 @@ namespace MonoDevelop.Ide.Gui.Dialogs if (!string.IsNullOrEmpty (message.Icon)) { image = new Image (); + image.Yalign = 0.00f; image.Pixbuf = ImageService.GetPixbuf (message.Icon, IconSize.Dialog); hbox.PackStart (image, false, false, 0); hbox.ReorderChild (image, 0); @@ -162,8 +158,7 @@ namespace MonoDevelop.Ide.Gui.Dialogs buttonNumber = ActionArea.Children.Length - 1; ActionArea.Children[buttonNumber].GrabFocus (); } - - + void ButtonClicked (object sender, EventArgs e) { Gtk.Button clickButton = (Gtk.Button)sender; diff --git a/main/src/tools/MacCrashLogger/Makefile.am b/main/src/tools/MacCrashLogger/Makefile.am index 65c32c8ca2..ea4d04e571 100644 --- a/main/src/tools/MacCrashLogger/Makefile.am +++ b/main/src/tools/MacCrashLogger/Makefile.am @@ -27,6 +27,10 @@ BUNDLE_MONOMAC = $(APP_BUNDLE_RESOURCES)/MonoMac.dll BUNDLE_CRASHLOG = $(APP_BUNDLE_RESOURCES)/MonoDevelop.CrashLog.dll BUNDLE_MONO = $(APP_BUNDLE)/$(APP_NAME) +#after upgrading to xcode 4.3, the /usr/bin/ibtool link is broken, so override PATH +XC43_TOOLS=/Applications/Xcode.app/Contents/Developer/usr/bin +IBTOOL=PATH='$(XC43_TOOLS):$(PATH)' ibtool + INFOPLIST = $(srcdir)/Info.plist MAINXIB = $(srcdir)/MainMenu.xib SCRIPT = $(srcdir)/MonoMacLaunchScript.sh @@ -43,7 +47,7 @@ $(ASSEMBLY): $(build_sources) $(DEPS) $(BUNDLE_MAINNIB): $(MAINXIB) mkdir -p $(APP_BUNDLE_RESOURCES) - ibtool "$^" --compile "$@" + $(IBTOOL) "$^" --compile "$@" $(BUNDLE_INFOPLIST): $(INFOPLIST) mkdir -p $(APP_BUNDLE_MACOS) |