]> git.saurik.com Git - apt.git/blobdiff - test/scratch.cc
add a tiny dump solver to quickly output a scenario
[apt.git] / test / scratch.cc
index 6783f379632f5cf38564cb956a3fbbc3ab4f1036..d638c70972e454bf930b243a9628c77d84209d17 100644 (file)
-#include <apt-pkg/acquire-item.h>
-#include <apt-pkg/acquire-worker.h>
-#include <apt-pkg/init.h>
+#include <apt-pkg/dpkgdb.h>
+#include <apt-pkg/debfile.h>
 #include <apt-pkg/error.h>
-#include <strutl.h>
+#include <apt-pkg/configuration.h>
+#include <apt-pkg/progress.h>
+#include <apt-pkg/extract.h>
+#include <apt-pkg/init.h>
+#include <apt-pkg/fileutl.h>
 
-#include <signal.h>
-#include <stdio.h>
+using namespace std;
 
-class AcqTextStatus : public pkgAcquireStatus
+int main(int argc,char *argv[])
 {
-   unsigned int ScreenWidth;
-   char BlankLine[300];
-   unsigned long ID;
-   
-   public:
-   
-   virtual void IMSHit(pkgAcquire::ItemDesc &Itm);
-   virtual void Fetch(pkgAcquire::ItemDesc &Itm);
-   virtual void Done(pkgAcquire::ItemDesc &Itm);
-   virtual void Fail(pkgAcquire::ItemDesc &Itm);
-   virtual void Start() {pkgAcquireStatus::Start(); BlankLine[0] = 0; ID = 1;};
-   virtual void Stop();
-   
-   void Pulse(pkgAcquire *Owner);
-};
+   pkgInitConfig(*_config);
+   pkgInitSystem(*_config,_system);
 
