mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-31 08:41:03 +00:00
Mostly, improve dependency checking.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@13640 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
9fbec32045
commit
9b0892e9c8
9 changed files with 206 additions and 47 deletions
15
ChangeLog
15
ChangeLog
|
@ -1,3 +1,18 @@
|
||||||
|
2002-05-13 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
||||||
|
* Source/NSFileManager.m: Don't try to release memory using free()
|
||||||
|
when it was allocated using NSZoneMalloc().
|
||||||
|
* Tools/autogsdoc.m: Improve dependency rule management.
|
||||||
|
* Tools/AGSParser.h: ditto
|
||||||
|
* Tools/AGSParser.m: ditto
|
||||||
|
* Tools/AGSIndex.h: ditto
|
||||||
|
* Tools/AGSIndex.m: ditto
|
||||||
|
Store all dependency information in the .igsdoc file and keep it up
|
||||||
|
to date. Never regenerate a file that doesn't need it.
|
||||||
|
Mostly the changes are to cope with the fact that we now have
|
||||||
|
common files into which all functions, constants, variables, and
|
||||||
|
typedefs within a project are combined.
|
||||||
|
|
||||||
2002-05-11 Richard Frith-Macdonald <rfm@gnu.org>
|
2002-05-11 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
||||||
* Source/Unicode.m: Rationalise so that all conversion operations
|
* Source/Unicode.m: Rationalise so that all conversion operations
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with this library; if not, write to the Free
|
License along with this library; if not, write to the Free
|
||||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __NSDecimal_h_GNUSTEP_BASE_INCLUDE
|
#ifndef __NSDecimal_h_GNUSTEP_BASE_INCLUDE
|
||||||
|
|
|
@ -1541,7 +1541,7 @@ typedef struct _GSEnumeratedDirectory {
|
||||||
|
|
||||||
inline void gsedRelease(GSEnumeratedDirectory X)
|
inline void gsedRelease(GSEnumeratedDirectory X)
|
||||||
{
|
{
|
||||||
free(X.path);
|
NSZoneFree(NSDefaultMallocZone(), X.path);
|
||||||
closedir(X.pointer);
|
closedir(X.pointer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,10 +43,12 @@
|
||||||
- (NSMutableDictionary*) refs;
|
- (NSMutableDictionary*) refs;
|
||||||
- (void) setDirectory: (NSString*)path;
|
- (void) setDirectory: (NSString*)path;
|
||||||
- (void) setGlobalRef: (NSString*)ref type: (NSString*)type;
|
- (void) setGlobalRef: (NSString*)ref type: (NSString*)type;
|
||||||
|
- (void) setOutputs: (NSArray*)a forHeader: (NSString*)h;
|
||||||
- (void) setRelationship: (NSString*)r from: (NSString*)from to: (NSString*)to;
|
- (void) setRelationship: (NSString*)r from: (NSString*)from to: (NSString*)to;
|
||||||
- (void) setSources: (NSArray*)a forHeader: (NSString*)h;
|
- (void) setSources: (NSArray*)a forHeader: (NSString*)h;
|
||||||
- (void) setUnitRef: (NSString*)ref type: (NSString*)type;
|
- (void) setUnitRef: (NSString*)ref type: (NSString*)type;
|
||||||
- (NSArray*) sourcesForHeader: (NSString*)h;
|
- (NSMutableArray*) outputsForHeader: (NSString*)h;
|
||||||
|
- (NSMutableArray*) sourcesForHeader: (NSString*)h;
|
||||||
- (NSDictionary*) unitRef: (NSString*)ref type: (NSString*)type;
|
- (NSDictionary*) unitRef: (NSString*)ref type: (NSString*)type;
|
||||||
- (NSString*) unitRef: (NSString*)ref type: (NSString*)type unit: (NSString**)u;
|
- (NSString*) unitRef: (NSString*)ref type: (NSString*)type unit: (NSString**)u;
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -466,6 +466,21 @@ setDirectory(NSMutableDictionary *dict, NSString *path)
|
||||||
return [d allKeys];
|
return [d allKeys];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a list of output files for the header
|
||||||
|
*/
|
||||||
|
- (NSMutableArray*) outputsForHeader: (NSString*)h
|
||||||
|
{
|
||||||
|
NSDictionary *dict = [refs objectForKey: @"output"];
|
||||||
|
NSArray *array = [dict objectForKey: h];
|
||||||
|
|
||||||
|
if (array == nil)
|
||||||
|
{
|
||||||
|
return [NSMutableArray arrayWithCapacity: 2];
|
||||||
|
}
|
||||||
|
return AUTORELEASE([array mutableCopy]);
|
||||||
|
}
|
||||||
|
|
||||||
- (NSMutableDictionary*) refs
|
- (NSMutableDictionary*) refs
|
||||||
{
|
{
|
||||||
return refs;
|
return refs;
|
||||||
|
@ -503,6 +518,23 @@ setDirectory(NSMutableDictionary *dict, NSString *path)
|
||||||
[t setObject: base forKey: ref];
|
[t setObject: base forKey: ref];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up an array listing the output files for a particular header.
|
||||||
|
*/
|
||||||
|
- (void) setOutputs: (NSArray*)a forHeader: (NSString*)h
|
||||||
|
{
|
||||||
|
NSMutableDictionary *dict;
|
||||||
|
|
||||||
|
dict = [refs objectForKey: @"output"];
|
||||||
|
if (dict == nil)
|
||||||
|
{
|
||||||
|
dict = [NSMutableDictionary new];
|
||||||
|
[refs setObject: dict forKey: @"output"];
|
||||||
|
RELEASE(dict);
|
||||||
|
}
|
||||||
|
[dict setObject: a forKey: h];
|
||||||
|
}
|
||||||
|
|
||||||
- (void) setRelationship: (NSString*)r from: (NSString*)from to: (NSString*)to
|
- (void) setRelationship: (NSString*)r from: (NSString*)from to: (NSString*)to
|
||||||
{
|
{
|
||||||
NSMutableDictionary *dict;
|
NSMutableDictionary *dict;
|
||||||
|
@ -585,13 +617,18 @@ setDirectory(NSMutableDictionary *dict, NSString *path)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a list of source files for the header (or nil)
|
* Return a list of source files for the header.
|
||||||
*/
|
*/
|
||||||
- (NSArray*) sourcesForHeader: (NSString*)h
|
- (NSArray*) sourcesForHeader: (NSString*)h
|
||||||
{
|
{
|
||||||
NSDictionary *dict = [refs objectForKey: @"source"];
|
NSDictionary *dict = [refs objectForKey: @"source"];
|
||||||
|
NSArray *array = [dict objectForKey: h];
|
||||||
|
|
||||||
return [dict objectForKey: h];
|
if (array == nil)
|
||||||
|
{
|
||||||
|
return [NSMutableArray arrayWithCapacity: 2];
|
||||||
|
}
|
||||||
|
return AUTORELEASE([array mutableCopy]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -74,18 +74,6 @@ static BOOL snuggleStart(NSString *t)
|
||||||
*/
|
*/
|
||||||
@implementation AGSOutput
|
@implementation AGSOutput
|
||||||
|
|
||||||
+ (void) initialize
|
|
||||||
{
|
|
||||||
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
|
|
||||||
|
|
||||||
[ud registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys:
|
|
||||||
@"TypesAndConstants", @"ConstantsTemplate",
|
|
||||||
@"Functions", @"FunctionsTemplate",
|
|
||||||
@"TypesAndConstants", @"TypedefsTemplate",
|
|
||||||
@"TypesAndConstants", @"VariablesTemplate",
|
|
||||||
nil]];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) dealloc
|
- (void) dealloc
|
||||||
{
|
{
|
||||||
DESTROY(identifier);
|
DESTROY(identifier);
|
||||||
|
|
|
@ -55,6 +55,7 @@
|
||||||
unsigned length;
|
unsigned length;
|
||||||
unsigned pos;
|
unsigned pos;
|
||||||
BOOL commentsRead;
|
BOOL commentsRead;
|
||||||
|
BOOL haveOutput;
|
||||||
BOOL haveSource;
|
BOOL haveSource;
|
||||||
BOOL inInstanceVariables;
|
BOOL inInstanceVariables;
|
||||||
BOOL inArgList;
|
BOOL inArgList;
|
||||||
|
@ -75,6 +76,7 @@
|
||||||
|
|
||||||
- (NSMutableDictionary*) info;
|
- (NSMutableDictionary*) info;
|
||||||
- (id) init; /** <init> Simple initialiser */
|
- (id) init; /** <init> Simple initialiser */
|
||||||
|
- (NSMutableArray*) outputs;
|
||||||
- (NSMutableDictionary*) parseDeclaration;
|
- (NSMutableDictionary*) parseDeclaration;
|
||||||
- (NSMutableDictionary*) parseFile: (NSString*)name isSource: (BOOL)isSource;
|
- (NSMutableDictionary*) parseFile: (NSString*)name isSource: (BOOL)isSource;
|
||||||
- (NSString*) parseIdentifier;
|
- (NSString*) parseIdentifier;
|
||||||
|
@ -105,6 +107,6 @@
|
||||||
- (unsigned) skipStatementLine;
|
- (unsigned) skipStatementLine;
|
||||||
- (unsigned) skipUnit;
|
- (unsigned) skipUnit;
|
||||||
- (unsigned) skipWhiteSpace;
|
- (unsigned) skipWhiteSpace;
|
||||||
- (NSArray*) source;
|
- (NSMutableArray*) sources;
|
||||||
@end
|
@end
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -171,6 +171,73 @@
|
||||||
inArgList = wasInArgList;
|
inArgList = wasInArgList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the list of known output files depending on this source/header.
|
||||||
|
*/
|
||||||
|
- (NSMutableArray*) outputs
|
||||||
|
{
|
||||||
|
NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
|
||||||
|
NSMutableArray *output = [NSMutableArray arrayWithCapacity: 6];
|
||||||
|
NSString *basic = [info objectForKey: @"Header"];
|
||||||
|
NSString *names[4] = { @"Functions", @"Typedefs", @"Variables",
|
||||||
|
@"Constants" };
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
basic = [basic lastPathComponent];
|
||||||
|
basic = [basic stringByDeletingPathExtension];
|
||||||
|
basic = [basic stringByAppendingPathExtension: @"gsdoc"];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If there are any classes, categories, or protocols, there will be
|
||||||
|
* an output file for them whose name is based on the name of the header.
|
||||||
|
*/
|
||||||
|
if ([[info objectForKey: @"Classes"] count] > 0
|
||||||
|
|| [[info objectForKey: @"Categories"] count] > 0
|
||||||
|
|| [[info objectForKey: @"Protocols"] count] > 0)
|
||||||
|
{
|
||||||
|
[output addObject: basic];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If there are any constants, variables, typedefs or functions, there
|
||||||
|
* will either be a shared output file for them (defined by a template
|
||||||
|
* name set in the user defaults system), or they will go in the same
|
||||||
|
* file as classes etc.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < sizeof(names) / sizeof(NSString*); i++)
|
||||||
|
{
|
||||||
|
NSString *base = names[i];
|
||||||
|
|
||||||
|
if ([[info objectForKey: base] count] > 0)
|
||||||
|
{
|
||||||
|
NSString *file;
|
||||||
|
|
||||||
|
base = [base stringByAppendingString: @"Template"];
|
||||||
|
file = [defs stringForKey: base];
|
||||||
|
if ([file length] == 0)
|
||||||
|
{
|
||||||
|
if ([output containsObject: basic] == NO)
|
||||||
|
{
|
||||||
|
[output addObject: basic];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ([[file pathExtension] isEqual: @"gsdoc"] == NO)
|
||||||
|
{
|
||||||
|
file = [file stringByAppendingPathExtension: @"gsdoc"];
|
||||||
|
}
|
||||||
|
if ([output containsObject: file] == NO)
|
||||||
|
{
|
||||||
|
[output addObject: file];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
- (void) parseDeclaratorInto: (NSMutableDictionary*)d
|
- (void) parseDeclaratorInto: (NSMutableDictionary*)d
|
||||||
{
|
{
|
||||||
NSMutableString *p = nil;
|
NSMutableString *p = nil;
|
||||||
|
@ -722,6 +789,7 @@ fail:
|
||||||
[source removeAllObjects];
|
[source removeAllObjects];
|
||||||
if (isSource == NO)
|
if (isSource == NO)
|
||||||
{
|
{
|
||||||
|
[info setObject: fileName forKey: @"Header"];
|
||||||
[source removeAllObjects];
|
[source removeAllObjects];
|
||||||
[source addObject:
|
[source addObject:
|
||||||
[[[fileName lastPathComponent] stringByDeletingPathExtension]
|
[[[fileName lastPathComponent] stringByDeletingPathExtension]
|
||||||
|
@ -1900,6 +1968,7 @@ fail:
|
||||||
{
|
{
|
||||||
[source removeAllObjects];
|
[source removeAllObjects];
|
||||||
[info removeAllObjects];
|
[info removeAllObjects];
|
||||||
|
haveOutput = NO;
|
||||||
haveSource = NO;
|
haveSource = NO;
|
||||||
DESTROY(declared);
|
DESTROY(declared);
|
||||||
DESTROY(comment);
|
DESTROY(comment);
|
||||||
|
@ -3038,9 +3107,9 @@ fail:
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSArray*) source
|
- (NSMutableArray*) sources
|
||||||
{
|
{
|
||||||
return AUTORELEASE([source copy]);
|
return AUTORELEASE([source mutableCopy]);
|
||||||
}
|
}
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
|
@ -391,6 +391,10 @@ main(int argc, char **argv, char **env)
|
||||||
defs = [NSUserDefaults standardUserDefaults];
|
defs = [NSUserDefaults standardUserDefaults];
|
||||||
[defs registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys:
|
[defs registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys:
|
||||||
@"Untitled", @"Project",
|
@"Untitled", @"Project",
|
||||||
|
@"TypesAndConstants", @"ConstantsTemplate",
|
||||||
|
@"Functions", @"FunctionsTemplate",
|
||||||
|
@"TypesAndConstants", @"TypedefsTemplate",
|
||||||
|
@"TypesAndConstants", @"VariablesTemplate",
|
||||||
nil]];
|
nil]];
|
||||||
|
|
||||||
verbose = [defs boolForKey: @"Verbose"];
|
verbose = [defs boolForKey: @"Verbose"];
|
||||||
|
@ -540,14 +544,14 @@ main(int argc, char **argv, char **env)
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
NSString *hfile = [sFiles objectAtIndex: i];
|
NSString *hfile = [sFiles objectAtIndex: i];
|
||||||
NSString *gsdocfile;
|
NSString *gsdocfile;
|
||||||
NSString *file;
|
NSString *file;
|
||||||
NSArray *a;
|
NSMutableArray *a;
|
||||||
NSDictionary *attrs;
|
NSDictionary *attrs;
|
||||||
NSDate *sDate = nil;
|
NSDate *sDate = nil;
|
||||||
NSDate *gDate = nil;
|
NSDate *gDate = nil;
|
||||||
unsigned i;
|
unsigned j;
|
||||||
|
|
||||||
if (pool != nil)
|
if (pool != nil)
|
||||||
{
|
{
|
||||||
|
@ -557,7 +561,7 @@ main(int argc, char **argv, char **env)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note the name of the header file without path or extension.
|
* Note the name of the header file without path or extension.
|
||||||
* This will be used to generate the outut file.
|
* This will be used to generate the output file.
|
||||||
*/
|
*/
|
||||||
file = [hfile stringByDeletingPathExtension];
|
file = [hfile stringByDeletingPathExtension];
|
||||||
file = [file lastPathComponent];
|
file = [file lastPathComponent];
|
||||||
|
@ -586,22 +590,16 @@ main(int argc, char **argv, char **env)
|
||||||
{
|
{
|
||||||
NSDate *d;
|
NSDate *d;
|
||||||
|
|
||||||
attrs = [mgr fileAttributesAtPath: hfile
|
|
||||||
traverseLink: YES];
|
|
||||||
d = [attrs objectForKey: NSFileModificationDate];
|
|
||||||
if (sDate == nil || [d earlierDate: sDate] == sDate)
|
|
||||||
{
|
|
||||||
sDate = d;
|
|
||||||
AUTORELEASE(RETAIN(sDate));
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
* Ask existing project info (.gsdoc file) for dependency
|
* Ask existing project info (.gsdoc file) for dependency
|
||||||
* information. Then check the dates on the source files.
|
* information. Then check the dates on the source files
|
||||||
|
* and the header file.
|
||||||
*/
|
*/
|
||||||
a = [projectRefs sourcesForHeader: hfile];
|
a = [projectRefs sourcesForHeader: hfile];
|
||||||
for (i = 0; i < [a count]; i++)
|
[a insertObject: hfile atIndex: 0];
|
||||||
|
for (j = 0; j < [a count]; j++)
|
||||||
{
|
{
|
||||||
NSString *sfile = [a objectAtIndex: i];
|
NSString *sfile = [a objectAtIndex: j];
|
||||||
|
|
||||||
attrs = [mgr fileAttributesAtPath: sfile
|
attrs = [mgr fileAttributesAtPath: sfile
|
||||||
traverseLink: YES];
|
traverseLink: YES];
|
||||||
|
@ -612,10 +610,37 @@ main(int argc, char **argv, char **env)
|
||||||
AUTORELEASE(RETAIN(sDate));
|
AUTORELEASE(RETAIN(sDate));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (verbose == YES)
|
||||||
|
{
|
||||||
|
NSLog(@"Sources for %@ are %@ ... %@", hfile, a, sDate);
|
||||||
|
}
|
||||||
|
|
||||||
attrs = [mgr fileAttributesAtPath: gsdocfile traverseLink: YES];
|
/*
|
||||||
gDate = [attrs objectForKey: NSFileModificationDate];
|
* Ask existing project info (.gsdoc file) for dependency
|
||||||
AUTORELEASE(RETAIN(gDate));
|
* information. Then check the dates on the output files.
|
||||||
|
* If none are set, assume the defualt.
|
||||||
|
*/
|
||||||
|
a = [projectRefs outputsForHeader: hfile];
|
||||||
|
if ([a count] == 0)
|
||||||
|
{
|
||||||
|
[a insertObject: gsdocfile atIndex: 0];
|
||||||
|
}
|
||||||
|
for (j = 0; j < [a count]; j++)
|
||||||
|
{
|
||||||
|
NSString *ofile = [a objectAtIndex: j];
|
||||||
|
|
||||||
|
attrs = [mgr fileAttributesAtPath: ofile traverseLink: YES];
|
||||||
|
d = [attrs objectForKey: NSFileModificationDate];
|
||||||
|
if (gDate == nil || [d laterDate: gDate] == gDate)
|
||||||
|
{
|
||||||
|
gDate = d;
|
||||||
|
AUTORELEASE(RETAIN(gDate));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (verbose == YES)
|
||||||
|
{
|
||||||
|
NSLog(@"Outputs for %@ are %@ ... %@", hfile, a, gDate);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gDate == nil || [sDate earlierDate: gDate] == gDate)
|
if (gDate == nil || [sDate earlierDate: gDate] == gDate)
|
||||||
|
@ -647,18 +672,38 @@ main(int argc, char **argv, char **env)
|
||||||
}
|
}
|
||||||
[parser parseFile: hfile isSource: NO];
|
[parser parseFile: hfile isSource: NO];
|
||||||
|
|
||||||
a = [parser source];
|
|
||||||
/*
|
/*
|
||||||
* Record dependency information.
|
* Record dependency information.
|
||||||
*/
|
*/
|
||||||
|
a = [parser outputs];
|
||||||
|
if ([a count] > 0)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Adjust the location of the output files to be in the
|
||||||
|
* documentation directory.
|
||||||
|
*/
|
||||||
|
for (j = 0; j < [a count]; j++)
|
||||||
|
{
|
||||||
|
NSString *s = [a objectAtIndex: j];
|
||||||
|
|
||||||
|
if ([s isAbsolutePath] == NO)
|
||||||
|
{
|
||||||
|
s = [documentationDirectory
|
||||||
|
stringByAppendingPathComponent: s];
|
||||||
|
[a replaceObjectAtIndex: j withObject: s];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[projectRefs setOutputs: a forHeader: hfile];
|
||||||
|
}
|
||||||
|
a = [parser sources];
|
||||||
if ([a count] > 0)
|
if ([a count] > 0)
|
||||||
{
|
{
|
||||||
[projectRefs setSources: a forHeader: hfile];
|
[projectRefs setSources: a forHeader: hfile];
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < [a count]; i++)
|
for (j = 0; j < [a count]; j++)
|
||||||
{
|
{
|
||||||
NSString *sfile = [a objectAtIndex: i];
|
NSString *sfile = [a objectAtIndex: j];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we can read a source file, parse it for any
|
* If we can read a source file, parse it for any
|
||||||
|
@ -769,9 +814,9 @@ main(int argc, char **argv, char **env)
|
||||||
/*
|
/*
|
||||||
* Now we try to process the gsdoc data to make index info
|
* Now we try to process the gsdoc data to make index info
|
||||||
* unless the project index is already more up to date than
|
* unless the project index is already more up to date than
|
||||||
* this file.
|
* this file (or the gsdoc file does not exist of course).
|
||||||
*/
|
*/
|
||||||
if (gDate == nil || [gDate earlierDate: rDate] == rDate)
|
if (gDate != nil && [gDate earlierDate: rDate] == rDate)
|
||||||
{
|
{
|
||||||
if (showDependencies == YES)
|
if (showDependencies == YES)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue