From 012096082e4701058ddc0970895d46328605bf6d Mon Sep 17 00:00:00 2001 From: Wenxi Zeng Date: Mon, 4 Mar 2024 15:22:26 -0600 Subject: [PATCH 1/4] prepare release 2.3.4 (#96) Co-authored-by: Wenxi Zeng --- Analytics-CSharp/Analytics-CSharp.csproj | 2 +- Analytics-CSharp/Segment/Analytics/Version.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Analytics-CSharp/Analytics-CSharp.csproj b/Analytics-CSharp/Analytics-CSharp.csproj index d48adc7..2d383d7 100644 --- a/Analytics-CSharp/Analytics-CSharp.csproj +++ b/Analytics-CSharp/Analytics-CSharp.csproj @@ -10,7 +10,7 @@ Segment, Inc The hassle-free way to add analytics to your C# app. - 2.3.3 + 2.3.4 MIT https://github.com/segmentio/Analytics-CSharp git diff --git a/Analytics-CSharp/Segment/Analytics/Version.cs b/Analytics-CSharp/Segment/Analytics/Version.cs index 9604455..7b97d1f 100644 --- a/Analytics-CSharp/Segment/Analytics/Version.cs +++ b/Analytics-CSharp/Segment/Analytics/Version.cs @@ -2,6 +2,6 @@ namespace Segment.Analytics { internal static class Version { - internal const string SegmentVersion = "2.3.3"; + internal const string SegmentVersion = "2.3.4"; } } From cd7404b9313aed6d6d471263585ae77e701c8b2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Neven=20Mari=C4=87?= <58113389+dimitri-dev@users.noreply.github.com> Date: Mon, 22 Apr 2024 23:28:08 +0200 Subject: [PATCH 2/4] attempt a fix for issue #97 (#98) --- Analytics-CSharp/Segment/Analytics/Analytics.cs | 4 ++++ Analytics-CSharp/Segment/Analytics/Timeline.cs | 14 +++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Analytics-CSharp/Segment/Analytics/Analytics.cs b/Analytics-CSharp/Segment/Analytics/Analytics.cs index 06325db..78ec1ab 100644 --- a/Analytics-CSharp/Segment/Analytics/Analytics.cs +++ b/Analytics-CSharp/Segment/Analytics/Analytics.cs @@ -191,6 +191,10 @@ public virtual void Reset() { Settings? returnSettings = null; IState system = await Store.CurrentState(); + + // I don't understand this as Store.CurrentState will at worst return a default(TState) which will be a default(System) in this case, hence this cast will always go through? + // System is a struct, so the default is an empty instance, not null + // might as well write /* if (true) */ if (system is System convertedSystem) { returnSettings = convertedSystem._settings; diff --git a/Analytics-CSharp/Segment/Analytics/Timeline.cs b/Analytics-CSharp/Segment/Analytics/Timeline.cs index 9b002b3..299c265 100644 --- a/Analytics-CSharp/Segment/Analytics/Timeline.cs +++ b/Analytics-CSharp/Segment/Analytics/Timeline.cs @@ -161,10 +161,18 @@ internal void Add(Plugin plugin) analytics.AnalyticsScope.Launch(analytics.AnalyticsDispatcher, async () => { Settings? settings = await plugin.Analytics.SettingsAsync(); + + // This is basically never null, look at the comment in SettingsAsync + if (settings == null) + { + return; + } + + // Fetch system afterwards for a minuscule but cool performance gain System system = await analytics.Store.CurrentState(); - // Don't initialize unless we have updated settings from the web. - // CheckSettings will initialize everything added before then, so wait until other inits have happened. - if (settings.HasValue && system._initializedPlugins.Count > 0) + + // Check for nullability because CurrentState returns default(IState) which could make the .Count throw a NullReferenceException + if (system._initializedPlugins != null && system._initializedPlugins.Count > 0) { await analytics.Store.Dispatch(new System.AddInitializedPluginAction(new HashSet{plugin.GetHashCode()})); plugin.Update(settings.Value, UpdateType.Initial); From 057f872523e981ff8192c605cb10c68079e2eff7 Mon Sep 17 00:00:00 2001 From: Michael Grosse Huelsewiesche Date: Mon, 22 Apr 2024 14:35:30 -0700 Subject: [PATCH 3/4] Fixing a possible null pointer exception and removing unnecessary nullability for settings (#99) --- .../Segment/Analytics/Analytics.cs | 20 +++++-------------- .../Segment/Analytics/Timeline.cs | 14 +++++-------- 2 files changed, 10 insertions(+), 24 deletions(-) diff --git a/Analytics-CSharp/Segment/Analytics/Analytics.cs b/Analytics-CSharp/Segment/Analytics/Analytics.cs index 78ec1ab..7c2cb68 100644 --- a/Analytics-CSharp/Segment/Analytics/Analytics.cs +++ b/Analytics-CSharp/Segment/Analytics/Analytics.cs @@ -176,9 +176,9 @@ public virtual void Reset() /// it's not recommended to be used in async method. /// /// Instance of - public virtual Settings? Settings() + public virtual Settings Settings() { - Task task = SettingsAsync(); + Task task = SettingsAsync(); task.Wait(); return task.Result; } @@ -187,20 +187,10 @@ public virtual void Reset() /// Retrieve the settings. /// /// Instance of - public virtual async Task SettingsAsync() + public virtual async Task SettingsAsync() { - Settings? returnSettings = null; - IState system = await Store.CurrentState(); - - // I don't understand this as Store.CurrentState will at worst return a default(TState) which will be a default(System) in this case, hence this cast will always go through? - // System is a struct, so the default is an empty instance, not null - // might as well write /* if (true) */ - if (system is System convertedSystem) - { - returnSettings = convertedSystem._settings; - } - - return returnSettings; + System system = await Store.CurrentState(); + return system._settings; } #endregion diff --git a/Analytics-CSharp/Segment/Analytics/Timeline.cs b/Analytics-CSharp/Segment/Analytics/Timeline.cs index 299c265..c2d4dbf 100644 --- a/Analytics-CSharp/Segment/Analytics/Timeline.cs +++ b/Analytics-CSharp/Segment/Analytics/Timeline.cs @@ -160,26 +160,22 @@ internal void Add(Plugin plugin) Analytics analytics = plugin.Analytics; analytics.AnalyticsScope.Launch(analytics.AnalyticsDispatcher, async () => { - Settings? settings = await plugin.Analytics.SettingsAsync(); - - // This is basically never null, look at the comment in SettingsAsync - if (settings == null) - { - return; - } - + Settings settings = await plugin.Analytics.SettingsAsync(); // Fetch system afterwards for a minuscule but cool performance gain System system = await analytics.Store.CurrentState(); + // Don't initialize unless we have updated settings from the web. + // CheckSettings will initialize everything added before then, so wait until other inits have happened. // Check for nullability because CurrentState returns default(IState) which could make the .Count throw a NullReferenceException if (system._initializedPlugins != null && system._initializedPlugins.Count > 0) { await analytics.Store.Dispatch(new System.AddInitializedPluginAction(new HashSet{plugin.GetHashCode()})); - plugin.Update(settings.Value, UpdateType.Initial); + plugin.Update(settings, UpdateType.Initial); } }); } + internal void Remove(Plugin plugin) => _plugins.RemoveAll(tempPlugin => tempPlugin == plugin); internal RawEvent Execute(RawEvent incomingEvent) From a33fff79c1fdc2b566a958a2f83cc005f219aa80 Mon Sep 17 00:00:00 2001 From: Wenxi Zeng Date: Mon, 22 Apr 2024 17:59:24 -0500 Subject: [PATCH 4/4] update version to 2.3.5 --- Analytics-CSharp/Analytics-CSharp.csproj | 2 +- Analytics-CSharp/Segment/Analytics/Version.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Analytics-CSharp/Analytics-CSharp.csproj b/Analytics-CSharp/Analytics-CSharp.csproj index 2d383d7..bcf9164 100644 --- a/Analytics-CSharp/Analytics-CSharp.csproj +++ b/Analytics-CSharp/Analytics-CSharp.csproj @@ -10,7 +10,7 @@ Segment, Inc The hassle-free way to add analytics to your C# app. - 2.3.4 + 2.3.5 MIT https://github.com/segmentio/Analytics-CSharp git diff --git a/Analytics-CSharp/Segment/Analytics/Version.cs b/Analytics-CSharp/Segment/Analytics/Version.cs index 7b97d1f..aafad40 100644 --- a/Analytics-CSharp/Segment/Analytics/Version.cs +++ b/Analytics-CSharp/Segment/Analytics/Version.cs @@ -2,6 +2,6 @@ namespace Segment.Analytics { internal static class Version { - internal const string SegmentVersion = "2.3.4"; + internal const string SegmentVersion = "2.3.5"; } }