Browse Source

* remove spaces and tabs
* first things to add archive unzipping

git-svn-id: trunk@6447 -

peter 18 years ago
parent
commit
2fe7c8ec82

+ 1 - 0
.gitattributes

@@ -8255,6 +8255,7 @@ utils/fppkg/lnet/sys/lkqueueeventerh.inc svneol=native#text/plain
 utils/fppkg/lnet/sys/lspawnfcgiunix.inc svneol=native#text/plain
 utils/fppkg/lnet/sys/lspawnfcgiwin.inc svneol=native#text/plain
 utils/fppkg/lnet/sys/osunits.inc svneol=native#text/plain
+utils/fppkg/pkgarchive.pp svneol=native#text/plain
 utils/fppkg/pkgcommands.pp svneol=native#text/plain
 utils/fppkg/pkgdownload.pp svneol=native#text/plain
 utils/fppkg/pkgfpmake.pp svneol=native#text/plain

+ 5 - 5
utils/fppkg/fpmktype.pp

@@ -14,16 +14,16 @@ Type
   TOS = (Amiga,Atari,Darwin,FreeBSD,Go32v2,Linux,MacOS,MorphOS,NetBSD,
          Netware,NetwLibc,OpenBSD,OS2,PalmOS,Solaris,Win32,Win64,wince,Emx);
   TOSes = Set of TOS;
-  
+
   TCPU = (Arm,I386,PPC,SPARC,X86_64,m68k);
   TCPUS = Set of TCPU;
-  
+
   TCompilerMode = (FPC,TP,ObjFPC,Delphi,MacPas);
   TCompilerModes = Set of TCompilerMode;
-  
+
   TTargetType = (ttUnit,ttProgram,ttExampleUnit,ttExampleProgram);
   TTargetTypes = set of TTargetType;
-  
+
   TTargetState = (tsNeutral,tsCompiling,tsCompiled,tsInstalled);
   TTargetStates = Set of TTargetState;
 
@@ -35,7 +35,7 @@ Type
                 caBeforeArchive,caAfterArchive,
                 caBeforeClean,caAfterClean,
                 caBeforeDownload,caAfterDownload);
-  
+
   TLogEvent = Procedure (Level : TVerboseLevel; Const Msg : String) of Object;
 
   EInstallerError = Class(Exception);

+ 59 - 59
utils/fppkg/fpmkunit.pp

@@ -14,16 +14,16 @@ Type
 
   TOS = fpmktype.TOS;
   TOSes = fpmktype.TOSes;
-  
+
   TCPU = fpmkType.TCPU;
   TCPUS = fpmktype.TCPUS;
-  
+
   TCompilerMode = fpmktype.TCompilerMode;
   TCompilerModes = fpmktype.TCompilerModes;
-  
+
   TTargetType = fpmktype.TTargetType;
   TTargetTypes = fpmktype.TTargetTypes;
-  
+
   TTargetState = fpmktype.TTargetState;
   TTargetStates = fpmktype.TTargetStates;
 
@@ -31,9 +31,9 @@ Type
   TVerboseLevels = fpmktype.TVerboseLevels;
 
   TLogEvent = fpmktype.TLogEvent;
-  
+
   TRunMode = (rmHelp,rmCompile,rmBuild,rmInstall,rmArchive,rmClean,rmManifest);
-  
+
   { TNamedItem }
 
   TNamedItem = Class(TCollectionItem)
@@ -42,8 +42,8 @@ Type
     procedure SetName(const AValue: String);virtual;
   Public
     property Name : String Read FName Write SetName;
-  end;  
-  
+  end;
+
   { TNamedCollection }
 
   TNamedCollection = Class(TCollection)
@@ -54,9 +54,9 @@ Type
     Function ItemByName(AName : String) : TNamedItem;
     Property UniqueNames : Boolean Read FUniqueNames;
   end;
-  
+
   { TNamedItemList }
-  
+
   TNamedItemList = Class(TList)
   private
     function GetNamedItem(Index : Integer): TNamedItem;
@@ -66,7 +66,7 @@ Type
     Function ItemByName(ANAme : String) : TNamedItem;
     Property NamedItems[Index : Integer] : TNamedItem Read GetNamedItem Write SetNamedItem; default;
   end;
-  
+
   TCommandAt = fpmktype.TCommandAt;
 
   { TCommand }
@@ -90,7 +90,7 @@ Type
     Property BeforeCommand : TNotifyEvent Read FBeforeCommand Write FBeforeCommand;
     Property AfterCommand : TNotifyEvent Read FAfterCommand Write FAfterCommand;
   end;
-  
+
   { TCommands }
 
   TCommands = Class(TNamedCollection)
@@ -213,9 +213,9 @@ Type
     Property DefaultOS : TOSes Read FDefaultOS Write FDefaultOS;
     Property DefaultCPU : TCPUs Read FDefaultCPU Write FDefaultCPU;
   end;
-  
+
   { TPackage }
-  
+
   TPackage = Class(TNamedItem) // Maybe descend from/use TTarget ?
   private
     FAfterArchive: TNotifyEvent;
@@ -324,7 +324,7 @@ Type
   end;
 
   { TDefaults }
-  
+
   TDefaults = Class(TPersistent)
   Private
     FArchive: String;
@@ -571,14 +571,14 @@ Type
     FValue : String;
     Constructor Create(AValue : String);
   end;
-  
+
   { TFunctionItem }
 
   TFunctionItem = Class(TObject)
     FFunc : TReplaceFunction;
     Constructor Create(AFunc : TReplaceFunction);
   end;
-  
+
   { TDictionary }
 
   TDictionary = Class(TComponent)
@@ -604,7 +604,7 @@ Type
 // Constants are in the file as for fpmktype.
 
 {$i fpmkcnst.inc}
- 
+
 
 Type
   TArchiveEvent = Procedure (Const AFileName : String; List : TStrings) of Object;
@@ -672,7 +672,7 @@ ResourceString
   SWarnFailedToSetTime  = 'Warning: Failed to set timestamp on file : %s';
   SWarnFailedToGetTime  = 'Warning: Failed to get timestamp from file : %s';
   SWarnFileDoesNotExist = 'Warning: File "%s" does not exist';
-  
+
   // Log messages
   SLogEnterDir           = 'Entering directory: %s';
   SLogCompilingPackage   = 'Compiling package : %s';
@@ -896,7 +896,7 @@ function FixPath (APath : String) : String;
 
 Var
   P : PChar;
-  
+
 begin
   Result:=APath;
   If (result<>'') then
@@ -1370,8 +1370,8 @@ Var
   L : TStrings;
   Line : String;
   I,P,PC : Integer;
-  
-  
+
+
 begin
   L:=TStringList.Create;
   Try
@@ -1486,10 +1486,10 @@ end;
 Function QuoteXML(S : String) : string;
 
   Procedure W(Var J : Integer; Var R : String; T : String);
-  
+
   Var
     I: integer;
-  
+
   begin
     If J+Length(T)>Length(R) then
       SetLength(R,J+Length(T));
@@ -1508,8 +1508,8 @@ const
   gtStr = '&gt;';
 
 Var
-  I,J : Integer; 
- 
+  I,J : Integer;
+
 begin
   SetLength(Result,Length(S));
   J:=0;
@@ -1526,24 +1526,24 @@ begin
        #13: wrtStr('&#xD;');}
     else
       Result[J]:=S[i];
-    end;  
-    If (J=Length(Result)) and (I<Length(S)) then  
+    end;
+    If (J=Length(Result)) and (I<Length(S)) then
       SetLength(Result,J+Length(S)-I);
     end;
