Hello,

here is the first version of the patch for adding <dir name="...">
support in package.xml.

example:

  <filein>compiler/initialization/SystemInitialization.st</filein>
  <filein>compiler/type/Extensions.st</filein>
  ...

becomes:


<dir name="compiler">
  <filein>...</filein>
 </dir>

Comments are welcome

Gwen
diff --git a/kernel/PkgLoader.st b/kernel/PkgLoader.st
index 8a3a429..9ee5e2e 100644
--- a/kernel/PkgLoader.st
+++ b/kernel/PkgLoader.st
@@ -1185,7 +1185,7 @@ Object subclass: Version [
 Kernel.PackageInfo subclass: Package [
     | features prerequisites builtFiles files fileIns relativeDirectory
        baseDirectories libraries modules callouts url namespace sunitScripts
-       startScript stopScript test version |
+       startScript stopScript test version path |
     
     <category: 'Language-Packaging'>
     <comment: 'I am not part of a standard Smalltalk system. I store internally the
@@ -1200,7 +1200,7 @@ XML.'>
        ^ Tags ifNil: [ Tags := Dictionary from: {      
                         'file' -> #addFile:.
                         'filein' -> #addFileIn:.
-                       'prereq' -> #addPrerequisite:.
+                        'prereq' -> #addPrerequisite:.
                         'provides' -> #addFeature:.
                         'module' -> #addModule:.
                         'directory' -> #relativeDirectory:.
@@ -1360,7 +1360,7 @@ XML.'>
         <category: 'accessing'>
 
 	files isNil ifTrue: [files := OrderedCollection new].
-        files add: aString
+        files add: self path, aString
     ]
 
     files [
@@ -1379,7 +1379,7 @@ XML.'>
     addFileIn: aString [
         <category: 'accessing'>
 
-        self fileIns add: aString
+        self fileIns add: self path, aString
     ]
 
     fileIns [
@@ -1573,9 +1573,40 @@ XML.'>
 		    Namespace current: namespace]
     ]
 
+    path [
+
+	^ path ifNil: [ path := '' ]
+    ]
+
+    path: aString [
+
+	path := aString
+    ]
+
+    dir: file tag: aString [
+
+	| attribute args key value tag oldPath |
+        attribute := ReadStream on: aString.
+        tag := attribute upTo: $ .
+        args := OrderedCollection new.
+        [ attribute atEnd ] whileFalse: [
+        	attribute peek isAlphaNumeric ifTrue: [
+        	    key := attribute upTo: $=.
+        	    attribute upTo: $".
+        	    value := attribute upTo: $".
+        	    args add: key->value. ].
+        	attribute next ].
+        args := Dictionary from: args.
+	args size > 1 ifTrue: [ self error: '' ].
+	oldPath := self path.
+	self path: (self path, (args at: 'name')).
+	self parse: file tag: 'dir'.
+	self path: oldPath.
+    ]
+
     parse: file tag: openingTag [
 	<category: 'private-initializing'>
-	| stack cdata ch tag testPackage |
+	| stack cdata ch tag testPackage attribute args key value |
 	stack := OrderedCollection new.
 	stack addLast: openingTag.
 	
@@ -1591,18 +1622,20 @@ XML.'>
 			ifTrue: 
 			    [tag := stack removeLast.
 			    file next.
-                           (file upTo: $>) = tag 
-                               ifFalse: [^self error: 'error in packages file: unmatched end tag ' , tag].
-
+                            (file upTo: $>) = tag 
+                               ifFalse: [^self error: 'error in packages file: unmatched end tag ' , tag ].
                            tag = openingTag ifTrue: [ ^ self ].
-                           self perform: (self class tags at: tag ifAbsent: [ self error: 'invalid tag ', tag ]) with: cdata.
-                           cdata := nil].
+			   self perform: (self class tags at: tag ifAbsent: [ self error: 'invalid tag ', tag ]) with: cdata.
+			   args := attribute := key := value := cdata := nil ].
                    ch isAlphaNumeric 
                        ifTrue: 
 			    [tag := file upTo: $>.
+			    (tag size > 4 and: [ (tag copyFrom: 1 to: 4) = 'dir ' ])
+				ifTrue: [ self dir: file tag: tag ]
+				ifFalse: [
 			    tag = 'test' 
 				ifTrue: [self test: (TestPackage new parse: file tag: tag)]
-				ifFalse: [stack addLast: tag].
+				ifFalse: [stack addLast: tag] ].
 			    cdata trimSeparators isEmpty 
 				ifFalse: [^self error: 'unexpected character data'].
 			    cdata := nil]]] 

_______________________________________________
help-smalltalk mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/help-smalltalk

Reply via email to