Commit 847bba926929c4d64dcc5065b9b2762a62a87c87
1 parent
643ed9cb
Exists in
master
and in
4 other branches
Add Gitlab::Satellite::Action
Showing
1 changed file
with
47 additions
and
0 deletions
Show diff stats
... | ... | @@ -0,0 +1,47 @@ |
1 | +module Gitlab | |
2 | + module Satellite | |
3 | + class Action | |
4 | + DEFAULT_OPTIONS = { git_timeout: 30.seconds } | |
5 | + | |
6 | + attr_accessor :options, :project | |
7 | + | |
8 | + def initialize(project, options = {}) | |
9 | + @project = project | |
10 | + @options = DEFAULT_OPTIONS.merge(options) | |
11 | + end | |
12 | + | |
13 | + protected | |
14 | + | |
15 | + # * Sets a 30s timeout for Git | |
16 | + # * Locks the satellite repo | |
17 | + # * Yields the prepared satellite repo | |
18 | + def in_locked_and_timed_satellite | |
19 | + Grit::Git.with_timeout(options[:git_timeout]) do | |
20 | + File.open(lock_file, "w+") do |f| | |
21 | + f.flock(File::LOCK_EX) | |
22 | + | |
23 | + unless project.satellite.exists? | |
24 | + raise "Satellite doesn't exist" | |
25 | + end | |
26 | + | |
27 | + Dir.chdir(project.satellite.path) do | |
28 | + repo = Grit::Repo.new('.') | |
29 | + | |
30 | + return yield repo | |
31 | + end | |
32 | + end | |
33 | + end | |
34 | + rescue Errno::ENOMEM => ex | |
35 | + Gitlab::GitLogger.error(ex.message) | |
36 | + return false | |
37 | + rescue Grit::Git::GitTimeout => ex | |
38 | + Gitlab::GitLogger.error(ex.message) | |
39 | + return false | |
40 | + end | |
41 | + | |
42 | + def lock_file | |
43 | + Rails.root.join("tmp", "#{project.path}.lock") | |
44 | + end | |
45 | + end | |
46 | + end | |
47 | +end | ... | ... |