-  If J<>Length(Result) then  
-    SetLength(Result,J);  
+  If J<>Length(Result) then
+    SetLength(Result,J);
 end;
-                                              
-                  
+
+
 
 Procedure TPackage.GetManifest(Manifest : TStrings);
-  
+
 
 Var
   S : String;
   Release,Minor,Major : Word;
   i : integer;
-  
+
 begin
   With Manifest do
     begin
@@ -1567,7 +1567,7 @@ begin
           end;
         Add('</dependencies>');
         end;
-      end;  
+      end;
     Add('</package>');
     end;
 end;
@@ -1722,7 +1722,7 @@ begin
           L.LoadFromFile(FN);
           Result:=L.Text;
         Finally
-          L.Free;  
+          L.Free;
         end;
         end;
       end;
@@ -2012,13 +2012,13 @@ end;
 procedure TInstaller.Usage(FMT: String; Args: array of const);
 
   Procedure WriteCmd(C: Char; LC : String; Msg : String);
-  
+
   begin
     Writeln(stderr,'-',C,'  --',LC,'   ',MSG);
   end;
-  
+
   Procedure WriteOption(C: Char; LC : String; Msg : String);
-  
+
   begin
     Writeln(stderr,'-',C,'  --',LC,'=',SValue,'  ',MSG);
   end;
@@ -2078,7 +2078,7 @@ procedure TInstaller.Manifest;
 Var
   L : TStrings;
   I : Integer;
-  
+
 begin
   L:=TStringList.Create;
   Try
@@ -2088,7 +2088,7 @@ begin
       Writeln(L[i]);
   Finally
     L.Free;
-  end;    
+  end;
 end;
 
 constructor TInstaller.Create(AOWner: TComponent);
@@ -2208,7 +2208,7 @@ Var
   Fin,FOut : TFileStream;
   Count : Int64;
   A : Integer;
-  
+
 begin
   Log(vlCommand,SLogCopyingFile,[Src,Dest]);
   FIn:=TFileStream.Create(Src,fmopenRead);
@@ -2395,7 +2395,7 @@ Function TBuildEngine.FileNewer(Src,Dest : String) : Boolean;
 Var
   DS,DD : Longint;
   D1,D2 : TDateTime;
-  
+
 begin
   DS:=FileAge(Src);
   DD:=FileAge(Dest);
@@ -2414,7 +2414,7 @@ Var
   I : Integer;
   Cmd,O : String;
   E : Boolean;
-  
+
 begin
   For I:=0 to Commands.Count-1 do
     begin
@@ -2463,7 +2463,7 @@ begin
           ((Target.CPU=[]) or (Defaults.CPU in Target.CPU))
           and
           ((Target.OS=[]) or (Defaults.OS in Target.OS));
-  If not Result then  
+  If not Result then
     begin
     log(vldebug,'Target is not a unit or program');
     If Not ((Target.CPU=[]) or (Defaults.CPU in Target.CPU)) then
@@ -2571,7 +2571,7 @@ Function TBuildEngine.GetCompiler : String;
 
 Var
   S : String;
-  
+
 begin
   // Cache in FCompiler for speed.
   If (FCompiler='') then
@@ -2591,7 +2591,7 @@ procedure TBuildEngine.Compile(Target: TTarget);
 
 Var
   S : String;
-  
+
 begin
   if Target.State in [tsNeutral,tsCompiling] then
     begin
@@ -2630,8 +2630,8 @@ begin
         begin
         If (T.State=tsCompiling) then
           Log(vlWarning,SWarnCircularDependency,[Target.Name,T.Name])
-        else 
-          Compile(T) 
+        else
+          Compile(T)
         end
       else if Not FileExists(Target.Dependencies[i]) then
         Error(SErrDepUnknownTarget,[Target.Name,Target.Dependencies[i]]);
@@ -2715,7 +2715,7 @@ procedure TBuildEngine.Compile(APackage: TPackage);
 Var
   T : TTarget;
   I : Integer;
-  
+
 begin
   Log(vlInfo,SLogCompilingPackage,[APackage.Name]);
   FCurrentPackage:=APackage;
@@ -2859,7 +2859,7 @@ procedure TBuildEngine.Archive(APackage: TPackage);
 Var
   L : TStrings;
   A,S,C,O : String;
-  
+
 begin
   Log(vlInfo,SLogArchivingPackage,[APackage.Name]);
   DoBeforeArchive(Apackage);
@@ -2896,7 +2896,7 @@ procedure TBuildEngine.Clean(APackage: TPackage);
 Var
   O : String;
   List : TStringList;
-  
+
 begin
   Log(vlInfo,SLogCleaningPackage,[APackage.Name]);
   DoBeforeClean(Apackage);
@@ -3038,14 +3038,14 @@ Procedure TBuildEngine.GetManifest(Packages : TPackages; Manifest : TStrings);
 
 Var
   I : Integer;
-  
+
 begin
   If Assigned(BeforeManifest) then
     BeforeManifest(Self);
-  Manifest.Add('<packages>');  
+  Manifest.Add('<packages>');
   For I:=0 to Packages.Count-1 do
     GetManifest(Packages.PackageItems[i],Manifest);
-  Manifest.Add('</packages>');  
+  Manifest.Add('</packages>');
   If Assigned(AfterManifest) then
     AfterManifest(Self);
 end;
@@ -3085,7 +3085,7 @@ function TTarget.GetStrings(AIndex: integer): TStrings;
       S:=TStringList.Create;
     Result:=S;
   end;
-  
+
 begin
   Result:=Nil;
   Case AIndex Of
@@ -3278,7 +3278,7 @@ end;
 Var
   DefInstaller : TInstaller = Nil;
   DefDictionary : TDictionary = Nil;
-  
+
 Function Installer : TInstaller;
 
 begin
@@ -3353,7 +3353,7 @@ end;
 
 procedure TDictionary.AddFunction(const AName: String;
   FReplacement: TReplaceFunction);
-  
+
 Var
   I : Integer;
 
@@ -3392,7 +3392,7 @@ function TDictionary.GetValue(const AName,Args: String): String;
 Var
   O : TObject;
   I : Integer;
-  
+
 begin
   I:=Flist.IndexOf(AName);
   If (I=-1) then

+ 184 - 134
utils/fppkg/fppkg.lpi

@@ -12,7 +12,7 @@
       <MainUnit Value="0"/>
       <IconPath Value=".\"/>
       <TargetFileExt Value=""/>
-      <ActiveEditorIndexAtStart Value="15"/>
+      <ActiveEditorIndexAtStart Value="1"/>
     </General>
     <VersionInfo>
       <ProjectVersion Value=""/>
@@ -32,25 +32,25 @@
         <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/>
       </local>
     </RunParams>
-    <Units Count="25">
+    <Units Count="32">
       <Unit0>
         <Filename Value="fppkg.pp"/>
         <IsPartOfProject Value="True"/>
         <UnitName Value="fppkg"/>
-        <CursorPos X="32" Y="319"/>
-        <TopLine Value="305"/>
+        <CursorPos X="32" Y="21"/>
+        <TopLine Value="1"/>
         <EditorIndex Value="0"/>
-        <UsageCount Value="49"/>
+        <UsageCount Value="67"/>
         <Loaded Value="True"/>
       </Unit0>
       <Unit1>
         <Filename Value="pkgropts.pp"/>
         <IsPartOfProject Value="True"/>
         <UnitName Value="pkgropts"/>
