[23760] users/jberry/mpwa
source_changes at macosforge.org
source_changes at macosforge.org
Sun Apr 8 21:10:53 PDT 2007
Revision: 23760
http://trac.macosforge.org/projects/macports/changeset/23760
Author: jberry at macports.org
Date: 2007-04-08 21:10:51 -0700 (Sun, 08 Apr 2007)
Log Message:
-----------
More mpwa progress:
* Add portpkg.xar to database in table port_pkg_files
* Submission of portpkgs now pretty much works
Modified Paths:
--------------
users/jberry/mpwa/app/controllers/port_controller.rb
users/jberry/mpwa/app/controllers/port_pkg_controller.rb
users/jberry/mpwa/app/controllers/ports_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/doc/schema-thoughts.sql
Added Paths:
-----------
users/jberry/mpwa/app/controllers/port_pkg_files_controller.rb
users/jberry/mpwa/app/helpers/port_pkg_files_helper.rb
users/jberry/mpwa/app/models/port_pkg_files.rb
users/jberry/mpwa/app/models/repository.rb
users/jberry/mpwa/app/views/layouts/port_pkg_files.rhtml
users/jberry/mpwa/app/views/port_pkg/submit.rhtml
users/jberry/mpwa/app/views/port_pkg_files/
users/jberry/mpwa/app/views/port_pkg_files/_form.rhtml
users/jberry/mpwa/app/views/port_pkg_files/edit.rhtml
users/jberry/mpwa/app/views/port_pkg_files/list.rhtml
users/jberry/mpwa/app/views/port_pkg_files/new.rhtml
users/jberry/mpwa/app/views/port_pkg_files/show.rhtml
users/jberry/mpwa/lib/temp_directories.rb
users/jberry/mpwa/test/fixtures/port_pkg_files.yml
users/jberry/mpwa/test/functional/port_pkg_files_controller_test.rb
users/jberry/mpwa/test/unit/port_pkg_files_test.rb
Modified: users/jberry/mpwa/app/controllers/port_controller.rb
===================================================================
--- users/jberry/mpwa/app/controllers/port_controller.rb 2007-04-09 02:58:08 UTC (rev 23759)
+++ users/jberry/mpwa/app/controllers/port_controller.rb 2007-04-09 04:10:51 UTC (rev 23760)
@@ -48,4 +48,6 @@
Port.find(params[:id]).destroy
redirect_to :action => 'list'
end
+
+
end
Modified: users/jberry/mpwa/app/controllers/port_pkg_controller.rb
===================================================================
--- users/jberry/mpwa/app/controllers/port_pkg_controller.rb 2007-04-09 02:58:08 UTC (rev 23759)
+++ users/jberry/mpwa/app/controllers/port_pkg_controller.rb 2007-04-09 04:10:51 UTC (rev 23760)
@@ -48,4 +48,16 @@
PortPkg.find(params[:id]).destroy
redirect_to :action => 'list'
end
+
+ def submit
+ portpkg = params[:portpkg]
+
+ # 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)
+ end
+
+
end
Added: users/jberry/mpwa/app/controllers/port_pkg_files_controller.rb
===================================================================
--- users/jberry/mpwa/app/controllers/port_pkg_files_controller.rb (rev 0)
+++ users/jberry/mpwa/app/controllers/port_pkg_files_controller.rb 2007-04-09 04:10:51 UTC (rev 23760)
@@ -0,0 +1,51 @@
+class PortPkgFilesController < ApplicationController
+ def index
+ list
+ render :action => 'list'
+ end
+
+ # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
+ verify :method => :post, :only => [ :destroy, :create, :update ],
+ :redirect_to => { :action => :list }
+
+ def list
+ @port_pkg_files_pages, @port_pkg_files = paginate :port_pkg_files, :per_page => 10
+ end
+
+ def show
+ @port_pkg_files = PortPkgFiles.find(params[:id])
+ end
+
+ def new
+ @port_pkg_files = PortPkgFiles.new
+ end
+
+ def create
+ @port_pkg_files = PortPkgFiles.new(params[:port_pkg_files])
+ if @port_pkg_files.save
+ flash[:notice] = 'PortPkgFiles was successfully created.'
+ redirect_to :action => 'list'
+ else
+ render :action => 'new'
+ end
+ end
+
+ def edit
+ @port_pkg_files = PortPkgFiles.find(params[:id])
+ end
+
+ def update
+ @port_pkg_files = PortPkgFiles.find(params[:id])
+ if @port_pkg_files.update_attributes(params[:port_pkg_files])
+ flash[:notice] = 'PortPkgFiles was successfully updated.'
+ redirect_to :action => 'show', :id => @port_pkg_files
+ else
+ render :action => 'edit'
+ end
+ end
+
+ def destroy
+ PortPkgFiles.find(params[:id]).destroy
+ redirect_to :action => 'list'
+ end
+end
Modified: users/jberry/mpwa/app/controllers/ports_controller.rb
===================================================================
--- users/jberry/mpwa/app/controllers/ports_controller.rb 2007-04-09 02:58:08 UTC (rev 23759)
+++ users/jberry/mpwa/app/controllers/ports_controller.rb 2007-04-09 04:10:51 UTC (rev 23760)
@@ -4,7 +4,7 @@
def makeTempDir()
tmpdir = Dir::tmpdir
- basename = "macports"
+ basename = "mpwa"
n = 1
begin
tmpname = File.join(tmpdir, sprintf('%s.%d.%d', basename, $$, n))
Added: users/jberry/mpwa/app/helpers/port_pkg_files_helper.rb
===================================================================
--- users/jberry/mpwa/app/helpers/port_pkg_files_helper.rb (rev 0)
+++ users/jberry/mpwa/app/helpers/port_pkg_files_helper.rb 2007-04-09 04:10:51 UTC (rev 23760)
@@ -0,0 +1,2 @@
+module PortPkgFilesHelper
+end
Modified: users/jberry/mpwa/app/models/person.rb
===================================================================
--- users/jberry/mpwa/app/models/person.rb 2007-04-09 02:58:08 UTC (rev 23759)
+++ users/jberry/mpwa/app/models/person.rb 2007-04-09 04:10:51 UTC (rev 23760)
@@ -1,4 +1,24 @@
class Person < ActiveRecord::Base
has_and_belongs_to_many :ports, :class_name => 'Port', :join_table => 'maintainers_ports'
has_many :port_pkgs, :foreign_key => 'submitter_id'
+
+ def Person.by_email(email)
+ Person.find(:first, :conditions => "email = '#{email}'")
+ end
+
+ def Person.ensure_person_with_email(email)
+ 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.email = email
+
+ # Save the person
+ person.save
+ end
+ return person
+ end
end
Modified: users/jberry/mpwa/app/models/port.rb
===================================================================
--- users/jberry/mpwa/app/models/port.rb 2007-04-09 02:58:08 UTC (rev 23759)
+++ users/jberry/mpwa/app/models/port.rb 2007-04-09 04:10:51 UTC (rev 23760)
@@ -1,5 +1,35 @@
class Port < ActiveRecord::Base
has_many :port_pkgs
has_and_belongs_to_many :tags
- has_and_belongs_to_many :maintainers, :class_name => 'Person', :join_table => 'maintainers_ports'
+ has_and_belongs_to_many :maintainers, :class_name => 'Person', :join_table => 'maintainers_ports'
+
+ def Port.by_name(name)
+ Port.find(:first, :conditions => "name = '#{name}'")
+ end
+
+ def Port.ensure_port(name, info)
+ 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']
+
+ maintainers = info['maintainers']
+ if !maintainers.nil?
+ maintainers.each do |maintainer|
+ person = Person.ensure_person_with_email(maintainer)
+ port.maintainers << person
+ end
+ end
+
+ # Save the port
+ port.save
+ end
+ return port
+ end
+
end
Modified: users/jberry/mpwa/app/models/port_pkg.rb
===================================================================
--- users/jberry/mpwa/app/models/port_pkg.rb 2007-04-09 02:58:08 UTC (rev 23759)
+++ users/jberry/mpwa/app/models/port_pkg.rb 2007-04-09 04:10:51 UTC (rev 23760)
@@ -1,5 +1,96 @@
+require 'time'
+require 'temp_directories'
+require 'port'
+
class PortPkg < ActiveRecord::Base
+ @@xar = "/opt/local/bin/xar"
+ @@porttool = "/opt/local/bin/port"
+
belongs_to :port
belongs_to :submitter, :class_name => 'Person', :foreign_key => 'submitter_id'
+ has_many :files, :class_name => 'PortPkgFiles'
has_and_belongs_to_many :tags
+
+ def PortPkg.import_from_file(file)
+ raise "badpkg" if file.nil?
+
+ # Make a temporary directory
+ tempDirPath = TempDirectories.makeTempDir
+
+ # Write the portpkg file to the temporary directory
+ pkgPath = tempDirPath + "portpkg.xar"
+ 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.
+ puts("cd #{tempDirPath}; #{@@xar} -xf #{pkgPath}")
+ system("cd #{tempDirPath}; #{@@xar} -xf #{pkgPath}") or raise "badpkg"
+
+ # Validate the portpkg, bailing on error
+ (expandedPkgPath + "Portfile").file? or raise "badpkg"
+ infoOut = `#{@@porttool} info --name --category --epoch --version --revision --variants --maintainers --short_desc --long_description --description --homepage #{expandedPkgPath}`
+ $?.exitstatus or raise "badpkg"
+
+ # Extract:
+ # => name
+ # => category
+ # => 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 'maintainers'
+ info[token] = value.split(/,\s*/)
+ else
+ info[token] = value
+ end
+ end
+ end
+ name = info['name']
+ puts "name: #{name}"
+ raise "badpkg" if name.nil?
+
+ # Ensure a port for this pkg
+ port = Port.ensure_port(name, info)
+
+ # Create the port_pkg object
+ port_pkg = PortPkg.new
+
+ # 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']
+
+ # Save unpacked data into a file
+ portPkgFile = PortPkgFiles.new
+ portPkgFile.name = 'portpkg.xar'
+ file.rewind
+ portPkgFile.data = file.read
+ port_pkg.files << portPkgFile
+
+ # Save the pkg (maybe we shouldn't?)
+ port_pkg.save
+
+ # Cleanup the temp directory
+ tempDirPath.rmtree
+
+ # Return the port_pkg
+ return port_pkg
+ end
+
end
Added: users/jberry/mpwa/app/models/port_pkg_files.rb
===================================================================
--- users/jberry/mpwa/app/models/port_pkg_files.rb (rev 0)
+++ users/jberry/mpwa/app/models/port_pkg_files.rb 2007-04-09 04:10:51 UTC (rev 23760)
@@ -0,0 +1,3 @@
+class PortPkgFiles < ActiveRecord::Base
+ belongs_to :port_pkg
+end
Added: users/jberry/mpwa/app/models/repository.rb
===================================================================
--- users/jberry/mpwa/app/models/repository.rb (rev 0)
+++ users/jberry/mpwa/app/models/repository.rb 2007-04-09 04:10:51 UTC (rev 23760)
@@ -0,0 +1,3 @@
+class Repository
+
+end
Added: users/jberry/mpwa/app/views/layouts/port_pkg_files.rhtml
===================================================================
--- users/jberry/mpwa/app/views/layouts/port_pkg_files.rhtml (rev 0)
+++ users/jberry/mpwa/app/views/layouts/port_pkg_files.rhtml 2007-04-09 04:10:51 UTC (rev 23760)
@@ -0,0 +1,17 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
+ <title>PortPkgFiles: <%= controller.action_name %></title>
+ <%= stylesheet_link_tag 'scaffold' %>
+</head>
+<body>
+
+<p style="color: green"><%= flash[:notice] %></p>
+
+<%= yield %>
+
+</body>
+</html>
Added: users/jberry/mpwa/app/views/port_pkg/submit.rhtml
===================================================================
--- users/jberry/mpwa/app/views/port_pkg/submit.rhtml (rev 0)
+++ users/jberry/mpwa/app/views/port_pkg/submit.rhtml 2007-04-09 04:10:51 UTC (rev 23760)
@@ -0,0 +1,8 @@
+<h1>New port_pkg</h1>
+
+<% form_tag :action => 'create' do %>
+ <%= render :partial => 'form' %>
+ <%= submit_tag "Create" %>
+<% end %>
+
+<%= link_to 'Back', :action => 'list' %>
Added: users/jberry/mpwa/app/views/port_pkg_files/_form.rhtml
===================================================================
--- users/jberry/mpwa/app/views/port_pkg_files/_form.rhtml (rev 0)
+++ users/jberry/mpwa/app/views/port_pkg_files/_form.rhtml 2007-04-09 04:10:51 UTC (rev 23760)
@@ -0,0 +1,10 @@
+<%= error_messages_for 'port_pkg_files' %>
+
+<!--[form:port_pkg_files]-->
+<p><label for="port_pkg_files_name">Name</label><br/>
+<%= text_field 'port_pkg_files', 'name' %></p>
+
+<p><label for="port_pkg_files_data">Data</label><br/>
+</p>
+<!--[eoform:port_pkg_files]-->
+
Added: users/jberry/mpwa/app/views/port_pkg_files/edit.rhtml
===================================================================
--- users/jberry/mpwa/app/views/port_pkg_files/edit.rhtml (rev 0)
+++ users/jberry/mpwa/app/views/port_pkg_files/edit.rhtml 2007-04-09 04:10:51 UTC (rev 23760)
@@ -0,0 +1,9 @@
+<h1>Editing port_pkg_files</h1>
+
+<% form_tag :action => 'update', :id => @port_pkg_files do %>
+ <%= render :partial => 'form' %>
+ <%= submit_tag 'Edit' %>
+<% end %>
+
+<%= link_to 'Show', :action => 'show', :id => @port_pkg_files %> |
+<%= link_to 'Back', :action => 'list' %>
Added: users/jberry/mpwa/app/views/port_pkg_files/list.rhtml
===================================================================
--- users/jberry/mpwa/app/views/port_pkg_files/list.rhtml (rev 0)
+++ users/jberry/mpwa/app/views/port_pkg_files/list.rhtml 2007-04-09 04:10:51 UTC (rev 23760)
@@ -0,0 +1,27 @@
+<h1>Listing port_pkg_files</h1>
+
+<table>
+ <tr>
+ <% for column in PortPkgFiles.content_columns %>
+ <th><%= column.human_name %></th>
+ <% end %>
+ </tr>
+
+<% for port_pkg_files in @port_pkg_files %>
+ <tr>
+ <% for column in PortPkgFiles.content_columns %>
+ <td><%=h port_pkg_files.send(column.name) %></td>
+ <% end %>
+ <td><%= link_to 'Show', :action => 'show', :id => port_pkg_files %></td>
+ <td><%= link_to 'Edit', :action => 'edit', :id => port_pkg_files %></td>
+ <td><%= link_to 'Destroy', { :action => 'destroy', :id => port_pkg_files }, :confirm => 'Are you sure?', :method => :post %></td>
+ </tr>
+<% end %>
+</table>
+
+<%= link_to 'Previous page', { :page => @port_pkg_files_pages.current.previous } if @port_pkg_files_pages.current.previous %>
+<%= link_to 'Next page', { :page => @port_pkg_files_pages.current.next } if @port_pkg_files_pages.current.next %>
+
+<br />
+
+<%= link_to 'New port_pkg_files', :action => 'new' %>
Added: users/jberry/mpwa/app/views/port_pkg_files/new.rhtml
===================================================================
--- users/jberry/mpwa/app/views/port_pkg_files/new.rhtml (rev 0)
+++ users/jberry/mpwa/app/views/port_pkg_files/new.rhtml 2007-04-09 04:10:51 UTC (rev 23760)
@@ -0,0 +1,8 @@
+<h1>New port_pkg_files</h1>
+
+<% form_tag :action => 'create' do %>
+ <%= render :partial => 'form' %>
+ <%= submit_tag "Create" %>
+<% end %>
+
+<%= link_to 'Back', :action => 'list' %>
Added: users/jberry/mpwa/app/views/port_pkg_files/show.rhtml
===================================================================
--- users/jberry/mpwa/app/views/port_pkg_files/show.rhtml (rev 0)
+++ users/jberry/mpwa/app/views/port_pkg_files/show.rhtml 2007-04-09 04:10:51 UTC (rev 23760)
@@ -0,0 +1,8 @@
+<% for column in PortPkgFiles.content_columns %>
+<p>
+ <b><%= column.human_name %>:</b> <%=h @port_pkg_files.send(column.name) %>
+</p>
+<% end %>
+
+<%= link_to 'Edit', :action => 'edit', :id => @port_pkg_files %> |
+<%= link_to 'Back', :action => 'list' %>
Modified: users/jberry/mpwa/doc/schema-thoughts.sql
===================================================================
--- users/jberry/mpwa/doc/schema-thoughts.sql 2007-04-09 02:58:08 UTC (rev 23759)
+++ users/jberry/mpwa/doc/schema-thoughts.sql 2007-04-09 04:10:51 UTC (rev 23760)
@@ -47,10 +47,7 @@
epoch varchar(32),
version varchar(32),
- revision varchar(32),
-
- url varchar(127) -- uniquely identify a portpkg to outside world
- -- this might also also indexing of externally served portpkgs
+ revision varchar(32)
-- one-many association for variants
-- many-many association for tags through PkgTagAssoc
@@ -59,6 +56,14 @@
-- (note that both pkgs and variants, have dependency relations)
);
+drop table if exists Port_Pkg_Files;
+create table Port_Pkg_Files (
+ id bigint not null primary key auto_increment,
+ port_pkg_id bigint not null,
+ name varchar(255),
+ data blob
+);
+
-- A tag which may be attached to various items through Ports_Tags, Port_Pkgs_Tags
drop table if exists Tags;
create table Tags (
Added: users/jberry/mpwa/lib/temp_directories.rb
===================================================================
--- users/jberry/mpwa/lib/temp_directories.rb (rev 0)
+++ users/jberry/mpwa/lib/temp_directories.rb 2007-04-09 04:10:51 UTC (rev 23760)
@@ -0,0 +1,24 @@
+require "fileutils"
+
+class TempDirectories
+
+ def TempDirectories.makeTempDir
+ # Note: for long running processes, we should really incorporate time or randomness into this
+ tmpdir = Dir::tmpdir
+ basename = "mpwa"
+ n = 1
+ begin
+ tmpname = Pathname.new(tmpdir) + sprintf('%s.%d.%d', basename, $$, n)
+ n += 1
+ next if tmpname.exist?
+ begin
+ tmpname.mkdir
+ rescue SystemCallError
+ next
+ end
+ end while !tmpname.exist?
+ return tmpname
+ end
+
+end
+
Added: users/jberry/mpwa/test/fixtures/port_pkg_files.yml
===================================================================
--- users/jberry/mpwa/test/fixtures/port_pkg_files.yml (rev 0)
+++ users/jberry/mpwa/test/fixtures/port_pkg_files.yml 2007-04-09 04:10:51 UTC (rev 23760)
@@ -0,0 +1,5 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+ id: 1
+two:
+ id: 2
Added: users/jberry/mpwa/test/functional/port_pkg_files_controller_test.rb
===================================================================
--- users/jberry/mpwa/test/functional/port_pkg_files_controller_test.rb (rev 0)
+++ users/jberry/mpwa/test/functional/port_pkg_files_controller_test.rb 2007-04-09 04:10:51 UTC (rev 23760)
@@ -0,0 +1,92 @@
+require File.dirname(__FILE__) + '/../test_helper'
+require 'port_pkg_files_controller'
+
+# Re-raise errors caught by the controller.
+class PortPkgFilesController; def rescue_action(e) raise e end; end
+
+class PortPkgFilesControllerTest < Test::Unit::TestCase
+ fixtures :port_pkg_files
+
+ def setup
+ @controller = PortPkgFilesController.new
+ @request = ActionController::TestRequest.new
+ @response = ActionController::TestResponse.new
+
+ @first_id = port_pkg_files(:first).id
+ end
+
+ def test_index
+ get :index
+ assert_response :success
+ assert_template 'list'
+ end
+
+ def test_list
+ get :list
+
+ assert_response :success
+ assert_template 'list'
+
+ assert_not_nil assigns(:port_pkg_files)
+ end
+
+ def test_show
+ get :show, :id => @first_id
+
+ assert_response :success
+ assert_template 'show'
+
+ assert_not_nil assigns(:port_pkg_files)
+ assert assigns(:port_pkg_files).valid?
+ end
+
+ def test_new
+ get :new
+
+ assert_response :success
+ assert_template 'new'
+
+ assert_not_nil assigns(:port_pkg_files)
+ end
+
+ def test_create
+ num_port_pkg_files = PortPkgFiles.count
+
+ post :create, :port_pkg_files => {}
+
+ assert_response :redirect
+ assert_redirected_to :action => 'list'
+
+ assert_equal num_port_pkg_files + 1, PortPkgFiles.count
+ end
+
+ def test_edit
+ get :edit, :id => @first_id
+
+ assert_response :success
+ assert_template 'edit'
+
+ assert_not_nil assigns(:port_pkg_files)
+ assert assigns(:port_pkg_files).valid?
+ end
+
+ def test_update
+ post :update, :id => @first_id
+ assert_response :redirect
+ assert_redirected_to :action => 'show', :id => @first_id
+ end
+
+ def test_destroy
+ assert_nothing_raised {
+ PortPkgFiles.find(@first_id)
+ }
+
+ post :destroy, :id => @first_id
+ assert_response :redirect
+ assert_redirected_to :action => 'list'
+
+ assert_raise(ActiveRecord::RecordNotFound) {
+ PortPkgFiles.find(@first_id)
+ }
+ end
+end
Added: users/jberry/mpwa/test/unit/port_pkg_files_test.rb
===================================================================
--- users/jberry/mpwa/test/unit/port_pkg_files_test.rb (rev 0)
+++ users/jberry/mpwa/test/unit/port_pkg_files_test.rb 2007-04-09 04:10:51 UTC (rev 23760)
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class PortPkgFilesTest < Test::Unit::TestCase
+ fixtures :port_pkg_files
+
+ # Replace this with your real tests.
+ def test_truth
+ assert true
+ end
+end
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macports-changes/attachments/20070408/a932d199/attachment.html
More information about the macports-changes
mailing list