Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions project/project.godot
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,4 @@ logger/logs=143
logger/limits/throttle_window_ms=1000
experimental/attach_screenshot=true
experimental/screenshot_level=1
schema_version=1
34 changes: 2 additions & 32 deletions src/sentry/sentry_options.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "sentry_options.h"

#include "sentry/environment.h"
#include "sentry/settings_migrations.h"
#include "sentry_sdk.h" // for SentrySDK::Level variant casts

#include <godot_cpp/classes/os.hpp>
Expand Down Expand Up @@ -36,34 +37,6 @@ void _define_setting(const godot::PropertyInfo &p_info, const godot::Variant &p_
ProjectSettings::get_singleton()->add_property_info(info);
}

void _migrate_setting(const String &p_old_name, const String &p_new_name) {
if (ProjectSettings::get_singleton()->has_setting(p_old_name)) {
Variant value = ProjectSettings::get_singleton()->get_setting(p_old_name);
ProjectSettings::get_singleton()->set_setting(p_new_name, value);
ProjectSettings::get_singleton()->set_setting(p_old_name, Variant());
}
}

void _migrate_messages_as_breadcrumbs() {
String old_setting = "sentry/logger/messages_as_breadcrumbs";
String mask_setting = "sentry/logger/breadcrumbs";

if (!ProjectSettings::get_singleton()->has_setting(old_setting)) {
return;
}

bool was_enabled = ProjectSettings::get_singleton()->get_setting(old_setting);
int mask = ProjectSettings::get_singleton()->get_setting(mask_setting,
int(sentry::GodotLoggerEventMask::MASK_ALL));
if (was_enabled) {
mask |= sentry::GodotLoggerEventMask::MASK_MESSAGE;
} else {
mask &= ~sentry::GodotLoggerEventMask::MASK_MESSAGE;
}
ProjectSettings::get_singleton()->set_setting(mask_setting, mask);
ProjectSettings::get_singleton()->set_setting(old_setting, Variant());
}

} // unnamed namespace

namespace sentry {
Expand Down Expand Up @@ -117,10 +90,7 @@ void SentryOptions::_define_project_settings(const Ref<SentryOptions> &p_options
ERR_FAIL_COND(p_options.is_null());
ERR_FAIL_NULL(ProjectSettings::get_singleton());

// Migrate project settings from earlier SDK versions.
// TODO: Fold these into a versioned migration dispatcher in a follow-up.
_migrate_setting("sentry/experimental/enable_logs", "sentry/options/enable_logs");
_migrate_messages_as_breadcrumbs();
sentry::run_project_settings_migrations();

_define_setting("sentry/options/auto_init", p_options->auto_init);
_define_setting("sentry/options/skip_auto_init_on_editor_play", p_options->skip_auto_init_on_editor_play);
Expand Down
107 changes: 107 additions & 0 deletions src/sentry/settings_migrations.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
#include "settings_migrations.h"

#include "sentry/godot_error_types.h"

#include <godot_cpp/classes/engine.hpp>
#include <godot_cpp/classes/project_settings.hpp>
#include <godot_cpp/variant/utility_functions.hpp>

using namespace godot;

namespace {

void _define_internal_project_setting(const String &p_name, const Variant &p_default_value) {
if (!ProjectSettings::get_singleton()->has_setting(p_name)) {
ProjectSettings::get_singleton()->set_setting(p_name, p_default_value);
}
ProjectSettings::get_singleton()->set_initial_value(p_name, p_default_value);
ProjectSettings::get_singleton()->set_as_internal(p_name, true);
}

bool _has_any_persisted_sentry_settings() {
const TypedArray<Dictionary> properties = ProjectSettings::get_singleton()->get_property_list();
for (int i = 0; i < properties.size(); ++i) {
const String name = ((Dictionary)properties[i]).get("name", String());
if (name.begins_with("sentry/")) {
return true;
}
}
return false;
}

void _set_project_setting_and_save(const String &p_key, const Variant &p_value) {
ProjectSettings::get_singleton()->set_setting(p_key, p_value);
if (Engine::get_singleton()->is_editor_hint()) {
ProjectSettings::get_singleton()->call_deferred("save");
}
}

void _rename_setting(const String &p_old_name, const String &p_new_name) {
if (ProjectSettings::get_singleton()->has_setting(p_old_name)) {
Variant value = ProjectSettings::get_singleton()->get_setting(p_old_name);
ProjectSettings::get_singleton()->set_setting(p_new_name, value);
ProjectSettings::get_singleton()->set_setting(p_old_name, Variant());
}
}

void _migrate_messages_as_breadcrumbs() {
const String old_setting = "sentry/logger/messages_as_breadcrumbs";
const String mask_setting = "sentry/logger/breadcrumbs";

const bool was_enabled = ProjectSettings::get_singleton()->get_setting(old_setting, true);
Comment thread
limbonaut marked this conversation as resolved.
int mask = ProjectSettings::get_singleton()->get_setting(
mask_setting, int(sentry::GodotLoggerEventMask::MASK_ALL));

if (was_enabled) {
mask |= sentry::GodotLoggerEventMask::MASK_MESSAGE;
} else {
mask &= ~sentry::GodotLoggerEventMask::MASK_MESSAGE;
}
ProjectSettings::get_singleton()->set_setting(mask_setting, mask);
Comment thread
limbonaut marked this conversation as resolved.
ProjectSettings::get_singleton()->set_setting(old_setting, Variant());
Comment thread
limbonaut marked this conversation as resolved.
}

void _migrate_to_v1() {
_rename_setting("sentry/experimental/enable_logs", "sentry/options/enable_logs");
_migrate_messages_as_breadcrumbs();
}

} // unnamed namespace

namespace sentry {

constexpr static int SCHEMA_VERSION = 1;

void run_project_settings_migrations() {
const String schema_version_key = "sentry/schema_version";

const bool has_version = ProjectSettings::get_singleton()->has_setting(schema_version_key);
const bool is_fresh_install = !has_version && !_has_any_persisted_sentry_settings();

_define_internal_project_setting(schema_version_key, 0);

if (is_fresh_install) {
_set_project_setting_and_save(schema_version_key, SCHEMA_VERSION);
return;
}

const int from_version = ProjectSettings::get_singleton()->get_setting(schema_version_key, 0);

if (from_version > SCHEMA_VERSION) {
UtilityFunctions::push_warning("Sentry: Project settings are from a newer SDK version than the current version. Migration is not supported.");
return;
}

if (from_version < 1) {
_migrate_to_v1();
}

if (from_version < SCHEMA_VERSION) {
_set_project_setting_and_save(schema_version_key, SCHEMA_VERSION);
UtilityFunctions::print(
vformat("Sentry: Project settings migrated from schema version %d to %d.",
from_version, SCHEMA_VERSION));
}
}

} //namespace sentry
9 changes: 9 additions & 0 deletions src/sentry/settings_migrations.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#pragma once

namespace sentry {

// Runs Sentry project settings migrations, updating schema version and migrating legacy settings.
// This function should be called before Sentry-related settings are defined (see sentry_options.cpp).
void run_project_settings_migrations();

} //namespace sentry
Loading