Commit 630be84add608572e1edd245032cd369a0f1e680

Authored by Dmitriy Zaporozhets
2 parents 9fd6c3d5 fcb0b76c

Merge branch 'files-rational-git-log' into 'master'

Split commit logs loading

#### Before this MR

When visit files tab we have ajax call that loads all last commits for files inside directory.
Load time depends on amount of files in directory. So if directory has 100 files - you may need to wait up to 20 seconds to get last commits info of files. Still if you do navigation at this time the request still wait for processing taking workers busy. If several people try to navigate through big repository directories - you will see huge performance drop.

#### After this MR

Load last commits only for first 10 entries. It usually takes not more then a second (even for huge repos). If user still on the same page - do next ajax call and get 10 more entries. If user navigate to another directory - stop ajax calls for this directory. So for cases when you want navigate to nested directory - you don't have long-running ajax calls that takes workers and makes app unusable for other users

- - -

Fixes #1229
app/controllers/projects/refs_controller.rb
... ... @@ -31,9 +31,23 @@ class Projects::RefsController < Projects::ApplicationController
31 31 end
32 32  
33 33 def logs_tree
34   - contents = tree.entries
35   - @logs = contents.map do |content|
36   - file = params[:path] ? File.join(params[:path], content.name) : content.name
  34 + @offset = if params[:offset].present?
  35 + params[:offset].to_i
  36 + else
  37 + 0
  38 + end
  39 +
  40 + @limit = 10
  41 +
  42 + @path = params[:path]
  43 +
  44 + contents = []
  45 + contents += tree.trees
  46 + contents += tree.blobs
  47 + contents += tree.submodules
  48 +
  49 + @logs = contents[@offset, @limit].to_a.map do |content|
  50 + file = @path ? File.join(@path, content.name) : content.name
37 51 last_commit = @repo.last_commit_for_path(@commit.id, file)
38 52 {
39 53 file_name: content.name,
... ...
app/views/projects/refs/logs_tree.js.haml
... ... @@ -7,3 +7,13 @@
7 7 var row = $("table.table_#{@hex_path} tr.file_#{hexdigest(file_name)}");
8 8 row.find("td.tree_time_ago").html('#{escape_javascript time_ago_with_tooltip(commit.committed_date)}');
9 9 row.find("td.tree_commit").html('#{escape_javascript render("projects/tree/tree_commit_column", commit: commit)}');
  10 +
  11 +- if @logs.present?
  12 + :plain
  13 + var current_url = location.href.replace(/\/?$/, '/');
  14 + var log_url = '#{project_tree_url(@project, tree_join(@ref, @path || '/'))}'.replace(/\/?$/, '/');
  15 + if(current_url == log_url) {
  16 + // Load 10 more commit log for each file in tree
  17 + // if we still on the same page
  18 + ajaxGet('#{logs_file_project_ref_path(@project, @ref, @path || '/', offset: (@offset + @limit))}');
  19 + }
... ...