-        <CursorPos X="32" Y="98"/>
-        <TopLine Value="77"/>
-        <EditorIndex Value="9"/>
-        <UsageCount Value="49"/>
+        <CursorPos X="1" Y="1"/>
+        <TopLine Value="1"/>
+        <EditorIndex Value="7"/>
+        <UsageCount Value="67"/>
         <Loaded Value="True"/>
       </Unit1>
       <Unit2>
@@ -58,86 +58,86 @@
         <IsPartOfProject Value="True"/>
         <CursorPos X="64" Y="8"/>
         <TopLine Value="1"/>
-        <UsageCount Value="49"/>
+        <UsageCount Value="67"/>
       </Unit2>
       <Unit3>
         <Filename Value="fpmktype.pp"/>
         <IsPartOfProject Value="True"/>
         <UnitName Value="fpmktype"/>
-        <CursorPos X="35" Y="9"/>
+        <CursorPos X="1" Y="1"/>
         <TopLine Value="1"/>
-        <EditorIndex Value="13"/>
-        <UsageCount Value="49"/>
+        <EditorIndex Value="12"/>
+        <UsageCount Value="67"/>
         <Loaded Value="True"/>
       </Unit3>
       <Unit4>
         <Filename Value="fpmkunit.pp"/>
         <IsPartOfProject Value="True"/>
         <UnitName Value="fpmkunit"/>
-        <CursorPos X="54" Y="18"/>
+        <CursorPos X="1" Y="1"/>
         <TopLine Value="1"/>
-        <EditorIndex Value="1"/>
-        <UsageCount Value="49"/>
+        <EditorIndex Value="3"/>
+        <UsageCount Value="67"/>
         <Loaded Value="True"/>
       </Unit4>
       <Unit5>
         <Filename Value="fprepos.pp"/>
         <IsPartOfProject Value="True"/>
         <UnitName Value="fprepos"/>
-        <CursorPos X="44" Y="208"/>
-        <TopLine Value="190"/>
+        <CursorPos X="1" Y="1"/>
+        <TopLine Value="1"/>
         <EditorIndex Value="5"/>
-        <UsageCount Value="49"/>
+        <UsageCount Value="67"/>
         <Loaded Value="True"/>
       </Unit5>
       <Unit6>
         <Filename Value="fpxmlrep.pp"/>
         <IsPartOfProject Value="True"/>
         <UnitName Value="fpxmlrep"/>
-        <CursorPos X="26" Y="79"/>
-        <TopLine Value="44"/>
-        <EditorIndex Value="8"/>
-        <UsageCount Value="49"/>
+        <CursorPos X="1" Y="1"/>
+        <TopLine Value="1"/>
+        <EditorIndex Value="6"/>
+        <UsageCount Value="67"/>
         <Loaded Value="True"/>
       </Unit6>
       <Unit7>
         <Filename Value="pkghandler.pp"/>
         <IsPartOfProject Value="True"/>
         <UnitName Value="pkghandler"/>
-        <CursorPos X="55" Y="112"/>
-        <TopLine Value="97"/>
-        <EditorIndex Value="17"/>
-        <UsageCount Value="49"/>
+        <CursorPos X="1" Y="107"/>
+        <TopLine Value="89"/>
+        <EditorIndex Value="15"/>
+        <UsageCount Value="67"/>
         <Loaded Value="True"/>
       </Unit7>
       <Unit8>
         <Filename Value="pkgmkconv.pp"/>
         <IsPartOfProject Value="True"/>
         <UnitName Value="pkgmkconv"/>
-        <CursorPos X="24" Y="123"/>
+        <CursorPos X="36" Y="131"/>
         <TopLine Value="97"/>
-        <EditorIndex Value="15"/>
-        <UsageCount Value="49"/>
+        <EditorIndex Value="14"/>
+        <UsageCount Value="67"/>
         <Loaded Value="True"/>
       </Unit8>
       <Unit9>
         <Filename Value="pkgdownload.pp"/>
         <IsPartOfProject Value="True"/>
         <UnitName Value="pkgdownload"/>
-        <CursorPos X="32" Y="18"/>
-        <TopLine Value="5"/>
-        <EditorIndex Value="14"/>
-        <UsageCount Value="49"/>
+        <CursorPos X="1" Y="1"/>
+        <TopLine Value="1"/>
+        <EditorIndex Value="13"/>
+        <UsageCount Value="67"/>
         <Loaded Value="True"/>
       </Unit9>
       <Unit10>
         <Filename Value="pkgmessages.pp"/>
         <IsPartOfProject Value="True"/>
         <UnitName Value="pkgmessages"/>
-        <CursorPos X="43" Y="29"/>
-        <TopLine Value="12"/>
-        <EditorIndex Value="12"/>
-        <UsageCount Value="49"/>
+        <CursorPos X="1" Y="1"/>
+        <TopLine Value="1"/>
+        <EditorIndex Value="11"/>
+        <UsageCount Value="67"/>
         <Loaded Value="True"/>
       </Unit10>
       <Unit11>
@@ -145,63 +145,59 @@
         <UnitName Value="streamcoll"/>
         <CursorPos X="66" Y="88"/>
         <TopLine Value="65"/>
-        <UsageCount Value="7"/>
+        <UsageCount Value="5"/>
       </Unit11>
       <Unit12>
         <Filename Value="streamcoll20.pp"/>
         <UnitName Value="streamcoll"/>
         <CursorPos X="3" Y="15"/>
         <TopLine Value="1"/>
-        <UsageCount Value="7"/>
+        <UsageCount Value="5"/>
       </Unit12>
       <Unit13>
         <Filename Value="..\..\..\fpc20\rtl\objpas\classes\classesh.inc"/>
-        <CursorPos X="17" Y="1345"/>
-        <TopLine Value="1326"/>
+        <CursorPos X="14" Y="599"/>
+        <TopLine Value="580"/>
         <EditorIndex Value="2"/>
-        <UsageCount Value="24"/>
+        <UsageCount Value="33"/>
         <Loaded Value="True"/>
       </Unit13>
       <Unit14>
         <Filename Value="..\..\..\fpc20\rtl\inc\objpash.inc"/>
         <CursorPos X="38" Y="277"/>
         <TopLine Value="269"/>
-        <EditorIndex Value="16"/>
-        <UsageCount Value="24"/>
-        <Loaded Value="True"/>
+        <UsageCount Value="31"/>
       </Unit14>
       <Unit15>
         <Filename Value="..\..\..\fpc20\fcl\inc\contnrs.pp"/>
         <UnitName Value="contnrs"/>
         <CursorPos X="1" Y="19"/>
         <TopLine Value="1"/>
-        <UsageCount Value="7"/>
+        <UsageCount Value="5"/>
       </Unit15>
       <Unit16>
         <Filename Value="contnrs20.pp"/>
         <UnitName Value="contnrs20"/>
         <CursorPos X="1" Y="1"/>
         <TopLine Value="1"/>
-        <EditorIndex Value="3"/>
-        <UsageCount Value="18"/>
-        <Loaded Value="True"/>
+        <UsageCount Value="25"/>
       </Unit16>
       <Unit17>
         <Filename Value="pkgcommands.pp"/>
         <UnitName Value="pkgcommands"/>
-        <CursorPos X="49" Y="48"/>
-        <TopLine Value="43"/>
-        <EditorIndex Value="11"/>
-        <UsageCount Value="23"/>
+        <CursorPos X="21" Y="88"/>
+        <TopLine Value="68"/>
+        <EditorIndex Value="9"/>
+        <UsageCount Value="32"/>
         <Loaded Value="True"/>
       </Unit17>
       <Unit18>
         <Filename Value="pkgwget.pp"/>
         <UnitName Value="pkgwget"/>
