Added filtering by toolset and OS, and pattern matching (r453:460)

This commit is contained in:
starkos 2008-07-29 22:51:01 +00:00
parent ea6a7d7be2
commit 21882c1218
11 changed files with 133 additions and 12 deletions

View File

@ -42,7 +42,7 @@ struct FxAction
project_set_guid(prj, "AE2461B7-236F-4278-81D3-F0D476F9A4C0"); project_set_guid(prj, "AE2461B7-236F-4278-81D3-F0D476F9A4C0");
project_set_language(prj, "c++"); project_set_language(prj, "c++");
flt = filter_create(); flt = session_get_filter(sess);
filter_set_value(flt, FilterConfig, "Debug"); filter_set_value(flt, FilterConfig, "Debug");
project_set_filter(prj, flt); project_set_filter(prj, flt);
} }
@ -51,7 +51,6 @@ struct FxAction
{ {
stream_destroy(strm); stream_destroy(strm);
session_destroy(sess); session_destroy(sess);
filter_destroy(flt);
} }

View File

@ -4,6 +4,7 @@
* \author Copyright (c) 2002-2008 Jason Perkins and the Premake project * \author Copyright (c) 2002-2008 Jason Perkins and the Premake project
*/ */
#include <assert.h>
#include "premake.h" #include "premake.h"
#include "platform.h" #include "platform.h"
@ -28,6 +29,26 @@ enum Platform platform_get()
} }
const char* platform_get_name(void)
{
enum Platform id = platform_get();
switch (id)
{
case BSD:
return "BSD";
case Linux:
return "Linux";
case MacOSX:
return "MacOSX";
case Windows:
return "Windows";
default:
assert(0);
return 0;
}
}
void platform_set(enum Platform id) void platform_set(enum Platform id)
{ {
CurrentPlatform = id; CurrentPlatform = id;

View File

@ -78,6 +78,12 @@ int platform_dir_set_current(const char* path);
enum Platform platform_get(void); enum Platform platform_get(void);
/**
* Retrieve the current platform identifier as a string value.
*/
const char* platform_get_name(void);
/** /**
* Create a new platform file search context. * Create a new platform file search context.
*/ */

View File

@ -14,14 +14,16 @@
DEFINE_CLASS(Filter) DEFINE_CLASS(Filter)
{ {
const char* values[NumFilters]; const char* values[NumFilters];
Script script;
}; };
/** /**
* Create and initialize a new configuration filter. * Create and initialize a new configuration filter.
* \param script A scripting object; used for script_is_match().
* \returns A new configuration filter. * \returns A new configuration filter.
*/ */
Filter filter_create(void) Filter filter_create(Script script)
{ {
int i; int i;
@ -30,6 +32,7 @@ Filter filter_create(void)
{ {
flt->values[i] = NULL; flt->values[i] = NULL;
} }
flt->script = script;
return flt; return flt;
} }
@ -81,7 +84,8 @@ int filter_is_match(Filter flt, Strings terms)
const char* term = strings_item(terms, ti); const char* term = strings_item(terms, ti);
for (ki = 0; ki < NumFilters; ++ki) for (ki = 0; ki < NumFilters; ++ki)
{ {
if (cstr_eq(flt->values[ki], term)) const char* key = flt->values[ki];
if (key != NULL && script_is_match(flt->script, key, term))
{ {
is_match = 1; is_match = 1;
break; break;

View File

@ -10,6 +10,7 @@
#define PREMAKE_FILTER_H #define PREMAKE_FILTER_H
#include "base/strings.h" #include "base/strings.h"
#include "script/script.h"
/** /**
@ -17,14 +18,16 @@
*/ */
enum FilterKey enum FilterKey
{ {
FilterAction,
FilterConfig, FilterConfig,
FilterOS,
NumFilters NumFilters
}; };
DECLARE_CLASS(Filter) DECLARE_CLASS(Filter)
Filter filter_create(void); Filter filter_create(Script script);
void filter_destroy(Filter flt); void filter_destroy(Filter flt);
const char* filter_get_value(Filter flt, enum FilterKey key); const char* filter_get_value(Filter flt, enum FilterKey key);

View File

@ -7,26 +7,26 @@
#include "premake.h" #include "premake.h"
#include "testing/testing.h" #include "testing/testing.h"
extern "C" { extern "C" {
#include "project/solution.h" #include "session/session.h"
#include "project/filter.h"
} }
struct FxFilter struct FxFilter
{ {
Session sess;
Filter flt; Filter flt;
Strings terms; Strings terms;
FxFilter() FxFilter()
{ {
flt = filter_create(); sess = session_create();
flt = session_get_filter(sess);
terms = strings_create(); terms = strings_create();
strings_add(terms, "Debug");
} }
~FxFilter() ~FxFilter()
{ {
filter_destroy(flt); session_destroy(sess);
strings_destroy(terms); strings_destroy(terms);
} }
}; };
@ -49,19 +49,36 @@ SUITE(project)
TEST_FIXTURE(FxFilter, IsMatch_ReturnsTrue_OnValueMatch) TEST_FIXTURE(FxFilter, IsMatch_ReturnsTrue_OnValueMatch)
{ {
filter_set_value(flt, FilterConfig, "Debug"); filter_set_value(flt, FilterConfig, "Debug");
strings_add(terms, "Debug");
CHECK(filter_is_match(flt, terms)); CHECK(filter_is_match(flt, terms));
} }
TEST_FIXTURE(FxFilter, IsMatch_ReturnsFalse_OnNullKey) TEST_FIXTURE(FxFilter, IsMatch_ReturnsFalse_OnNullKey)
{ {
strings_add(terms, "Debug");
CHECK(!filter_is_match(flt, terms)); CHECK(!filter_is_match(flt, terms));
} }
TEST_FIXTURE(FxFilter, IsMatch_ReturnsFalse_OnValueMismatch) TEST_FIXTURE(FxFilter, IsMatch_ReturnsFalse_OnValueMismatch)
{ {
filter_set_value(flt, FilterConfig, "Release"); filter_set_value(flt, FilterConfig, "Release");
strings_add(terms, "Debug");
CHECK(!filter_is_match(flt, terms)); CHECK(!filter_is_match(flt, terms));
} }
TEST_FIXTURE(FxFilter, IsMatch_ReturnsTrue_OnWildcardMatch)
{
filter_set_value(flt, FilterConfig, "DebugDLL");
strings_add(terms, "Debug.*");
CHECK(filter_is_match(flt, terms));
}
TEST_FIXTURE(FxFilter, IsMatch_ReturnsTrue_OnSetMatch)
{
filter_set_value(flt, FilterAction, "vs2008");
strings_add(terms, "vs200[58]");
CHECK(filter_is_match(flt, terms));
}
} }

View File

@ -115,6 +115,38 @@ lua_State* script_get_lua(Script script)
} }
/**
* Uses Lua's pattern matching functions to test match a value. This is used by
* the configuration filter functions (see filter.c).
* \param script The script engine instance.
* \param str The string to test match.
* \param pattern The Lua pattern to match against.
* \returns True if the string value matches the pattern.
*/
int script_is_match(Script script, const char* str, const char* pattern)
{
const char* match;
int top, z;
assert(script);
assert(str);
assert(pattern);
top = lua_gettop(script->L);
lua_getglobal(script->L, "string");
lua_getfield(script->L, -1, "match");
lua_pushstring(script->L, str);
lua_pushstring(script->L, pattern);
lua_call(script->L, 2, 1);
match = lua_tostring(script->L, -1);
z = cstr_eq(str, match);
lua_settop(script->L, top);
return z;
}
/** /**
* Internal shared implementation for script_run_file() and script_run_string(). * Internal shared implementation for script_run_file() and script_run_string().
* \param L The Lua scripting environment. * \param L The Lua scripting environment.

View File

@ -19,6 +19,7 @@ DECLARE_CLASS(Script)
Script script_create(void); Script script_create(void);
void script_destroy(Script script); void script_destroy(Script script);
const char* script_get_action(Script script); const char* script_get_action(Script script);
int script_is_match(Script script, const char* str, const char* pattern);
const char* script_run_file(Script script, const char* filename); const char* script_run_file(Script script, const char* filename);
const char* script_run_string(Script script, const char* code); const char* script_run_string(Script script, const char* code);
void script_set_action(Script script, const char* action); void script_set_action(Script script, const char* action);

View File

@ -15,6 +15,7 @@
#include "base/array.h" #include "base/array.h"
#include "base/cstr.h" #include "base/cstr.h"
#include "base/error.h" #include "base/error.h"
#include "platform/platform.h"
DEFINE_CLASS(Session) DEFINE_CLASS(Session)
@ -41,12 +42,16 @@ Session session_create(void)
return NULL; return NULL;
} }
/* create and return the session object */ /* create the session object */
sess = ALLOC_CLASS(Session); sess = ALLOC_CLASS(Session);
sess->script = script; sess->script = script;
sess->solutions = array_create(); sess->solutions = array_create();
sess->filter = filter_create(); sess->filter = filter_create(script);
sess->active_stream = NULL; sess->active_stream = NULL;
/* initialize the filter */
filter_set_value(sess->filter, FilterOS, platform_get_name());
return sess; return sess;
} }
@ -209,6 +214,18 @@ Stream session_get_active_stream(Session sess)
} }
/**
* Retrieve the active configuration filter.
* \param sess The session object.
* \returns The active configuration filter.
*/
Filter session_get_filter(Session sess)
{
assert(sess);
return sess->filter;
}
/** /**
* Retrieve the contained solution at the given index in the solution list. * Retrieve the contained solution at the given index in the solution list.
* \param sess The session object. * \param sess The session object.
@ -274,6 +291,7 @@ void session_set_action(Session sess, const char* action)
{ {
assert(sess); assert(sess);
script_set_action(sess->script, action); script_set_action(sess->script, action);
filter_set_value(sess->filter, FilterAction, action);
} }

View File

@ -84,6 +84,7 @@ int session_enumerate_configurations(Session sess, Project prj, Stream s
int session_enumerate_objects(Session sess, SessionSolutionCallback* sln_funcs, SessionProjectCallback* prj_funcs, SessionProjectCallback* cfg_funcs); int session_enumerate_objects(Session sess, SessionSolutionCallback* sln_funcs, SessionProjectCallback* prj_funcs, SessionProjectCallback* cfg_funcs);
const char* session_get_action(Session sess); const char* session_get_action(Session sess);
Stream session_get_active_stream(Session sess); Stream session_get_active_stream(Session sess);
Filter session_get_filter(Session sess);
Solution session_get_solution(Session sess, int index); Solution session_get_solution(Session sess, int index);
int session_num_solutions(Session sess); int session_num_solutions(Session sess);
const char* session_run_file(Session sess, const char* filename); const char* session_run_file(Session sess, const char* filename);

View File

@ -11,6 +11,7 @@ extern "C" {
#include "script/script.h" #include "script/script.h"
#include "base/base.h" #include "base/base.h"
#include "base/error.h" #include "base/error.h"
#include "platform/platform.h"
} }
@ -187,6 +188,24 @@ SUITE(session)
} }
/**********************************************************************
* Configuration filtering tests
**********************************************************************/
TEST_FIXTURE(FxSession, SetAction_UpdatesFilter)
{
session_set_action(sess, "MyAction");
Filter filter = session_get_filter(sess);
CHECK_EQUAL("MyAction", filter_get_value(filter, FilterAction));
}
TEST_FIXTURE(FxSession, Ctor_SetsOSFilter)
{
Filter filter = session_get_filter(sess);
CHECK_EQUAL(platform_get_name(), filter_get_value(filter, FilterOS));
}
/********************************************************************** /**********************************************************************
* Solution containment tests * Solution containment tests
**********************************************************************/ **********************************************************************/