git-restart 0.0.3 → 0.0.4.pre.dev
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/git-restart +4 -11
- data/lib/git-restart/runner.rb +16 -48
- data/lib/git-restart/task.rb +11 -80
- metadata +5 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c99d1fbfa58de92874eb59f9b49e6ca080e0b5a1
|
4
|
+
data.tar.gz: 8651e7bcf6fa826f158e0dfd15bcd82a66a7f703
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e0c1e3adf4b6ebe1317a276a104363e4b27e617f646ec5f283f75303822d2d1afa75179aac180b5daf9ab591aea25e48be06ef639eb7e09933e0d6bf0d29663
|
7
|
+
data.tar.gz: 615bbed3fad0442ac9b988d0333d126bd9b52ab4e562a90454400a9a158bacd16f7065c8b7822d5871f6b4f48c6a37ec19f363ca3b074afe6809d402c918503e
|
data/bin/git-restart
CHANGED
@@ -5,18 +5,11 @@ require 'git-restart/runner.rb'
|
|
5
5
|
|
6
6
|
puts "Starting runner ..."
|
7
7
|
|
8
|
-
|
9
|
-
target
|
10
|
-
ARGV.each do |t|
|
11
|
-
if(t =~ /\.gitrun$/)
|
12
|
-
target = t;
|
13
|
-
else
|
14
|
-
$taskfiles << t;
|
15
|
-
end
|
16
|
-
end
|
8
|
+
target = ARGV[0]
|
9
|
+
target ||= ".gitrun"
|
17
10
|
|
18
|
-
raise ArgumentError, "No valid
|
11
|
+
raise ArgumentError, "No valid task file specified!" unless File.exist? target
|
19
12
|
|
20
13
|
load target
|
21
14
|
|
22
|
-
GitRestart::Task.runner.mqtt.
|
15
|
+
GitRestart::Task.runner.mqtt.lock_and_listen
|
data/lib/git-restart/runner.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
|
2
2
|
require 'mqtt/sub_handler'
|
3
|
-
|
4
3
|
require 'git'
|
5
|
-
require 'octokit'
|
6
4
|
|
7
5
|
require_relative "task.rb"
|
8
6
|
|
@@ -11,16 +9,12 @@ module GitRestart
|
|
11
9
|
attr_accessor :name
|
12
10
|
|
13
11
|
attr_accessor :repo, :branches, :exclude_branches, :start_on
|
14
|
-
attr_accessor :allowed_tasks
|
15
12
|
|
16
13
|
attr_reader :next_tasks
|
17
14
|
attr_reader :current_task_file
|
18
15
|
|
19
|
-
attr_reader :mqtt
|
20
|
-
attr_accessor :octokit
|
21
|
-
|
22
16
|
def current_commit()
|
23
|
-
@git.object("HEAD").sha;
|
17
|
+
@git.object("HEAD^").sha;
|
24
18
|
end
|
25
19
|
def current_branch()
|
26
20
|
@git.current_branch();
|
@@ -29,15 +23,9 @@ module GitRestart
|
|
29
23
|
@current_modified;
|
30
24
|
end
|
31
25
|
|
32
|
-
def initialize(
|
33
|
-
raise ArgumentError, "File list needs to be nil or an Array!" unless (fileList.is_a? Array or fileList.nil?)
|
34
|
-
|
26
|
+
def initialize()
|
35
27
|
GitRestart::Task.runner = self;
|
36
28
|
|
37
|
-
@allowed_tasks = Array.new();
|
38
|
-
@allowed_tasks << fileList if(fileList);
|
39
|
-
@allowed_tasks << $taskfiles unless($taskfiles.empty?)
|
40
|
-
|
41
29
|
@current_tasks = Hash.new();
|
42
30
|
@next_tasks = Hash.new();
|
43
31
|
|
@@ -50,15 +38,16 @@ module GitRestart
|
|
50
38
|
|
51
39
|
yield(self);
|
52
40
|
|
53
|
-
@allowed_tasks.flatten!
|
54
|
-
|
55
41
|
@listenedSub = @mqtt.subscribe_to "GitHub/#{@repo}" do |data|
|
42
|
+
puts "Received data: #{data}"
|
56
43
|
begin
|
57
44
|
data = JSON.parse(data, symbolize_names: true);
|
58
45
|
rescue
|
59
46
|
next;
|
60
47
|
end
|
61
48
|
|
49
|
+
puts "Processing data #{data}"
|
50
|
+
|
62
51
|
next unless data[:branch];
|
63
52
|
if(not @branches.empty?)
|
64
53
|
next unless @branches.include? data[:branch];
|
@@ -66,29 +55,16 @@ module GitRestart
|
|
66
55
|
next if @exclude_branches.include? data[:branch];
|
67
56
|
end
|
68
57
|
|
58
|
+
puts "Queueing data!"
|
59
|
+
|
69
60
|
@branchQueue << data;
|
70
61
|
end
|
71
62
|
|
72
63
|
autostart();
|
73
64
|
_start_task_thread();
|
74
|
-
|
75
|
-
at_exit {
|
76
|
-
_stop_all_tasks();
|
77
|
-
}
|
78
65
|
end
|
79
66
|
|
80
67
|
def update_status(name, newStatus, message = nil)
|
81
|
-
puts "Task #{@name} assumed a new status: #{newStatus}#{message ? " MSG:#{message}" : ""}"
|
82
|
-
|
83
|
-
return unless @octokit;
|
84
|
-
|
85
|
-
begin
|
86
|
-
@octokit.create_status(@repo, current_commit(), newStatus, {
|
87
|
-
context: "#{@name}/#{name}".gsub(" ", "_"),
|
88
|
-
description: message,
|
89
|
-
})
|
90
|
-
rescue
|
91
|
-
end
|
92
68
|
end
|
93
69
|
|
94
70
|
def _start_task_thread()
|
@@ -96,6 +72,8 @@ module GitRestart
|
|
96
72
|
loop do
|
97
73
|
newData = @branchQueue.pop;
|
98
74
|
|
75
|
+
puts "Popped data: #{newData}"
|
76
|
+
|
99
77
|
@current_modified = newData[:touched];
|
100
78
|
_switch_to(newData[:branch], newData[:head_commit]);
|
101
79
|
end
|
@@ -128,28 +106,23 @@ module GitRestart
|
|
128
106
|
t.gsub!(/^\.\//,"");
|
129
107
|
@current_task_file = t;
|
130
108
|
|
131
|
-
|
132
|
-
next unless @allowed_tasks.include? @current_task_file
|
133
|
-
end
|
134
|
-
|
109
|
+
# TODO Add proper error reporting
|
135
110
|
begin
|
136
111
|
load(t);
|
137
112
|
rescue ScriptError, StandardError
|
138
|
-
update_status("File #{t}", :failure, "File could not be parsed!")
|
139
113
|
puts("File #{t} could not be loaded!");
|
140
114
|
rescue GitRestart::TaskValidityError
|
141
|
-
update_status("File #{t}", :failure, "Task-file not configured properly!")
|
142
115
|
puts("Task-File #{t} is not configured properly!");
|
143
116
|
end
|
144
117
|
end
|
145
118
|
|
146
|
-
puts "Finished loading! Next tasks: #{@next_tasks
|
119
|
+
puts "Finished loading! Next tasks are: #{@next_tasks}"
|
147
120
|
end
|
148
121
|
|
149
122
|
def _start_next_tasks()
|
150
123
|
_generate_next_tasks();
|
151
124
|
|
152
|
-
puts "
|
125
|
+
puts "Starting next tasks!"
|
153
126
|
@next_tasks.each do |name, t|
|
154
127
|
next unless t.active;
|
155
128
|
next unless t.triggered?
|
@@ -160,24 +133,19 @@ module GitRestart
|
|
160
133
|
end
|
161
134
|
|
162
135
|
def _switch_to(branch, commit = nil)
|
163
|
-
puts "
|
164
|
-
|
165
|
-
begin
|
166
|
-
@git.fetch();
|
167
|
-
rescue
|
168
|
-
end
|
136
|
+
puts "Switching to branch: #{branch}, commit: #{commit}"
|
137
|
+
@git.fetch();
|
169
138
|
|
170
139
|
if(branch != current_branch())
|
171
140
|
_stop_all_tasks();
|
172
141
|
else
|
173
142
|
_stop_triggered_tasks();
|
174
143
|
end
|
175
|
-
@git.reset_hard();
|
176
144
|
@git.checkout(branch);
|
177
|
-
@git.merge("origin/#{branch}");
|
178
|
-
|
179
145
|
@git.reset_hard(commit);
|
180
146
|
|
147
|
+
@git.merge("origin/#{branch}");
|
148
|
+
|
181
149
|
_start_next_tasks();
|
182
150
|
end
|
183
151
|
|
data/lib/git-restart/task.rb
CHANGED
@@ -1,58 +1,27 @@
|
|
1
1
|
|
2
|
-
# @author Xasin
|
3
2
|
module GitRestart
|
4
|
-
# The Error-Class used to signal when a Task is set up wrong
|
5
3
|
class TaskValidityError < StandardError
|
6
4
|
end
|
7
5
|
|
8
|
-
# This class is used to define "Tasks". Each task represents
|
9
|
-
# a set of commands, which it executes in chronological order, or until
|
10
|
-
# a task errors.
|
11
|
-
# Additionally, it will kill execution of tasks with a specified kill-signal
|
12
|
-
# when an update was detected from GitHub.
|
13
|
-
# The failure-status of the tasks can also be reported via Octokit, allowing this
|
14
|
-
# to be used as a simple CI or Test system for various languages.
|
15
6
|
class Task
|
16
|
-
# The array of tasks to execute. Each target will be executed in the given
|
17
|
-
# order via `Process.spawn`.
|
18
|
-
# @return [Array<String>]
|
19
7
|
attr_reader :targets
|
20
8
|
|
21
|
-
# The signal (as String, like Signal.list) to use to kill the process.
|
22
|
-
# Can be nil to disable killing
|
23
9
|
attr_accessor :signal
|
24
|
-
# Whether or not to report failure if the currently running target
|
25
|
-
# has a non-zero exit status after having been killed. Only makes sense
|
26
|
-
# together with report_status
|
27
10
|
attr_accessor :expect_clean_exit
|
28
|
-
# Whether or not to report failure/success status to GitHub using Octokit
|
29
11
|
attr_accessor :report_status
|
30
|
-
# Defines this as a "CI_Task". Such a task will always run on an update,
|
31
|
-
# regardless what files changed. Useful if you always want a status report
|
32
|
-
# on GitHub.
|
33
12
|
attr_accessor :ci_task
|
34
|
-
|
35
|
-
|
36
|
-
# The file to use to retrieve a single-line status info for the "description"
|
37
|
-
# string of the GitHub status. Only the last *non-indented* line is used,
|
38
|
-
# which allows the output of Minitest to be used directly.
|
39
|
-
attr_accessor :status_file
|
40
|
-
|
41
|
-
# Whether or not this task is active. Usually set via #on_branches,
|
42
|
-
# but can be used to manually disable or enable this task based on
|
43
|
-
# config files, ENV variables etc.
|
13
|
+
attr_accessor :name, :status_file
|
14
|
+
|
44
15
|
attr_accessor :active
|
45
16
|
|
46
|
-
# The last status-code of this Task. Used internally.
|
47
17
|
attr_reader :lastStatus
|
48
|
-
# The last status-message of this task. Used internally.
|
49
18
|
attr_reader :status_message
|
50
19
|
|
51
|
-
|
20
|
+
attr_reader :mqtt
|
21
|
+
|
52
22
|
def self.runner=(runner)
|
53
23
|
@runner = runner;
|
54
24
|
end
|
55
|
-
# @api private
|
56
25
|
def self.runner()
|
57
26
|
return @runner;
|
58
27
|
end
|
@@ -63,10 +32,6 @@ module GitRestart
|
|
63
32
|
def branch()
|
64
33
|
runner().current_branch();
|
65
34
|
end
|
66
|
-
def current_commit()
|
67
|
-
runner().current_commit();
|
68
|
-
end
|
69
|
-
|
70
35
|
def modified()
|
71
36
|
runner().current_modified();
|
72
37
|
end
|
@@ -104,8 +69,6 @@ module GitRestart
|
|
104
69
|
|
105
70
|
valid?
|
106
71
|
|
107
|
-
@status_file ||= "/tmp/TaskLog_#{@name}_#{current_commit()}";
|
108
|
-
|
109
72
|
if(runner().next_tasks[@name])
|
110
73
|
raise TaskValidityError, "A task of name #{@name} already exists!"
|
111
74
|
else
|
@@ -119,12 +82,8 @@ module GitRestart
|
|
119
82
|
|
120
83
|
@watched.each do |regEx|
|
121
84
|
modified().each do |f|
|
122
|
-
|
123
|
-
|
124
|
-
else
|
125
|
-
next unless f =~ /#{Regexp.quote(@chdir)}(.*)/
|
126
|
-
return true if $1 =~ regEx;
|
127
|
-
end
|
85
|
+
next unless f =~ /#{Regexp.quote(@chdir)}(.*)/
|
86
|
+
return true if $1 =~ regEx;
|
128
87
|
end
|
129
88
|
end
|
130
89
|
|
@@ -141,55 +100,30 @@ module GitRestart
|
|
141
100
|
end
|
142
101
|
end
|
143
102
|
|
144
|
-
def _rm_logfile()
|
145
|
-
if File.exist?("/tmp/TaskLog_#{@name}_#{current_commit()}") then
|
146
|
-
File.delete("/tmp/TaskLog_#{@name}_#{current_commit()}");
|
147
|
-
end
|
148
|
-
end
|
149
|
-
def _get_statusline()
|
150
|
-
return "No status specified" unless File.exist? @status_file
|
151
|
-
|
152
|
-
sMsg = ""
|
153
|
-
File.open(@status_file, "r") do |sFile|
|
154
|
-
sFile.each_line do |l|
|
155
|
-
l.chomp!
|
156
|
-
next if l == "";
|
157
|
-
next if l =~ /^\s+/;
|
158
|
-
|
159
|
-
sMsg = l;
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
return sMsg;
|
164
|
-
end
|
165
|
-
|
166
103
|
def _report_status(status, message = nil)
|
167
|
-
|
168
|
-
@status_message = message;
|
104
|
+
@status_message = ""
|
169
105
|
|
170
106
|
return unless @report_status
|
171
107
|
|
172
108
|
runner().update_status(@name, status, message);
|
109
|
+
puts "Task #{@name} assumed a new status: #{status}#{message ? " MSG:#{message}" : ""}"
|
173
110
|
end
|
174
111
|
private :_report_status
|
175
112
|
|
176
113
|
def start()
|
177
114
|
puts "Starting Task: #{@name}"
|
178
115
|
|
179
|
-
if @targets.empty?
|
180
|
-
|
181
|
-
return
|
182
|
-
end
|
116
|
+
return if @targets.empty?
|
117
|
+
sleep 0.01
|
183
118
|
|
184
119
|
@executionThread = Thread.new do
|
185
120
|
_report_status(:pending);
|
186
121
|
|
187
|
-
_rm_logfile();
|
188
122
|
@targets.each do |target|
|
189
123
|
@statuschange_mutex.synchronize {
|
190
124
|
break if @exiting
|
191
125
|
options = {
|
192
|
-
[:out, :err] => "/
|
126
|
+
[:out, :err] => "/dev/null"
|
193
127
|
}
|
194
128
|
options[:chdir] = @chdir if @chdir
|
195
129
|
|
@@ -205,14 +139,11 @@ module GitRestart
|
|
205
139
|
|
206
140
|
if(@lastStatus == 0)
|
207
141
|
_report_status(:success);
|
208
|
-
_rm_logfile();
|
209
142
|
elsif(!@exiting || @expect_clean_exit)
|
210
143
|
_report_status(:failure);
|
211
144
|
end
|
212
145
|
end
|
213
146
|
@executionThread.abort_on_exception = true;
|
214
|
-
|
215
|
-
sleep 0.01
|
216
147
|
end
|
217
148
|
|
218
149
|
def stop()
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-restart
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4.pre.dev
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Xasin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-08-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mqtt-sub_handler
|
@@ -38,20 +38,6 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.4'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: octokit
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '4.0'
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '4.0'
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: minitest
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -121,12 +107,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
121
107
|
version: '0'
|
122
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
109
|
requirements:
|
124
|
-
- - "
|
110
|
+
- - ">"
|
125
111
|
- !ruby/object:Gem::Version
|
126
|
-
version:
|
112
|
+
version: 1.3.1
|
127
113
|
requirements: []
|
128
114
|
rubyforge_project:
|
129
|
-
rubygems_version: 2.
|
115
|
+
rubygems_version: 2.6.14.1
|
130
116
|
signing_key:
|
131
117
|
specification_version: 4
|
132
118
|
summary: "(Re)start scripts and monitor them on a GitHub push"
|