[24566] users/jberry/mpwa/app

source_changes at macosforge.org source_changes at macosforge.org
Sat Apr 28 07:27:43 PDT 2007


Revision: 24566
          http://trac.macosforge.org/projects/macports/changeset/24566
Author:   jberry at macports.org
Date:     2007-04-28 07:27:42 -0700 (Sat, 28 Apr 2007)

Log Message:
-----------
mpwa: interim progress. Now seems to be handling submit of new format portpkgs with the xar xml metadata

Modified Paths:
--------------
    users/jberry/mpwa/app/controllers/port_pkg_controller.rb
    users/jberry/mpwa/app/models/person.rb
    users/jberry/mpwa/app/models/port.rb
    users/jberry/mpwa/app/models/port_pkg.rb
    users/jberry/mpwa/app/models/port_pkg_file.rb

Modified: users/jberry/mpwa/app/controllers/port_pkg_controller.rb
===================================================================
--- users/jberry/mpwa/app/controllers/port_pkg_controller.rb	2007-04-28 12:36:02 UTC (rev 24565)
+++ users/jberry/mpwa/app/controllers/port_pkg_controller.rb	2007-04-28 14:27:42 UTC (rev 24566)
@@ -1,3 +1,5 @@
+require 'port_pkg'
+
 class PortPkgController < ApplicationController
   def index
     list
@@ -55,8 +57,8 @@
     # Validate parameters (we're probably making this too hard)
     raise "bad package" if portpkg.nil?
 
-    # Import the package from the file
-    @port_pkg = PortPkg.import_from_file(portpkg)  
+    # Create a package from the file
+    @port_pkg = PortPkg.create_from_file(portpkg)  
   end
   
   def emit_portpkg

Modified: users/jberry/mpwa/app/models/person.rb
===================================================================
--- users/jberry/mpwa/app/models/person.rb	2007-04-28 12:36:02 UTC (rev 24565)
+++ users/jberry/mpwa/app/models/person.rb	2007-04-28 14:27:42 UTC (rev 24566)
@@ -6,14 +6,14 @@
         Person.find(:first, :conditions => "email = '#{email}'")
     end
     
-    def Person.ensure_person_with_email(email)
+    def Person.ensure_person_with_email(email, name = nil)
         person = Person.by_email(email)
         if person.nil?
             # build a new person using the supplied email address
             person = Person.new
             
             # Give it everything we know
-            person.user_name = email
+            person.user_name = name.nil? ? email : name
             person.email = email
             
             # Save the person

Modified: users/jberry/mpwa/app/models/port.rb
===================================================================
--- users/jberry/mpwa/app/models/port.rb	2007-04-28 12:36:02 UTC (rev 24565)
+++ users/jberry/mpwa/app/models/port.rb	2007-04-28 14:27:42 UTC (rev 24566)
@@ -10,27 +10,23 @@
         Port.find(:first, :conditions => "name = '#{name}'")
     end
     
-    def Port.ensure_port(name, info)
+    def Port.ensure_port(name, meta)
         port = Port.by_name(name)
         if port.nil?
             # build a new port using default values
             port = Port.new
             
             port.name = name
-            port.short_desc = info['description']
-            port.long_desc = info['long_description']
-            port.home_page = info['homepage']
+            port.short_desc = meta.short_desc
+            port.long_desc = meta.long_desc
+            port.home_page = meta.home_page
             
-            maintainers = info['maintainers']
-            if !maintainers.nil?
-                maintainers.each do |maintainer|
-                    person = Person.ensure_person_with_email(maintainer)
-                    port.maintainers << person
-                end
+            meta.maintainers.each do |maintainer|
+                person = Person.ensure_person_with_email(maintainer)
+                port.maintainers << person
             end
-            
-            categories = info['categories']
-            categories.each { |c| port.add_tag c } if !categories.nil?
+             
+            meta.categories.each { |c| port.add_tag c }
 
             # Save the port
             port.save

Modified: users/jberry/mpwa/app/models/port_pkg.rb
===================================================================
--- users/jberry/mpwa/app/models/port_pkg.rb	2007-04-28 12:36:02 UTC (rev 24565)
+++ users/jberry/mpwa/app/models/port_pkg.rb	2007-04-28 14:27:42 UTC (rev 24566)
@@ -1,99 +1,118 @@
 require 'time'
 require 'temp_directories'
 require 'port'
+require 'port_pkg_file'
+require 'person'
 require 'mpwa-conf'
+require 'rexml/document'
 
+PortPkgMeta = Struct.new("PortPkgMeta",
+    :submitter_email, :submitter_name, :submitter_notes,
+    :name, :epoch, :version, :revision,
+    :short_desc, :long_desc, :home_page,
+    :maintainers, :variants, :categories)
+
 class PortPkg < ActiveRecord::Base
     belongs_to :port
     belongs_to :submitter, :class_name => 'Person', :foreign_key => 'submitter_id'
     has_many :files, :class_name => 'PortPkgFile'
     has_and_belongs_to_many :tags
     
-    def PortPkg.import_from_file(file)
-        raise "badpkg" if file.nil?
+    def PortPkg.create_from_file(file)
+        portpkg = PortPkg.new
+        portpkg.import_from_file(file)
+    end
+    
+    def PortPkg.extract_pkg_meta_from_file(f)
+        meta = PortPkgMeta.new()
+        doc = REXML::Document.new(f)
         
