Added !if /FileExists

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6170 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
anders_k 2011-11-13 15:34:43 +00:00
parent a37905cc0c
commit 20dcb1923a
4 changed files with 37 additions and 2 deletions

View file

@ -61,6 +61,7 @@ The opposite of !ifdef. The lines will be compiled when the gflag has not been d
\S1{if} !if \S1{if} !if
\c [!] value [op value2] \c [!] value [op value2]
\c [!] /FileExists "c:\path\file.exe"
This command, when paired with an !endif command, will tell the compiler whether or not to compile the lines in between the two lines. If value is non-zero, or the comparison of value and value2 depending on the operator results in true, the contained lines will be compiled. Otherwise, they will be skipped. This command, when paired with an !endif command, will tell the compiler whether or not to compile the lines in between the two lines. If value is non-zero, or the comparison of value and value2 depending on the operator results in true, the contained lines will be compiled. Otherwise, they will be skipped.
op can be either == or != (string comparison), <=, < > or >= (float comparison), & (bitwise AND comparison), && or || (boolean comparison). op can be either == or != (string comparison), <=, < > or >= (float comparison), & (bitwise AND comparison), && or || (boolean comparison).
@ -74,6 +75,10 @@ If [!] is set, return value will be switched from true to false and vice versa.
\c !error "neither should this" \c !error "neither should this"
\c !endif \c !endif
\c !if /FileExists ".\cert.pfx"
\c !finalize '".\sign.bat" "%1"'
\c !endif
\S1{ifmacrodef} !ifmacrodef \S1{ifmacrodef} !ifmacrodef
\c gflag [bcheck gflag [...]]] \c gflag [bcheck gflag [...]]]

View file

@ -33,6 +33,10 @@ public:
virtual const std::set<tstring>& files(); virtual const std::set<tstring>& files();
virtual const std::set<tstring>& dirs(); virtual const std::set<tstring>& dirs();
// dir_reader always excludes . and .. AND the exclude list is private,
// use this backdoor if you need to match "."
virtual std::set<tstring>& hack_simpleexcluded() {return m_excluded;}
virtual void exclude(const tstring& spec); virtual void exclude(const tstring& spec);
virtual void exclude(const std::set<tstring>& specs); virtual void exclude(const std::set<tstring>& specs);

View file

@ -486,7 +486,33 @@ parse_again:
if(line.getnumtokens() == 2) if(line.getnumtokens() == 2)
istrue = line.gettoken_int(1); istrue = line.gettoken_int(1);
else if (line.getnumtokens() == 3) {
if (!_tcsicmp(line.gettoken_str(1),_T("/fileexists")))
{
TCHAR *fc = my_convert(line.gettoken_str(2));
tstring dir = get_dir_name(fc), spec = get_file_name(fc);
my_convert_free(fc);
if (dir == spec) dir = _T(".");
boost::scoped_ptr<dir_reader> dr( new_dir_reader() );
dr->hack_simpleexcluded().erase(_T("."));
dr->read(dir);
for (dir_reader::iterator fit = dr->files().begin();
fit != dr->files().end() && !istrue; fit++)
{
if (dir_reader::matches(*fit, spec)) istrue = true;
}
if (!istrue) for (dir_reader::iterator dit = dr->dirs().begin();
dit != dr->dirs().end() && !istrue; dit++)
{
if (dir_reader::matches(*dit, spec)) istrue = true;
}
}
else PRINTHELP()
}
else if (line.getnumtokens() == 4) { else if (line.getnumtokens() == 4) {
mod = line.gettoken_enum(2,_T("=\0==\0!=\0<=\0<\0>\0>=\0&\0&&\0|\0||\0")); mod = line.gettoken_enum(2,_T("=\0==\0!=\0<=\0<\0>\0>=\0&\0&&\0|\0||\0"));

View file

@ -246,7 +246,7 @@ static tokenType tokenlist[TOK__LAST] =
{TOK_P_ADDINCLUDEDIR,_T("!AddIncludeDir"),1,0,_T("dir"),TP_ALL}, {TOK_P_ADDINCLUDEDIR,_T("!AddIncludeDir"),1,0,_T("dir"),TP_ALL},
{TOK_P_INCLUDE,_T("!include"),1,1,_T("[/NONFATAL] filename.nsh"),TP_ALL}, {TOK_P_INCLUDE,_T("!include"),1,1,_T("[/NONFATAL] filename.nsh"),TP_ALL},
{TOK_P_CD,_T("!cd"),1,0,_T("absolute_or_relative_new_directory"),TP_ALL}, {TOK_P_CD,_T("!cd"),1,0,_T("absolute_or_relative_new_directory"),TP_ALL},
{TOK_P_IF,_T("!if"),1,3,_T("[!] value [(==,!=,<=,<,>,>=,&,&&,||) value2] [...]"),TP_ALL}, {TOK_P_IF,_T("!if"),1,3,_T("[!] (value [(==,!=,<=,<,>,>=,&,&&,||) value2] | /FILEEXISTS path) [...]"),TP_ALL},
{TOK_P_IFDEF,_T("!ifdef"),1,-1,_T("symbol [| symbol2 [& symbol3 [...]]]"),TP_ALL}, {TOK_P_IFDEF,_T("!ifdef"),1,-1,_T("symbol [| symbol2 [& symbol3 [...]]]"),TP_ALL},
{TOK_P_IFNDEF,_T("!ifndef"),1,-1,_T("symbol [| symbol2 [& symbol3 [...]]]"),TP_ALL}, {TOK_P_IFNDEF,_T("!ifndef"),1,-1,_T("symbol [| symbol2 [& symbol3 [...]]]"),TP_ALL},
{TOK_P_ENDIF,_T("!endif"),0,0,_T(""),TP_ALL}, {TOK_P_ENDIF,_T("!endif"),0,0,_T(""),TP_ALL},