Skip to content

Commit

Permalink
Fixed scanning a repository with broken package and manifest references.
Browse files Browse the repository at this point in the history
  • Loading branch information
hjuutilainen committed Aug 7, 2015
1 parent 1551f97 commit 939b188
Showing 1 changed file with 60 additions and 17 deletions.
77 changes: 60 additions & 17 deletions MunkiAdmin/NSOperation Subclasses/MARelationshipScanner.m
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,30 @@ - (id)matchingCatalogForString:(NSString *)aString
}
}

- (ManifestMO *)matchingManifestForString:(NSString *)title
{
ManifestMO *manifest = nil;
/*
Try to get a managed object ID for this title, this is a broken reference if it doesn't exist!
*/
ManifestMOID *manifestID = [self.allManifestsByTitle objectForKey:title];
if (manifestID) {

/*
Resolve the managed object ID to an actual manifest object
*/
manifest = (ManifestMO *)[self.context existingObjectWithID:manifestID error:nil];
if (manifest) {
DDLogVerbose(@"Found existing manifest with title '%@'", title);
} else {
DDLogError(@"Error: Could not find manifest with title '%@'", title);
}
} else {
DDLogError(@"Error: Could not find manifest with title '%@'", title);
}
return manifest;
}

- (void)scanManifests
{
NSManagedObjectContext *privateContext = self.context;
Expand Down Expand Up @@ -187,7 +211,9 @@ - (void)scanManifests
for (StringObjectMO *aManagedInstall in currentManifest.managedInstallsFaster) {
DDLogVerbose(@"%@: linking managed_install object %@", currentManifest.fileName, aManagedInstall.title);
id matchingObject = [self matchingAppOrPkgForString:aManagedInstall.title];
if ([matchingObject isKindOfClass:[ApplicationMO class]]) {
if (!matchingObject) {
DDLogError(@"%@: Error: Could not link managed_install object %lu --> Name: %@", currentManifest.title, (unsigned long)idx, aManagedInstall.title);
} else if ([matchingObject isKindOfClass:[ApplicationMO class]]) {
aManagedInstall.originalApplication = matchingObject;
} else if ([matchingObject isKindOfClass:[PackageMO class]]) {
aManagedInstall.originalPackage = matchingObject;
Expand All @@ -196,7 +222,9 @@ - (void)scanManifests
for (StringObjectMO *aManagedUninstall in currentManifest.managedUninstallsFaster) {
DDLogVerbose(@"%@: linking managed_uninstall object %@", currentManifest.fileName, aManagedUninstall.title);
id matchingObject = [self matchingAppOrPkgForString:aManagedUninstall.title];
if ([matchingObject isKindOfClass:[ApplicationMO class]]) {
if (!matchingObject) {
DDLogError(@"%@: Error: Could not link managed_uninstall object %lu --> Name: %@", currentManifest.title, (unsigned long)idx, aManagedUninstall.title);
} else if ([matchingObject isKindOfClass:[ApplicationMO class]]) {
aManagedUninstall.originalApplication = matchingObject;
} else if ([matchingObject isKindOfClass:[PackageMO class]]) {
aManagedUninstall.originalPackage = matchingObject;
Expand All @@ -205,7 +233,9 @@ - (void)scanManifests
for (StringObjectMO *aManagedUpdate in currentManifest.managedUpdatesFaster) {
DDLogVerbose(@"%@: linking managed_update object %@", currentManifest.fileName, aManagedUpdate.title);
id matchingObject = [self matchingAppOrPkgForString:aManagedUpdate.title];
if ([matchingObject isKindOfClass:[ApplicationMO class]]) {
if (!matchingObject) {
DDLogError(@"%@: Error: Could not link managed_update object %lu --> Name: %@", currentManifest.title, (unsigned long)idx, aManagedUpdate.title);
} else if ([matchingObject isKindOfClass:[ApplicationMO class]]) {
aManagedUpdate.originalApplication = matchingObject;
} else if ([matchingObject isKindOfClass:[PackageMO class]]) {
aManagedUpdate.originalPackage = matchingObject;
Expand All @@ -214,7 +244,9 @@ - (void)scanManifests
for (StringObjectMO *anOptionalInstall in currentManifest.optionalInstallsFaster) {
DDLogVerbose(@"%@: linking optional_install object %@", currentManifest.fileName, anOptionalInstall.title);
id matchingObject = [self matchingAppOrPkgForString:anOptionalInstall.title];
if ([matchingObject isKindOfClass:[ApplicationMO class]]) {
if (!matchingObject) {
DDLogError(@"%@: Error: Could not link optional_install object %lu --> Name: %@", currentManifest.title, (unsigned long)idx, anOptionalInstall.title);
} else if ([matchingObject isKindOfClass:[ApplicationMO class]]) {
anOptionalInstall.originalApplication = matchingObject;
} else if ([matchingObject isKindOfClass:[PackageMO class]]) {
anOptionalInstall.originalPackage = matchingObject;
Expand All @@ -226,12 +258,13 @@ - (void)scanManifests
*/
for (StringObjectMO *stringObject in currentManifest.includedManifestsFaster) {
DDLogVerbose(@"%@: linking included_manifest object %@", currentManifest.fileName, stringObject.title);
ManifestMO *originalManifest = (ManifestMO *)[privateContext objectWithID:[self.allManifestsByTitle objectForKey:stringObject.title]];
DDLogVerbose(@"%@: linking included_manifest object %@ to original manifest %@", currentManifest.fileName, stringObject.title, originalManifest.title);

ManifestMO *originalManifest = [self matchingManifestForString:stringObject.title];
if (originalManifest) {
DDLogVerbose(@"%@: linking included_manifest object %@ to original manifest %@", currentManifest.fileName, stringObject.title, originalManifest.title);
stringObject.originalManifest = originalManifest;
} else {
DDLogError(@"%@ could not link item %lu --> Name: %@", currentManifest.title, (unsigned long)idx, stringObject.title);
DDLogError(@"%@: Error: Could not link included_manifest object %lu --> Name: %@", currentManifest.title, (unsigned long)idx, stringObject.title);
}
}

Expand All @@ -240,36 +273,44 @@ - (void)scanManifests
*/
for (ConditionalItemMO *conditionalItem in currentManifest.conditionalItems) {
for (StringObjectMO *managedInstall in conditionalItem.managedInstalls) {
DDLogVerbose(@"%@: linking managed_install object %@", currentManifest.fileName, managedInstall.title);
DDLogVerbose(@"%@: linking conditional managed_install object %@", currentManifest.fileName, managedInstall.title);
id matchingObject = [self matchingAppOrPkgForString:managedInstall.title];
if ([matchingObject isKindOfClass:[ApplicationMO class]]) {
if (!matchingObject) {
DDLogError(@"%@: Error: Could not link conditional managed_install object %lu --> Name: %@", currentManifest.title, (unsigned long)idx, managedInstall.title);
} else if ([matchingObject isKindOfClass:[ApplicationMO class]]) {
managedInstall.originalApplication = matchingObject;
} else if ([matchingObject isKindOfClass:[PackageMO class]]) {
managedInstall.originalPackage = matchingObject;
}
}
for (StringObjectMO *managedUninstall in conditionalItem.managedUninstalls) {
DDLogVerbose(@"%@: linking managed_uninstall object %@", currentManifest.fileName, managedUninstall.title);
DDLogVerbose(@"%@: linking conditional managed_uninstall object %@", currentManifest.fileName, managedUninstall.title);
id matchingObject = [self matchingAppOrPkgForString:managedUninstall.title];
if ([matchingObject isKindOfClass:[ApplicationMO class]]) {
if (!matchingObject) {
DDLogError(@"%@: Error: Could not link conditional managed_uninstall object %lu --> Name: %@", currentManifest.title, (unsigned long)idx, managedUninstall.title);
} else if ([matchingObject isKindOfClass:[ApplicationMO class]]) {
managedUninstall.originalApplication = matchingObject;
} else if ([matchingObject isKindOfClass:[PackageMO class]]) {
managedUninstall.originalPackage = matchingObject;
}
}
for (StringObjectMO *managedUpdate in conditionalItem.managedUpdates) {
DDLogVerbose(@"%@: linking managed_update object %@", currentManifest.fileName, managedUpdate.title);
DDLogVerbose(@"%@: linking conditional managed_update object %@", currentManifest.fileName, managedUpdate.title);
id matchingObject = [self matchingAppOrPkgForString:managedUpdate.title];
if ([matchingObject isKindOfClass:[ApplicationMO class]]) {
if (!matchingObject) {
DDLogError(@"%@: Error: Could not link conditional managed_update object %lu --> Name: %@", currentManifest.title, (unsigned long)idx, managedUpdate.title);
} else if ([matchingObject isKindOfClass:[ApplicationMO class]]) {
managedUpdate.originalApplication = matchingObject;
} else if ([matchingObject isKindOfClass:[PackageMO class]]) {
managedUpdate.originalPackage = matchingObject;
}
}
for (StringObjectMO *optionalInstall in conditionalItem.optionalInstalls) {
DDLogVerbose(@"%@: linking optional_install object %@", currentManifest.fileName, optionalInstall.title);
DDLogVerbose(@"%@: linking conditional optional_install object %@", currentManifest.fileName, optionalInstall.title);
id matchingObject = [self matchingAppOrPkgForString:optionalInstall.title];
if ([matchingObject isKindOfClass:[ApplicationMO class]]) {
if (!matchingObject) {
DDLogError(@"%@: Error: Could not link conditional optional_install object %lu --> Name: %@", currentManifest.title, (unsigned long)idx, optionalInstall.title);
} else if ([matchingObject isKindOfClass:[ApplicationMO class]]) {
optionalInstall.originalApplication = matchingObject;
} else if ([matchingObject isKindOfClass:[PackageMO class]]) {
optionalInstall.originalPackage = matchingObject;
Expand All @@ -278,11 +319,13 @@ - (void)scanManifests

for (StringObjectMO *includedManifest in conditionalItem.includedManifests) {
DDLogVerbose(@"%@: linking conditional included_manifest object %@", currentManifest.fileName, includedManifest.title);
ManifestMO *originalManifest = (ManifestMO *)[privateContext objectWithID:[self.allManifestsByTitle objectForKey:includedManifest.title]];

ManifestMO *originalManifest = [self matchingManifestForString:includedManifest.title];
if (originalManifest) {
DDLogVerbose(@"%@: linking conditional included_manifest object %@ to original manifest %@", currentManifest.fileName, includedManifest.title, originalManifest.title);
includedManifest.originalManifest = originalManifest;
} else {
DDLogError(@"%@ could not link conditional item %lu --> Name: %@", currentManifest.title, (unsigned long)idx, includedManifest.title);
DDLogError(@"%@: could not link conditional included_manifest object %lu --> Name: %@", currentManifest.title, (unsigned long)idx, includedManifest.title);
}
}
}
Expand Down

0 comments on commit 939b188

Please sign in to comment.