Skip to content

Commit 2c21377

Browse files
authored
Merge pull request #192 from bugsnag/release/v4.1.1
Release v4.1.1
2 parents ba904d9 + 629bad0 commit 2c21377

9 files changed

Lines changed: 87 additions & 65 deletions

File tree

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
Changelog
22
=========
33

4+
## 4.1.1 (2026-04-21)
5+
6+
### Bug fixes
7+
* Amend secondary instance URL to bugsnag.smartbear.com
8+
| [richardelms](https://github.com/richardelms)
9+
| [#186](https://github.com/bugsnag/bugsnag-dotnet/pull/186)
10+
411
## 4.1.0 (2025-07-17)
512

613
### Enhancements

CONTRIBUTING.md

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
## Development Dependencies
44

5-
- Windows 10 pro
5+
- Windows 10 or later
66
- Docker for Windows
7-
- Visual Studio 2017
8-
- [.NET framework 3.5](https://docs.microsoft.com/en-us/dotnet/framework/install/dotnet-35-windows-10)
7+
- Visual Studio 2022 or later
8+
- .NET SDK 6.0+
9+
- .NET SDK 8.0 (for running tests)
10+
- .NET Framework 4.6.2 targeting pack
911

1012
## Running the build script
1113

@@ -51,23 +53,37 @@ See the [README](examples)
5153
If you're a member of the core team, follow these instructions for releasing
5254
bugsnag-dotnet.
5355

54-
### First-time setup
56+
### Versioning
5557

56-
### Every time
58+
This project follows [semantic versioning](http://semver.org):
5759

58-
* Compile new features, enhancements, and fixes into the CHANGELOG.
59-
* Update the project version using [semantic versioning](http://semver.org).
60-
Specifically:
60+
> Given a version number MAJOR.MINOR.PATCH, increment the:
61+
>
62+
> 1. MAJOR version when you make incompatible API changes,
63+
> 2. MINOR version when you add functionality in a backwards-compatible
64+
> manner, and
65+
> 3. PATCH version when you make backwards-compatible bug fixes.
6166
62-
> Given a version number MAJOR.MINOR.PATCH, increment the:
63-
>
64-
> 1. MAJOR version when you make incompatible API changes,
65-
> 2. MINOR version when you add functionality in a backwards-compatible
66-
> manner, and
67-
> 3. PATCH version when you make backwards-compatible bug fixes.
68-
>
69-
> Additional labels for pre-release and build metadata are available as
70-
> extensions to the MAJOR.MINOR.PATCH format.
67+
### Release steps
7168

72-
* Commit and push your changes
73-
* Add a git tag with the new version of the library
69+
1. Create a release branch from `next` (e.g. `release/vX.Y.Z`)
70+
2. Compile new features, enhancements, and fixes into the `CHANGELOG.md`
71+
3. Make a PR from your release branch into `master`
72+
4. Once the PR has been approved, merge the release branch into `master`
73+
5. Create a git tag on `master` with the new version (e.g. `vX.Y.Z`)
74+
6. Create a new release on GitHub https://github.com/bugsnag/bugsnag-dotnet/releases/new
75+
- Use the tag vX.Y.Z as the name of the release
76+
- Copy the release notes from `CHANGELOG.md`
77+
7. Crate a PR from `master` to `next` to keep the branches in sync
78+
79+
### How deployment works
80+
81+
Pushing a git tag triggers an automatic deployment via AppVeyor CI (configured
82+
in `appveyor.yml`):
83+
84+
* The `Appveyor` Cake task runs, which sets the package version from the git
85+
tag and creates NuGet packages (`.nupkg` and `.snupkg` symbol packages)
86+
* AppVeyor's deploy step detects the tag (`appveyor_repo_tag: true`) and
87+
pushes all NuGet and symbol packages to **nuget.org**
88+
* No manual publish step is needed — tagging the commit is what triggers the
89+
release

appveyor.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ artifacts:
1212
deploy:
1313
- provider: NuGet
1414
api_key:
15-
secure: 0b6P8wGK4Rl0WY7UltuKoMY6xytEPQG3wCr2APXcBM5Kn1ZfPdCnL0Yvvb1UTqxF
15+
secure: ZOltiJQYBDnQdQxzM3eROvsQo5RB4INOv6RqUPtE+j7E2HbdKqI6SNX7h3YxNNkO
1616
skip_symbols: false
1717
symbol_server: https://www.nuget.org/api/v2/symbolpackage
1818
artifact: /.*(\.|\.s)nupkg/

src/Bugsnag.ConfigurationSection/Configuration.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ public class Configuration : System.Configuration.ConfigurationSection, IConfigu
1111
{
1212
private static Configuration _configuration = ConfigurationManager.GetSection("bugsnag") as Configuration ?? new Configuration();
1313

14-
private const string HubKeyPrefix = "00000";
15-
private const string HubNotifyUrl = "https://notify.insighthub.smartbear.com";
16-
private const string HubSessionsUrl = "https://sessions.insighthub.smartbear.com";
14+
private const string SecondaryKeyPrefix = "00000";
15+
private const string SecondaryNotifyUrl = "https://notify.bugsnag.smartbear.com";
16+
private const string SecondarySessionsUrl = "https://sessions.bugsnag.smartbear.com";
1717

18-
private static bool IsHubKey(string key) =>
18+
private static bool IsSecondaryKey(string key) =>
1919
!string.IsNullOrEmpty(key) &&
20-
key.StartsWith(HubKeyPrefix, StringComparison.OrdinalIgnoreCase);
20+
key.StartsWith(SecondaryKeyPrefix, StringComparison.OrdinalIgnoreCase);
2121

2222
public static Configuration Settings
2323
{
@@ -89,10 +89,10 @@ public Uri Endpoint
8989
{
9090
get
9191
{
92-
if (IsHubKey(ApiKey) &&
92+
if (IsSecondaryKey(ApiKey) &&
9393
InternalEndpoint == Bugsnag.Configuration.DefaultEndpoint)
9494
{
95-
return new Uri(HubNotifyUrl);
95+
return new Uri(SecondaryNotifyUrl);
9696
}
9797
return new Uri(InternalEndpoint);
9898
}
@@ -406,10 +406,10 @@ public Uri SessionEndpoint
406406
{
407407
get
408408
{
409-
if (IsHubKey(ApiKey) &&
409+
if (IsSecondaryKey(ApiKey) &&
410410
InternalSessionEndpoint == Bugsnag.Configuration.DefaultSessionEndpoint)
411411
{
412-
return new Uri(HubSessionsUrl);
412+
return new Uri(SecondarySessionsUrl);
413413
}
414414
return new Uri(InternalSessionEndpoint);
415415
}

src/Bugsnag/Configuration.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ public class Configuration : IConfiguration
1212
{
1313
public const string DefaultEndpoint = "https://notify.bugsnag.com";
1414
public const string DefaultSessionEndpoint = "https://sessions.bugsnag.com";
15-
public const string HubEndpoint = "https://notify.insighthub.smartbear.com";
16-
public const string HubSessionEndpoint = "https://sessions.insighthub.smartbear.com";
15+
public const string SecondaryEndpoint = "https://notify.bugsnag.smartbear.com";
16+
public const string SecondarySessionEndpoint = "https://sessions.bugsnag.smartbear.com";
1717
private const string HubKeyPrefix = "00000";
1818

1919

@@ -26,9 +26,9 @@ public Configuration(string apiKey)
2626
{
2727
ApiKey = apiKey;
2828

29-
bool isHubKey = IsHubKey(apiKey);
30-
Endpoint = new Uri(isHubKey ? HubEndpoint : DefaultEndpoint);
31-
SessionEndpoint = new Uri(isHubKey ? HubSessionEndpoint : DefaultSessionEndpoint);
29+
bool isSecondaryKey = IsSecondaryKey(apiKey);
30+
Endpoint = new Uri(isSecondaryKey ? SecondaryEndpoint : DefaultEndpoint);
31+
SessionEndpoint = new Uri(isSecondaryKey ? SecondarySessionEndpoint : DefaultSessionEndpoint);
3232

3333
AutoNotify = true;
3434
SessionTrackingInterval = TimeSpan.FromSeconds(60);
@@ -71,8 +71,7 @@ public Configuration(string apiKey)
7171

7272
public int MaximumBreadcrumbs { get; set; }
7373

74-
private static bool IsHubKey(string key) =>
75-
!string.IsNullOrEmpty(key) &&
76-
key.StartsWith(HubKeyPrefix, StringComparison.OrdinalIgnoreCase);
74+
private static bool IsSecondaryKey(string key) =>
75+
!string.IsNullOrEmpty(key) && key.StartsWith(HubKeyPrefix, StringComparison.OrdinalIgnoreCase);
7776
}
7877
}

tests/Bugsnag.ConfigurationSection.Tests/EndpointTests.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
namespace Bugsnag.ConfigurationSection.Tests
66
{
77
/// <summary>
8-
/// Verifies that a “Hub”-flavoured API-key (prefix 00000…)
9-
/// automatically switches the notify / sessions hosts to InsightHub,
8+
/// Verifies that a Secondary-flavoured API-key (prefix 00000…)
9+
/// automatically switches the notify / sessions hosts to smartbear.com,
1010
/// *unless* the user deliberately overrides them in the XML.
1111
/// </summary>
12-
public class HubEndpointTests
12+
public class SecondaryEndpointTests
1313
{
1414
private static IConfiguration Load(string cfgName)
1515
{
@@ -21,38 +21,38 @@ private static IConfiguration Load(string cfgName)
2121
}
2222

2323
/*─────────────────────────────────────────────────────────
24-
* 1. Hub key, *default* endpoints → InsightHub hosts
24+
* 1. Secondary key, *default* endpoints → smartbear.com hosts
2525
*────────────────────────────────────────────────────────*/
2626
[Fact]
27-
public void HubKey_UsesInsightHubHosts_WhenNotOverridden()
27+
public void SecondaryKey_UsesSmartbearHosts_WhenNotOverridden()
2828
{
29-
var cfg = Load("HubDefault"); // see HubDefault.config below
29+
var cfg = Load("SecondaryDefault"); // see SecondaryDefault.config below
3030

3131
Assert.NotNull(cfg);
3232
Assert.Equal("00000123456789abcdef0123456789", cfg.ApiKey);
3333

34-
Assert.Equal(new Uri("https://notify.insighthub.smartbear.com"), cfg.Endpoint);
35-
Assert.Equal(new Uri("https://sessions.insighthub.smartbear.com"), cfg.SessionEndpoint);
34+
Assert.Equal(new Uri("https://notify.bugsnag.smartbear.com"), cfg.Endpoint);
35+
Assert.Equal(new Uri("https://sessions.bugsnag.smartbear.com"), cfg.SessionEndpoint);
3636
}
3737

3838
/*─────────────────────────────────────────────────────────
39-
* 2. Hub key but custom <endpoint> / <sessionsEndpoint> →
39+
* 2. Secondary key but custom <endpoint> / <sessionsEndpoint> →
4040
* **user preference wins**
4141
*────────────────────────────────────────────────────────*/
4242
[Fact]
43-
public void HubKey_HonoursCustomEndpoints_WhenPresent()
43+
public void SecondaryKey_HonoursCustomEndpoints_WhenPresent()
4444
{
45-
var cfg = Load("HubCustomEndpoint"); // see HubCustomEndpoint.config below
45+
var cfg = Load("SecondaryEndpoint"); // see SecondaryEndpoint.config below
4646

4747
Assert.NotNull(cfg);
4848
Assert.Equal("00000feedfacecafebeefdeadbeef", cfg.ApiKey);
4949

50-
Assert.Equal(new Uri("https://corp.example.com/notify"), cfg.Endpoint);
50+
Assert.Equal(new Uri("https://corp.example.com/notify"), cfg.Endpoint);
5151
Assert.Equal(new Uri("https://corp.example.com/sessions"), cfg.SessionEndpoint);
5252
}
5353

5454
/*─────────────────────────────────────────────────────────
55-
* 3. Non-hub key ⇒ still Bugsnag hosts
55+
* 3. Non-secondary key ⇒ still Bugsnag hosts
5656
*────────────────────────────────────────────────────────*/
5757
[Fact]
5858
public void ClassicKey_KeepsBugsnagHosts()
@@ -62,7 +62,7 @@ public void ClassicKey_KeepsBugsnagHosts()
6262
Assert.NotNull(cfg);
6363
Assert.Equal("abcd1234abcd1234abcd1234abcd1234", cfg.ApiKey);
6464

65-
Assert.Equal(new Uri(Bugsnag.Configuration.DefaultEndpoint), cfg.Endpoint);
65+
Assert.Equal(new Uri(Bugsnag.Configuration.DefaultEndpoint), cfg.Endpoint);
6666
Assert.Equal(new Uri(Bugsnag.Configuration.DefaultSessionEndpoint), cfg.SessionEndpoint);
6767
}
6868
}

tests/Bugsnag.ConfigurationSection.Tests/HubDefault.config renamed to tests/Bugsnag.ConfigurationSection.Tests/SecondaryDefault.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@
55
type="Bugsnag.ConfigurationSection.Configuration, Bugsnag.ConfigurationSection" />
66
</configSections>
77

8-
<!-- Hub-flavoured key, *no* explicit <endpoint> elements -->
8+
<!-- Secondary key, *no* explicit <endpoint> elements -->
99
<bugsnag apiKey="00000123456789abcdef0123456789" />
1010
</configuration>

tests/Bugsnag.ConfigurationSection.Tests/HubCustomEndpoint.config renamed to tests/Bugsnag.ConfigurationSection.Tests/SecondaryEndpoint.config

File renamed without changes.

tests/Bugsnag.Tests/EndpointTests.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,39 +7,39 @@ namespace Bugsnag.Tests
77
{
88
public class EndpointTests
99
{
10-
// 5 leading zeroes → Insight Hub
11-
private const string HubKey = "00000aaaaaaaaaaaaaaaaaaaaaaaaaaa";
12-
// Any non-hub key → classic Bugsnag
10+
// 5 leading zeroes → Secondary
11+
private const string SecondaryKey = "00000aaaaaaaaaaaaaaaaaaaaaaaaaaa";
12+
// Any non-secondary key → classic
1313
private const string ClassicKey = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
1414

1515
[Fact]
1616
public void ClassicKey_Uses_Bugsnag_Hosts()
1717
{
1818
var cfg = new CoreConfiguration(ClassicKey);
1919

20-
Assert.Equal(new Uri(CoreConfiguration.DefaultEndpoint), cfg.Endpoint);
20+
Assert.Equal(new Uri(CoreConfiguration.DefaultEndpoint), cfg.Endpoint);
2121
Assert.Equal(new Uri(CoreConfiguration.DefaultSessionEndpoint), cfg.SessionEndpoint);
2222
}
2323

2424
[Fact]
25-
public void HubKey_Uses_InsightHub_Hosts()
25+
public void SecondaryKey_Uses_Smartbear_Hosts()
2626
{
27-
var cfg = new CoreConfiguration(HubKey);
27+
var cfg = new CoreConfiguration(SecondaryKey);
2828

29-
Assert.Equal(new Uri(CoreConfiguration.HubEndpoint), cfg.Endpoint);
30-
Assert.Equal(new Uri(CoreConfiguration.HubSessionEndpoint), cfg.SessionEndpoint);
29+
Assert.Equal(new Uri(CoreConfiguration.SecondaryEndpoint), cfg.Endpoint);
30+
Assert.Equal(new Uri(CoreConfiguration.SecondarySessionEndpoint), cfg.SessionEndpoint);
3131
}
3232

3333
[Fact]
34-
public void HubKey_Honours_Custom_Endpoints_When_Provided()
34+
public void SecondaryKey_Honours_Custom_Endpoints_When_Provided()
3535
{
36-
var cfg = new CoreConfiguration(HubKey)
36+
var cfg = new CoreConfiguration(SecondaryKey)
3737
{
38-
Endpoint = new Uri("https://notify.example.com"),
38+
Endpoint = new Uri("https://notify.example.com"),
3939
SessionEndpoint = new Uri("https://sessions.example.com")
4040
};
4141

42-
Assert.Equal(new Uri("https://notify.example.com"), cfg.Endpoint);
42+
Assert.Equal(new Uri("https://notify.example.com"), cfg.Endpoint);
4343
Assert.Equal(new Uri("https://sessions.example.com"), cfg.SessionEndpoint);
4444
}
4545

@@ -48,7 +48,7 @@ public void BlankKey_Falls_Back_To_Default_Hosts()
4848
{
4949
var cfg = new CoreConfiguration(string.Empty);
5050

51-
Assert.Equal(new Uri(CoreConfiguration.DefaultEndpoint), cfg.Endpoint);
51+
Assert.Equal(new Uri(CoreConfiguration.DefaultEndpoint), cfg.Endpoint);
5252
Assert.Equal(new Uri(CoreConfiguration.DefaultSessionEndpoint), cfg.SessionEndpoint);
5353
}
5454
}

0 commit comments

Comments
 (0)