-        <CursorPos X="38" Y="30"/>
-        <TopLine Value="17"/>
+        <CursorPos X="1" Y="1"/>
+        <TopLine Value="1"/>
         <EditorIndex Value="4"/>
-        <UsageCount Value="18"/>
+        <UsageCount Value="27"/>
         <Loaded Value="True"/>
       </Unit18>
       <Unit19>
@@ -209,33 +205,29 @@
         <UnitName Value="pkglnet"/>
         <CursorPos X="36" Y="19"/>
         <TopLine Value="1"/>
-        <UsageCount Value="10"/>
+        <UsageCount Value="8"/>
       </Unit19>
       <Unit20>
         <Filename Value="reptest.pp"/>
         <UnitName Value="reptest"/>
-        <CursorPos X="1" Y="93"/>
-        <TopLine Value="59"/>
-        <EditorIndex Value="6"/>
-        <UsageCount Value="17"/>
-        <Loaded Value="True"/>
+        <CursorPos X="1" Y="1"/>
+        <TopLine Value="1"/>
+        <UsageCount Value="22"/>
       </Unit20>
       <Unit21>
         <Filename Value="rep2xml.lpr"/>
         <UnitName Value="rep2xml"/>
-        <CursorPos X="1" Y="249"/>
+        <CursorPos X="40" Y="228"/>
         <TopLine Value="217"/>
-        <EditorIndex Value="7"/>
-        <UsageCount Value="15"/>
-        <Loaded Value="True"/>
+        <UsageCount Value="22"/>
       </Unit21>
       <Unit22>
-        <Filename Value="pkgfpmake.pp"/>
-        <UnitName Value="pkgfpmake"/>
-        <CursorPos X="86" Y="58"/>
+        <Filename Value="pkgarchive.pp"/>
+        <UnitName Value="pkgarchive"/>
+        <CursorPos X="32" Y="61"/>
         <TopLine Value="50"/>
-        <EditorIndex Value="10"/>
-        <UsageCount Value="14"/>
+        <EditorIndex Value="8"/>
+        <UsageCount Value="23"/>
         <Loaded Value="True"/>
       </Unit22>
       <Unit23>
@@ -243,142 +235,195 @@
         <UnitName Value="pkgoCurl"/>
         <CursorPos X="1" Y="1"/>
         <TopLine Value="1"/>
-        <UsageCount Value="10"/>
+        <UsageCount Value="8"/>
       </Unit23>
       <Unit24>
         <Filename Value="pkglibcurl.pp"/>
         <UnitName Value="pkglibcurl"/>
         <CursorPos X="1" Y="1"/>
         <TopLine Value="1"/>
-        <UsageCount Value="10"/>
+        <UsageCount Value="8"/>
       </Unit24>
+      <Unit25>
+        <Filename Value="zipper.pp"/>
+        <UnitName Value="zipper"/>
+        <CursorPos X="21" Y="1324"/>
+        <TopLine Value="1303"/>
+        <EditorIndex Value="1"/>
+        <UsageCount Value="15"/>
+        <Loaded Value="True"/>
+      </Unit25>
+      <Unit26>
+        <Filename Value="..\..\..\fpc20\rtl\objpas\sysutils\filutilh.inc"/>
+        <CursorPos X="12" Y="53"/>
+        <TopLine Value="40"/>
+        <UsageCount Value="13"/>
+      </Unit26>
+      <Unit27>
+        <Filename Value="..\..\..\fpc20\rtl\inc\systemh.inc"/>
+        <CursorPos X="3" Y="214"/>
+        <TopLine Value="313"/>
+        <UsageCount Value="13"/>
+      </Unit27>
+      <Unit28>
+        <Filename Value="..\..\..\fpc20\rtl\objpas\sysutils\datih.inc"/>
+        <CursorPos X="16" Y="93"/>
+        <TopLine Value="86"/>
+        <UsageCount Value="13"/>
+      </Unit28>
+      <Unit29>
+        <Filename Value="zstream.pp"/>
+        <UnitName Value="zstream"/>
+        <CursorPos X="38" Y="348"/>
+        <TopLine Value="330"/>
+        <UsageCount Value="11"/>
+      </Unit29>
+      <Unit30>
+        <Filename Value="..\..\..\fpc20\packages\base\paszlib\paszlib.pas"/>
+        <UnitName Value="paszlib"/>
+        <CursorPos X="34" Y="139"/>
+        <TopLine Value="118"/>
+        <UsageCount Value="11"/>
+      </Unit30>
+      <Unit31>
+        <Filename Value="pkgfpmake.pp"/>
+        <UnitName Value="pkgfpmake"/>
+        <CursorPos X="1" Y="89"/>
+        <TopLine Value="59"/>
+        <EditorIndex Value="10"/>
+        <UsageCount Value="12"/>
+        <Loaded Value="True"/>
+      </Unit31>
     </Units>
     <JumpHistory Count="30" HistoryIndex="29">
       <Position1>
-        <Filename Value="pkghandler.pp"/>
-        <Caret Line="25" Column="36" TopLine="6"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="1347" Column="5" TopLine="1310"/>
       </Position1>
       <Position2>
-        <Filename Value="pkghandler.pp"/>
-        <Caret Line="323" Column="58" TopLine="303"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="1" Column="1" TopLine="1"/>
       </Position2>
       <Position3>
-        <Filename Value="pkgcommands.pp"/>
-        <Caret Line="77" Column="20" TopLine="58"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="1095" Column="22" TopLine="1072"/>
       </Position3>
       <Position4>
-        <Filename Value="fppkg.pp"/>
-        <Caret Line="106" Column="48" TopLine="88"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="1308" Column="7" TopLine="1291"/>
       </Position4>
       <Position5>
-        <Filename Value="pkgwget.pp"/>
-        <Caret Line="1" Column="1" TopLine="1"/>
+        <Filename Value="pkgcommands.pp"/>
+        <Caret Line="69" Column="27" TopLine="40"/>
       </Position5>
       <Position6>
-        <Filename Value="pkgwget.pp"/>
-        <Caret Line="7" Column="42" TopLine="1"/>
+        <Filename Value="pkgfpmake.pp"/>
+        <Caret Line="92" Column="36" TopLine="63"/>
       </Position6>
       <Position7>
-        <Filename Value="pkghandler.pp"/>
-        <Caret Line="114" Column="74" TopLine="97"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="41" Column="46" TopLine="13"/>
       </Position7>
       <Position8>
-        <Filename Value="pkgropts.pp"/>
-        <Caret Line="237" Column="1" TopLine="219"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="1297" Column="108" TopLine="1282"/>
       </Position8>
       <Position9>
-        <Filename Value="pkgropts.pp"/>
-        <Caret Line="93" Column="18" TopLine="70"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="557" Column="20" TopLine="541"/>
       </Position9>
       <Position10>
-        <Filename Value="pkgropts.pp"/>
-        <Caret Line="196" Column="1" TopLine="169"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="542" Column="25" TopLine="535"/>
       </Position10>
       <Position11>
-        <Filename Value="fpxmlrep.pp"/>
-        <Caret Line="553" Column="2" TopLine="528"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="557" Column="30" TopLine="547"/>
       </Position11>
       <Position12>
-        <Filename Value="pkghandler.pp"/>
-        <Caret Line="243" Column="76" TopLine="229"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="268" Column="20" TopLine="249"/>
       </Position12>
       <Position13>
-        <Filename Value="fppkg.pp"/>
-        <Caret Line="108" Column="24" TopLine="94"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="545" Column="21" TopLine="508"/>
       </Position13>
       <Position14>