+        root_el = doc.root
+        submitter_el = root_el.elements["submitter"]
+        package_el = root_el.elements["package"]
+        
+        meta[:submitter_email] = submitter_el.elements["email"].text
+        meta[:submitter_name] = submitter_el.elements["name"].text
+        meta[:submitter_notes] = submitter_el.elements["notes"].text
+        
+        meta[:name] = package_el.elements["name"].text
+        meta[:epoch] = package_el.elements["epoch"].text
+        meta[:version] = package_el.elements["version"].text
+        meta[:revision] = package_el.elements["revision"].text
+        
+        meta[:short_desc] = package_el.elements["description"].text;
+        meta[:long_desc] = package_el.elements["long_description"].text;
+        meta[:home_page] = package_el.elements["homepage"].text;
+            
+        meta[:maintainers] = []
+        package_el.elements.each("maintainers/maintainer") { |m| meta.maintainers << m.text }
+        
+        meta[:variants] = []
+        package_el.elements.each("variants/variant")  { |v| meta.variants << v.text }
+        
+        meta[:categories] = []
+        package_el.elements.each("categories/category")  { |c| meta.categories << c.text }
+
+        return meta
+    end
+    
+    def import_from_file(file)
+        raise "badpkg: nil file_path" if file.nil?
+        
         # Make a temporary directory
         tempDirPath = TempDirectories.makeTempDir
         
         # Write the portpkg file to the temporary directory
         pkgPath = tempDirPath + "portpkg.portpkg"
+        metaName = "portpkg_meta.xml"
+        metaPath = tempDirPath + metaName
+ 
         expandedPkgPath = tempDirPath + "portpkg"
         File.open(pkgPath, "w") { |f| f.write(file.read) }
-
+        
         # Note: a bug in xar presently prevents us from limiting the extraction to the portpkg directory,
         # => which we'd like to do for the sake of cleanliness. Hopefully this will become fixed soon.
-        system("cd #{tempDirPath}; #{MPWA::XARTOOL} -xf #{pkgPath}") or raise "badpkg"
+        system("cd #{tempDirPath}; #{MPWA::XARTOOL} -xf #{pkgPath} -s #{metaPath} -n #{metaName}") or raise "badpkg"
         
-        # Validate the portpkg, bailing on error
-        (expandedPkgPath + "Portfile").file? or raise "badpkg"
-        infoOut = `#{MPWA::PORTTOOL} info --name --categories --epoch --version --revision --variants --maintainers --short_desc --long_description --description --homepage #{expandedPkgPath}`
-        $?.exitstatus or raise "badpkg"
+        # Parse the meta information       
+        raise "badpkg: no meta information" if !metaPath.file?
+        meta = nil
+        File.open(metaPath, "r") { |f| meta = PortPkg.extract_pkg_meta_from_file(f) }
+        puts meta
         
-        # Extract:
-        # => name
-        # => categories
-        # => epoch, version, revision
-        # => homepage
-        # => description
-        # => long_description
-        # => maintainers
-        # => variants
-        # => dependencies
-        info = {}
-        infoOut.each_line do |line|
-            m = /^(\w+):\s*(.*)\s*$/.match(line)
-            if !m.nil?
-                token = m[1]
-                value = m[2]
-
-                case token
-                    when 'categories', 'maintainers'
-                        info[token] = value.split(/,\s*/)
-                    else
-                        info[token] = value
-                end
-            end
-        end
-        name = info['name']
-        raise "badpkg" if name.nil?
+        self.submitted_at = Time.now
+        self.submitter = Person.ensure_person_with_email(meta.submitter_email, meta.submitter_name)
+        # TODO: add submitter notes
+        #meta.submitter_notes
+       
+        self.epoch = meta.epoch
+        self.version = meta.version
+        self.revision = meta.revision
         
-        # Ensure a port for this pkg
-        port = Port.ensure_port(name, info)
+        puts "revision: #{self.revision}"
         
-        # Create the port_pkg object
-        port_pkg = PortPkg.new
+        self.port = Port.ensure_port(meta.name, meta)
         
-        # TODO: Need to fix the submitter somehow
-        port_pkg.submitter = Person.ensure_person_with_email("jberry at macports.org")
-        port_pkg.submitted_at = Time.now
-        port_pkg.port = port
-        port_pkg.epoch = info['epoch']
-        port_pkg.version = info['version']
-        port_pkg.revision = info['revision']
-
         # Tag with categories
-        categories = info['categories']
-        categories.each { |c| port_pkg.add_tag c } if !categories.nil?
+        meta.categories.each { |c| self.add_tag(c) }
         
         # Save unpacked data into a file
-        port_pkg.files << PortPkgFile.from_path(pkgPath, tempDirPath)
+        self.files << PortPkgFile.from_path(pkgPath, tempDirPath)
         
         # Save files from the expanded package
         expandedPkgPath.find do |p|
-            if p.file?
-                port_pkg.files << PortPkgFile.from_path(p, tempDirPath)
-            end
+            self.files << PortPkgFile.from_path(p, tempDirPath) if p.file?
         end
         
         # Save the pkg (maybe we shouldn't?)
-        port_pkg.save
+        self.save
         
         # Cleanup the temp directory
         tempDirPath.rmtree
         
         # Return the port_pkg
-        return port_pkg
-    end
+        return self
+     end
     
     def file_by_path(file_path)
         candidates = self.files.select { |f| f.file_path == file_path }

Modified: users/jberry/mpwa/app/models/port_pkg_file.rb
===================================================================
--- users/jberry/mpwa/app/models/port_pkg_file.rb	2007-04-28 12:36:02 UTC (rev 24565)
+++ users/jberry/mpwa/app/models/port_pkg_file.rb	2007-04-28 14:27:42 UTC (rev 24566)
@@ -1,3 +1,4 @@
+require 'file_blob'
 require 'mpwa-conf'
 
 class PortPkgFile < ActiveRecord::Base

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macports-changes/attachments/20070428/11b71610/attachment.html


More information about the macports-changes mailing list