/** * @todo: docs */ public function get_package(array $args) { $qb = com_meego_package::new_query_builder(); $qb->add_constraint('name', '=', $args['package']); $qb->add_order('repository.name', 'ASC'); $packages = $qb->execute(); if (count($packages) == 0) { throw new midgardmvc_exception_notfound("Package not found"); } $this->data['package'] = $packages[0]; if (empty($this->data['package']->title)) { $this->data['package']->title = $this->data['package']->name; } $repositories = array(); $this->data['packages'] = array(); foreach ($packages as $package) { if (empty($package->title)) { $package->title = $package->name; } if (!isset($repositories[$package->repository])) { $repository = new com_meego_repository(); $repository->get_by_id($package->repository); $repositories[$package->repository] = $repository; } $package->repositoryobject = $repositories[$package->repository]; $package->projectobject = new com_meego_project($package->repositoryobject->project); $package->localurl = $this->mvc->dispatcher->generate_url('package_instance', array('package' => $package->name, 'version' => $package->version, 'project' => $package->projectobject->name, 'repository' => $repositories[$package->repository]->name, 'arch' => $repositories[$package->repository]->arch), $this->request); $package->repositoryobject->localurl = $this->mvc->dispatcher->generate_url('repository', array('project' => $package->projectobject->name, 'repository' => $repositories[$package->repository]->name, 'arch' => $repositories[$package->repository]->arch), $this->request); $this->data['packages'][] = $package; } }
/** * Populates relations, such as * * - runtime dependency packages * - build dependency packages * - provided packages * - obsoleted packages * - suggested packages * - conflicting packages * * @param object extinfo which is a Package object * @param object package which is a com_meego_package object * */ public function addRelations($extinfo = null, $package = null) { // check if package is referred in a relation // and update the relation record's 'to' field unless // it has been set already $qc = new midgard_query_constraint_group('AND'); $qc->add_constraint(new midgard_query_constraint(new midgard_query_property('toname'), '=', new midgard_query_value($package->filename))); $qc->add_constraint(new midgard_query_constraint(new midgard_query_property('version'), '=', new midgard_query_value($package->version))); $q = new midgard_query_select(new midgard_query_storage('com_meego_package_relation')); $q->set_constraint($qc); $q->execute(); $relations = $q->list_objects(); if (!count($relations)) { $this->log(' package is not required by others'); } else { // repo of the current package $repository_a = new com_meego_repository(); $repository_a->get_by_id($package->repository); foreach ($relations as $relation) { if ($relation->to != 0) { $this->log(' package is in relation but "to" field is already set. relation id: ' . $relation->id); continue; } // get the related package object $related_package = new com_meego_package(); $related_package->get_by_id($relation->from); // repo of the related package $repository_b = new com_meego_repository(); $repository_b->get_by_id($related_package->repository); if ($repository_a->arch == $repository_b->arch) { // we can safely update the to field of this relation $this->log(' package is in relation with ' . $relation->from . ', update "to" field. relation id:' . $relation->id); $_relation = new com_meego_package_relation($relation->guid); $_relation->to = $package->id; $_relation->update(); } } unset($relations, $_relation); } if (is_array($extinfo->depends)) { /* delete relations that are no longer needed */ $this->cleanRelations('requires', $extinfo->depends, $package); foreach ($extinfo->depends as $dependency) { $this->createRelation('requires', $dependency, $package); } } if (is_array($extinfo->buildDepends)) { /* delete relations that are no longer needed */ $this->cleanRelations('buildrequires', $extinfo->buildDepends, $package); foreach ($extinfo->buildDepends as $dependency) { $this->createRelation('buildrequires', $dependency, $package); } } if (is_array($extinfo->provides)) { /* delete relations that are no longer needed */ $this->cleanRelations('provides', $extinfo->provides, $package); foreach ($extinfo->provides as $provided) { $this->createRelation('provides', $provided, $package); } } if (is_array($extinfo->obsoletes)) { /* delete relations that are no longer needed */ $this->cleanRelations('obsoletes', $extinfo->obsoletes, $package); foreach ($extinfo->obsoletes as $obsoleted) { $this->createRelation('obsoletes', $obsoleted, $package); } } if (is_array($extinfo->suggests)) { /* delete relations that are no longer needed */ $this->cleanRelations('suggests', $extinfo->suggests, $package); foreach ($extinfo->suggests as $suggested) { $this->createRelation('suggests', $suggested, $package); } } if (is_array($extinfo->conflicts)) { /* delete relations that are no longer needed */ $this->cleanRelations('conflicts', $extinfo->conflicts, $package); foreach ($extinfo->conflicts as $conflicted) { $this->createRelation('conflicts', $conflicted, $package); } } }