-        <Filename Value="rep2xml.lpr"/>
-        <Caret Line="241" Column="48" TopLine="221"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="562" Column="21" TopLine="543"/>
       </Position14>
       <Position15>
-        <Filename Value="fppkg.pp"/>
-        <Caret Line="22" Column="23" TopLine="1"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="567" Column="22" TopLine="549"/>
       </Position15>
       <Position16>
-        <Filename Value="fppkg.pp"/>
-        <Caret Line="33" Column="21" TopLine="14"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="1" Column="1" TopLine="1"/>
       </Position16>
       <Position17>
-        <Filename Value="fppkg.pp"/>
-        <Caret Line="229" Column="1" TopLine="201"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="519" Column="21" TopLine="500"/>
       </Position17>
       <Position18>
-        <Filename Value="fppkg.pp"/>
-        <Caret Line="316" Column="32" TopLine="296"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="525" Column="22" TopLine="506"/>
       </Position18>
       <Position19>
-        <Filename Value="fppkg.pp"/>
-        <Caret Line="1" Column="1" TopLine="1"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="562" Column="21" TopLine="543"/>
       </Position19>
       <Position20>
-        <Filename Value="fppkg.pp"/>
-        <Caret Line="33" Column="21" TopLine="14"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="568" Column="19" TopLine="549"/>
       </Position20>
       <Position21>
-        <Filename Value="fpxmlrep.pp"/>
-        <Caret Line="488" Column="44" TopLine="465"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="1347" Column="113" TopLine="1328"/>
       </Position21>
       <Position22>
-        <Filename Value="fpxmlrep.pp"/>
-        <Caret Line="208" Column="1" TopLine="186"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="1367" Column="1" TopLine="1349"/>
       </Position22>
       <Position23>
-        <Filename Value="fppkg.pp"/>
-        <Caret Line="117" Column="31" TopLine="112"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="1" Column="1" TopLine="1"/>
       </Position23>
       <Position24>
-        <Filename Value="fppkg.pp"/>
-        <Caret Line="340" Column="1" TopLine="305"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="263" Column="1" TopLine="244"/>
       </Position24>
       <Position25>
-        <Filename Value="fppkg.pp"/>
-        <Caret Line="12" Column="1" TopLine="1"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="555" Column="30" TopLine="530"/>
       </Position25>
       <Position26>
-        <Filename Value="fppkg.pp"/>
-        <Caret Line="250" Column="32" TopLine="229"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="1313" Column="19" TopLine="1302"/>
       </Position26>
       <Position27>
-        <Filename Value="fppkg.pp"/>
-        <Caret Line="304" Column="1" TopLine="267"/>
+        <Filename Value="zipper.pp"/>
+        <Caret Line="1322" Column="17" TopLine="1303"/>
       </Position27>
       <Position28>
-        <Filename Value="pkghandler.pp"/>
-        <Caret Line="101" Column="49" TopLine="80"/>
+        <Filename Value="pkgcommands.pp"/>
+        <Caret Line="78" Column="65" TopLine="56"/>
       </Position28>
       <Position29>
-        <Filename Value="pkgfpmake.pp"/>
-        <Caret Line="12" Column="47" TopLine="1"/>
+        <Filename Value="pkghandler.pp"/>
+        <Caret Line="253" Column="19" TopLine="231"/>
       </Position29>
       <Position30>
-        <Filename Value="pkgropts.pp"/>
-        <Caret Line="330" Column="45" TopLine="314"/>
+        <Filename Value="pkghandler.pp"/>
+        <Caret Line="97" Column="13" TopLine="77"/>
       </Position30>
     </JumpHistory>
   </ProjectOptions>
   <CompilerOptions>
     <Version Value="5"/>
     <PathDelim Value="\"/>
+    <SearchPaths>
+      <OtherUnitFiles Value="fcl20\"/>
+    </SearchPaths>
     <CodeGeneration>
       <Checks>
         <IOChecks Value="True"/>
@@ -396,6 +441,11 @@
       </Debugging>
     </Linking>
     <Other>
+      <Verbosity>
+        <ShowHints Value="False"/>
+      </Verbosity>
+      <CustomOptions Value="-FE.
+"/>
       <CompilerPath Value="$(CompPath)"/>
     </Other>
   </CompilerOptions>

+ 4 - 4
utils/fppkg/fppkg.pp

@@ -9,10 +9,10 @@ uses
 {$endif}
   Classes, SysUtils, TypInfo, custapp,
   // Repository handler objects
-  fprepos, fpxmlrep,fpmktype, pkgropts,
+  fprepos, fpxmlrep,fpmktype, pkgmessages, pkgropts,
   // Package Handler components
   pkghandler, pkgmkconv, pkgdownload,
-  pkgfpmake, pkgmessages, pkgcommands
+  pkgarchive, pkgfpmake, pkgcommands
   // Downloaders
 {$if defined(unix) or defined(windows)}
   ,pkgwget
@@ -329,14 +329,14 @@ begin
     LoadCompilerDefaults;
     LoadRepository;
     GenerateParaActions;
-    
+
     repeat
       if not ActionStack.Pop(ActionPackage,Action,Args) then
         break;
       ExecuteAction(ActionPackage,Action,Args);
     until false;
     Terminate;
-    
+
   except
     On E : Exception do
       begin

+ 19 - 23
utils/fppkg/fprepos.pp

@@ -19,14 +19,10 @@ interface
 uses
   classes,sysutils,
   contnrs,
-{$ifdef ver2_0}
-  streamcoll20,
-{$else}
   streamcoll,
-{$endif}
   fpmktype;
 
-Const 
+Const
   StreamVersion   : Integer = 1;
   StreamSignature = $FEEF;
 
@@ -54,7 +50,7 @@ Type
    Property Minor : Word Read FMinor Write FMinor;
    Property Suffix : string Read FSuffix Write FSuffix;
   end;
-  
+
   { TFPDependency }
 
   TFPDependency = Class(TStreamCollectionItem)
@@ -72,7 +68,7 @@ Type
     Property PackageName : String Read FPackageName Write FPackageName;
     Property MinVersion : TFPVersion Read FMinVersion Write SetMinVersion;
   end;
-  
+
   { TFPDepencencies }
 
   { TFPDependencies }
@@ -158,8 +154,8 @@ Type
     FPackages : TFPPackages;
     function GetPackage(Index : Integer): TFPPackage;
     function GetPackageCount: Integer;
-  Protected 
-    Property PackageCollection : TFPPackages Read FPackages;    
+  Protected
+    Property PackageCollection : TFPPackages Read FPackages;
     procedure CreatePackages; virtual;
     Procedure BackupFile(AFileName : String); virtual;
     Procedure DoGetPackageDependencies(PackageName : String; List : TStringList; Level : Integer); virtual;
@@ -213,7 +209,7 @@ ResourceString
   SErrDuplicatePackageName = 'Duplicate package name : "%s"';
   SErrMaxLevelExceeded     = 'Maximum number of dependency levels exceeded (%d) at package "%s".';
 
-  
+
 { TFPVersion }
 
 function TFPVersion.GetAsString: String;
@@ -231,10 +227,10 @@ end;
 procedure TFPVersion.SetAsString(const AValue: String);
 
   Function NextDigit(sep : Char; var V : string) : integer;
-  
+
   Var
     P : Integer;
-  
+
   begin
     P:=Pos(Sep,V);
     If (P=0) then
@@ -249,7 +245,7 @@ procedure TFPVersion.SetAsString(const AValue: String);
 Var
   P : Integer;
   V : String;