-// AcqTextStatus::IMSHit - Called when an item got a HIT response      /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-void AcqTextStatus::IMSHit(pkgAcquire::ItemDesc &Itm)
-{
-   cout << '\r' << BlankLine << '\r';   
-   cout << "Hit " << Itm.Description;
-   if (Itm.Owner->FileSize != 0)
-      cout << " [" << SizeToStr(Itm.Owner->FileSize) << ']';
-   cout << endl;
-   Update = true;
-};
-                                                                       /*}}}*/
-// AcqTextStatus::Fetch - An item has started to download              /*{{{*/
-// ---------------------------------------------------------------------
-/* This prints out the short description and the expected size */
-void AcqTextStatus::Fetch(pkgAcquire::ItemDesc &Itm)
-{
-   Update = true;
-   if (Itm.Owner->Complete == true)
-      return;
-   
-   Itm.Owner->ID = ID++;
-   
-   cout << '\r' << BlankLine << '\r';   
-   cout << hex << Itm.Owner->ID << dec << " Get " << Itm.Description;
-   if (Itm.Owner->FileSize != 0)
-      cout << " [" << SizeToStr(Itm.Owner->FileSize) << ']';
-   cout << endl;
-};
-                                                                       /*}}}*/
-// AcqTextStatus::Done - Completed a download                          /*{{{*/
-// ---------------------------------------------------------------------
-/* We don't display anything... */
-void AcqTextStatus::Done(pkgAcquire::ItemDesc &Itm)
-{
-   Update = true;
-};
-                                                                       /*}}}*/
-// AcqTextStatus::Fail - Called when an item fails to download         /*{{{*/
-// ---------------------------------------------------------------------
-/* We print out the error text  */
-void AcqTextStatus::Fail(pkgAcquire::ItemDesc &Itm)
-{
-   cout << '\r' << BlankLine << '\r';   
-   cout << "Err " << Itm.Description << endl;
-   cout << "  " << Itm.Owner->ErrorText << endl;
-   Update = true;
-};
-                                                                       /*}}}*/
-// AcqTextStatus::Stop - Finished downloading                          /*{{{*/
-// ---------------------------------------------------------------------
-/* This prints out the bytes downloaded and the overall average line
-   speed */
-void AcqTextStatus::Stop()
-{
-   pkgAcquireStatus::Stop();
-   cout << '\r' << BlankLine << '\r';
-   
-   if (FetchedBytes == 0)
-      cout << flush;
-   else
-      cout << "Fetched " << SizeToStr(FetchedBytes) << " in " << 
-         TimeToStr(ElapsedTime) << " (" << SizeToStr(CurrentCPS) << 
-         "/s)" << endl;
-}
-                                                                       /*}}}*/
-// AcqTextStatus::Pulse - Regular event pulse                          /*{{{*/
-// ---------------------------------------------------------------------
-/* This draws the current progress. Each line has an overall percent
-   meter and a per active item status meter along with an overall 
-   bandwidth and ETA indicator. */
-void AcqTextStatus::Pulse(pkgAcquire *Owner)
-{
-   pkgAcquireStatus::Pulse(Owner);
-   
-   enum {Long = 0,Medium,Short} Mode = Long;
-   
-   ScreenWidth = 78;
-   char Buffer[300];
-   char *End = Buffer + sizeof(Buffer);
-   char *S = Buffer;
-   
-   // Put in the percent done
-   sprintf(S,"%ld%%",long(double(CurrentBytes*100.0)/double(TotalBytes)));   
+//   cout << flNoLink(argv[1]) << endl;
+   
+//   #if 0
+/*   DynamicMMap *FileMap = new DynamicMMap(MMap::Public);
+   pkgFLCache *FList = new pkgFLCache(*FileMap);
+   
+   char *Name = "/tmp/test";
+   pkgFLCache::PkgIterator Pkg(*FList,0);
+   pkgFLCache::NodeIterator Node = FList->GetNode(Name,Name+strlen(Name),Pkg.Offset(),true,false);
+   cout << (pkgFLCache::Node *)Node << endl;
+   Node = FList->GetNode(Name,Name+strlen(Name),Pkg.Offset(),true,false);
+   cout << (pkgFLCache::Node *)Node << endl;
+*/
+//   #if 0
+   _config->Set("Dir::State::status","/tmp/testing/status");
+
+   debDpkgDB Db;
    
-   for (pkgAcquire::Worker *I = Owner->WorkersBegin(); I != 0;
-       I = Owner->WorkerStep(I))
    {
-      S += strlen(S);
+      OpTextProgress Prog;
       
-      // There is no item running 
-      if (I->CurrentItem == 0)
-      {
-        if (I->Status.empty() == false)
-           snprintf(S,End-S," [%s]",I->Status.c_str());
-        continue;
-      }
-
-      // Add in the short description
-      if (I->CurrentItem->Owner->ID != 0)
-        snprintf(S,End-S," [%x %s",I->CurrentItem->Owner->ID,
-                 I->CurrentItem->ShortDesc.c_str());
-      else
-        snprintf(S,End-S," [%s",I->CurrentItem->ShortDesc.c_str());
-      S += strlen(S);
-
-      // Show the short mode string
-      if (I->CurrentItem->Owner->Mode != 0)
-      {
-        snprintf(S,End-S," %s",I->CurrentItem->Owner->Mode);
-        S += strlen(S);
-      }
-            
-      // Add the current progress
-      if (Mode == Long)
-        snprintf(S,End-S," %u",I->CurrentSize);
-      else
-      {
-        if (Mode == Medium || I->TotalSize == 0)
-           snprintf(S,End-S," %s",SizeToStr(I->CurrentSize).c_str());
-      }
-      S += strlen(S);
+      if (Db.ReadyPkgCache(Prog) == false)
+        cerr << "Error!" << endl;
+      Prog.Done();
       
-      // Add the total size and percent
-      if (I->TotalSize > 0 && I->CurrentItem->Owner->Complete == false)
-      {
-        if (Mode == Long)
-           snprintf(S,End-S,"/%u %u%%",I->TotalSize,
-                    long(double(I->CurrentSize*100.0)/double(I->TotalSize)));
-        else
-        {
-           if (Mode == Medium)
-              snprintf(S,End-S,"/%s %u%%",SizeToStr(I->TotalSize).c_str(),
-                       long(double(I->CurrentSize*100.0)/double(I->TotalSize)));
-           else
-              snprintf(S,End-S," %u%%",
-                       long(double(I->CurrentSize*100.0)/double(I->TotalSize)));
-        }      
-      }      
-      S += strlen(S);
-      snprintf(S,End-S,"]");
-   }
-
-   // Put in the ETA and cps meter
-   if (CurrentCPS != 0)
-   {      
-      char Tmp[300];
-      unsigned long ETA = (unsigned long)((TotalBytes - CurrentBytes)/CurrentCPS);
-      sprintf(Tmp," %s/s %s",SizeToStr(CurrentCPS).c_str(),TimeToStr(ETA).c_str());
-      unsigned int Len = strlen(Buffer);
-      unsigned int LenT = strlen(Tmp);
-      if (Len + LenT < ScreenWidth)
-      {         
-        memset(Buffer + Len,' ',ScreenWidth - Len);
-        strcpy(Buffer + ScreenWidth - LenT,Tmp);
-      }      
+      if (Db.ReadyFileList(Prog) == false)
+        cerr << "Error!" << endl;
    }
-   Buffer[ScreenWidth] = 0;
    
-   // Draw the current status
-   if (strlen(Buffer) == strlen(BlankLine))
-      cout << '\r' << Buffer << flush;
-   else
-      cout << '\r' << BlankLine << '\r' << Buffer << flush;
-   memset(BlankLine,' ',strlen(Buffer));
-   BlankLine[strlen(Buffer)] = 0;
+   if (_error->PendingError() == true)
+   {
+      _error->DumpErrors();
+      return 0;
+   }
    
-   Update = false;
-}
-                                                                       /*}}}*/
+/*   Db.GetFLCache().BeginDiverLoad();
+   pkgFLCache::PkgIterator Pkg(Db.GetFLCache(),0);
+   if (Db.GetFLCache().AddDiversion(Pkg,"/usr/include/linux/kerneld.h","/usr/bin/nslookup") == false)
+      cerr << "Error!" << endl;
 
-int main(int argc,char *argv[])
-{
-   signal(SIGPIPE,SIG_IGN);
+   const char *Tmp = "/usr/include/linux/kerneld.h";
+   pkgFLCache::NodeIterator Nde = Db.GetFLCache().GetNode(Tmp,Tmp+strlen(Tmp),0,false,false);
+   map_ptrloc Loc = Nde->File;
+      
+   for (; Nde.end() == false && Nde->File == Loc; Nde++)
+      cout << Nde->Flags << ',' << Nde->Pointer << ',' << Nde.File() << endl;
+   Db.GetFLCache().FinishDiverLoad();*/
 
