int LocalPackage::get_xml() { legacyPackage=false; _parseOk=false; //mDebug("get_xml start"); string tmp_xml=get_tmp_file(); //mDebug("Extracting XML"); extractFromTgz(filename, "install/data.xml", tmp_xml); if (!FileNotEmpty(tmp_xml)) { //mDebug("XML empty, parsing as legacy"); say(_("%s: No XML, converting from legacy\n"), filename.c_str()); legacyPackage=true; FILE *legacy = fopen("/var/log/mpkg-legacy.log", "a"); if (legacy) { fprintf(legacy, "%s\n", filename.c_str()); fclose(legacy); } // In most cases it means that we have legacy Slackware package. // Trying to convert: //mDebug("Converting from legacy to XML"); if (slack2xml(filename, tmp_xml) != 0) { mError("Infernally invalid package! Cannot work with it at all"); unlink(tmp_xml.c_str()); delete_tmp_files(); return -1; } //mDebug("Converted"); } //mDebug("Parsing XML"); PackageConfig p(tmp_xml); unlink(tmp_xml.c_str()); if (!p.parseOk) { //mDebug("Error parsing XML"); delete_tmp_files(); return -100; } int bufsize; xmlChar * membuff = p.getXMLNodeXPtr(&bufsize); __doc = xmlParseMemory((const char *) membuff, bufsize); xmlFree(membuff); _packageXMLNode = xmlDocGetRootElement(__doc); xml2package(p.getXMLDoc(), p.getXMLNode(), &data); //mDebug("get_xml end"); delete_tmp_files(); _parseOk=true; return 0; }
int xml2spkg(xmlNodePtr pkgNode, SPKG *data) { //mDebug("reading package node"); #ifdef XPTR_MODE // Init using xmlNodePtr PackageConfig p(pkgNode); #else // Init using string dump xmlDocPtr doc = xmlNewDoc((const xmlChar *) "1.0"); xmlDocSetRootElement(doc,pkgNode); /* FILE *__dump = fopen(TEMP_XML_DOC,"w"); xmlDocDump(__dump, doc); fclose(__dump); */ xmlChar * membuff; int bufsize; xmlDocDumpMemory(doc, &membuff, &bufsize); //xmlFreeDoc(doc); //PackageConfig p(TEMP_XML_DOC); PackageConfig p(membuff, bufsize); #endif if (!p.parseOk) return -100; // Now, import spkg-related things data->buildsystem = p.getBuildSystem(); data->url = p.getBuildUrl(); data->configure_keys = p.getBuildKeyNames(); data->configure_values = p.getBuildKeyValues(); data->patches = p.getBuildPatchList(); data->source_root = p.getBuildSourceRoot(); data->max_numjobs = p.getBuildMaxNumjobs(); data->allow_change_cflags = p.getBuildOptimizationCustomizable(); data->march = p.getBuildOptimizationMarch(); data->mtune = p.getBuildOptimizationMtune(); data->olevel = p.getBuildOptimizationLevel(); data->custom_gcc_options = p.getBuildOptimizationCustomGccOptions(); data->use_cflags = p.getBuildUseCflags(); data->custom_configure = p.getBuildCmdConfigure(); data->custom_make = p.getBuildCmdMake(); data->custom_makeinstall = p.getBuildCmdMakeInstall(); data->no_subfolder = p.getBuildNoSubfolder(); data->env_options = p.getBuildConfigureEnvOptions(); data->nostrip = p.getValue((const char *) GET_PKG_MBUILD_NOSTRIP)=="true"; xml2package(p.getXMLDoc(), p.getXMLNode(), &data->pkg); return 0; }
// Add other such functions for other repository types. int Repository::get_index(string server_url, PACKAGE_LIST *packages, unsigned int type) { if (actionBus._abortActions) { actionBus._abortComplete=true; actionBus.setActionState(ACTIONID_DBUPDATE, ITEMSTATE_ABORTED); return MPKGERROR_ABORTED; } currentStatus = "Updating data from "+ server_url+"..."; mDebug("get_index!"); // First: detecting repository type // Trying to download in this order (if successful, we have detected a repository type): // 1. packages.xml.gz (Native MOPSLinux) // 2. PACKAGES.TXT (Legacy Slackware) // 3. Packages.gz (Debian) // (and something else for RPM, in future) string index_filename = get_tmp_file(); string md5sums_filename = get_tmp_file(); if (!dialogMode) say("[%s] ...\r",server_url.c_str()); string cm = "gunzip -f "+index_filename+".gz 2>/dev/null"; if (type == TYPE_MPKG || type == TYPE_AUTO) { actionBus.getActionState(0); mDebug("trying MPKG, type = "+ IntToStr(type)); if (CommonGetFile(server_url + "packages.xml.gz", index_filename+".gz")==DOWNLOAD_OK) { actionBus.getActionState(0); mDebug("download ok, validating contents..."); if (system(cm.c_str())==0 && \ ReadFile(index_filename).find("<?xml version=\"1.0\"")!=std::string::npos && ReadFile(index_filename).find("<repository")!=std::string::npos) { currentStatus = "Detected native MPKG repository"; type = TYPE_MPKG; } } } if (actionBus._abortActions) { actionBus._abortComplete=true; actionBus.setActionState(ACTIONID_DBUPDATE, ITEMSTATE_ABORTED); return MPKGERROR_ABORTED; } if (type == TYPE_SLACK || type == TYPE_AUTO) { mDebug("trying SLACK, type = "+ IntToStr(type)); if (CommonGetFile(server_url + "PACKAGES.TXT", index_filename)==DOWNLOAD_OK) { mDebug("download ok, validating contents..."); if (ReadFile(index_filename).find("PACKAGE NAME: ")!=std::string::npos) { currentStatus = _("Detected legacy Slackware repository"); if (CommonGetFile(server_url + "CHECKSUMS.md5", md5sums_filename) == DOWNLOAD_OK) { type = TYPE_SLACK; } else { mError(_("Error downloading checksums")); return -1; // Download failed: no checksums or checksums download error } } } } if (actionBus._abortActions) { actionBus._abortComplete=true; actionBus.setActionState(ACTIONID_DBUPDATE, ITEMSTATE_ABORTED); return MPKGERROR_ABORTED; } if (type == TYPE_DEBIAN || type == TYPE_AUTO) { if(CommonGetFile(server_url + "Packages.gz", index_filename+".gz")==DOWNLOAD_OK) { type = TYPE_DEBIAN; } } if (type != TYPE_MPKG && type != TYPE_SLACK && type!=TYPE_DEBIAN) { currentStatus = _("Error updating data from ") +server_url+_(": download error or unsupported type"); mError(_("Error downloading package index: download error, or unsupported repository type")); return -1; } mDebug("Starting to parse index"); PACKAGE *pkg = new PACKAGE; string xml_name=index_filename; // XMLNode *repository_root = new XMLNode; xmlDocPtr indexDoc; xmlNodePtr indexRootNode; // int pkg_count; int ret=0; currentStatus = "["+server_url+"] Importing data..."; if (actionBus._abortActions) { actionBus._abortComplete=true; actionBus.setActionState(ACTIONID_DBUPDATE, ITEMSTATE_ABORTED); return MPKGERROR_ABORTED; } string *pList = new string; string *mList = new string; //XMLNode *tmp = new XMLNode; //xmlDocPtr indexDoc; //xmlNodePtr indexRootNode; switch(type) { case TYPE_MPKG: indexDoc = xmlReadFile(xml_name.c_str(), "UTF-8", 0); if (indexDoc == NULL) { xmlFreeDoc(indexDoc); mError("ппц..."); return -1; } else mDebug("indexDoc read successfully"); indexRootNode = xmlDocGetRootElement(indexDoc); if (indexRootNode == NULL) { mError(_("Failed to get index")); xmlFreeDoc(indexDoc); } else mDebug("indexRootNode read successfully"); if (xmlStrcmp(indexRootNode->name, (const xmlChar *) "repository") ) { mError(_("Invalid index file")); xmlFreeDoc(indexDoc); } else mDebug("Found valid repository index"); xmlXPathContextPtr xContext; xmlXPathObjectPtr xResult; xContext = xmlXPathNewContext(indexDoc); if (xContext == NULL) { mError("ппц"); } xResult = xmlXPathEvalExpression((const xmlChar *)"/repository/package", xContext); if (xResult == NULL) { mError("XPath expression error"); } if (xmlXPathNodeSetIsEmpty(xResult->nodesetval)) { xmlXPathFreeObject(xResult); printf(_("[%s] ... Nothing found\n"), server_url.c_str()); //mError("No packages found"); return 0; } xmlNodeSetPtr xNodeSet; int xi; actionBus.setActionProgress(ACTIONID_DBUPDATE, 0); xNodeSet = xResult->nodesetval; xmlXPathFreeContext(xContext); actionBus.setActionProgressMaximum(ACTIONID_DBUPDATE, xNodeSet->nodeNr); if (xNodeSet->nodeNr==0) printf("[%s] ... Nothing found", server_url.c_str()); for (xi = 0; xi < xNodeSet->nodeNr; xi++) { printf("[%s] ... Importing received data: %d/%d\r",server_url.c_str(), xi+1, xNodeSet->nodeNr); actionBus.setActionProgress(ACTIONID_DBUPDATE, xi); mDebug("Processing " + IntToStr(xi) + " node"); if (actionBus._abortActions) { actionBus._abortComplete = true; actionBus.setActionState(ACTIONID_DBUPDATE, ITEMSTATE_ABORTED); return MPKGERROR_ABORTED; } actionBus.setActionProgress(ACTIONID_DBUPDATE, xi); pkg->clear(); mDebug("Calling xml2Package"); if (xml2package(xNodeSet->nodeTab[xi], pkg)<0) { mError("Failed to parse"); abort(); } else mDebug("xml2package OK"); // Adding location data pkg->get_locations()->at(0).set_server_url(&server_url); packages->add(pkg); } printf("\n"); xmlCleanupMemory(); xmlCleanupParser(); /* *repository_root=XMLNode::openFileHelper(xml_name.c_str(), "repository"); pkg_count=repository_root->nChildNode("package"); if (pkg_count==0) { mError("Repository has no packages\n"); delete pkg; return 0; } actionBus.setActionProgress(ACTIONID_DBUPDATE, 0); for (int i=0; i<pkg_count; i++) { if (actionBus._abortActions) { actionBus._abortComplete=true; actionBus.setActionState(ACTIONID_DBUPDATE, ITEMSTATE_ABORTED); return MPKGERROR_ABORTED; } actionBus.setActionProgress(ACTIONID_DBUPDATE, i); pkg->clear(); *tmp = repository_root->getChildNode("package", i); xml2package(tmp, pkg); // Adding location data pkg->get_locations()->at(0).set_server_url(&server_url); packages->add(pkg); }*/ //delete tmp; break; case TYPE_SLACK: *pList = ReadFile(index_filename); *mList = ReadFile(md5sums_filename); ret = slackpackages2list(pList, mList, packages, server_url); if (pList!=NULL) delete pList; if (mList!=NULL) delete mList; break; case TYPE_DEBIAN: break; default: break; } delete pkg; return ret; }
void generateDeps(string tgz_filename, bool updateOnly) { if (mConfig.getValue("add_deps_in_build")=="yes") updateOnly=false; if (tgz_filename.empty()) { mError("No filename specified"); return; } say("Generating dependencies for %s\n",tgz_filename.c_str()); string current_dir = (string) get_current_dir_name(); // Create a temporary directory string tmpdir = get_tmp_file(); string dep_out = get_tmp_file(); unlink(tmpdir.c_str()); system("mkdir -p " + tmpdir); say("Extracting\n"); system("tar zxf " + tgz_filename + " -C " + tmpdir); PackageConfig *p = new PackageConfig(tmpdir+"/install/data.xml"); PACKAGE pkg; if (p->parseOk) xml2package(p->getXMLNode(), &pkg); delete p; say("Building dependencies\n"); system("env LC_ALL=C requiredbuilder -n -v " + tgz_filename + " > "+ dep_out); vector<string> data = ReadFileStrings(dep_out); string tmp; string tail; DEPENDENCY d; //pkg.get_dependencies()->clear(); string condptr; for (unsigned int i=0; i<data.size(); i++) { tmp = data[i].substr(0,data[i].find_first_of(" ")); tail = data[i].substr(tmp.length()+1); d.set_package_name(&tmp); tmp = tail.substr(0, tail.find_first_of(" ")); tail = tail.substr(tmp.length()+1); condptr=IntToStr(condition2int(hcondition2xml(tmp))); d.set_condition(&condptr); tmp = tail.substr(0,tail.find_first_of("-")); d.set_package_version(&tmp); if (*d.get_package_name()!=*pkg.get_name()) { // Checking existing dependencies bool added=false; for (unsigned int t=0; t<pkg.get_dependencies()->size(); t++) { if (*d.get_package_name()==*pkg.get_dependencies()->at(t).get_package_name()) { pkg.get_dependencies()->at(t) = d; added=true; } } if (!added) { if (updateOnly) mWarning("Found (possible) missing dependencies: " + d.getDepInfo()); else pkg.get_dependencies()->push_back(d); } } } say(_("Got %d dependencies\n"), pkg.get_dependencies()->size()); p = new PackageConfig(tmpdir+"/install/data.xml"); dumpPackage(&pkg, p, tmpdir+"/install/data.xml"); delete p; if (tgz_filename[0]!='/') tgz_filename = current_dir + "/"+getDirectory(tgz_filename); system ("cd " + tmpdir + "; buildpkg " + tgz_filename ); system("rm -rf " + tmpdir); delete_tmp_files(); }