diff --git a/.gitignore b/.gitignore index 537c0fae2..67221f5e4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .DS_Store .idea .rvmrc +.stgit* *.swap *.swo *.swp @@ -19,4 +20,4 @@ gpg/*/random_seed public/uploads/* public/source.tar tmp/**/* -capybara-*.html \ No newline at end of file +capybara-*.html diff --git a/Gemfile b/Gemfile index 687389f86..0e74b4f45 100644 --- a/Gemfile +++ b/Gemfile @@ -4,9 +4,9 @@ gem 'rails', '3.0.0' gem 'bundler', '>= 1.0.0' #Security -gem 'devise', '1.1.2' +gem 'devise', '1.1.3' gem 'devise-mongo_mapper', :git => 'git://github.com/collectiveidea/devise-mongo_mapper' - +gem 'devise_invitable', '~> 0.3.4' #Mongo gem 'mongo_mapper', :branch => 'rails3', :git => 'http://github.com/jnunemaker/mongomapper.git' gem 'bson_ext', '1.1' diff --git a/Gemfile.lock b/Gemfile.lock index 8876632a6..a2a905cc5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -49,21 +49,22 @@ GIT GIT remote: http://github.com/dcu/magent.git - revision: 06513f3dac812469a55f2e365c349af4d2abc92a + revision: 5d664351b305141158fc69fc495456414821adb3 specs: - magent (0.4.2) - mongo (>= 0.1.0) - uuidtools (>= 2.0.0) + magent (1.0.0) + em-websocket + mongo + uuidtools GIT remote: http://github.com/jnunemaker/mongomapper.git - revision: 5a3328244b641fa4f6a3743e9e0b4dd6a1ac2700 + revision: fd59b0ab068be7321f8e84b9dc12fb4fa6b8535d branch: rails3 specs: mongo_mapper (0.8.4) activemodel (~> 3.0.0) activesupport (~> 3.0.0) - plucky (~> 0.3.5) + plucky (~> 0.3.6) GEM remote: http://rubygems.org/ @@ -119,6 +120,8 @@ GEM rack (>= 1.0.0) rack-test (>= 0.5.4) selenium-webdriver (>= 0.0.3) + childprocess (0.0.7) + ffi (~> 0.6.3) columnize (0.3.1) crack (0.1.8) cucumber (0.9.2) @@ -132,9 +135,11 @@ GEM culerity (0.2.12) daemons (1.1.0) database_cleaner (0.5.2) - devise (1.1.2) + devise (1.1.3) bcrypt-ruby (~> 2.1.2) warden (~> 0.10.7) + devise_invitable (0.3.4) + devise (~> 1.1.0) diff-lcs (1.1.2) em-websocket (0.1.4) addressable (>= 2.1.1) @@ -171,7 +176,7 @@ GEM subexec (~> 0.0.4) mocha (0.9.8) rake - mongo (1.0.9) + mongo (1.1) bson (>= 1.0.5) net-scp (1.0.4) net-ssh (>= 1.99.1) @@ -181,8 +186,8 @@ GEM net-ssh-gateway (1.0.1) net-ssh (>= 1.99.1) nokogiri (1.4.3.1) - plucky (0.3.5) - mongo (~> 1.0.8) + plucky (0.3.6) + mongo (~> 1.1) polyglot (0.3.1) pubsubhubbub (0.1.1) em-http-request (>= 0.1.5) @@ -208,16 +213,16 @@ GEM rake (0.8.7) rest-client (1.6.1) mime-types (>= 1.16) - rspec (2.0.0.rc) - rspec-core (= 2.0.0.rc) - rspec-expectations (= 2.0.0.rc) - rspec-mocks (= 2.0.0.rc) - rspec-core (2.0.0.rc) - rspec-expectations (2.0.0.rc) + rspec (2.0.0) + rspec-core (= 2.0.0) + rspec-expectations (= 2.0.0) + rspec-mocks (= 2.0.0) + rspec-core (2.0.0) + rspec-expectations (2.0.0) diff-lcs (>= 1.1.2) - rspec-mocks (2.0.0.rc) - rspec-core (= 2.0.0.rc) - rspec-expectations (= 2.0.0.rc) + rspec-mocks (2.0.0) + rspec-core (= 2.0.0) + rspec-expectations (= 2.0.0) rspec-rails (2.0.0.beta.17) rspec (>= 2.0.0.beta.14) webrat (>= 0.7.0) @@ -227,8 +232,9 @@ GEM ruby-debug-base (0.10.3) linecache (>= 0.3) rubyzip (0.9.4) - selenium-webdriver (0.0.28) - ffi (>= 0.6.1) + selenium-webdriver (0.0.29) + childprocess (>= 0.0.7) + ffi (~> 0.6.3) json_pure rubyzip subexec (0.0.4) @@ -267,8 +273,9 @@ DEPENDENCIES carrierwave! cucumber-rails (= 0.3.2) database_cleaner - devise (= 1.1.2) + devise (= 1.1.3) devise-mongo_mapper! + devise_invitable (~> 0.3.4) em-http-request! em-websocket factory_girl_rails diff --git a/README.md b/README.md index fc4b5aedf..40447939b 100644 --- a/README.md +++ b/README.md @@ -11,21 +11,22 @@ Initial installation instructions are [here](http://github.com/diaspora/diaspora We are continuing to build features and improve the code base. When we think it is ready for general use, we will post more final -instructions. +instructions. Issue tracking is at [bugs.joindiaspora.com](bugs.joindiaspora.com). ## Commit Guidelines You are welcome to contribute, add to and extend Diaspora however you see fit. We will do our best to incorporate everything that meets our guidelines. -Please make your changes on a topic branch in your repo and submit your pull request -from there, so that commits you don't want to submit aren't included. +You can find an introduction to the source code [here](http://github.com/diaspora/diaspora/wiki/An-Introduction-to-the-Diaspora-Source). For an idea of where to start, look at our [issue tracker](bugs.joindiaspora.com). + +Make a topic branch. By making your changes in a topic branch, you ensure that new commits to your master are not included in the pull request, and it's easier for us to merge your commits. Please do not rebase our tree into yours. See [here](http://www.mail-archive.com/dri-devel@lists.sourceforge.net/msg39091.html) for when to rebase. -All commits must be tested, and all your tests should be green +Patches must be tested, and all your tests should be green before a pull request is sent. Please write your tests in Rspec. GEMS: We would like to keep external dependencies unduplicated. We're using diff --git a/app/controllers/albums_controller.rb b/app/controllers/albums_controller.rb index a7ce4b5e3..f5a43360c 100644 --- a/app/controllers/albums_controller.rb +++ b/app/controllers/albums_controller.rb @@ -37,8 +37,12 @@ class AlbumsController < ApplicationController def show @photo = Photo.new @album = current_user.find_visible_post_by_id( params[:id] ) - @album_photos = @album.photos - respond_with @album + unless @album + render :file => "#{Rails.root}/public/404.html", :layout => false, :status => 404 + else + @album_photos = @album.photos + respond_with @album + end end def edit diff --git a/app/controllers/aspects_controller.rb b/app/controllers/aspects_controller.rb index cc6aeaa6c..484cab55e 100644 --- a/app/controllers/aspects_controller.rb +++ b/app/controllers/aspects_controller.rb @@ -41,10 +41,14 @@ class AspectsController < ApplicationController end def show - @aspect = current_user.aspect_by_id params[:id] - @friends = @aspect.people - @posts = current_user.visible_posts( :by_members_of => @aspect ).paginate :per_page => 15, :order => 'created_at DESC' - respond_with @aspect + @aspect = current_user.aspect_by_id params[:id] + unless @aspect + render :file => "#{Rails.root}/public/404.html", :layout => false, :status => 404 + else + @friends = @aspect.people + @posts = current_user.visible_posts( :by_members_of => @aspect ).paginate :per_page => 15, :order => 'created_at DESC' + respond_with @aspect + end end def public diff --git a/app/controllers/invitations_controller.rb b/app/controllers/invitations_controller.rb new file mode 100644 index 000000000..852904458 --- /dev/null +++ b/app/controllers/invitations_controller.rb @@ -0,0 +1,21 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3 or later. See +# the COPYRIGHT file. + +class InvitationsController < Devise::InvitationsController + def update + begin + user = User.find_by_invitation_token(params["user"]["invitation_token"]) + user.accept_invitation!(params["user"]) + rescue MongoMapper::DocumentNotValid => e + user = nil + flash[:error] = e.message + end + if user + flash[:notice] = I18n.t 'registrations.create.success' + sign_in_and_redirect(:user, user) + else + redirect_to new_user_registration_path + end + end +end diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb index 1e5ef5c23..746877498 100644 --- a/app/controllers/people_controller.rb +++ b/app/controllers/people_controller.rb @@ -17,26 +17,18 @@ class PeopleController < ApplicationController end def show - begin - @person = current_user.visible_person_by_id(params[:id]) - rescue BSON::InvalidObjectId - flash[:error] = "Person not found." - redirect_to people_path - return - end + @person = current_user.visible_person_by_id(params[:id]) unless @person - flash[:error] = "Person not found." - redirect_to people_path - return + render :file => "#{Rails.root}/public/404.html", :layout => false, :status => 404 + else + @profile = @person.profile + @aspects_with_person = current_user.aspects_with_person(@person) + @aspects_dropdown_array = current_user.aspects.collect{|x| [x.to_s, x.id]} + @posts = current_user.visible_posts(:person_id => @person.id).paginate :page => params[:page], :order => 'created_at DESC' + @latest_status_message = current_user.raw_visible_posts.find_all_by__type_and_person_id("StatusMessage", params[:id]).last + @post_count = @posts.count + respond_with @person end - - @profile = @person.profile - @aspects_with_person = current_user.aspects_with_person(@person) - @aspects_dropdown_array = current_user.aspects.collect{|x| [x.to_s, x.id]} - @posts = current_user.visible_posts(:person_id => @person.id).paginate :page => params[:page], :order => 'created_at DESC' - @latest_status_message = current_user.raw_visible_posts.find_all_by__type_and_person_id("StatusMessage", params[:id]).last - @post_count = @posts.count - respond_with @person end def destroy diff --git a/app/controllers/photos_controller.rb b/app/controllers/photos_controller.rb index a1ef260b1..a3a815f69 100644 --- a/app/controllers/photos_controller.rb +++ b/app/controllers/photos_controller.rb @@ -76,8 +76,12 @@ class PhotosController < ApplicationController def show @photo = current_user.find_visible_post_by_id params[:id] - @album = @photo.album - respond_with @photo, @album + unless @photo + render :file => "#{Rails.root}/public/404.html", :layout => false, :status => 404 + else + @album = @photo.album + respond_with @photo, @album + end end def edit diff --git a/app/controllers/status_messages_controller.rb b/app/controllers/status_messages_controller.rb index 58b86c051..205156a89 100644 --- a/app/controllers/status_messages_controller.rb +++ b/app/controllers/status_messages_controller.rb @@ -33,7 +33,11 @@ class StatusMessagesController < ApplicationController def show @status_message = current_user.find_visible_post_by_id params[:id] - respond_with @status_message + unless @status_message + render :status => 404 + else + respond_with @status_message + end end private diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 0956c28cc..030cfe56d 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -78,6 +78,10 @@ class UsersController < ApplicationController send_data( File.open(tar_path).read, :filename => "#{current_user.id}.tar" ) end + def invite + User.invite!(:email => params[:email]) + end + private def prep_image_url(params) url = APP_CONFIG[:pod_url].chop if APP_CONFIG[:pod_url][-1,1] == '/' diff --git a/app/models/person.rb b/app/models/person.rb index a1dca0089..2798ac3fb 100644 --- a/app/models/person.rb +++ b/app/models/person.rb @@ -34,8 +34,21 @@ class Person /^(https?):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(\.[a-z]{2,5})?(:[0-9]{1,5})?(\/.*)?$/ix def self.search(query) - query = Regexp.escape( query.to_s.strip ) - Person.all('profile.first_name' => /^#{query}/i) | Person.all('profile.last_name' => /^#{query}/i) + qTokens = query.to_s.strip.split(" ") + fullQueryText = Regexp.escape( query.to_s.strip ) + p = [] + + qTokens.each { + |token| + + q = Regexp.escape( token.to_s.strip ) + p = Person.all('profile.first_name' => /^#{q}/i) \ + | Person.all('profile.last_name' => /^#{q}/i) \ + | p + + } + + return p end def real_name diff --git a/app/models/user.rb b/app/models/user.rb index 270cb7a70..8870b43d8 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -7,6 +7,16 @@ require File.join(Rails.root, 'lib/diaspora/user/querying') require File.join(Rails.root, 'lib/diaspora/user/receiving') require File.join(Rails.root, 'lib/salmon/salmon') +class InvitedUserValidator < ActiveModel::Validator + def validate(document) + unless document.invitation_token + unless document.person + document.errors[:base] << "Unless you are being invited, you must have a person" + end + end + end +end + class User include MongoMapper::Document plugin MongoMapper::Devise @@ -16,11 +26,13 @@ class User include Encryptor::Private QUEUE = MessageHandler.new - devise :database_authenticatable, :registerable, + devise :invitable, :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable key :username, :unique => true key :serialized_private_key, String + key :invitation_token, String + key :invitation_sent_at, DateTime key :friend_ids, Array key :pending_request_ids, Array key :visible_post_ids, Array @@ -38,6 +50,7 @@ class User after_create :seed_aspects before_validation :downcase_username, :on => :create + validates_with InvitedUserValidator before_destroy :unfriend_everyone, :remove_person @@ -254,6 +267,27 @@ class User end ###Helpers############ + + def accept_invitation!( opts = {} ) + if self.invited? + self.username = opts[:username] + self.password = opts[:password] + self.password_confirmation = opts[:password_confirmation] + opts[:person][:diaspora_handle] = "#{opts[:username]}@#{APP_CONFIG[:terse_pod_url]}" + opts[:person][:url] = APP_CONFIG[:pod_url] + + opts[:serialized_private_key] = User.generate_key + self.serialized_private_key = opts[:serialized_private_key] + opts[:person][:serialized_public_key] = opts[:serialized_private_key].public_key + + person_hash = opts.delete(:person) + self.person = Person.create(person_hash) + self.person.save + self.save + self + end + end + def self.instantiate!( opts = {} ) opts[:person][:diaspora_handle] = "#{opts[:username]}@#{APP_CONFIG[:terse_pod_url]}" opts[:person][:url] = APP_CONFIG[:pod_url] diff --git a/app/views/aspects/manage.html.haml b/app/views/aspects/manage.html.haml index 5573fe020..85296669f 100644 --- a/app/views/aspects/manage.html.haml +++ b/app/views/aspects/manage.html.haml @@ -21,13 +21,20 @@ = request.person.real_name %h3=t('.ignore_remove') - %li.remove + .remove %ul.dropzone %li.grey Drag to ignore/remove + %h3= link_to "Invite a friend!", "#invite_user_pane", :id => "invite_user_button", :class => "invite_user_button", :title => "Invite a friend" + + .yo{ :style => "display:none;"} + #invite_user_pane + = render "invitations/new" + - content_for :publish do = link_to(t('.add_a_new_aspect'), "#add_aspect_pane", :id => "add_aspect_button", :class => "new_aspect button", :title => t('.add_a_new_aspect')) + %ul#aspect_list - for aspect in @aspects %li.aspect diff --git a/app/views/invitations/_new.haml b/app/views/invitations/_new.haml new file mode 100644 index 000000000..208e77640 --- /dev/null +++ b/app/views/invitations/_new.haml @@ -0,0 +1,8 @@ +%h2 Send invitation += form_for User.new, :url => invitation_path(User) do |f| + /= devise_error_messages! + %p + = f.label :email + = f.text_field :email + %p= f.submit "Send an invitation" +/= link_to "Home", after_sign_in_path_for(resource_name) diff --git a/app/views/invitations/edit.html.haml b/app/views/invitations/edit.html.haml new file mode 100644 index 000000000..e21b0c276 --- /dev/null +++ b/app/views/invitations/edit.html.haml @@ -0,0 +1,25 @@ += image_tag "http://needcoffee.cachefly.net/needcoffee/uploads/2009/02/predator-arnold-schwarzenegger.jpg" + += form_for(resource, :as => resource_name, :url => invitation_path(resource_name), :html => {:method => :put }) do |f| + %p + = f.label :username + = f.text_field :username + %p + = f.label :password + = f.password_field :password + %p + = f.label :password_confirmation + = f.password_field :password_confirmation + + = f.fields_for :person do |p| + = p.fields_for :profile do |pr| + %p + = pr.label :first_name + = pr.text_field :first_name + %p + = pr.label :last_name + = pr.text_field :last_name + + = f.hidden_field :invitation_token + = f.submit 'sign_up' += render :partial => "devise/shared/links" diff --git a/app/views/invitations/new.html.haml b/app/views/invitations/new.html.haml new file mode 100644 index 000000000..598b16a3d --- /dev/null +++ b/app/views/invitations/new.html.haml @@ -0,0 +1,8 @@ +%h2 Send invitation += form_for User.new, :url => invitation_path(User) do |f| + = devise_error_messages! + %p + = f.label :email + = f.text_field :email + %p= f.submit "Send an invitation" +/= link_to "Home", after_sign_in_path_for(resource_name) diff --git a/app/views/registrations/new.html.haml b/app/views/registrations/new.html.haml index 25902720e..7e74a2157 100644 --- a/app/views/registrations/new.html.haml +++ b/app/views/registrations/new.html.haml @@ -22,6 +22,5 @@ %p = pr.label :last_name = pr.text_field :last_name - = f.submit t('.sign_up') = render :partial => "devise/shared/links" diff --git a/app/views/shared/_aspect_friends.haml b/app/views/shared/_aspect_friends.haml index 03da4ee9b..343272dff 100644 --- a/app/views/shared/_aspect_friends.haml +++ b/app/views/shared/_aspect_friends.haml @@ -19,5 +19,11 @@ = render "requests/new_request", :aspect => @aspect -else .clear + %br = link_to t('.add_friends'), aspects_manage_path +%br += link_to "Invite a friend!", "#invite_user_pane", :id => "invite_user_button", :class => "invite_user_button", :title => "Invite a friend" +.yo{ :style => "display:none;"} + #invite_user_pane + = render "invitations/new" diff --git a/app/views/shared/_publisher.haml b/app/views/shared/_publisher.haml index 214f88964..f14873e75 100644 --- a/app/views/shared/_publisher.haml +++ b/app/views/shared/_publisher.haml @@ -21,7 +21,10 @@ = f.hidden_field( :public, :value => false ) .buttons - = f.submit t('.share') + - if @aspect == :all + = f.submit t('.share'), :title => "Share with all aspects" + - else + = f.submit t('.share'), :title => "Share with #{@aspect.name}" - if defined? broadcast - = f.submit "Broadcast", :class => "broadcast", :name => "broadcast" + = f.submit "Broadcast", :class => "broadcast", :name => "broadcast", :title => "Publish to Diaspora and Facebook" diff --git a/app/views/users/_profile.haml b/app/views/users/_profile.haml index 9b415a720..a9ea4ad4d 100644 --- a/app/views/users/_profile.haml +++ b/app/views/users/_profile.haml @@ -4,6 +4,7 @@ %h2 Profile += link_to new_user_invitation_path(current_user) = form_for @user do |f| = f.error_messages diff --git a/app/views/users/mailer/invitation.html.haml b/app/views/users/mailer/invitation.html.haml new file mode 100644 index 000000000..884a8fc27 --- /dev/null +++ b/app/views/users/mailer/invitation.html.haml @@ -0,0 +1,9 @@ +%p + Hello #{@resource.email}! +%p + Someone has invited you to #{root_url}, you can accept it through the link below. +%p= link_to 'Accept invitation', accept_invitation_url(@resource, :invitation_token => @resource.invitation_token) +%p + If you don't want to accept the invitation, please ignore this email. + %br/ + Your account won't be created until you access the link above and set your password. diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index b012b3f74..6fb026335 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -44,6 +44,11 @@ Devise.setup do |config| # Setup a pepper to generate the encrypted password. config.pepper = "065eb8798b181ff0ea2c5c16aee0ff8b70e04e2ee6bd6e08b49da46924223e39127d5335e466207d42bf2a045c12be5f90e92012a4f05f7fc6d9f3c875f4c95b" + # ==> Configuration for :invitable + # Time interval where the invitation token is valid (default: 0). + # If invite_for is 0 or nil, the invitation will never expire. + # config.invite_for = 2.weeks + # ==> Configuration for :confirmable # The time you want to give your user to confirm his account. During this time # he will be able to access your application without confirming. Default is nil. diff --git a/config/initializers/git_info.rb b/config/initializers/git_info.rb index e7aaffdda..09b540703 100644 --- a/config/initializers/git_info.rb +++ b/config/initializers/git_info.rb @@ -2,4 +2,22 @@ # licensed under the Affero General Public License version 3 or later. See # the COPYRIGHT file. -GIT_INFO = `git show --name-only` +s = `git show --name-only 2>/dev/null || :` +if (s.nil? or s.empty?) + path = File.expand_path("config/gitversion") + begin + if (File.exists?( path)) + s = '' + f = File.open( path) + f.each_line do |line| + s += line + end + f.close + end + rescue + s = "" + end +end +GIT_INFO = s +# What's the scope of this s? Leave to GC just in case... +s = nil diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml new file mode 100644 index 000000000..07a2611d0 --- /dev/null +++ b/config/locales/devise.en.yml @@ -0,0 +1,46 @@ +en: + errors: + messages: + not_found: "not found" + already_confirmed: "was already confirmed" + not_locked: "was not locked" + + devise: + failure: + unauthenticated: 'You need to sign in or sign up before continuing.' + unconfirmed: 'You have to confirm your account before continuing.' + locked: 'Your account is locked.' + invalid: 'Invalid email or password.' + invalid_token: 'Invalid authentication token.' + timeout: 'Your session expired, please sign in again to continue.' + inactive: 'Your account was not activated yet.' + sessions: + signed_in: 'Signed in successfully.' + signed_out: 'Signed out successfully.' + passwords: + send_instructions: 'You will receive an email with instructions about how to reset your password in a few minutes.' + updated: 'Your password was changed successfully. You are now signed in.' + confirmations: + send_instructions: 'You will receive an email with instructions about how to confirm your account in a few minutes.' + confirmed: 'Your account was successfully confirmed. You are now signed in.' + registrations: + signed_up: 'You have signed up successfully. If enabled, a confirmation was sent to your e-mail.' + updated: 'You updated your account successfully.' + destroyed: 'Bye! Your account was successfully cancelled. We hope to see you again soon.' + unlocks: + send_instructions: 'You will receive an email with instructions about how to unlock your account in a few minutes.' + unlocked: 'Your account was successfully unlocked. You are now signed in.' + invitations: + send_instructions: 'Your invitation has been sent.' + invitation_token_invalid: 'The invitation token provided is not valid!' + updated: 'Your password was set successfully. You are now signed in.' + mailer: + confirmation_instructions: + subject: 'Confirmation instructions' + reset_password_instructions: + subject: 'Reset password instructions' + unlock_instructions: + subject: 'Unlock Instructions' + invitation: + subject: 'A friend wants you to join Diaspora!' + diff --git a/config/routes.rb b/config/routes.rb index 5959f21bb..8fbd132a8 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,10 +11,11 @@ Diaspora::Application.routes.draw do resources :albums devise_for :users, :controllers => {:registrations => "registrations", - :password => "devise/passwords"} + :password => "devise/passwords", + :invitations => "invitations"} # added public route to user - match 'public/:username', :to => 'users#public' - match 'users/export', :to => 'users#export' + match 'public/:username', :to => 'users#public' + match 'users/export', :to => 'users#export' match 'users/export_photos', :to => 'users#export_photos' resources :users, :except => [:create, :new, :show] diff --git a/lib/diaspora/user/querying.rb b/lib/diaspora/user/querying.rb index 9b08bd9b8..7e6413749 100644 --- a/lib/diaspora/user/querying.rb +++ b/lib/diaspora/user/querying.rb @@ -7,7 +7,7 @@ module Diaspora module Querying def find_visible_post_by_id( id ) - self.raw_visible_posts.find id + self.raw_visible_posts.find id.to_id end def visible_posts( opts = {} ) @@ -44,11 +44,9 @@ module Diaspora end def people_in_aspects aspects - people = [] - aspects.each{ |aspect| - people = people | aspect.people - } - people + aspects.inject([]) do |found_people,aspect| + found_people | aspect.people + end end def all_aspect_ids diff --git a/lib/mongo_mapper/bson_id.rb b/lib/mongo_mapper/bson_id.rb index f1e0e9985..e3425715f 100644 --- a/lib/mongo_mapper/bson_id.rb +++ b/lib/mongo_mapper/bson_id.rb @@ -4,7 +4,11 @@ class String def to_id - BSON::ObjectId self + begin + BSON::ObjectId self + rescue + nil + end end end class BSON::ObjectId diff --git a/pkg/fedora/.gitignore b/pkg/fedora/.gitignore index 3fab5f9c0..bedbdc760 100644 --- a/pkg/fedora/.gitignore +++ b/pkg/fedora/.gitignore @@ -1,2 +1,3 @@ TODO dist +.stgit* diff --git a/pkg/fedora/README.md b/pkg/fedora/README.md index 96c9c47d9..c0b29d3d2 100644 --- a/pkg/fedora/README.md +++ b/pkg/fedora/README.md @@ -1,24 +1,25 @@ ## Diaspora RPM tools -Creates RPM packages from diaspora git repository. +Creates diaspora source tarballs and RPM packages -An alternative to the capistrano system, providing classic, binary RPM -packages for deployment on Fedora 13. +An alternative to the capistrano system, providing classic, binary RPM +packages for deployment on Fedora 13 and OS-independent source tarballs +aimed for packaging purposes. -#### Synopsis: +#### Fedora RPM synopsis *Prerequisites*: ruby-1.8, rubygem and other packages as described in http://github.com/diaspora/diaspora/wiki/Rpm-installation-on-fedora or http://github.com/diaspora/diaspora/wiki/Installing-on-CentOS-Fedora -Create source tarballs like dist/diaspora-0.0-1010041233_fade4231.tar.gz +Create source tarballs like dist/diaspora-0.0-1010041233_fade4231.tar.gz and dist/diaspora-bundle-0.0-1010041233_fade4231.tar.gz: % ./make-dist.sh source % ./make-dist.sh bundle -Setup links to tarballs from RPM source directory: - % ./make-dist.sh links +Setup links to tarballs from RPM source directory and create spec files: + % ./make-dist.sh prepare Build rpms: rpmbuild -ba dist/diaspora.spec @@ -28,7 +29,7 @@ Install (as root): rpm -U ~/rmpbuild/rpms/i686/diaspora-bundle-0.0-1.1010042345_4343fade43.fc13.i686 rpm -U ~/rmpbuild/rpms/noarch/diaspora-0.0-1.1010042345_4343fade43.fc13.noarch -Initiate (as root). +Initiate (as root). /usr/share/diaspora/diaspora-setup Start development server: @@ -37,48 +38,75 @@ Start development server: cd /usr/share/diaspora/master ./script/server -See http://github.com/diaspora/diaspora/wiki/Using-apache for +See http://github.com/diaspora/diaspora/wiki/Using-apache for apache/passenger setup. After configuration, start with: - /sbin/service diaspora-ws start + /sbin/service diaspora-wsd start /sbin/service httpd restart +#### Generic source synopsis + +Generate source tarball: + % ./make-dist.sh source + Using repo: http://github.com/diaspora/diaspora.git + Commit id: 1010092232_b313272 + Source: dist/diaspora-0.0-1010092232_b313272.tar.gz + Required bundle: 1010081636_d1a4ee0 + % + +The source tarball could be used as-is, by unpacking add making a +*bundle install*. An alternative is to generate a canned bundle like: + % ./make-dist.sh bundle + [ lot's of output...] + Bundle: dist/diaspora-bundle-0.0-1010081636_d1a4ee0.tar.gz + % + +This file can be installed anywhere. To use it, add a symlink from vendor/bundle +to the bundle's master directory. Reasonable defaults are to install +diaspora in /var/diaspora and bundle in /usr/lib/diaspora-bundle. With these, +the link is + % rm -rf /var/diaspora/master/vendor/bundle + % ln -sf /usr/lib/diaspora-bundle/master/bundle \ + > /var/diaspora/master/vendor + % + +The directories tmp, log, and public/uploads needs to be writable. If using +apache passenger, read the docs on uid used and file ownership. + +Note that the bundle version required is printed each time a new source +is generated. #### Notes +The source tarball is as retrieved from diaspora with following differences: + + - The .git directories are removed (freeing more than 50% of the size). + - A new file /master/config/gitversion is created. + - The file public/source.tar is generated. + - The file .bundle/config is patched. Remove before doing + *bundle install* + Routines uses last available version from master branch at github. The -version contains a time stamp and an abbreviated git commit id. If listed -in filename order, like ls does, latest version will be the last one. +version contains a time stamp and an abbreviated git commit id. Using -c, a specific commit can be used for source build. -*make-dist links* creates links also for all files listed in SOURCES. +*make-dist prepare* creates links also for all files listed in SOURCES. Typically, this is secondary sources. *make-dist.sh sources* applies all patches named *.patch in this directory after checking out source from git. -The spec-files in dist/ are patched by ./make-dist.sh source to reference +The spec-files in dist/ are patched by *./make-dist.sh prepare* to reference correct versions of diaspora and diaspora-bundle. The diaspora-bundle -is only updated if Gemfile is updated, upgrading diaspora doesn't +is only updated if Gemfile is updated, upgrading diaspora doesn't always require a new diaspora-bundle. Editing spec files should be done -in this directory, changes in dist/ are lost when doing ./make-dist source. +in this directory, changes in dist/ are lost when doing *./make-dist prepare*. The topmost comment's version is patched to reflect the complete version -of current specfile by 'make-dist source'. WRite the comment in this +of current specfile by *make-dist source*. Write the comment in this directory, copy-paste previous version nr. It will be updated. -rpmlint shows many errors, most of which related to that the server -won't start if the .git directories are not included. Needs investigation. - -This has been confirmed to start up and provide basic functionality both using -the thin webserver and apache passenger, and on 32/64 bit systems. - -#### Bugs - -As of now, diaspora fails if it not owns all file under /usr/share/diaspora. -I guess this means diaspora writes some stuff somewhere. In the long run, -this should be located and symlinked to /var,leaving the rest of the files -owned by root. FTM, all files in /usr/share/diaspore are owned by -diaspora - +This has been confirmed to start up and provide basic functionality both using +the thin webserver and apache passenger, on 32/64 bit systems and in the +mock build environment. #### Implementation @@ -86,22 +114,23 @@ diaspora dist/diaspora directory. This content is, after some patches, the diaspora package. 'make-dir.sh bundle' makes a 'bundle install --deployment' in the diaspora dir. -The resulting bundle is stored in vendor/bundle. This is, after some more +The resulting bundle is stored in vendor/bundle. This is, after some more patches, the content of diaspora-bundle. -Here is also support for running the diaspora websocket service as a system +Here is also support for running the diaspora websocket service as a system service through /sbin/service and some install scripts. - -Diaspora files are stored in /usr/share/diaspora, and owned by diaspora. The + +Diaspora files are stored in /usr/share/diaspora, and owned by root. The bundle, containing some C extensions, is architecture-dependent and lives in /usr/lib[64]/diaspora. Log files are in /var/log/diaspora. Symlinks in -/usr/share diaspora makes log and bundle available as expected by diaspora app. -This is more or less as mandated by LSB and Fedora packaging rules. - - find /usr/share/diaspora/ -type l -exec ls -l {} \; | awk '{print $9, $10, $11}' - /usr/share/diaspora/master/public/uploads -> /var/lib/diaspora/uploads - /usr/share/diaspora/master/log -> /var/log/diaspora - /usr/share/diaspora/master/vendor/bundle -> /usr/lib/diaspora-bundle/master/vendor/bundle +/usr/share diaspora makes log, bundle and tmp dir available as expected by +diaspora app. This is more or less as mandated by LSB and Fedora packaging rules. + + find . -type l -exec ls -l {} \; | awk '{print $9, $10, $11}' + ./public/uploads -> /var/lib/diaspora/uploads + ./log -> /var/log/diaspora + ./tmp -> /var/lib/diaspora/tmp + ./vendor/bundle -> /usr/lib/diaspora-bundle/master/vendor/bundle #### Discussion @@ -119,11 +148,11 @@ original README.md: not 777. - Splitting in two packages makes sense IMHO. The bundle is not changed that often, - but is quite bug: ~18M without test packages (the default) or ~55M with test - packages. The application is just ~7.5M, and is fast to deploy even with these + but is quite big: ~30M without test packages (the default) or ~55M with test + packages. The application is just ~3M, and is fast to deploy even with these tools (yes, I know, capistrano is much faster...) - Many, roughly 50% of the packages in the bundle are already packaged for Fedora i. e., they could be removed from the bundle and added as dependencies instead. - This is likely to make things more stable in the long run. + This is likely to make things more stable in the long run. diaspora.spec has a list. diff --git a/pkg/fedora/SOURCES b/pkg/fedora/SOURCES index 4f85fc9c7..eb326e9f6 100644 --- a/pkg/fedora/SOURCES +++ b/pkg/fedora/SOURCES @@ -1,3 +1,5 @@ # These files will be linked to %_sourcedir by 'make-dist links' diaspora-setup -diaspora-ws +diaspora-wsd +diaspora.logconf +make_rel_symlink.py diff --git a/pkg/fedora/add-bundle.patch b/pkg/fedora/add-bundle.diff similarity index 100% rename from pkg/fedora/add-bundle.patch rename to pkg/fedora/add-bundle.diff diff --git a/pkg/fedora/diaspora-bundle.spec b/pkg/fedora/diaspora-bundle.spec index 49d1e714f..6f04cff2f 100644 --- a/pkg/fedora/diaspora-bundle.spec +++ b/pkg/fedora/diaspora-bundle.spec @@ -4,22 +4,22 @@ %define __jar_repack %{nil} # Turn off the brp-python-bytecompile script, *pyc/pyo causes problems -%global __os_install_post %(echo '%{__os_install_post}' | +%global __os_install_post %(echo '%{__os_install_post}' | sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g') Summary: Rubygem bundle for diaspora Name: diaspora-bundle Version: 0.0 Release: 1.%{git_release}%{?dist} -License: AGPLv3 +License: AGPLv3 Group: Applications/Communications URL: http://www.joindiaspora.com/ Vendor: joindiaspora.com Source: %{name}-%{version}-%{git_release}.tar.gz Prefix: %{_prefix} +BuildRoot: %{_rmpdir}/not-used-in-fedora/ Requires(pre): shadow-utils -BuildRequires: git Requires: ruby(abi) = 1.8 %description @@ -37,6 +37,8 @@ Source file usede to compile native libraries in diaspora-bundle. %prep %setup -q -n %{name}-%{version}-%{git_release} +find . -name .git* -print | xargs rm -rf + pushd bundle/ruby/1.8/ find . -name \*.css -exec chmod 644 {} \; find . -name \*.js -exec chmod 644 {} \; @@ -64,12 +66,12 @@ pushd bundle/ruby/1.8/ sed -i -e '/^#!/d' $f chmod 0644 $f done > /dev/null 2>&1 - find . -perm /u+x -type f -print0 | + find . -perm /u+x -type f -print0 | xargs --null sed -i 's|^#!/usr/local/bin/ruby|#!/usr/bin/ruby|' chmod 755 gems/thin-1.2.7/example/async_chat.ru chmod 755 gems/thin-1.2.7/example/async_tailer.ru - chmod 644 gems/i18n-0.4.1/MIT-LICENSE + chmod 644 gems/i18n-0.4.1/MIT-LICENSE chmod 755 gems/abstract-1.0.0/abstract.gemspec chmod 644 gems/mini_magick-2.1/MIT-LICENSE chmod 755 gems/thin-1.2.7/lib/thin/controllers/service.sh.erb @@ -82,7 +84,7 @@ pushd bundle/ruby/1.8/ # In repo (2.2.4) test -d gems/gherkin-*/ext && { pushd gems/gherkin-*/ext - # Recompile all shared libraries using -O2 optimalization flagcd + # Recompile all shared libraries using -O2 flag for lexer_dir in */ ; do pushd $lexer_dir sed -i 's/ -O0 / -O2 /' extconf.rb @@ -118,7 +120,7 @@ pushd bundle/ruby/1.8/ ln -s ../cbson/cbson.so . popd - # In repo (0.10.4) + # In repo (0.10.4) pushd gems/ruby-debug-base-0.10.3/lib rm ruby_debug.so ln -s ../ext/ruby_debug.so . @@ -144,6 +146,7 @@ pushd bundle/ruby/1.8/ ln -sf ../../ext/nokogiri/nokogiri.so . popd + # in repo (rawhide) pushd gems/json-1.4.6/ext/json/ext/json/ext rm generator.so ln -s ../../generator/generator.so @@ -199,18 +202,18 @@ popd } mkdir -p $RPM_BUILD_ROOT/%{_libdir}/diaspora-bundle/master/vendor - cp -ar bundle $RPM_BUILD_ROOT/%{_libdir}/diaspora-bundle/master/vendor + find %{buildroot}/%{_libdir}/diaspora-bundle \ -type d -fprintf dirs '%%%dir "%%p"\n' find -L %{buildroot}/%{_libdir}/diaspora-bundle -regextype posix-awk \ - -type f -not -regex '.*[.]c$|.*[.]h$|.*[.]cpp$|.*Makefile$' \ + -type f -not -regex '.*[.]c$|.*[.]h$|.*[.]cpp$|.*Makefile$' \ -fprintf files '"%%p"\n' -find %{buildroot}/%{_libdir}/diaspora-bundle -regextype posix-awk \ - -type f -regex '.*[.]c$|.*[.]h$|.*[.]cpp$|.*Makefile$' \ - -fprintf dev-files '"%%p"\n' +find %{buildroot}/%{_libdir}/diaspora-bundle -regextype posix-awk \ + -type f -regex '.*[.]c$|.*[.]h$|.*[.]cpp$|.*Makefile$' \ + -fprintf dev-files '"%%p"\n' sed -i -e 's|%{buildroot}||' -e 's|//|/|' files dev-files dirs -cat files >> dirs && cp dirs files +cat files >> dirs && cp dirs files %clean [ "$RPM_BUILD_ROOT" != "/" ] && rm -fr $RPM_BUILD_ROOT @@ -224,5 +227,5 @@ cat files >> dirs && cp dirs files %doc COPYRIGHT AUTHORS GNU-AGPL-3.0 %changelog -* Sat Oct 02 2010 Alec Leamas 1.1009271539_08b9aa8 +* Sat Oct 02 2010 Alec Leamas 0.0-1.1009271539_08b9aa8 - Initial attempt to create a spec file diff --git a/pkg/fedora/diaspora-reset b/pkg/fedora/diaspora-reset index 5557a645c..33c49e893 100755 --- a/pkg/fedora/diaspora-reset +++ b/pkg/fedora/diaspora-reset @@ -1,14 +1,13 @@ #!/bin/sh # -# Try to revert to pristine state, deleting all users and -# configuration +# Try to revert to pristine state, deleting all users and +# configuration +# set -x service mongod stop -service diaspora-ws stop +service diaspora-wsd stop rm -rf /var/lib/mongodb/* cp /usr/share/diaspora/master/config/app_config.yml.example \ /usr/share/diaspora/master/config/app_config.yml service mongod start - - diff --git a/pkg/fedora/diaspora-setup b/pkg/fedora/diaspora-setup index 23eb420d5..eaa9192c0 100755 --- a/pkg/fedora/diaspora-setup +++ b/pkg/fedora/diaspora-setup @@ -1,21 +1,23 @@ #!/bin/bash # -# Do what's needed to initiate diaspora. +# Do what's needed to initiate diaspora. # -# See http://github.com/diaspora/diaspora/issues/issue/395 -# -# Note: This is really sort of prototyping. This should be done in ruby, -# on a web page. test $UID = "0" || { echo "You need to be root to do this, giving up" exit 2 } -cd /usr/share/diaspora/master +services=$( netstat -nl | grep '[^:]:3000[ \t]') +test -n "$services" && { + echo "Warning: something is already using port 3000" + echo " $services" +} /sbin/service mongod start || : +cd /usr/share/diaspora/master + test -e config/app_config.yml || cp config/app_config.yml.example config/app_config.yml @@ -49,4 +51,3 @@ while : ; do break } done - diff --git a/pkg/fedora/diaspora-ws b/pkg/fedora/diaspora-wsd similarity index 81% rename from pkg/fedora/diaspora-ws rename to pkg/fedora/diaspora-wsd index 90dc28f8f..6f0c7593f 100755 --- a/pkg/fedora/diaspora-ws +++ b/pkg/fedora/diaspora-wsd @@ -1,30 +1,30 @@ #!/bin/bash # -# /etc/rc.d/init.d/diaspora-ws +# /etc/rc.d/init.d/diaspora-wsd # -# Starts the diaspora websocket server +# Starts the diaspora websocket daemon # # chkconfig: - 80 80 -# description: Diaspora websocket server +# description: Diaspora websocket daemon ### BEGIN INIT INFO -# Provides: diaspora-ws +# Provides: diaspora-wsd # Required-Start: $local_fs $network # Required-Stop: $local_fs $network # Should-Start: $remote_fs # Should-Stop: $remote_fs -# Default-Start: +# Default-Start: # Default-Stop: 0 1 2 3 4 5 6 # Short-Description: start and stop Diaspora websocket server # Description: The websocket server provides websocket services for -# diaspora. +# diaspora. ### END INIT INFO # Source function library. . /etc/init.d/functions -if [ -f /etc/sysconfig/diaspora-ws -a $UID -eq 0 ]; then - . /etc/sysconfig/diaspora-ws +if [ -f /etc/sysconfig/diaspora-wsd -a $UID -eq 0 ]; then + . /etc/sysconfig/diaspora-wsd fi # Note: this line is patched by installation scripts. @@ -33,9 +33,9 @@ cd /usr/share/diaspora RETVAL=0 prog="Diaspora websocket server" exec="script/websocket_server.rb" -pidfile="/var/run/diaspora-ws" -lockfile="/var/lock/subsys/diaspora-ws" -logfile=/var/log/diaspora-ws.log +pidfile="/var/run/diaspora-wsd" +lockfile="/var/lock/subsys/diaspora-wsd" +logfile=/var/log/diaspora-wsd.log [ -n "$OPTIONS" ] && OPTIONS=" $OPTIONS" ruby_cmd="ruby -C $PWD $exec$OPTIONS" diff --git a/pkg/fedora/diaspora.logconf b/pkg/fedora/diaspora.logconf index 767c2d7a2..bc8b078d1 100644 --- a/pkg/fedora/diaspora.logconf +++ b/pkg/fedora/diaspora.logconf @@ -8,6 +8,6 @@ notifempty missingok postrotate - ( /sbin/service diaspora-ws condrestart ) >/dev/null 2>&1 + ( /sbin/service diaspora-wsd condrestart ) >/dev/null 2>&1 endscript } diff --git a/pkg/fedora/diaspora.spec b/pkg/fedora/diaspora.spec index 533f170d3..0d07ddb43 100644 --- a/pkg/fedora/diaspora.spec +++ b/pkg/fedora/diaspora.spec @@ -1,18 +1,21 @@ -%global debug_package %{nil} +%global debug_package %{nil} %define git_release HEAD Summary: A social network server Name: diaspora Version: 0.0.1 Release: 1.%{git_release}%{?dist} -License: AGPLv3 +License: AGPLv3 Group: Applications/Communications URL: http://www.joindiaspora.com/ Vendor: joindiaspora.com Source: %{name}-%{version}-%{git_release}.tar.gz -Source1: diaspora-ws +Source1: diaspora-wsd Source2: diaspora-setup +Source3: diaspora.logconf +Source4: make_rel_symlink.py BuildArch: noarch +BuildRoot: %{_rmpdir}/not-used-in-fedora/ Requires: mongodb-server Requires: ruby(abi) = 1.8 @@ -26,36 +29,49 @@ open source social network server. %prep %setup -q -n %{name}-%{version}-%{git_release} -find . -perm /u+x -type f -exec \ +find . -perm /u+x -type f -exec \ sed -i 's|^#!/usr/local/bin/ruby|#!/usr/bin/ruby|' {} \; > /dev/null %build rm -rf master/vendor/bundle -mkdir master/tmp || : -pushd master - tar cf public/source.tar --exclude='source.tar' -X .gitignore * -popd %install -[ "$RPM_BUILD_ROOT" != "/" ] && rm -fr $RPM_BUILD_ROOT -mkdir -p $RPM_BUILD_ROOT/%{_datadir}/diaspora -cp master/README.md . -mv master/GNU-AGPL-3.0 . +rm -fr $RPM_BUILD_ROOT + +sed -i \ + '/BUNDLE_PATH/s|:.*|: %{_libdir}/diaspora-bundle/master/vendor/bundle|' \ + master/.bundle/config + +cp master/GNU-AGPL-3.0 master/COPYRIGHT master/README.md master/AUTHORS . +cp master/pkg/fedora/README.md README-Fedora.md -mkdir -p $RPM_BUILD_ROOT/%{_localstatedir}/log/diaspora mkdir -p $RPM_BUILD_ROOT/etc/init.d -sed -i '/^cd /s|.*|cd %{_datadir}/diaspora/master|' diaspora-ws -cp diaspora-ws $RPM_BUILD_ROOT/etc/init.d -mkdir -p $RPM_BUILD_ROOT/etc/logrotate.d -cp diaspora.logconf $RPM_BUILD_ROOT/%{_sysconfdir}/logrotate.d/diaspora +cp %SOURCE1 $RPM_BUILD_ROOT/etc/init.d +sed -i '/^cd /s|.*|cd %{_datadir}/diaspora/master|' \ + $RPM_BUILD_ROOT/etc/init.d/diaspora-wsd + +mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/logrotate.d +cp %SOURCE3 $RPM_BUILD_ROOT/%{_sysconfdir}/logrotate.d/diaspora + mkdir -p $RPM_BUILD_ROOT/%{_datadir}/diaspora cp -ar master $RPM_BUILD_ROOT/%{_datadir}/diaspora -cp -ar master/.gitignore master/.bundle $RPM_BUILD_ROOT/%{_datadir}/diaspora/master -cp diaspora-setup $RPM_BUILD_ROOT/%{_datadir}/diaspora -mkdir -p $RPM_BUILD_ROOT/%{_localstatedir}/lib/diaspora/uploads +cp %SOURCE2 $RPM_BUILD_ROOT/%{_datadir}/diaspora -find $RPM_BUILD_ROOT/%{_datadir}/diaspora -type d -fprintf dirs '%%%dir "%%p"\n' -find -L $RPM_BUILD_ROOT/%{_datadir}/diaspora -type f -fprintf files '"%%p"\n' +mkdir -p $RPM_BUILD_ROOT/%{_localstatedir}/log/diaspora +mkdir -p $RPM_BUILD_ROOT/%{_localstatedir}/lib/diaspora/uploads +mkdir -p $RPM_BUILD_ROOT/%{_localstatedir}/lib/diaspora/tmp + +%{SOURCE4} $RPM_BUILD_ROOT/%{_localstatedir}/log/diaspora \ + $RPM_BUILD_ROOT/%{_datadir}/diaspora/master/log +%{SOURCE4} $RPM_BUILD_ROOT/%{_localstatedir}/lib/diaspora/uploads \ + $RPM_BUILD_ROOT/%{_datadir}/diaspora/master/public/uploads +%{SOURCE4} $RPM_BUILD_ROOT/%{_localstatedir}/lib/diaspora/tmp \ + $RPM_BUILD_ROOT/%{_datadir}/diaspora/master/tmp + +find $RPM_BUILD_ROOT/%{_datadir}/diaspora -type d \ + -fprintf dirs '%%%dir "%%p"\n' +find -L $RPM_BUILD_ROOT/%{_datadir}/diaspora -type f \ + -fprintf files '"%%p"\n' cat files >> dirs && mv -f dirs files sed -i -e '\|.*/master/config.ru"$|d' \ -e '\|.*/master/config/environment.rb"$|d' \ @@ -64,36 +80,33 @@ sed -i -e '\|.*/master/config.ru"$|d' \ %post -rm -f %{_datadir}/diaspora/master/vendor/bundle -rm -f %{_datadir}/diaspora/master/log -rm -f %{_datadir}/diaspora/master/public/uploads +/sbin/chkconfig --add diaspora-wsd -ln -s %{_localstatedir}/log/diaspora \ - %{_datadir}/diaspora/master/log || : -ln -s %{_libdir}/diaspora-bundle/master/vendor/bundle \ - %{_datadir}/diaspora/master/vendor || : -ln -s %{_localstatedir}/lib/diaspora/uploads \ - %{_datadir}/diaspora/master/public/uploads || : -/sbin/chkconfig --add diaspora-ws || : %preun if [ $1 -eq 0 ] ; then - service diaspora-ws stop >/dev/null 2>&1 || : - /sbin/chkconfig --del diaspora-ws + service diaspora-wsd stop &>/dev/null || : + /sbin/chkconfig --del diaspora-wsd fi + %clean -[ "$RPM_BUILD_ROOT" != "/" ] && rm -fr $RPM_BUILD_ROOT +rm -fr $RPM_BUILD_ROOT + %files -f files -%defattr(-, diaspora, diaspora, 0755) -%doc README.md GNU-AGPL-3.0 +%defattr(-, root, root, 0755) +%doc AUTHORS README.md GNU-AGPL-3.0 COPYRIGHT README-Fedora.md %attr(-, diaspora, diaspora) %{_datadir}/diaspora/master/config.ru %attr(-, diaspora, diaspora) %{_datadir}/diaspora/master/config/environment.rb %attr(-, diaspora, diaspora) %{_localstatedir}/log/diaspora %attr(-, diaspora, diaspora) %{_localstatedir}/lib/diaspora/uploads +%attr(-, diaspora, diaspora) %{_localstatedir}/lib/diaspora/tmp +%{_datadir}/diaspora/master/tmp +%{_datadir}/diaspora/master/public/uploads +%{_datadir}/diaspora/master/log %config(noreplace) %{_sysconfdir}/logrotate.d/diaspora -%{_sysconfdir}/init.d/diaspora-ws +%{_sysconfdir}/init.d/diaspora-wsd %changelog * Fri Sep 24 2010 Alec Leamas 0.0-1.1009280542_859ec2d diff --git a/pkg/fedora/make-dist.sh b/pkg/fedora/make-dist.sh index d8407ab9d..3a24635ed 100755 --- a/pkg/fedora/make-dist.sh +++ b/pkg/fedora/make-dist.sh @@ -6,6 +6,8 @@ # GIT_REPO='http://github.com/diaspora/diaspora.git' VERSION='0.0' +RELEASE='1' + function git_id # @@ -14,63 +16,65 @@ function git_id # Usage: git_id [-n] [file or directory] # { - nl="\n" - file_or_dir="$PWD" + local nl="\n" + local file_or_dir="$PWD" test "$1" = '-n' && { nl=""; shift; } test -n "$1" && file_or_dir="$1" if [ -d $file_or_dir ]; then - file="" - dir=$file_or_dir + local file="" + local dir=$file_or_dir else - file=$(basename $file_or_dir) - dir=$(dirname $file_or_dir) - fi + local file=$(basename $file_or_dir) + local dir=$(dirname $file_or_dir) + fi - export LANG=C ( cd $dir git log -1 --abbrev-commit --date=iso $file | - awk -v nl="$nl" \ - ' BEGIN { commit = "" } - /^commit/ { if ( commit == "") commit = $2 } - /^Date:/ { split( $2, d, "-") - split( $3, t, ":") - } - END { printf( "%s%s%s%s%s_%s%s", - substr( d[1],3), d[2], d[3], - t[1], t[2], - commit, nl) - }' + awk -v nl="$nl" \ + ' BEGIN { commit = ""; d[1] = "" } + /^commit/ { if ( commit == "") commit = $2 } + /^Date:/ { if (d[1] == "") { + split( $2, d, "-") + split( $3, t, ":") + } + } + END { printf( "%s%s%s%s%s_%s%s", + substr( d[1],3), d[2], d[3], + t[1], t[2], + commit, nl) + }' ) } function fix_alphatag() # Patch version on top comment first id line: -# Usage: fix_alphatag +# Usage: fix_alphatag # Patches:\ # * Fri Sep 24 2010 name surname 1.20100925_faf23207 { - dist=$(rpm --eval %dist) - awk -v dist="$dist" -v version="$2" -v release="$3" \ - ' BEGIN { done = 0 } - /^[*]/ { if (done) - print - else - { - gsub( "1[.].*", "") - printf( "%s%s-1.%s%s\n", - $0, version, release,dist) - done = 1 - } - next - } - { print }' \ - < $1 > $1.tmp && mv -f $1.tmp $1 + local dist=$(rpm --eval %dist) + awk -v dist="$dist" -v version="$2" -v commit="$3" -v release="$4" \ + ' BEGIN { done = 0 } + /^[*]/ { if (done) + print + else + { + s = sprintf( "-%s.%s%s\n", release, commit, dist) + gsub( "-[0-9][.][^ ]*$", s) + done = 1 + # add new gsub for version... + print + } + next + } + { print }' < $1 > $1.tmp && mv -f $1.tmp $1 } + function fix_bundle_deps -# usage: fix_bundle_deps +# usage: fix_bundle_deps # Patches: Requires: diaspora-bundle = 0.0-20101021-aefsf323148 { awk -v vers="$2-$3" \ @@ -79,101 +83,112 @@ function fix_bundle_deps else print next - } - { print}' \ - < $1 > $1.tmp && mv -f $1.tmp $1 + } + { print}' \ + < $1 > $1.tmp && mv -f $1.tmp $1 } + function patch() # Patch spec-files with current version-release -# Usage: patch VERSION RELEASE +# Usage: patch { sed -e "/^%define/s|HEAD|$2|" \ -e '/^Version:/s|.*|Version: '$1'|' \ - dist/diaspora.spec - fix_alphatag dist/diaspora.spec $1 $2 - bundle_id=$(git_id dist/diaspora/Gemfile) - dist_tag=$(rpm --eval %dist) - fix_bundle_deps dist/diaspora.spec $1 "1.${bundle_id}$dist_tag" + dist/diaspora.spec + fix_alphatag dist/diaspora.spec $1 $2 $3 + local bundle_id=$(git_id dist/diaspora/Gemfile) + local dist_tag=$(rpm --eval %dist) + fix_bundle_deps dist/diaspora.spec $1 "$RELEASE.${bundle_id}$dist_tag" sed -e "/^%define/s|HEAD|$bundle_id|" \ -e '/^Version:/s|.*|Version: '$1'|' \ < diaspora-bundle.spec > dist/diaspora-bundle.spec - + cp dist/diaspora.spec dist/diaspora/diaspora.spec } + function checkout() # Checkout last version of diaspora unless it's already there. # Usage: checkout [commit id, defaults to HEAD] # Returns: commit for current branch's HEAD. -{ - mkdir dist >/dev/null 2>&1 || : +{ + mkdir dist &>/dev/null || : ( - cd dist + local last_repo='' + cd dist + + test -e '.last-repo' && + last_repo=$( cat '.last-repo') + test "$last_repo" != $GIT_REPO && + rm -rf diaspora test -d diaspora || { - git clone --quiet $GIT_REPO; - ( - cd diaspora; - git remote add upstream \ - git://github.com/diaspora/diaspora.git - for p in ../../*.patch; do - git apply --whitespace=fix $p > /dev/null - done - ) + git clone --quiet $GIT_REPO; + ( + cd diaspora; + git remote add upstream \ + git://github.com/diaspora/diaspora.git + for p in ../../*.patch; do + git apply --whitespace=fix $p > /dev/null + done &> /dev/null || : + ) } - cd diaspora; - git fetch --quiet upstream + echo -n "$GIT_REPO" > '.last-repo' + + cd diaspora; + git fetch --quiet upstream git merge --quiet upstream/master git checkout --quiet ${1:-'HEAD'} - git_id -n + git_id -n ) } -function make_dist +function make_src # Create a distribution tarball -# Usage: make dist [ commit, defaults to HEAD] +# Usage: make src { + echo "Using repo: $GIT_REPO" + commit=$(checkout ${1:-'HEAD'}) - echo "Creating source tarball for $commit" - patch $VERSION $commit + echo "Commit id: $commit" RELEASE_DIR="diaspora-$VERSION-$commit" - rm -rf dist/${RELEASE_DIR} + rm -rf dist/${RELEASE_DIR} mkdir dist/${RELEASE_DIR} - cp diaspora-ws diaspora-setup diaspora.logconf dist/${RELEASE_DIR} cd dist mkdir ${RELEASE_DIR}/master cp -ar diaspora/* diaspora/.git* ${RELEASE_DIR}/master mv ${RELEASE_DIR}/master/diaspora.spec ${RELEASE_DIR} ( - cd ${RELEASE_DIR}; - find . -name .gitkeep -delete - cd master + cd ${RELEASE_DIR}/master + git show --name-only > config/gitversion + tar cf public/source.tar \ + --exclude='source.tar' -X .gitignore * + find $PWD -name .git\* | xargs rm -rf rm -rf .bundle - git apply ../../../add-bundle.patch + /usr/bin/patch -p1 -s <../../../add-bundle.diff ) tar czf ${RELEASE_DIR}.tar.gz ${RELEASE_DIR} && \ rm -rf ${RELEASE_DIR} cd .. - echo "Source: dist/${RELEASE_DIR}.tar.gz" - echo "Required bundle: $(git_id dist/diaspora/Gemfile)" - echo "Source specfile: dist/diaspora.spec" - echo "Bundle specfile: dist/diaspora-bundle.spec" + echo "Source: dist/${RELEASE_DIR}.tar.gz" + echo "Required bundle: $(git_id dist/diaspora/Gemfile)" } + function make_bundle() # Create the bundle tarball # Usage: make_bundle [ commit, defaults to HEAD] # { checkout ${1:-'HEAD'} >/dev/null - bundle_id=$(git_id dist/diaspora/Gemfile) + bundle_id=$( git_id dist/diaspora/Gemfile) bundle_name="diaspora-bundle-$VERSION-$bundle_id" test -e "dist/$bundle_name.tar.gz" || { echo "Creating bundle $bundle_name" cd dist - rm -rf $bundle_name + rm -rf $bundle_name mkdir -p $bundle_name/bundle pushd diaspora > /dev/null bundle install --deployment \ @@ -184,89 +199,126 @@ function make_bundle() "../$bundle_name" popd > /dev/null tar czf $bundle_name.tar.gz $bundle_name + rm -rf $bundle_name cd .. } - echo + echo echo "Bundle: dist/$bundle_name.tar.gz" } -function make_links() -# Usage: make_links [source commit] + +function prepare_rpm() +# Usage: prepare_rpm < commit> { - dest=$(rpm --eval %_sourcedir) + local dest=$(rpm --eval %_sourcedir) test -z "$dest" && { echo "Can't find RPM source directory, giving up." exit 2 } - echo "Linking sources to $dest" - src_commit="${1:-$( checkout)}" - - src="dist/diaspora-$VERSION-$src_commit.tar.gz" + local commit=$( checkout $1) + echo "Release: $RELEASE.$commit" + echo "Rpm source dir: $dest" + + patch $VERSION $commit $RELEASE + + local src="dist/diaspora-$VERSION-$commit.tar.gz" + test -e $src || + cat <<- EOF + Warning: $src does not exist + (last version not built?) + EOF ln -sf $PWD/$src $dest - bundle_commit=$(git_id dist/diaspora/Gemfile) - bundle="dist/diaspora-bundle-$VERSION-$bundle_commit.tar.gz" + local bundle_commit=$( git_id dist/diaspora/Gemfile) + local bundle="dist/diaspora-bundle-$VERSION-$bundle_commit.tar.gz" + test -e $bundle || + cat <<- EOF + Warning: $bundle does not exist + (last version not built?) + EOF ln -sf $PWD/$bundle $dest + local file for file in $( grep -v '^#' SOURCES); do - ln -sf $PWD/$file $dest/$file + if [ -e "$file" ]; then + ln -sf $PWD/$file $dest/$file + else + echo "Warning: $file (listed in SOURCES) does not exist" + fi done - cd $dest - find . -type l -not -readable -exec rm {} \; + ( cd $dest; find . -type l -not -readable -exec rm {} \;) + echo "Source specfile: dist/diaspora.spec" + echo "Bundle specfile: dist/diaspora-bundle.spec" } + function usage() { cat <<- EOF - Usage: make-dist [-c commit] + Usage: make-dist [options] - -c Use a given commit, defaults to last checked in. - dist Build a diaspora application tarball. + Options: + + -h Print this message. + -c commit Use a given commit, defaults to last checked in. + -r release Mark with specified release, defaults to 1. + -u uri Git repository URI, defaults to + $GIT_REPO. + + source Build a diaspora application tarball. bundle Build a bundler(1) bundle for diaspora. - links Symlink bundle and source tarballs to rpm source dir. - + prepare Symlink bundle and source tarballs to rpm source dir, + create patched rpm spec files. + All results are stored in dist/ + EOF } -test "$1" = "-h" -o $# = 0 && { +commit='HEAD' +while getopts ":r:c:h" opt +do + case $opt in + u) GIT_REPO="$OPTARG" + ;; + c) commit="${OPTARG:0:7}" + ;; + r) RELEASE="$OPTARG:" + ;; + h) usage + exit 0 + ;; + *) usage + exit 2 + ;; + esac +done +shift $(($OPTIND - 1)) + +typeset -r GIT_REPO RELEASE +export LANG=C + +test $# -gt 1 -o $# -eq 0 && { usage; - exit 0 + exit 2; } -test "$1" = "-c" && { - test -z "$2" && { - usage; - exit 1 - } - commit="$2" - shift; shift -} - - case $1 in - + "bundle") make_bundle $commit ;; - - 'source') make_dist $commit + 'source') make_src $commit ;; - - 'links') make_links $commit + 'prepare') prepare_rpm $commit $release ;; - - "fix_gemfile") - fix_gemfile - ;; - *) usage exit 1 ;; esac - - + + diff --git a/pkg/fedora/make_rel_symlink.py b/pkg/fedora/make_rel_symlink.py new file mode 100755 index 000000000..5c893056f --- /dev/null +++ b/pkg/fedora/make_rel_symlink.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python + +import os +import os.path +import sys +import pdb +import shutil + +def relative_ln_s( from_, to_ ): + """ + + This is just so dirty & boring: create a relative symlink, making the + to_ path relative to from_. No errorchecks. Both arguments must be + files, a destination directory doesn't work (I think). An existing + file in to_ will be removed. + + """ + prefix = os.path.commonprefix( [ to_, from_ ] ) + if prefix == '': + prefix = '/' + source = from_.split( prefix )[ 1 ] + dest = to_.split( prefix )[ 1 ] + level = len( dest.split( '/' ) ) - 1 + path = ( '../' * level ) + source + return path + +USAGE = 'Usage: make_rel_symlink [-p] ' + +just_print = False; +if sys.argv[1] == "-p": + just_print = True; + sys.argv = sys.argv[ 1:] + +if len( sys.argv ) != 3: + print USAGE + sys.exit( 1 ) + +if os.path.isdir( sys.argv[2] ): + print "Removing link target dir:" + sys.argv[2] + shutil.rmtree( sys.argv[2]) + +link_path = relative_ln_s( sys.argv[1], sys.argv[2] ) +if just_print: + print link_path +else: + os.chdir( os.path.dirname( sys.argv[2])) + target = os.path.basename( sys.argv[2]) + if os.path.exists( target ): + os.unlink( target) + os.symlink( link_path, target) + + diff --git a/public/javascripts/view.js b/public/javascripts/view.js index 474548fe3..eec063bcd 100644 --- a/public/javascripts/view.js +++ b/public/javascripts/view.js @@ -28,6 +28,7 @@ $(document).ready(function(){ //buttons////// $("#add_aspect_button").fancybox({ 'titleShow' : false }); $("#add_request_button").fancybox({ 'titleShow': false }); + $("#invite_user_button").fancybox({ 'titleShow': false }); $(".add_request_button").fancybox({ 'titleShow': false }); $("input[type='submit']").addClass("button"); @@ -72,7 +73,7 @@ $.fn.clearForm = function() { $("#publisher .broadcast").live("click", function(evt){ evt.preventDefault(); - if( confirm("Broadcast to the world?") ) { + if( confirm("Publish to Diaspora and Facebook?") ) { $("#status_message_public").val("true"); $(this).submit(); } diff --git a/spec/models/person_spec.rb b/spec/models/person_spec.rb index defa9f866..b8738f934 100644 --- a/spec/models/person_spec.rb +++ b/spec/models/person_spec.rb @@ -115,7 +115,7 @@ describe Person do end end - describe 'searching' do + describe '::search' do before do @friend_one = Factory.create(:person) @friend_two = Factory.create(:person) @@ -159,6 +159,11 @@ describe Person do people.include?(@friend_three).should == false end + it 'should yield results on full names' do + people = Person.search("Casey Grippi") + people.should == [@friend_four] + end + it 'should search by diaspora_handle exactly' do stub_success("tom@tom.joindiaspora.com") Person.by_webfinger(@friend_one.diaspora_handle).should == @friend_one diff --git a/spec/models/user/invite_spec.rb b/spec/models/user/invite_spec.rb new file mode 100644 index 000000000..1bb2bf0f6 --- /dev/null +++ b/spec/models/user/invite_spec.rb @@ -0,0 +1,35 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3 or later. See +# the COPYRIGHT file. + +require 'spec_helper' + +describe User do + let!(:invited_user) { create_user_with_invitation("abc")} + + context "the acceptance of an invitation" do + it "should create the person with the passed in params" do + Person.count.should be 0 + u = invited_user.accept_invitation!(:invitation_token => "abc", + :username => "user", + :password => "secret", + :password_confirmation => "secret", + :person => {:profile => {:first_name => "Bob", + :last_name => "Smith"}} ) + Person.count.should be 1 + u.person.profile.first_name.should == "Bob" + end + end + + +end + +def create_user_with_invitation(invitation_token, attributes={}) + user = User.new({:password => nil, :password_confirmation => nil}.update(attributes)) + #puts user.inspect + #user.skip_confirmation! + user.invitation_token = invitation_token + user.invitation_sent_at = Time.now.utc + user.save(:validate => false) + user +end diff --git a/tmp/.gitkeep b/tmp/.gitkeep new file mode 100644 index 000000000..e69de29bb