-   URI Foo(argv[1]);
-   cout << Foo.Access << '\'' << endl;
-   cout << Foo.Host << '\'' << endl;
-   cout << Foo.Path << '\'' << endl;
-   cout << Foo.User << '\'' << endl;
-   cout << Foo.Password << '\'' << endl;
-   cout << Foo.Port << endl;
-   
-   return 0;
+/*   unsigned int I = 0;
+   pkgFLCache &Fl = Db.GetFLCache();
+   while (I < Fl.HeaderP->HashSize)
+   {
+      cout << I << endl;
+      pkgFLCache::NodeIterator Node(Fl,Fl.NodeP + Fl.HeaderP->FileHash + I++);
+      if (Node->Pointer == 0)
+        continue;
+      for (; Node.end() == false; Node++)
+      {
+        cout << Node.DirN() << '/' << Node.File();
+        if (Node->Flags == pkgFLCache::Node::Diversion)
+           cout << " (div)";
+        if (Node->Flags == pkgFLCache::Node::ConfFile)
+           cout << " (conf)";
+        cout << endl;
+      }
+   }*/
 
-   pkgInitialize(*_config);
-   
-   pkgSourceList List;
-   AcqTextStatus Stat;
-   pkgAcquire Fetcher(&Stat);
-   List.ReadMainList();
-   
-   pkgSourceList::const_iterator I;
-   for (I = List.begin(); I != List.end(); I++)
+   for (int I = 1; I < argc; I++)
    {
-      new pkgAcqIndex(&Fetcher,I);
-      if (_error->PendingError() == true)
-        break;
+      FileFd F(argv[I],FileFd::ReadOnly);
+      debDebFile Deb(F);
+      
+      if (Deb.ExtractControl(Db) == false)
+        cerr << "Error!" << endl;
+      cout << argv[I] << endl;
+      
+      pkgCache::VerIterator Ver = Deb.MergeControl(Db);
+      if (Ver.end() == true)
+        cerr << "Failed" << endl;
+      else
+        cout << Ver.ParentPkg().Name() << ' ' << Ver.VerStr() << endl;
+      
+      pkgExtract Extract(Db.GetFLCache(),Ver);
+      Deb.ExtractArchive(Extract);
    }
-   
-   Fetcher.Run();
-   
+//   #endif
+//#endif      
    _error->DumpErrors();
 }