From be414d4829463708e23b639fea9e6fe88863b1c5 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Thu, 1 Sep 2016 02:21:16 +0800 Subject: We don't need them --- lib/tasks/.gitkeep | 0 lib/tasks/ci/.gitkeep | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 lib/tasks/.gitkeep delete mode 100644 lib/tasks/ci/.gitkeep (limited to 'lib') diff --git a/lib/tasks/.gitkeep b/lib/tasks/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/lib/tasks/ci/.gitkeep b/lib/tasks/ci/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 -- cgit v1.2.1 From 63e03dada7e754a92ca088c683f4189424ab34b1 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Wed, 21 Sep 2016 16:12:32 +0800 Subject: Make various trace methods take last_lines argument: So that we could read last few lines rather than read the entire file which could be huge. --- lib/gitlab/ci/trace_reader.rb | 49 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 lib/gitlab/ci/trace_reader.rb (limited to 'lib') diff --git a/lib/gitlab/ci/trace_reader.rb b/lib/gitlab/ci/trace_reader.rb new file mode 100644 index 00000000000..37e51536e8f --- /dev/null +++ b/lib/gitlab/ci/trace_reader.rb @@ -0,0 +1,49 @@ +module Gitlab + module Ci + # This was inspired from: http://stackoverflow.com/a/10219411/1520132 + class TraceReader + BUFFER_SIZE = 4096 + + attr_accessor :path, :buffer_size + + def initialize(new_path, buffer_size: BUFFER_SIZE) + self.path = new_path + self.buffer_size = Integer(buffer_size) + end + + def read(last_lines: nil) + if last_lines + read_last_lines(last_lines) + else + File.read(path) + end + end + + def read_last_lines(max_lines) + File.open(path) do |file| + chunks = [] + pos = lines = 0 + max = file.size + + # We want an extra line to make sure fist line has full contents + while lines <= max_lines && pos < max + pos += buffer_size + + buf = if pos <= max + file.seek(-pos, IO::SEEK_END) + file.read(buffer_size) + else # Reached the head, read only left + file.seek(0) + file.read(buffer_size - (pos - max)) + end + + lines += buf.count("\n") + chunks.unshift(buf) + end + + chunks.join.lines.last(max_lines).join + end + end + end + end +end -- cgit v1.2.1