[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