Author: cazfi Date: Tue Jan 13 23:58:58 2015 New Revision: 27668 URL: http://svn.gna.org/viewcvs/freeciv?rev=27668&view=rev Log: Support alternative ruleset capstr in compatibility mode ruleset loading.
See patch #5692 Modified: trunk/server/rscompat.c trunk/server/rscompat.h trunk/server/ruleset.c Modified: trunk/server/rscompat.c URL: http://svn.gna.org/viewcvs/freeciv/trunk/server/rscompat.c?rev=27668&r1=27667&r2=27668&view=diff ============================================================================== --- trunk/server/rscompat.c (original) +++ trunk/server/rscompat.c Tue Jan 13 23:58:58 2015 @@ -43,9 +43,11 @@ This checks the string and that the required capabilities are satisified. **************************************************************************/ int rscompat_check_capabilities(struct section_file *file, - const char *filename) + const char *filename, + struct rscompat_info *info) { const char *datafile_options; + bool ok = FALSE; if (!(datafile_options = secfile_lookup_str(file, "datafile.options"))) { log_fatal("\"%s\": ruleset capability problem:", filename); @@ -53,22 +55,36 @@ return 0; } - if (!has_capabilities(RULESET_CAPABILITIES, datafile_options)) { - log_fatal("\"%s\": ruleset datafile appears incompatible:", filename); - log_fatal(" datafile options: %s", datafile_options); - log_fatal(" supported options: %s", RULESET_CAPABILITIES); - ruleset_error(LOG_ERROR, "Capability problem"); - return 0; + if (info->compat_mode) { + /* Check alternative capstr first, so that when we do the main capstr check, + * we already know that failures there are fatal (error message correct, can return + * immediately) */ + + if (has_capabilities(RULESET_COMPAT_CAP, datafile_options) + && has_capabilities(datafile_options, RULESET_COMPAT_CAP)) { + ok = TRUE; + } } - if (!has_capabilities(datafile_options, RULESET_CAPABILITIES)) { - log_fatal("\"%s\": ruleset datafile claims required option(s)" - " that we don't support:", filename); - log_fatal(" datafile options: %s", datafile_options); - log_fatal(" supported options: %s", RULESET_CAPABILITIES); - ruleset_error(LOG_ERROR, "Capability problem"); - return 0; + if (!ok) { + if (!has_capabilities(RULESET_CAPABILITIES, datafile_options)) { + log_fatal("\"%s\": ruleset datafile appears incompatible:", filename); + log_fatal(" datafile options: %s", datafile_options); + log_fatal(" supported options: %s", RULESET_CAPABILITIES); + ruleset_error(LOG_ERROR, "Capability problem"); + + return 0; + } + if (!has_capabilities(datafile_options, RULESET_CAPABILITIES)) { + log_fatal("\"%s\": ruleset datafile claims required option(s)" + " that we don't support:", filename); + log_fatal(" datafile options: %s", datafile_options); + log_fatal(" supported options: %s", RULESET_CAPABILITIES); + ruleset_error(LOG_ERROR, "Capability problem"); + + return 0; + } } return secfile_lookup_int_default(file, 1, "datafile.format_version"); Modified: trunk/server/rscompat.h URL: http://svn.gna.org/viewcvs/freeciv/trunk/server/rscompat.h?rev=27668&r1=27667&r2=27668&view=diff ============================================================================== --- trunk/server/rscompat.h (original) +++ trunk/server/rscompat.h Tue Jan 13 23:58:58 2015 @@ -20,6 +20,8 @@ /* utility */ #include "support.h" +#define RULESET_COMPAT_CAP "+Freeciv-ruleset-Devel-2014.September.14c" + struct rscompat_info { bool compat_mode; @@ -37,7 +39,8 @@ void rscompat_init_info(struct rscompat_info *info); -int rscompat_check_capabilities(struct section_file *file, const char *filename); +int rscompat_check_capabilities(struct section_file *file, const char *filename, + struct rscompat_info *info); void rscompat_postprocess(struct rscompat_info *info); Modified: trunk/server/ruleset.c URL: http://svn.gna.org/viewcvs/freeciv/trunk/server/ruleset.c?rev=27668&r1=27667&r2=27668&view=diff ============================================================================== --- trunk/server/ruleset.c (original) +++ trunk/server/ruleset.c Tue Jan 13 23:58:58 2015 @@ -1078,7 +1078,7 @@ const char *filename = secfile_name(file); bool ok = TRUE; - compat->ver_techs = rscompat_check_capabilities(file, filename); + compat->ver_techs = rscompat_check_capabilities(file, filename, compat); if (compat->ver_techs <= 0) { return FALSE; } @@ -1465,7 +1465,7 @@ char msg[MAX_LEN_MSG]; bool ok = TRUE; - compat->ver_units = rscompat_check_capabilities(file, filename); + compat->ver_units = rscompat_check_capabilities(file, filename, compat); if (compat->ver_units <= 0) { return FALSE; } @@ -1992,7 +1992,7 @@ const char *filename = secfile_name(file); bool ok = TRUE; - compat->ver_buildings = rscompat_check_capabilities(file, filename); + compat->ver_buildings = rscompat_check_capabilities(file, filename, compat); if (compat->ver_buildings <= 0) { return FALSE; } @@ -2367,7 +2367,7 @@ const char *filename = secfile_name(file); bool ok = TRUE; - compat->ver_terrain = rscompat_check_capabilities(file, filename); + compat->ver_terrain = rscompat_check_capabilities(file, filename, compat); if (compat->ver_terrain <= 0) { return FALSE; } @@ -3230,7 +3230,7 @@ const char *filename = secfile_name(file); bool ok = TRUE; - compat->ver_governments = rscompat_check_capabilities(file, filename); + compat->ver_governments = rscompat_check_capabilities(file, filename, compat); if (compat->ver_governments <= 0) { return FALSE; } @@ -3711,7 +3711,7 @@ size_t agcount, atcount, ascount; bool ok = TRUE; - compat->ver_nations = rscompat_check_capabilities(file, filename); + compat->ver_nations = rscompat_check_capabilities(file, filename, compat); if (compat->ver_nations <= 0) { return FALSE; } @@ -4374,7 +4374,7 @@ int i; bool ok = TRUE; - compat->ver_styles = rscompat_check_capabilities(file, filename); + compat->ver_styles = rscompat_check_capabilities(file, filename, compat); if (compat->ver_styles <= 0) { return FALSE; } @@ -4459,7 +4459,7 @@ struct section_list *sec; bool ok = TRUE; - compat->ver_cities = rscompat_check_capabilities(file, filename); + compat->ver_cities = rscompat_check_capabilities(file, filename, compat); if (compat->ver_cities <= 0) { return FALSE; } @@ -4590,7 +4590,7 @@ filename = secfile_name(file); - compat->ver_effects = rscompat_check_capabilities(file, filename); + compat->ver_effects = rscompat_check_capabilities(file, filename, compat); if (compat->ver_effects <= 0) { return FALSE; } @@ -4740,7 +4740,7 @@ filename = secfile_name(file); /* section: datafile */ - compat->ver_game = rscompat_check_capabilities(file, filename); + compat->ver_game = rscompat_check_capabilities(file, filename, compat); if (compat->ver_game <= 0) { return FALSE; } _______________________________________________ Freeciv-commits mailing list Freeciv-commits@gna.org https://mail.gna.org/listinfo/freeciv-commits