diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/api.rb | 1 | ||||
-rw-r--r-- | lib/api/entities.rb | 20 | ||||
-rw-r--r-- | lib/api/helpers.rb | 10 | ||||
-rw-r--r-- | lib/api/issues.rb | 111 | ||||
-rw-r--r-- | lib/api/projects.rb | 40 | ||||
-rw-r--r-- | lib/gitlab/logger.rb | 1 | ||||
-rw-r--r-- | lib/tasks/gitlab/backup.rake | 10 | ||||
-rw-r--r-- | lib/tasks/gitlab/status.rake | 25 |
8 files changed, 185 insertions, 33 deletions
diff --git a/lib/api.rb b/lib/api.rb index e24e0a78f71..6a8a3d651c0 100644 --- a/lib/api.rb +++ b/lib/api.rb @@ -15,5 +15,6 @@ module Gitlab mount Users mount Projects + mount Issues end end diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 35ad4d430ad..d86fb79c78b 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -16,11 +16,7 @@ module Gitlab expose :issues_enabled, :merge_requests_enabled, :wall_enabled, :wiki_enabled, :created_at end - class ProjectRepositoryBranches < Grape::Entity - expose :name, :commit - end - - class ProjectRepositoryTags < Grape::Entity + class RepoObject < Grape::Entity expose :name, :commit end @@ -29,5 +25,19 @@ module Gitlab expose :author, :using => Entities::UserBasic expose :expires_at, :updated_at, :created_at end + + class Milestone < Grape::Entity + expose :id, :title, :description, :due_date, :closed, :updated_at, :created_at + end + + class Issue < Grape::Entity + expose :id + expose (:project_id) {|issue| issue.project.id} + expose :title, :description + expose :label_list, :as => :labels + expose :milestone, :using => Entities::Milestone + expose :assignee, :author, :using => Entities::UserBasic + expose :closed, :updated_at, :created_at + end end end diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index 424a17b283c..c1ea05667ae 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -4,6 +4,16 @@ module Gitlab @current_user ||= User.find_by_authentication_token(params[:private_token]) end + def user_project + if @project ||= current_user.projects.find_by_id(params[:id]) || + current_user.projects.find_by_code(params[:id]) + else + error!({'message' => '404 Not found'}, 404) + end + + @project + end + def authenticate! error!({'message' => '401 Unauthorized'}, 401) unless current_user end diff --git a/lib/api/issues.rb b/lib/api/issues.rb new file mode 100644 index 00000000000..dcb6e53588c --- /dev/null +++ b/lib/api/issues.rb @@ -0,0 +1,111 @@ +module Gitlab + # Issues API + class Issues < Grape::API + before { authenticate! } + + resource :issues do + # Get currently authenticated user's issues + # + # Example Request: + # GET /issues + get do + present current_user.issues, :with => Entities::Issue + end + end + + resource :projects do + # Get a list of project issues + # + # Parameters: + # id (required) - The ID or code name of a project + # Example Request: + # GET /projects/:id/issues + get ":id/issues" do + present user_project.issues, :with => Entities::Issue + end + + # Get a single project issue + # + # Parameters: + # id (required) - The ID or code name of a project + # issue_id (required) - The ID of a project issue + # Example Request: + # GET /projects/:id/issues/:issue_id + get ":id/issues/:issue_id" do + @issue = user_project.issues.find(params[:issue_id]) + present @issue, :with => Entities::Issue + end + + # Create a new project issue + # + # Parameters: + # id (required) - The ID or code name of a project + # title (required) - The title of an issue + # description (optional) - The description of an issue + # assignee_id (optional) - The ID of a user to assign issue + # milestone_id (optional) - The ID of a milestone to assign issue + # labels (optional) - The labels of an issue + # Example Request: + # POST /projects/:id/issues + post ":id/issues" do + @issue = user_project.issues.new( + :title => params[:title], + :description => params[:description], + :assignee_id => params[:assignee_id], + :milestone_id => params[:milestone_id], + :label_list => params[:labels] + ) + @issue.author = current_user + + if @issue.save + present @issue, :with => Entities::Issue + else + error!({'message' => '404 Not found'}, 404) + end + end + + # Update an existing issue + # + # Parameters: + # id (required) - The ID or code name of a project + # issue_id (required) - The ID of a project issue + # title (optional) - The title of an issue + # description (optional) - The description of an issue + # assignee_id (optional) - The ID of a user to assign issue + # milestone_id (optional) - The ID of a milestone to assign issue + # labels (optional) - The labels of an issue + # closed (optional) - The state of an issue (0 = false, 1 = true) + # Example Request: + # PUT /projects/:id/issues/:issue_id + put ":id/issues/:issue_id" do + @issue = user_project.issues.find(params[:issue_id]) + parameters = { + :title => (params[:title] || @issue.title), + :description => (params[:description] || @issue.description), + :assignee_id => (params[:assignee_id] || @issue.assignee_id), + :milestone_id => (params[:milestone_id] || @issue.milestone_id), + :label_list => (params[:labels] || @issue.label_list), + :closed => (params[:closed] || @issue.closed) + } + + if @issue.update_attributes(parameters) + present @issue, :with => Entities::Issue + else + error!({'message' => '404 Not found'}, 404) + end + end + + # Delete a project issue + # + # Parameters: + # id (required) - The ID or code name of a project + # issue_id (required) - The ID of a project issue + # Example Request: + # DELETE /projects/:id/issues/:issue_id + delete ":id/issues/:issue_id" do + @issue = user_project.issues.find(params[:issue_id]) + @issue.destroy + end + end + end +end diff --git a/lib/api/projects.rb b/lib/api/projects.rb index 70f8fa2aa62..8edfa481c10 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -16,53 +16,49 @@ module Gitlab # Get a single project # # Parameters: - # id (required) - The code of a project + # id (required) - The ID or code name of a project # Example Request: # GET /projects/:id get ":id" do - @project = current_user.projects.find_by_code(params[:id]) - present @project, :with => Entities::Project + present user_project, :with => Entities::Project end # Get a project repository branches # # Parameters: - # id (required) - The code of a project + # id (required) - The ID or code name of a project # Example Request: # GET /projects/:id/repository/branches get ":id/repository/branches" do - @project = current_user.projects.find_by_code(params[:id]) - present @project.repo.heads.sort_by(&:name), :with => Entities::ProjectRepositoryBranches + present user_project.repo.heads.sort_by(&:name), :with => Entities::RepoObject end # Get a project repository tags # # Parameters: - # id (required) - The code of a project + # id (required) - The ID or code name of a project # Example Request: # GET /projects/:id/repository/tags get ":id/repository/tags" do - @project = current_user.projects.find_by_code(params[:id]) - present @project.repo.tags.sort_by(&:name).reverse, :with => Entities::ProjectRepositoryTags + present user_project.repo.tags.sort_by(&:name).reverse, :with => Entities::RepoObject end # Get a project snippet # # Parameters: - # id (required) - The code of a project + # id (required) - The ID or code name of a project # snippet_id (required) - The ID of a project snippet # Example Request: # GET /projects/:id/snippets/:snippet_id get ":id/snippets/:snippet_id" do - @project = current_user.projects.find_by_code(params[:id]) - @snippet = @project.snippets.find(params[:snippet_id]) + @snippet = user_project.snippets.find(params[:snippet_id]) present @snippet, :with => Entities::ProjectSnippet end # Create a new project snippet # # Parameters: - # id (required) - The code name of a project + # id (required) - The ID or code name of a project # title (required) - The title of a snippet # file_name (required) - The name of a snippet file # lifetime (optional) - The expiration date of a snippet @@ -70,8 +66,7 @@ module Gitlab # Example Request: # POST /projects/:id/snippets post ":id/snippets" do - @project = current_user.projects.find_by_code(params[:id]) - @snippet = @project.snippets.new( + @snippet = user_project.snippets.new( :title => params[:title], :file_name => params[:file_name], :expires_at => params[:lifetime], @@ -89,7 +84,7 @@ module Gitlab # Update an existing project snippet # # Parameters: - # id (required) - The code name of a project + # id (required) - The ID or code name of a project # snippet_id (required) - The ID of a project snippet # title (optional) - The title of a snippet # file_name (optional) - The name of a snippet file @@ -98,8 +93,7 @@ module Gitlab # Example Request: # PUT /projects/:id/snippets/:snippet_id put ":id/snippets/:snippet_id" do - @project = current_user.projects.find_by_code(params[:id]) - @snippet = @project.snippets.find(params[:snippet_id]) + @snippet = user_project.snippets.find(params[:snippet_id]) parameters = { :title => (params[:title] || @snippet.title), :file_name => (params[:file_name] || @snippet.file_name), @@ -117,26 +111,24 @@ module Gitlab # Delete a project snippet # # Parameters: - # id (required) - The code of a project + # id (required) - The ID or code name of a project # snippet_id (required) - The ID of a project snippet # Example Request: # DELETE /projects/:id/snippets/:snippet_id delete ":id/snippets/:snippet_id" do - @project = current_user.projects.find_by_code(params[:id]) - @snippet = @project.snippets.find(params[:snippet_id]) + @snippet = user_project.snippets.find(params[:snippet_id]) @snippet.destroy end # Get a raw project snippet # # Parameters: - # id (required) - The code of a project + # id (required) - The ID or code name of a project # snippet_id (required) - The ID of a project snippet # Example Request: # GET /projects/:id/snippets/:snippet_id/raw get ":id/snippets/:snippet_id/raw" do - @project = current_user.projects.find_by_code(params[:id]) - @snippet = @project.snippets.find(params[:snippet_id]) + @snippet = user_project.snippets.find(params[:snippet_id]) present @snippet.content end end diff --git a/lib/gitlab/logger.rb b/lib/gitlab/logger.rb index aff13baf67b..c3a19e71c10 100644 --- a/lib/gitlab/logger.rb +++ b/lib/gitlab/logger.rb @@ -10,6 +10,7 @@ module Gitlab def self.read_latest path = Rails.root.join("log/githost.log") + self.build unless File.exist?(path) logs = File.read(path).split("\n") end diff --git a/lib/tasks/gitlab/backup.rake b/lib/tasks/gitlab/backup.rake index 014483d4e8c..d9053c232cd 100644 --- a/lib/tasks/gitlab/backup.rake +++ b/lib/tasks/gitlab/backup.rake @@ -121,7 +121,7 @@ namespace :gitlab do backup_path_repo = File.join(Gitlab.config.backup_path, "repositories") FileUtils.mkdir_p(backup_path_repo) until Dir.exists?(backup_path_repo) puts "Dumping repositories:" - project = Project.all.map { |n| [n.name,n.path_to_repo] } + project = Project.all.map { |n| [n.path,n.path_to_repo] } project << ["gitolite-admin.git", File.join(File.dirname(project.first.second), "gitolite-admin.git")] project.each do |project| print "- Dumping repository #{project.first}... " @@ -136,12 +136,18 @@ namespace :gitlab do task :repo_restore => :environment do backup_path_repo = File.join(Gitlab.config.backup_path, "repositories") puts "Restoring repositories:" - project = Project.all.map { |n| [n.name,n.path_to_repo] } + project = Project.all.map { |n| [n.path,n.path_to_repo] } project << ["gitolite-admin.git", File.join(File.dirname(project.first.second), "gitolite-admin.git")] project.each do |project| print "- Restoring repository #{project.first}... " FileUtils.rm_rf(project.second) if File.dirname(project.second) # delet old stuff if Kernel.system("cd #{File.dirname(project.second)} > /dev/null 2>&1 && git clone --bare #{backup_path_repo}/#{project.first}.bundle #{project.first}.git > /dev/null 2>&1") + permission_commands = [ + "sudo chmod -R g+rwX #{Gitlab.config.git_base_path}", + "sudo chown -R #{Gitlab.config.ssh_user}:#{Gitlab.config.ssh_user} #{Gitlab.config.git_base_path}", + "sudo chown gitlab:gitlab /home/git/repositories/**/hooks/post-receive" + ] + permission_commands.each { |command| Kernel.system(command) } puts "[DONE]".green else puts "[FAILED]".red diff --git a/lib/tasks/gitlab/status.rake b/lib/tasks/gitlab/status.rake index ac712234b27..96b8886fa89 100644 --- a/lib/tasks/gitlab/status.rake +++ b/lib/tasks/gitlab/status.rake @@ -2,7 +2,7 @@ namespace :gitlab do namespace :app do desc "GITLAB | Check gitlab installation status" task :status => :environment do - puts "Starting diagnostic" + puts "Starting diagnostic".yellow git_base_path = Gitlab.config.git_base_path print "config/database.yml............" @@ -56,7 +56,28 @@ namespace :gitlab do return end - puts "\nFinished" + if Project.count > 0 + puts "Validating projects repositories:".yellow + Project.find_each(:batch_size => 100) do |project| + print "#{project.name}....." + hook_file = File.join(project.path_to_repo, 'hooks','post-receive') + + unless File.exists?(hook_file) + puts "post-receive file missing".red + next + end + + + unless File.owned?(hook_file) + puts "post-receive file is not owner by gitlab".red + next + end + + puts "post-reveice file ok".green + end + end + + puts "\nFinished".blue end end end |