-  
+
 begin
   Release:=0;
   Major:=0;
@@ -367,7 +363,7 @@ Var
   O : TOSes;
   C : TCPUs;
   I,J,Count : Integer;
-  
+
 begin
   Version.AsString:=ReadString(Stream);
   Name:=ReadString(Stream);
@@ -380,20 +376,20 @@ begin
   O:=[];
   For I:=1 to Count do
     begin
-    J:=GetEnumValue(TypeInfo(TOS),ReadString(Stream)); 
+    J:=GetEnumValue(TypeInfo(TOS),ReadString(Stream));
     If (J<>-1) then
       Include(O,TOS(J));
-    end;    
-  OSEs:=O;  
+    end;
+  OSEs:=O;
   Count:=ReadInteger(Stream);
   C:=[];
   For I:=1 to Count do
     begin
-    J:=GetEnumValue(TypeInfo(TCPU),ReadString(Stream)); 
+    J:=GetEnumValue(TypeInfo(TCPU),ReadString(Stream));
     If (J<>-1) then
       Include(C,TCPU(J));
-    end;    
-  CPUS:=C;  
+    end;
+  CPUS:=C;
   FreeAndNil(FDependencies);
   B:=ReadBoolean(Stream);
   If B then
@@ -409,7 +405,7 @@ Var
   Count : Integer;
   O : TOS;
   C : TCPU;
-  
+
 begin
   WriteString(Stream,Version.AsString);
   WriteString(Stream,Name);
@@ -428,7 +424,7 @@ begin
   For O:=Low(TOS) to High(TOS) do
     If O in OSes then
       WriteString(Stream,GetEnumName(TypeInfo(TOS),Ord(O)));
-  // CPUs    
+  // CPUs
   Count:=0;
   For C:=Low(TCPU) to High(TCPU) do
     If C in CPUS then
@@ -796,7 +792,7 @@ procedure TFPRepository.GetPackageDependencies(PackageName: String;
 Var
   L : TStringList;
   I : Integer;
-  
+
 begin
   L:=TStringList.Create;
   Try

+ 21 - 21
utils/fppkg/fpxmlrep.pp

@@ -18,7 +18,7 @@ interface
 
 uses
   Classes, SysUtils, dom, fprepos, fpmktype;
-  
+
 Type
 
   { TFPXMLRepositoryHandler }
@@ -81,7 +81,7 @@ Type
   end;
 
   EXMLPackage = Class(EPackage);
-  
+
 implementation
 
 uses xmlwrite,xmlread,typinfo;
@@ -115,7 +115,7 @@ ResourceString
   SErrInvalidXMLDocument = 'Wrong root tag in XML document. Expected "%s", got "%s".';
   SErrUnknownPackageNode = 'Unknown XML tag ("%s") encountered while reading package "%s".';
   SErrInvalidDependencyXML = 'Invalid XMl encountered when reading dependency.';
-  
+
 { TFPXMLRepositoryHandler }
 
 function TFPXMLRepositoryHandler.VersionToXML(V : TFPVersion;
@@ -139,10 +139,10 @@ end;
 
 function TFPXMLRepositoryHandler.DependencyToXML(D: TFPDependency;
   XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement;
-  
+
 Var
   E : TDOMElement;
-  
+
 begin
   Result:=XML.CreateElement(SNodeDependency);
   Try
@@ -166,7 +166,7 @@ function TFPXMLRepositoryHandler.DependenciesToXML(DS: TFPDependencies;
 
 Var
   I : Integer;
-   
+
 begin
   If (DS.Count>0) then
     begin
@@ -201,7 +201,7 @@ begin
 end;
 
 function TFPXMLRepositoryHandler.GetNextElement(Start: TDomNode): TDomElement;
-  
+
 begin
   Result:=Nil;
   While (Start<>Nil) and (Start.NodeType<>ELEMENT_NODE) do
@@ -269,7 +269,7 @@ begin
         ES[SAttrName]:=GetEnumName(TypeInfo(TOS),Ord(O));
         E.AppendChild(ES);
         end;
-    // CPUs    
+    // CPUs
     E:=XML.CreateElement(SNodeCPUs);
     Result.AppendChild(E);
     For C:=Low(TCPU) to High(TCPU) do
@@ -293,7 +293,7 @@ function TFPXMLRepositoryHandler.PackagesToXML(PS: TFPPackages;
 
 Var
   I : Integer;
-  
+
 begin
   Result:=XML.CreateElement(SNodePackages);
   Try
@@ -312,11 +312,11 @@ end;
 
 function TFPXMLRepositoryHandler.RepositoryToXML(R: TFPRepository;
   XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement;
-  
+
 Var
   I : Integer;
   P : TDomElement;
-  
+
 begin
   Result:=XML.CreateElement(sNodeRepository);
   Try
@@ -518,19 +518,19 @@ begin
 end;
 
 procedure TFPXMLRepositoryHandler.XMLToDependencies(E: TDomElement; DS: TFPDependencies);
-  
+
 begin
   CheckNodeType(E,SNodeDependencies);
   DoXMLToDependencies(E,DS)
 end;
-  
+
 procedure TFPXMLRepositoryHandler.DoXMLToDependencies(E: TDomElement;
   DS: TFPDependencies);
-  
+
 Var
   DN : TDomElement;
   D : TFPDependency;
-  
+
 begin
   DN:=FindNextElement(E.FirstChild,SNodeDependency);
   While (DN<>Nil) do
@@ -662,7 +662,7 @@ procedure TFPXMLRepositoryHandler.DoXMLToRepository(E: TDomElement; R: TFPReposi
 Var
   PSN,PN : TDomElement;
   P : TFPPackage;
-  
+
 begin
   PSN:=FindNextElement(E.FirstChild,SNodePackages);
   If (PSN<>Nil) then
@@ -698,7 +698,7 @@ end;
 
 procedure TFPXMLRepositoryHandler.LoadFromXml(DS: TFPDependencies;
   Stream: TStream);
-  
+
 Var
   XML : TXMLDocument;
 
@@ -728,7 +728,7 @@ begin
 end;
 
 procedure TFPXMLRepositoryHandler.LoadFromXml(PS: TFPPackages; Stream: TStream);
-  
+
 Var
   XML : TXMLDocument;
 
@@ -758,7 +758,7 @@ begin
 end;
 
 procedure TFPXMLRepositoryHandler.LoadFromXml(D: TFPDependency; FileName: String);
-  
+
 Var
   F : TFileStream;
 
@@ -814,10 +814,10 @@ begin
 end;
 
 procedure TFPXMLRepositoryHandler.LoadFromXml(R: TFPRepository; FileName: String);
-  
+
 Var
   F : TFileStream;
-  
+
 begin
   F:=TFileStream.Create(FileName,fmOpenRead);
   try

+ 88 - 0
utils/fppkg/pkgarchive.pp

@@ -0,0 +1,88 @@
+unit pkgarchive;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes,SysUtils,pkghandler;
+
+type
+  { TUnzipArchive }
+
+  TUnzipArchive = Class(TPackagehandler)
+  Private
+    Procedure UnzipArchive;
+  Public
+    Function Execute(const Args:TActionArgs):boolean;override;
+  end;
+
+
+
+implementation
+
+uses
+  zipper,
+  uriparser,
+  pkgmessages;
+
+Procedure DeleteDir(const ADir:string);
+const
+{$ifdef unix}
+  AllFiles='*';
+{$else}
+  AllFiles='*.*';
+{$endif}
+var
+  Info : TSearchRec;
+begin
+  if FindFirst(ADir+PathDelim+AllFiles,faAnyFile, Info)=0 then
+    try
+      repeat
+        if (Info.Attr and faDirectory)=faDirectory then
+          DeleteDir(ADir+PathDelim+Info.Name)
+        else
+          DeleteFile(ADir+PathDelim+Info.Name);
+      until FindNext(Info)<>0;
+    finally
+      FindClose(Info);
+    end;
+end;
+
+
+{ TFPMakeCompiler }
+
+Procedure TUnzipArchive.UnzipArchive;
+Var
+  BuildDir : string;
+  ArchiveFile : String;
+begin
+  ArchiveFile:=PackageArchive;
+  BuildDir:=PackageBuildPath;
+  { Remove existing builddir }
+  if DirectoryExists(BuildDir) then
+    DeleteDir(BuildDir);
+  { Unzip Archive }
+//  SetCurrentDir(PackageBuildPath);
+  With TUnZipper.Create do
+    try
+      Log(vCommands,SLogUnzippping,[ArchiveFile]);
+      OutputPath:=PackageBuildPath;
+      UnZipAllFiles(ArchiveFile);
+    Finally
+      Free;
+    end;
+end;
+
+
+function TUnzipArchive.Execute(const Args:TActionArgs):boolean;
+begin
+{$warning TODO Check arguments}
+  UnzipArchive;
+  result:=true;
+end;
+
+
+initialization
+  RegisterPkgHandler('unziparchive',TUnzipArchive);
+end.

+ 4 - 0
utils/fppkg/pkgcommands.pp

@@ -83,6 +83,10 @@ function TCommandBuild.Execute(const Args:TActionArgs):boolean;
 begin
   ActionStack.Push(CurrentPackage,'fpmakebuild',Args);
   ActionStack.Push(CurrentPackage,'compilefpmake',Args);
+  if not DirectoryExists(PackageBuildPath) then
+    ActionStack.Push(CurrentPackage,'unziparchive',Args);
+  if not FileExists(PackageArchive) then
+    ActionStack.Push(CurrentPackage,'downloadpackage',Args);
 end;
 
 

+ 3 - 3
utils/fppkg/pkgdownload.pp

@@ -6,7 +6,7 @@ interface
 
 uses
   Classes, SysUtils, pkghandler;
-  
+
 Type
 
   { TBasePackageDownloader }
@@ -48,7 +48,7 @@ Var
   URI : TURI;
   FN : String;
   F : TFileStream;
-  
+
 begin
   URI:=ParseURI(URL);
   FN:=URI.Path+'/'+URI.Document;
@@ -83,7 +83,7 @@ procedure TBasePackageDownloader.Download(const URL: String; Dest: TStream);
 Var
   URI : TURI;
   P : String;
-  
+
 begin
   URI:=ParseURI(URL);
   P:=URI.Protocol;

+ 1 - 1
utils/fppkg/pkgfpmake.pp

@@ -46,7 +46,7 @@ implementation
 
 uses
   pkgmessages;
-  
+
 { TFPMakeCompiler }
 
 Procedure TFPMakeCompiler.CompileFPMake;

+ 12 - 5
utils/fppkg/pkghandler.pp

@@ -56,6 +56,7 @@ Type
     Function ExecuteProcess(Const Prog,Args:String):Integer;
     Procedure SetCurrentDir(Const ADir:String);
     function PackageBuildPath:String;
+    function PackageArchive:String;
   Public
     Constructor Create(AOwner: TComponent;ADefaults:TPackagerOptions;APackage:TFPPackage); virtual;
     function PackageLogPrefix:String;
@@ -86,17 +87,14 @@ function maybequoted(const s:ansistring):ansistring;
 var
   Verbosity : TVerbosities;
   ActionStack : TActionStack;
-  
+
 
 Implementation
 
 uses
   typinfo,
-{$ifdef ver2_0}
-  contnrs20,
-{$else ver2_0}
   contnrs,
-{$endif ver2_0}
+  uriparser,
   pkgmessages;
 
 var
@@ -251,6 +249,15 @@ begin
 end;
 
 
+function TPackageHandler.PackageArchive:String;
+var
+  URI : TURI;
+begin
+  URI:=ParseURI(CurrentPackage.URL);
+  Result:=Defaults.PackagesDir+URI.Document;
+end;
+
+
 function TPackageHandler.PackageLogPrefix:String;
 begin
   if assigned(CurrentPackage) then

+ 6 - 6
utils/fppkg/pkglibcurl.pp

@@ -1,18 +1,18 @@
 {$mode objfpc}
 {$h+}
-unit pkglibcurl; 
+unit pkglibcurl;
 
 interface
 
 uses Classes,pkgdownload,pkghandler;
 
-Type 
+Type
   TLibCurlDownloader = Class(TBasePackageDownloader)
   Protected
     Procedure LibCurlDownload(Const URL : String; Dest : TStream);
     Procedure FTPDownload(Const URL : String; Dest : TStream); override;
     Procedure HTTPDownload(Const URL : String; Dest : TStream); override;
- end;   
+ end;
 
 implementation
 
@@ -29,7 +29,7 @@ Procedure TLibCurlDownloader.LibCurlDownload(Const URL : String; Dest : TStream)
 Var
   HCurl : PCurl;
   ErrorBuffer : Array[0..CURL_ERROR_SIZE] of char;
-  
+
 begin
   hCurl:= curl_easy_init;
   if Assigned(hCurl) then
@@ -44,7 +44,7 @@ begin
       curl_easy_cleanup(hCurl);
     end
   else
-    Raise Exception.Create('Failed to initialize Curl');  
+    Raise Exception.Create('Failed to initialize Curl');
 end;
 
 
@@ -54,7 +54,7 @@ begin
   LibCurlDownload(URL,Dest);
 end;
 
-Procedure TLibCurlDownloader.HTTPDownload(Const URL : String; Dest : TStream); 
+Procedure TLibCurlDownloader.HTTPDownload(Const URL : String; Dest : TStream);
 
 begin
   LibCurlDownload(URL,Dest);

+ 4 - 3
utils/fppkg/pkgmessages.pp

@@ -25,18 +25,19 @@ Resourcestring
   SErrInvalidVerbosity       = 'Invalid verbosity string: "%s"';
   SErrInvalidCommand         = 'Invalid command: %s';
   SErrChangeDirFailed        = 'Could not change directory to "%s"';
-  
+
   SErrHTTPGetFailed          = 'HTTP Download failed.';
   SErrLoginFailed            = 'FTP LOGIN command failed.';
-  SErrCWDFailed              = 'FTP CWD "%s" command failed.';  
+  SErrCWDFailed              = 'FTP CWD "%s" command failed.';
   SErrGETFailed              = 'FTP GET "%s" command failed.';
-  
+
   SLogGeneratingFPMake       = 'Generating fpmake.pp';
   SLogNotCompilingFPMake     = 'Skipping compiling of fpmake.pp, fpmake executable already exists';
   SLogCommandLineAction      = 'Adding action from commandline: "%s %s"';
   SLogRunAction              = 'Action: "%s %s"';
   SLogExecute                = 'Executing: "%s %s"';
   SLogChangeDir              = 'CurrentDir: "%s"';
+  SLogUnzippping             = 'Unzipping "%s"';
   SLogLoadingGlobalConfig    = 'Loading global configuration from "%s"';
   SLogLoadingCompilerConfig  = 'Loading compiler configuration from "%s"';
   SLogGeneratingGlobalConfig = 'Generating default global configuration in "%s"';

+ 6 - 6
utils/fppkg/pkgocurl.pp

@@ -1,22 +1,22 @@
 {$mode objfpc}
 {$h+}
-unit pkgoCurl; 
+unit pkgoCurl;
 
 interface
 
 uses Classes,pkgdownload;
 
-Type 
+Type
   TOCurlDownloader = Class(TBasePackageDownloader)
-  Private 
+  Private
     FCurl : String;
   Protected
     Procedure OCurlDownload(Const URL : String; Dest : TStream); virtual;
     Procedure FTPDownload(Const URL : String; Dest : TStream); override;
     Procedure HTTPDownload(Const URL : String; Dest : TStream); override;
  Public
-    Property Curl : String Read FCurl Write FCurl; 
- end;   
+    Property Curl : String Read FCurl Write FCurl;
+ end;
 
 implementation
 
@@ -62,7 +62,7 @@ begin
   OCurlDownload(URL,Dest);
 end;
 
-Procedure TOCurlDownloader.HTTPDownload(Const URL : String; Dest : TStream); 
+Procedure TOCurlDownloader.HTTPDownload(Const URL : String; Dest : TStream);
 
 begin
   OCurlDownload(URL,Dest);

+ 11 - 10
utils/fppkg/pkgropts.pp

@@ -78,13 +78,8 @@ Type
   end;
 
 Const
-  DefaultCPU = {$I %FPCTARGETCPU%};
-  DefaultOS  = {$I %FPCTARGETOS%};
   DefaultMirrorsLocation  = 'http://www.freepascal.org/repository/mirrors.xml';
-  DefaultCompiler = 'fpc';
   DefaultRemoteRepository = 'fpc';
-  DefaultUnixPrefix = '/usr/local/lib/fpc/fppkg';
-  DefaultUnixBuildDir = '/tmp/fppkg/';
   DefaultMirrors = 'mirrors.xml';
   DefaultRepository = 'packages.xml';
   DefaultVersions   = 'versions-%s.dat';
@@ -118,7 +113,7 @@ uses
 {$endif}
   pkghandler,
   pkgmessages;
-  
+
 Function FixPath(S : String) : string;
 
 begin
@@ -207,9 +202,15 @@ Procedure TPackagerOptions.InitGlobalDefaults;
 var
   LocalDir : String;
 begin
+  // Retrieve Local fppkg directory
 {$ifdef unix}
   if (fpGetUID=0) then
-    LocalDir:=DefaultUnixPrefix
+    begin
+      if DirectoryExists('/usr/local/lib/fpc') then
+        LocalDir:='/usr/local/lib/fpc/fppkg/'
+      else
+        LocalDir:='/usr/lib/fpc/fppkg/';
+    end
   else
     LocalDir:=IncludeTrailingPathDelimiter(GetEnvironmentVariable('HOME'))+'.fppkg/';
 {$else}
@@ -233,13 +234,13 @@ end;
 
 Procedure TPackagerOptions.InitCompilerDefaults;
 begin
-  FCompiler:=FileSearch(DefaultCompiler+ExeExt,GetEnvironmentVariable('PATH'));
+  FCompiler:=FileSearch('fpc'+ExeExt,GetEnvironmentVariable('PATH'));
   if FCompiler='' then
     Raise EPackageHandler.Create(SErrMissingFPC);
 {$warning TODO detect compiler version/target from -i options }
   FCompilerVersion:='2.0.4';
-  FCompilerCPU:=StringToCPU(DefaultCPU);
-  FCompilerOS:=StringToOS(DefaultOS);
+  FCompilerCPU:=StringToCPU({$I %FPCTARGETCPU%});
+  FCompilerOS:=StringToOS({$I %FPCTARGETOS%});
   // Use the same algorithm as the compiler, see options.pas
 {$ifdef Unix}
   FInstallDir:=FixPath(GetEnvironmentVariable('FPCDIR'));

+ 6 - 6
utils/fppkg/pkgsynapse.pp

@@ -1,17 +1,17 @@
 {$mode objfpc}
 {$h+}
-unit pkgsynapse; 
+unit pkgsynapse;
 
 interface
 
 uses Classes,pkgdownload;
 
-Type 
+Type
   TSynapseDownloader = Class(TBasePackageDownloader)
   Protected
     Procedure FTPDownload(Const URL : String; Dest : TStream); override;
     Procedure HTTPDownload(Const URL : String; Dest : TStream); override;
- end;   
+ end;
 
 implementation
 
@@ -23,7 +23,7 @@ Var
   URI : TURI;
   FN : String;
   F : TFileStream;
-  
+
 begin
   // Download in temporary file.
   FN:=GetTempFileName();
@@ -45,7 +45,7 @@ begin
         DirectFile:=True;
         If (URI.Path<>'') then
           if not ChangeWorkingDir(URI.Path) then
-            Error(SErrCWDFailed,[URI.PATH]); 
+            Error(SErrCWDFailed,[URI.PATH]);
         BinaryMode:=True;
         If Not RetrieveFile(URI.Document, False) then
            Error(SErrGETFailed,[URI.Document]);
@@ -66,7 +66,7 @@ begin
   end;
 end;
 
-Procedure TSynapseDownloader.HTTPDownload(Const URL : String; Dest : TStream); 
+Procedure TSynapseDownloader.HTTPDownload(Const URL : String; Dest : TStream);
 
 begin
   If Not HttpGetBinary(URL,Dest) then

+ 9 - 9
utils/fppkg/pkgwget.pp

@@ -1,14 +1,14 @@
 {$mode objfpc}
 {$h+}
-unit pkgwget; 
+unit pkgwget;
 
 interface
 
 uses Classes,pkgdownload,pkgropts,fprepos;
 
-Type 
+Type
   TWGetDownloader = Class(TBasePackageDownloader)
-  Private 
+  Private
     FWGet : String;
   Protected
     Constructor Create(AOwner: TComponent; ADefaults:TPackagerOptions; APackage: TFPPackage); override;
@@ -16,8 +16,8 @@ Type
     Procedure FTPDownload(Const URL : String; Dest : TStream); override;
     Procedure HTTPDownload(Const URL : String; Dest : TStream); override;
  Public
-    Property WGet : String Read FWGet Write FWGet; 
- end;   
+    Property WGet : String Read FWGet Write FWGet;
+ end;
 
 implementation
 
@@ -29,20 +29,20 @@ begin
   Inherited;
   wget:='wget';
 end;
-    
+
 
 Procedure TWGetDownloader.WGetDownload(Const URL : String; Dest : TStream);
 
 Var
   Buffer : Array[0..4096] of byte;
   Count : Integer;
-  
+
 begin
   With TProcess.Create(Self) do
     try
       CommandLine:=WGet+' -q --output-document=- '+url;
       Options:=[poUsePipes,poNoConsole];
-      Execute; 
+      Execute;
       While Running do
         begin
         Count:=Output.Read(Buffer,SizeOf(Buffer));
@@ -62,7 +62,7 @@ begin
   WGetDownload(URL,Dest);
 end;
 
-Procedure TWGetDownloader.HTTPDownload(Const URL : String; Dest : TStream); 
+Procedure TWGetDownloader.HTTPDownload(Const URL : String; Dest : TStream);
 
 begin
   WGetDownload(URL,Dest);

+ 2 - 2
utils/fppkg/testdownload.pp

@@ -1,13 +1,13 @@
 program testdownload;
 
-uses 
+uses
   Classes,
   pkgwget, // Including this sets the Downloaderclass. Replace with downloader you want...
   pkgdownload;
 
 Var
   F : TFileStream;
-  
+
 begin
   F:=TFileStream.Create('fpc.html',fmcreate);
   Try