machinery-tool 1.10.0 → 1.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/NEWS +6 -0
- data/html/assets/compare/machinery-compare.js +41 -20
- data/html/assets/compare/machinery.js +38 -4
- data/html/assets/cross.png +0 -0
- data/html/assets/machinery.css +38 -0
- data/html/comparison.html.haml +110 -66
- data/lib/cli.rb +18 -7
- data/lib/compare_task.rb +16 -17
- data/lib/exceptions.rb +1 -0
- data/lib/file_diff.rb +32 -0
- data/lib/filter_option_parser.rb +2 -2
- data/lib/html.rb +52 -0
- data/lib/machinery.rb +2 -0
- data/lib/remote_system.rb +2 -2
- data/lib/version.rb +1 -1
- data/man/generated/machinery.1.gz +0 -0
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b96848d4a8e199cd5c03e8b7af1dac6b12ddd360
|
4
|
+
data.tar.gz: 8efb2f29f2ba6b12ea9a0c5bd428f6fd98ad8bcd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e357dd4675da951830ec52d8020d8d10aa4b7a08f0747e15209f22c358cd1b2fc35df58d56fd368c4182713c7d826da37872ea0d699d5693c1a55c51fe0f6922
|
7
|
+
data.tar.gz: 6c9a0664f73ea4f84ac3fb37abc6dadaa68ac17835e527d6fd9b84ea6e1da82477519231854bee6aff5bd5fed4db7fb9f58709a7fcaf3ed407ea6bf73758a980
|
data/NEWS
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
# Machinery Release Notes
|
2
2
|
|
3
3
|
|
4
|
+
## Version 1.11.0 - Mon Jul 20 13:51:09 CEST 2015 - thardeck@suse.de
|
5
|
+
|
6
|
+
* Fix comparison output for scopes that were excluded (gh#SUSE/machinery#1029)
|
7
|
+
* Fix connection errors caused by reading from stdin (gh#SUSE/machinery#1050)
|
8
|
+
* Differences between unmanaged files can be viewed in the HTML comparison
|
9
|
+
|
4
10
|
## Version 1.10.0 - Thu Jul 09 16:26:35 CEST 2015 - thardeck@suse.de
|
5
11
|
|
6
12
|
* Data which hasn't changed is not shown in the comparison HTML view by default
|
@@ -4,8 +4,27 @@ angular.module("machinery-compare")
|
|
4
4
|
.config(function($locationProvider) {
|
5
5
|
$locationProvider.html5Mode({enabled: true, requireBase: false});
|
6
6
|
})
|
7
|
-
.controller("compareController", function($scope) {
|
8
|
-
$
|
7
|
+
.controller("compareController", function($scope, $http, $timeout, $anchorScroll) {
|
8
|
+
$http.get("/compare/" + $("body").data("description-a") + "/" + $("body").data("description-b") + ".json").then(function(result) {
|
9
|
+
// Scroll to desired scope when rendering is done
|
10
|
+
$timeout(function () {
|
11
|
+
$anchorScroll();
|
12
|
+
}, 0);
|
13
|
+
$scope.diff = result.data;
|
14
|
+
|
15
|
+
// Determine which unmanaged files can be diffed
|
16
|
+
if($scope.diff.unmanaged_files !== undefined &&
|
17
|
+
$scope.diff.unmanaged_files.only_in1 !== undefined &&
|
18
|
+
$scope.diff.unmanaged_files.only_in2 !== undefined) {
|
19
|
+
var unmanagedFilesIn1 = $.map($scope.diff.unmanaged_files.only_in1.files, function(file){
|
20
|
+
return file.type == 'file' ? file.name : null;
|
21
|
+
});
|
22
|
+
var unmanagedFilesIn2 = $.map($scope.diff.unmanaged_files.only_in2.files, function(file){
|
23
|
+
return file.type == 'file' ? file.name : null;
|
24
|
+
});
|
25
|
+
$scope.diffableUnmanagedFiles = $(unmanagedFilesIn1).filter(unmanagedFilesIn2);
|
26
|
+
}
|
27
|
+
});
|
9
28
|
})
|
10
29
|
.directive("onlyInA", function() {
|
11
30
|
return {
|
@@ -46,33 +65,35 @@ angular.module("machinery-compare")
|
|
46
65
|
.directive("changedPackages", function() {
|
47
66
|
return {
|
48
67
|
restrict: "E",
|
49
|
-
scope: {
|
50
|
-
object: "=object"
|
51
|
-
},
|
52
68
|
link: function(scope, element, attrs) {
|
53
|
-
|
69
|
+
scope.$watch("diff", function(){
|
70
|
+
if(scope.diff == undefined || scope.diff.packages == undefined) {
|
71
|
+
return;
|
72
|
+
}
|
73
|
+
var elements = [];
|
54
74
|
|
55
|
-
|
56
|
-
|
57
|
-
|
75
|
+
angular.forEach(scope.diff.packages.changed, function(value) {
|
76
|
+
var changes = [];
|
77
|
+
var relevant_attributes = ["version", "vendor", "arch"];
|
58
78
|
|
59
|
-
if(value[0].version == value[1].version) {
|
60
|
-
relevant_attributes.push("release");
|
61
79
|
if(value[0].version == value[1].version) {
|
62
|
-
relevant_attributes.push("
|
80
|
+
relevant_attributes.push("release");
|
81
|
+
if(value[0].version == value[1].version) {
|
82
|
+
relevant_attributes.push("checksum");
|
83
|
+
}
|
63
84
|
}
|
64
|
-
}
|
65
85
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
86
|
+
angular.forEach(relevant_attributes, function(attribute) {
|
87
|
+
if(value[0][attribute] != value[1][attribute]) {
|
88
|
+
changes.push(attribute + ": " + value[0][attribute] + " ↔ " + value[1][attribute]);
|
89
|
+
}
|
90
|
+
});
|
91
|
+
|
92
|
+
elements.push(value[0].name + " (" + changes.join(", ") + ")");
|
70
93
|
});
|
71
94
|
|
72
|
-
|
95
|
+
scope.changed_elements = elements;
|
73
96
|
});
|
74
|
-
|
75
|
-
scope.changed_elements = elements;
|
76
97
|
},
|
77
98
|
templateUrl: "scope_packages_changed_partial"
|
78
99
|
};
|
@@ -1,7 +1,4 @@
|
|
1
1
|
$(document).ready(function () {
|
2
|
-
// Render the diff
|
3
|
-
var diff = getDiff();
|
4
|
-
|
5
2
|
// Align content below floating menu
|
6
3
|
var header_height = $("#nav-bar").height() + 20;
|
7
4
|
$("#content_container").css("margin-top", header_height);
|
@@ -31,6 +28,10 @@ $(document).ready(function () {
|
|
31
28
|
}
|
32
29
|
});
|
33
30
|
|
31
|
+
$(".dismiss").click(function(){
|
32
|
+
$(this).closest(".scope").hide();
|
33
|
+
});
|
34
|
+
|
34
35
|
// Hook up the toggle links
|
35
36
|
$(".toggle").click(function(){
|
36
37
|
$(this).closest(".scope").find(".scope_content").collapse("toggle");
|
@@ -55,8 +56,11 @@ $(document).ready(function () {
|
|
55
56
|
$(".show-common-elements").click(function(){
|
56
57
|
$scope = $(this).closest(".scope");
|
57
58
|
$scope.find(".scope_common_content").collapse("show");
|
58
|
-
$(
|
59
|
+
$scope.find(".scope_content").find(".show-common-elements").hide();
|
59
60
|
$scope.find(".hide-common-elements").show();
|
61
|
+
if ($(this).attr("href")){
|
62
|
+
$('html,body').animate({scrollTop: $($(this).attr("href")).offset().top}, 'slow');
|
63
|
+
}
|
60
64
|
return false;
|
61
65
|
});
|
62
66
|
|
@@ -67,4 +71,34 @@ $(document).ready(function () {
|
|
67
71
|
$scope.find(".show-common-elements").show();
|
68
72
|
return false;
|
69
73
|
});
|
74
|
+
|
75
|
+
// Unmanaged files diffs
|
76
|
+
$("#diff-unmanaged-files-file").change(function(){
|
77
|
+
$("#diff-unmanaged-files-content").hide();
|
78
|
+
$("#diff-unmanaged-files-error").hide();
|
79
|
+
$("#diff-unmanaged-files-spinner").show();
|
80
|
+
});
|
81
|
+
|
82
|
+
var description1 = $("body").data("description-a");
|
83
|
+
var description2 = $("body").data("description-b");
|
84
|
+
var url = "/compare/" + description1 + "/" + description2 + "/files/unmanaged_files" + $(this).val();
|
85
|
+
$.get(url, function(res) {
|
86
|
+
$("#diff-unmanaged-files-spinner").hide();
|
87
|
+
if(res.length === 0) {
|
88
|
+
$("#diff-unmanaged-files-error").html("Files are equal.").show();
|
89
|
+
} else {
|
90
|
+
$("#diff-unmanaged-files-diff").html(res);
|
91
|
+
$("#diff-unmanaged-files-content").show();
|
92
|
+
}
|
93
|
+
}, "text").
|
94
|
+
error(function(res) {
|
95
|
+
$("#diff-unmanaged-files-spinner").hide();
|
96
|
+
if(res.readyState == 0) {
|
97
|
+
$("#diff-unmanaged-files-error").html("Could not download file content. Is the web server still running?").show();
|
98
|
+
} else if(res.status == 406) {
|
99
|
+
$("#diff-unmanaged-files-error").html("Can't generate diff, the files are binary.").show();
|
100
|
+
} else {
|
101
|
+
$("#diff-unmanaged-files-error").html("There was an unknown error downloading the file.").show();
|
102
|
+
}
|
103
|
+
});
|
70
104
|
});
|
Binary file
|
data/html/assets/machinery.css
CHANGED
@@ -18,6 +18,10 @@ body {
|
|
18
18
|
text-decoration: none;
|
19
19
|
}
|
20
20
|
|
21
|
+
.scope{
|
22
|
+
border-spacing: 5px;
|
23
|
+
}
|
24
|
+
|
21
25
|
a.scope_anchor,
|
22
26
|
a.both_anchor {
|
23
27
|
display: block;
|
@@ -190,3 +194,37 @@ h1 {
|
|
190
194
|
min-height: 450px;
|
191
195
|
font-family: monospace;
|
192
196
|
}
|
197
|
+
|
198
|
+
#diff-unmanaged-files.modal .modal-body {
|
199
|
+
margin: 0 0.5em;
|
200
|
+
font-family: monospace;
|
201
|
+
}
|
202
|
+
|
203
|
+
#diff-unmanaged-files-diff {
|
204
|
+
background-color: #EEEEEE;
|
205
|
+
}
|
206
|
+
|
207
|
+
#diff-unmanaged-files-diff .diff ul {
|
208
|
+
background-color: #EEEEEE;
|
209
|
+
border: 1px solid gray;
|
210
|
+
padding: 4px;
|
211
|
+
}
|
212
|
+
|
213
|
+
#diff-unmanaged-files-file {
|
214
|
+
margin-bottom: 1em;
|
215
|
+
}
|
216
|
+
|
217
|
+
.well .dismiss{
|
218
|
+
margin: -14px;
|
219
|
+
}
|
220
|
+
|
221
|
+
.dismiss {
|
222
|
+
float: right;
|
223
|
+
width: 24px;
|
224
|
+
height: 24px;
|
225
|
+
background: url("cross.png");
|
226
|
+
cursor: pointer;
|
227
|
+
background-color: white;
|
228
|
+
border-radius: 50%;
|
229
|
+
}
|
230
|
+
|
data/html/comparison.html.haml
CHANGED
@@ -1,19 +1,32 @@
|
|
1
1
|
!!!
|
2
|
-
- description_a = diff[:meta][:description_a]
|
3
|
-
- description_b = diff[:meta][:description_b]
|
4
2
|
%html{"ng-app" => "machinery-compare"}
|
5
3
|
%head
|
6
4
|
%title
|
7
5
|
Machinery System Description Comparison
|
8
6
|
%meta{:charset => 'utf-8'}/
|
9
7
|
%meta{:name => "viewport", :content => "width=device-width, initial-scale=1"}
|
10
|
-
%link{:href => "assets/machinery-base.css", :rel => "stylesheet", :type => "text/css"}/
|
11
|
-
%link{:href => "assets/machinery.css", :rel => "stylesheet", :type => "text/css"}/
|
12
|
-
%script{:src => "assets/angular.min.js"}
|
13
|
-
%script{:src => "assets/compare/machinery-compare.js"}
|
14
|
-
%script{:src => "assets/jquery-2.1.1.min.js"}
|
15
|
-
%script{:src => "assets/transition.js"}
|
16
|
-
%script{:src => "assets/collapse.js"}
|
8
|
+
%link{:href => "/assets/machinery-base.css", :rel => "stylesheet", :type => "text/css"}/
|
9
|
+
%link{:href => "/assets/machinery.css", :rel => "stylesheet", :type => "text/css"}/
|
10
|
+
%script{:src => "/assets/angular.min.js"}
|
11
|
+
%script{:src => "/assets/compare/machinery-compare.js"}
|
12
|
+
%script{:src => "/assets/jquery-2.1.1.min.js"}
|
13
|
+
%script{:src => "/assets/transition.js"}
|
14
|
+
%script{:src => "/assets/collapse.js"}
|
15
|
+
%script{:src => "/assets/modal.js"}
|
16
|
+
|
17
|
+
%style
|
18
|
+
= Diffy::CSS
|
19
|
+
|
20
|
+
%script#alert{:type => "text/ng-template"}
|
21
|
+
#alert_container.scope{"ng-show" => "diff.meta.uninspected"}
|
22
|
+
.row
|
23
|
+
.col-xs-10.col-xs-offset-1
|
24
|
+
.well
|
25
|
+
%span.text-right.dismiss{:title => "Collapse/Expand"}
|
26
|
+
%p{"ng-show" => "diff.meta.uninspected[diff.meta.description_a].length"}
|
27
|
+
Couldn't compare <strong>'{{diff.meta.uninspected[diff.meta.description_a].join(", ")}}'</strong> because they are not present in description <strong>'{{diff.meta.description_a}}'</strong>
|
28
|
+
%p{"ng-show" => "diff.meta.uninspected[diff.meta.description_b].length"}
|
29
|
+
Couldn't compare <strong>'{{diff.meta.uninspected[diff.meta.description_b].join(", ")}}'</strong> because they are not present in description <strong>'{{diff.meta.description_b}}'</strong>
|
17
30
|
|
18
31
|
%script#scope_os_partial{:type => "text/ng-template"}
|
19
32
|
%table.table.table-striped.table-condensed
|
@@ -33,7 +46,7 @@
|
|
33
46
|
.row
|
34
47
|
.col-xs-1
|
35
48
|
%a{:href => "#os"}
|
36
|
-
%img.scope_logo_big{:src => "assets/logo-os.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Operating System", :"data-content"=>"#{scope_help('os')}"}/
|
49
|
+
%img.scope_logo_big{:src => "/assets/logo-os.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Operating System", :"data-content"=>"#{scope_help('os')}"}/
|
37
50
|
%span.toggle{:title => "Collapse/Expand"}
|
38
51
|
.col-xs-11
|
39
52
|
%h2
|
@@ -87,7 +100,7 @@
|
|
87
100
|
.row
|
88
101
|
.col-xs-1
|
89
102
|
%a{:href => "#packages"}
|
90
|
-
%img.scope_logo_big{:src => "assets/logo-packages.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Packages", :"data-content"=>"#{scope_help('packages')}"}/
|
103
|
+
%img.scope_logo_big{:src => "/assets/logo-packages.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Packages", :"data-content"=>"#{scope_help('packages')}"}/
|
91
104
|
%span.toggle{:title => "Collapse/Expand"}
|
92
105
|
.col-xs-11
|
93
106
|
%h2
|
@@ -102,7 +115,7 @@
|
|
102
115
|
Changed
|
103
116
|
= ": {{diff.packages.changed.length}} packages"
|
104
117
|
%span.summary-part{"ng-show" => "diff.packages.common"}
|
105
|
-
%a{href: "#packages_both"}
|
118
|
+
%a{:class=>"show-common-elements", href: "#packages_both"}
|
106
119
|
both
|
107
120
|
= ": {{diff.packages.common.length}} packages"
|
108
121
|
.row.scope_content.collapse.in
|
@@ -120,7 +133,7 @@
|
|
120
133
|
.col-xs-1
|
121
134
|
.col-xs-11.table_container
|
122
135
|
%changed
|
123
|
-
%changed_packages
|
136
|
+
%changed_packages
|
124
137
|
%a.both_anchor{id: "packages_both"}
|
125
138
|
.row
|
126
139
|
.col-xs-1
|
@@ -154,7 +167,7 @@
|
|
154
167
|
.row
|
155
168
|
.col-xs-1
|
156
169
|
%a{:href => "#patterns"}
|
157
|
-
%img.scope_logo_big{:src => "assets/logo-patterns.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Patterns", :"data-content"=>"#{scope_help('patterns')}"}/
|
170
|
+
%img.scope_logo_big{:src => "/assets/logo-patterns.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Patterns", :"data-content"=>"#{scope_help('patterns')}"}/
|
158
171
|
%span.toggle{:title => "Collapse/Expand"}
|
159
172
|
.col-xs-11
|
160
173
|
%h2
|
@@ -165,7 +178,7 @@
|
|
165
178
|
%span.summary-part{"ng-show" => "diff.patterns.only_in2"}
|
166
179
|
{{diff.meta.description_b}}: {{diff.patterns.only_in2.length}} patterns
|
167
180
|
%span.summary-part{"ng-show" => "diff.patterns.common"}
|
168
|
-
%a{href: "#patterns_both"}
|
181
|
+
%a{:class=>"show-common-elements", href: "#patterns_both"}
|
169
182
|
both
|
170
183
|
= ": {{diff.patterns.common.length}} patterns"
|
171
184
|
.row.scope_content.collapse.in
|
@@ -216,7 +229,7 @@
|
|
216
229
|
.row
|
217
230
|
.col-xs-1
|
218
231
|
%a{:href => "#users"}
|
219
|
-
%img.scope_logo_big{:src => "assets/logo-users.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Users", :"data-content"=>"#{scope_help('users')}"}/
|
232
|
+
%img.scope_logo_big{:src => "/assets/logo-users.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Users", :"data-content"=>"#{scope_help('users')}"}/
|
220
233
|
%span.toggle{:title => "Collapse/Expand"}
|
221
234
|
.col-xs-11
|
222
235
|
%h2
|
@@ -227,7 +240,7 @@
|
|
227
240
|
%span.summary-part{"ng-show" => "diff.users.only_in2"}
|
228
241
|
{{diff.meta.description_b}}: {{diff.users.only_in2.length}} users
|
229
242
|
%span.summary-part{"ng-show" => "diff.users.common"}
|
230
|
-
%a{href: "#users_both"}
|
243
|
+
%a{:class=>"show-common-elements", href: "#users_both"}
|
231
244
|
both
|
232
245
|
= ": {{diff.users.common.length}} users"
|
233
246
|
.row.scope_content.collapse.in
|
@@ -272,7 +285,7 @@
|
|
272
285
|
.row
|
273
286
|
.col-xs-1
|
274
287
|
%a{:href => "#unmanaged_files"}
|
275
|
-
%img.scope_logo_big{:src => "assets/logo-unmanaged-files.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Unmanaged Files", :"data-content"=>"#{scope_help('unmanaged_files')}"}/
|
288
|
+
%img.scope_logo_big{:src => "/assets/logo-unmanaged-files.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Unmanaged Files", :"data-content"=>"#{scope_help('unmanaged_files')}"}/
|
276
289
|
%span.toggle{:title => "Collapse/Expand"}
|
277
290
|
.col-xs-11
|
278
291
|
%h2
|
@@ -283,11 +296,14 @@
|
|
283
296
|
%span.summary-part{"ng-show" => "diff.unmanaged_files.only_in2"}
|
284
297
|
{{diff.meta.description_b}}: {{diff.unmanaged_files.only_in2.files.length || 0}} files
|
285
298
|
%span.summary-part{"ng-show" => "diff.unmanaged_files.common"}
|
286
|
-
%a{href: "#unmanaged_files_both"}
|
299
|
+
%a{:class=>"show-common-elements", href: "#unmanaged_files_both"}
|
287
300
|
both
|
288
301
|
= ": {{diff.unmanaged_files.common.files.length}} files"
|
302
|
+
%span.summary-part{"ng-show" => "diffableUnmanagedFiles.length"}
|
303
|
+
%a#diff-unmanaged-files{"data-toggle" => "modal", "data-target" => "#diff-unmanaged-files"}
|
304
|
+
Diff files
|
289
305
|
.row.scope_content.collapse.in
|
290
|
-
.row
|
306
|
+
.row{"ng-show" => "diff.unmanaged_files.only_in1 || diff.unmanaged_files.only_in2"}
|
291
307
|
.col-xs-1
|
292
308
|
.col-xs-5
|
293
309
|
%only-in-a
|
@@ -330,7 +346,7 @@
|
|
330
346
|
.row
|
331
347
|
.col-xs-1
|
332
348
|
%a{:href => "#groups"}
|
333
|
-
%img.scope_logo_big{:src => "assets/logo-groups.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Groups", :"data-content"=>"#{scope_help('groups')}"}/
|
349
|
+
%img.scope_logo_big{:src => "/assets/logo-groups.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Groups", :"data-content"=>"#{scope_help('groups')}"}/
|
334
350
|
%span.toggle{:title => "Collapse/Expand"}
|
335
351
|
.col-xs-11
|
336
352
|
%h2
|
@@ -341,7 +357,7 @@
|
|
341
357
|
%span.summary-part{"ng-show" => "diff.groups.only_in2"}
|
342
358
|
{{diff.meta.description_b}}: {{diff.groups.only_in2.length}} groups
|
343
359
|
%span.summary-part{"ng-show" => "diff.groups.common"}
|
344
|
-
%a{href: "#groups_both"}
|
360
|
+
%a{:class=>"show-common-elements", href: "#groups_both"}
|
345
361
|
both
|
346
362
|
= ": {{diff.groups.common.length}} groups"
|
347
363
|
.row.scope_content.collapse.in
|
@@ -401,7 +417,7 @@
|
|
401
417
|
.row
|
402
418
|
.col-xs-1
|
403
419
|
%a{:href => "#repositories"}
|
404
|
-
%img.scope_logo_big{:src => "assets/logo-repositories.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Repositories", :"data-content"=>"#{scope_help('repositories')}"}/
|
420
|
+
%img.scope_logo_big{:src => "/assets/logo-repositories.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Repositories", :"data-content"=>"#{scope_help('repositories')}"}/
|
405
421
|
%span.toggle{:title => "Collapse/Expand"}
|
406
422
|
.col-xs-11
|
407
423
|
%h2
|
@@ -412,7 +428,7 @@
|
|
412
428
|
%span.summary-part{"ng-show" => "diff.repositories.only_in2"}
|
413
429
|
{{diff.meta.description_b}}: {{diff.repositories.only_in2.length}} repos
|
414
430
|
%span.summary-part{"ng-show" => "diff.repositories.common"}
|
415
|
-
%a{href: "#repositories_both"}
|
431
|
+
%a{:class=>"show-common-elements", href: "#repositories_both"}
|
416
432
|
both
|
417
433
|
= ": {{diff.repositories.common.length}} repos"
|
418
434
|
.row.scope_content.collapse.in
|
@@ -468,7 +484,7 @@
|
|
468
484
|
.row
|
469
485
|
.col-xs-1
|
470
486
|
%a{:href => "#changed_managed_files"}
|
471
|
-
%img.scope_logo_big{:src => "assets/logo-changed-managed-files.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Changed Managed Files", :"data-content"=>"#{scope_help('changed_managed_files')}"}/
|
487
|
+
%img.scope_logo_big{:src => "/assets/logo-changed-managed-files.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Changed Managed Files", :"data-content"=>"#{scope_help('changed_managed_files')}"}/
|
472
488
|
%span.toggle{:title => "Collapse/Expand"}
|
473
489
|
.col-xs-11
|
474
490
|
%h2
|
@@ -479,7 +495,7 @@
|
|
479
495
|
%span.summary-part{"ng-show" => "diff.changed_managed_files.only_in2"}
|
480
496
|
{{diff.meta.description_b}}: {{diff.changed_managed_files.only_in2.files.length || 0}} files
|
481
497
|
%span.summary-part{"ng-show" => "diff.changed_managed_files.common"}
|
482
|
-
%a{href: "#changed_managed_files_both"}
|
498
|
+
%a{:class=>"show-common-elements", href: "#changed_managed_files_both"}
|
483
499
|
both
|
484
500
|
= ": {{diff.changed_managed_files.common.files.length}} files"
|
485
501
|
.row.scope_content.collapse.in
|
@@ -537,7 +553,7 @@
|
|
537
553
|
.row
|
538
554
|
.col-xs-1
|
539
555
|
%a{:href => "#config_files"}
|
540
|
-
%img.scope_logo_big{:src => "assets/logo-config-files.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Config Files", :"data-content"=>"#{scope_help('config_files')}"}/
|
556
|
+
%img.scope_logo_big{:src => "/assets/logo-config-files.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Config Files", :"data-content"=>"#{scope_help('config_files')}"}/
|
541
557
|
%span.toggle{:title => "Collapse/Expand"}
|
542
558
|
.col-xs-11
|
543
559
|
%h2
|
@@ -548,7 +564,7 @@
|
|
548
564
|
%span.summary-part{"ng-show" => "diff.config_files.only_in2"}
|
549
565
|
{{diff.meta.description_b}}: {{diff.config_files.only_in2.files.length || 0}} files
|
550
566
|
%span.summary-part{"ng-show" => "diff.config_files.common"}
|
551
|
-
%a{href: "#config_files_both"}
|
567
|
+
%a{:class=>"show-common-elements", href: "#config_files_both"}
|
552
568
|
both
|
553
569
|
= ": {{diff.config_files.common.files.length}} files"
|
554
570
|
.row.scope_content.collapse.in
|
@@ -592,7 +608,7 @@
|
|
592
608
|
.row
|
593
609
|
.col-xs-1
|
594
610
|
%a{:href => "#services"}
|
595
|
-
%img.scope_logo_big{:src => "assets/logo-services.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Services", :"data-content"=>"#{scope_help('services')}"}/
|
611
|
+
%img.scope_logo_big{:src => "/assets/logo-services.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Services", :"data-content"=>"#{scope_help('services')}"}/
|
596
612
|
%span.toggle{:title => "Collapse/Expand"}
|
597
613
|
.col-xs-11
|
598
614
|
%h2
|
@@ -603,7 +619,7 @@
|
|
603
619
|
%span.summary-part{"ng-show" => "diff.services.only_in2"}
|
604
620
|
{{diff.meta.description_b}}: {{diff.services.only_in2.services.length || 0}} services ({{diff.services.only_in2.init_system}})
|
605
621
|
%span.summary-part{"ng-show" => "diff.services.common"}
|
606
|
-
%a{href: "#services_both"}
|
622
|
+
%a{:class=>"show-common-elements", href: "#services_both"}
|
607
623
|
both
|
608
624
|
= ": {{diff.services.common.services.length}} services ({{diff.services.common.init_system}})"
|
609
625
|
.row.scope_content.collapse.in
|
@@ -630,12 +646,34 @@
|
|
630
646
|
%in-both
|
631
647
|
%render-template{:template => "scope_services_partial", :object => "diff.services.common"}
|
632
648
|
|
633
|
-
%script{:src => "assets/
|
634
|
-
%script{:src => "assets/
|
635
|
-
%script{:src => "assets/bootstrap-
|
636
|
-
|
649
|
+
%script{:src => "/assets/compare/machinery.js"}
|
650
|
+
%script{:src => "/assets/bootstrap-tooltip.js"}
|
651
|
+
%script{:src => "/assets/bootstrap-popover.js"}
|
652
|
+
|
653
|
+
%body{"ng-controller" => "compareController", "data-description-a" => description_a, "data-description-b" => description_b}
|
654
|
+
#diff-unmanaged-files.modal.fade
|
655
|
+
.modal-dialog.modal-lg
|
656
|
+
.modal-content
|
657
|
+
.modal-header
|
658
|
+
%button.close{"type" => "button", "data-dismiss" => "modal"}
|
659
|
+
×
|
660
|
+
%h4
|
661
|
+
Diff Unmanaged Files
|
662
|
+
.modal-body
|
663
|
+
.row
|
664
|
+
File
|
665
|
+
%select#diff-unmanaged-files-file{"ng-options" => "file for file in diffableUnmanagedFiles track by file",
|
666
|
+
"ng-model" => "selected"}
|
667
|
+
.row#diff-unmanaged-files-content{"style" => "display: none"}
|
668
|
+
Diff ('#{description_a}' -> '#{description_b}')
|
669
|
+
#diff-unmanaged-files-diff
|
670
|
+
#diff-unmanaged-files-error{"style" => "display: none"}
|
671
|
+
#diff-unmanaged-files-spinner{"style" => "display: none"}
|
672
|
+
Generating diff. Please wait...
|
673
|
+
.modal-footer
|
674
|
+
%button.btn.btn-primary{"type" => "button", "data-dismiss" => "modal"}
|
675
|
+
Close
|
637
676
|
|
638
|
-
%body
|
639
677
|
.container-fluid
|
640
678
|
#nav-bar
|
641
679
|
.row
|
@@ -645,26 +683,26 @@
|
|
645
683
|
Comparing '#{description_a}' with '#{description_b}'
|
646
684
|
%span.scope-navigation
|
647
685
|
Scopes:
|
648
|
-
%a{:href => "#os", :title => "Operating System"}
|
649
|
-
%img{:src => "assets/logo-os-small.png"}/
|
650
|
-
%a{:href => "#packages", :title => "Packages"}
|
651
|
-
%img{:src => "assets/logo-packages-small.png"}/
|
652
|
-
%a{:href => "#patterns", :title => "Patterns"}
|
653
|
-
%img{:src => "assets/logo-patterns-small.png"}/
|
654
|
-
%a{:href => "#users", :title => "Users"}
|
655
|
-
%img{:src => "assets/logo-users-small.png"}/
|
656
|
-
%a{:href => "#groups", :title => "Groups"}
|
657
|
-
%img{:src => "assets/logo-groups-small.png"}/
|
658
|
-
%a{:href => "#repositories", :title => "Repositories"}
|
659
|
-
%img{:src => "assets/logo-repositories-small.png"}/
|
660
|
-
%a{:href => "#unmanaged_files", :title => "Unmanaged Files"}
|
661
|
-
%img{:src => "assets/logo-unmanaged-files-small.png"}/
|
662
|
-
%a{:href => "#changed_managed_files", :title => "Changed Managed Files"}
|
663
|
-
%img{:src => "assets/logo-changed-managed-files-small.png"}/
|
664
|
-
%a{:href => "#config_files", :title => "Config Files"}
|
665
|
-
%img{:src => "assets/logo-config-files-small.png"}/
|
666
|
-
%a{:href => "#services", :title => "Services"}
|
667
|
-
%img{:src => "assets/logo-services-small.png"}/
|
686
|
+
%a{:href => "#os", :title => "Operating System", "ng-show" => "diff.os"}
|
687
|
+
%img{:src => "/assets/logo-os-small.png"}/
|
688
|
+
%a{:href => "#packages", :title => "Packages", "ng-show" => "diff.packages"}
|
689
|
+
%img{:src => "/assets/logo-packages-small.png"}/
|
690
|
+
%a{:href => "#patterns", :title => "Patterns", "ng-show" => "diff.patterns"}
|
691
|
+
%img{:src => "/assets/logo-patterns-small.png"}/
|
692
|
+
%a{:href => "#users", :title => "Users", "ng-show" => "diff.users"}
|
693
|
+
%img{:src => "/assets/logo-users-small.png"}/
|
694
|
+
%a{:href => "#groups", :title => "Groups", "ng-show" => "diff.groups"}
|
695
|
+
%img{:src => "/assets/logo-groups-small.png"}/
|
696
|
+
%a{:href => "#repositories", :title => "Repositories", "ng-show" => "diff.repositories"}
|
697
|
+
%img{:src => "/assets/logo-repositories-small.png"}/
|
698
|
+
%a{:href => "#unmanaged_files", :title => "Unmanaged Files", "ng-show" => "diff.unmanaged_files"}
|
699
|
+
%img{:src => "/assets/logo-unmanaged-files-small.png"}/
|
700
|
+
%a{:href => "#changed_managed_files", :title => "Changed Managed Files", "ng-show" => "diff.changed_managed_files"}
|
701
|
+
%img{:src => "/assets/logo-changed-managed-files-small.png"}/
|
702
|
+
%a{:href => "#config_files", :title => "Config Files", "ng-show" => "diff.config_files"}
|
703
|
+
%img{:src => "/assets/logo-config-files-small.png"}/
|
704
|
+
%a{:href => "#services", :title => "Services", "ng-show" => "diff.services"}
|
705
|
+
%img{:src => "/assets/logo-services-small.png"}/
|
668
706
|
.row
|
669
707
|
.col-xs-1
|
670
708
|
%a#expand-all{:href => "#", :style => "display: none"}
|
@@ -678,14 +716,20 @@
|
|
678
716
|
%a{:href => "http://machinery-project.org", :target => "_blank"}
|
679
717
|
Machinery
|
680
718
|
|
681
|
-
#content_container
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
%div{"
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
719
|
+
#content_container
|
720
|
+
.row{"ng-hide" => "diff"}
|
721
|
+
.col-xs-11.col-xs-offset-1
|
722
|
+
%p
|
723
|
+
Loading comparison results. Please wait...
|
724
|
+
%div{"ng-show" => "diff"}
|
725
|
+
%div{"src" => "'alert'", "ng-include" => true}
|
726
|
+
%div{"src" => "'scope_os'", "ng-include" => true, "ng-show" => "diff.os"}
|
727
|
+
%div{"src" => "'scope_packages'", "ng-include" => true, "ng-show" => "diff.packages"}
|
728
|
+
%div{"src" => "'scope_patterns'", "ng-include" => true, "ng-show" => "diff.patterns"}
|
729
|
+
%div{"src" => "'scope_users'", "ng-include" => true, "ng-show" => "diff.users"}
|
730
|
+
%div{"src" => "'scope_groups'", "ng-include" => true, "ng-show" => "diff.groups"}
|
731
|
+
%div{"src" => "'scope_repositories'", "ng-include" => true, "ng-show" => "diff.repositories"}
|
732
|
+
%div{"src" => "'scope_unmanaged_files'", "ng-include" => true, "ng-show" => "diff.unmanaged_files"}
|
733
|
+
%div{"src" => "'scope_changed_managed_files'", "ng-include" => true, "ng-show" => "diff.changed_managed_files"}
|
734
|
+
%div{"src" => "'scope_config_files'", "ng-include" => true, "ng-show" => "diff.config_files"}
|
735
|
+
%div{"src" => "'scope_services'", "ng-include" => true, "ng-show" => "diff.services"}
|
data/lib/cli.rb
CHANGED
@@ -26,9 +26,6 @@ class Cli
|
|
26
26
|
switch :version, negatable: false, desc: "Show version"
|
27
27
|
switch :debug, negatable: false, desc: "Enable debug mode"
|
28
28
|
switch [:help, :h], negatable: false, desc: "Show help"
|
29
|
-
if @config.experimental_features
|
30
|
-
flag :exclude, negatable: false, desc: "Exclude elements matching the filter criteria"
|
31
|
-
end
|
32
29
|
|
33
30
|
sort_help :manually
|
34
31
|
pre do |global_options,command,options,args|
|
@@ -88,7 +85,7 @@ class Cli
|
|
88
85
|
case e
|
89
86
|
when GLI::MissingRequiredArgumentsException
|
90
87
|
Machinery::Ui.error("Option --" + e.message)
|
91
|
-
exit 1
|
88
|
+
exit 1
|
92
89
|
when GLI::UnknownCommandArgument, GLI::UnknownGlobalArgument,
|
93
90
|
GLI::UnknownCommand, GLI::BadCommandLine, OptionParser::MissingArgument
|
94
91
|
Machinery::Ui.error e.to_s + "\n\n"
|
@@ -228,6 +225,12 @@ class Cli
|
|
228
225
|
Inspector.sort_scopes(scopes.uniq)
|
229
226
|
end
|
230
227
|
|
228
|
+
def self.supports_filtering(command)
|
229
|
+
if @config.experimental_features
|
230
|
+
command.flag :exclude, negatable: false, desc: "Exclude elements matching the filter criteria"
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
231
234
|
AVAILABLE_SCOPE_LIST = Machinery::Ui.internal_scope_list_to_string(
|
232
235
|
Inspector.all_scopes
|
233
236
|
)
|
@@ -317,6 +320,10 @@ class Cli
|
|
317
320
|
c.switch "show-all", required: false, negatable: false,
|
318
321
|
desc: "Show also common properties"
|
319
322
|
if @config.experimental_features
|
323
|
+
c.flag [:port, :p], type: Integer, required: false, default_value: @config.http_server_port,
|
324
|
+
desc: "Listen on port PORT", arg_name: "PORT"
|
325
|
+
c.flag [:ip, :i], type: String, required: false, default_value: "127.0.0.1",
|
326
|
+
desc: "Listen on ip address IP", arg_name: "IP"
|
320
327
|
c.switch "html", required: false, negatable: false,
|
321
328
|
desc: "Open comparison in HTML format in your web browser."
|
322
329
|
end
|
@@ -336,7 +343,9 @@ class Cli
|
|
336
343
|
task = CompareTask.new
|
337
344
|
opts = {
|
338
345
|
show_html: options["html"],
|
339
|
-
show_all: options["show-all"]
|
346
|
+
show_all: options["show-all"],
|
347
|
+
ip: options["ip"],
|
348
|
+
port: options["port"]
|
340
349
|
}
|
341
350
|
task.compare(description1, description2, scope_list, opts)
|
342
351
|
end
|
@@ -461,6 +470,7 @@ class Cli
|
|
461
470
|
LONGDESC
|
462
471
|
arg "HOSTNAME"
|
463
472
|
command :inspect do |c|
|
473
|
+
supports_filtering(c)
|
464
474
|
c.flag [:name, :n], type: String, required: false, arg_name: "NAME",
|
465
475
|
desc: "Store system description under the specified name"
|
466
476
|
c.flag [:scope, :s], type: String, required: false,
|
@@ -516,7 +526,7 @@ class Cli
|
|
516
526
|
end
|
517
527
|
inspect_options[:remote_user] = options["remote-user"]
|
518
528
|
|
519
|
-
filter = FilterOptionParser.parse("inspect", options
|
529
|
+
filter = FilterOptionParser.parse("inspect", options)
|
520
530
|
|
521
531
|
if options["verbose"] && !filter.empty?
|
522
532
|
Machinery::Ui.puts "\nThe following filters are applied during inspection:"
|
@@ -611,6 +621,7 @@ class Cli
|
|
611
621
|
LONGDESC
|
612
622
|
arg "NAME"
|
613
623
|
command :show do |c|
|
624
|
+
supports_filtering(c)
|
614
625
|
c.flag [:scope, :s], type: String, required: false,
|
615
626
|
desc: "Show specified scopes", arg_name: "SCOPE_LIST"
|
616
627
|
c.flag ["exclude-scope", :e], type: String, required: false,
|
@@ -638,7 +649,7 @@ class Cli
|
|
638
649
|
description = SystemDescription.load(name, system_description_store)
|
639
650
|
scope_list = process_scope_option(options[:scope], options["exclude-scope"])
|
640
651
|
|
641
|
-
filter = FilterOptionParser.parse("show", options
|
652
|
+
filter = FilterOptionParser.parse("show", options)
|
642
653
|
|
643
654
|
inspected_filters = description.filter_definitions("inspect")
|
644
655
|
|
data/lib/compare_task.rb
CHANGED
@@ -27,26 +27,25 @@ class CompareTask
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def render_html_comparison(description1, description2, scopes, options)
|
30
|
-
|
31
|
-
meta: {
|
32
|
-
description_a: description1.name,
|
33
|
-
description_b: description2.name,
|
34
|
-
}
|
35
|
-
}
|
30
|
+
LocalSystem.validate_existence_of_package("xdg-utils")
|
36
31
|
|
37
|
-
|
38
|
-
|
39
|
-
comparison = Comparison.compare_scope(description1, description2, scope)
|
40
|
-
diff[scope] = comparison.as_json
|
41
|
-
end
|
42
|
-
end
|
32
|
+
url = "http://#{options[:ip]}:#{options[:port]}/compare/" \
|
33
|
+
"#{CGI.escape(description1.name)}/#{CGI.escape(description2.name)}"
|
43
34
|
|
44
|
-
|
45
|
-
|
46
|
-
|
35
|
+
Machinery::Ui.use_pager = false
|
36
|
+
Machinery::Ui.puts <<EOF
|
37
|
+
There is a web server running, serving the comparison result on #{url}.
|
38
|
+
|
39
|
+
The server can be closed with Ctrl+C.
|
40
|
+
EOF
|
41
|
+
|
42
|
+
server = Html.run_server(description1.store, port: options[:port], ip: options[:ip])
|
43
|
+
|
44
|
+
Html.when_server_ready(options[:ip], options[:port]) do
|
45
|
+
LoggedCheetah.run("xdg-open", url)
|
46
|
+
end
|
47
47
|
|
48
|
-
|
49
|
-
LoggedCheetah.run("xdg-open", File.join(target, "index.html"))
|
48
|
+
server.join # Wait until the user cancelled the blocking webserver
|
50
49
|
end
|
51
50
|
|
52
51
|
def render_comparison(description1, description2, scopes, options = {})
|
data/lib/exceptions.rb
CHANGED
@@ -126,6 +126,7 @@ module Machinery
|
|
126
126
|
class ExportFailed < MachineryError; end
|
127
127
|
class AnalysisFailed < MachineryError; end
|
128
128
|
class UpgradeFailed < MachineryError; end
|
129
|
+
class BinaryDiffError < MachineryError; end
|
129
130
|
|
130
131
|
class SshConnectionFailed < MachineryError; end
|
131
132
|
class RsyncFailed < MachineryError; end
|
data/lib/file_diff.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# Copyright (c) 2013-2015 SUSE LLC
|
2
|
+
#
|
3
|
+
# This program is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of version 3 of the GNU General Public License as
|
5
|
+
# published by the Free Software Foundation.
|
6
|
+
#
|
7
|
+
# This program is distributed in the hope that it will be useful,
|
8
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
9
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
10
|
+
# GNU General Public License for more details.
|
11
|
+
#
|
12
|
+
# You should have received a copy of the GNU General Public License
|
13
|
+
# along with this program; if not, contact SUSE LLC.
|
14
|
+
#
|
15
|
+
# To contact SUSE about this file by physical or electronic mail,
|
16
|
+
# you may find current contact information at www.suse.com
|
17
|
+
|
18
|
+
class FileDiff
|
19
|
+
def self.diff(description1, description2, scope, path)
|
20
|
+
return nil if !description1.scope_extracted?(scope) || !description2.scope_extracted?(scope)
|
21
|
+
|
22
|
+
file1 = description1[scope].files.find { |f| f.name == path }
|
23
|
+
file2 = description2[scope].files.find { |f| f.name == path }
|
24
|
+
return nil if !file1 || !file2
|
25
|
+
|
26
|
+
if file1.binary? || file2.binary?
|
27
|
+
raise Machinery::Errors::BinaryDiffError, "Can't diff binary files"
|
28
|
+
end
|
29
|
+
|
30
|
+
Diffy::Diff.new(file1.content, file2.content, include_plus_and_minus_in_html: true)
|
31
|
+
end
|
32
|
+
end
|
data/lib/filter_option_parser.rb
CHANGED
@@ -19,11 +19,11 @@
|
|
19
19
|
# actual Filter objects.
|
20
20
|
class FilterOptionParser
|
21
21
|
class <<self
|
22
|
-
def parse(command, options
|
22
|
+
def parse(command, options)
|
23
23
|
filter = Filter.from_default_definition(command)
|
24
24
|
|
25
25
|
definitions = skip_files_definitions(options.delete("skip-files"))
|
26
|
-
definitions += exclude_definitions(
|
26
|
+
definitions += exclude_definitions(options["exclude"])
|
27
27
|
|
28
28
|
definitions.map! { |definition| definition.gsub("\\@", "@") } # Unescape escaped @s
|
29
29
|
definitions.each do |definition|
|
data/lib/html.rb
CHANGED
@@ -137,6 +137,58 @@ class Html
|
|
137
137
|
content
|
138
138
|
end
|
139
139
|
|
140
|
+
get "/compare/:a/:b.json" do
|
141
|
+
description_a = SystemDescription.load(params[:a], system_description_store)
|
142
|
+
description_b = SystemDescription.load(params[:b], system_description_store)
|
143
|
+
|
144
|
+
diff = {
|
145
|
+
meta: {
|
146
|
+
description_a: description_a.name,
|
147
|
+
description_b: description_b.name,
|
148
|
+
}
|
149
|
+
}
|
150
|
+
|
151
|
+
Inspector.all_scopes.each do |scope|
|
152
|
+
if description_a[scope] && description_b[scope]
|
153
|
+
comparison = Comparison.compare_scope(description_a, description_b, scope)
|
154
|
+
diff[scope] = comparison.as_json
|
155
|
+
else
|
156
|
+
diff[:meta][:uninspected] ||= Hash.new
|
157
|
+
|
158
|
+
if !description_a[scope] && description_b[scope]
|
159
|
+
diff[:meta][:uninspected][description_a.name] ||= Array.new
|
160
|
+
diff[:meta][:uninspected][description_a.name] << scope
|
161
|
+
end
|
162
|
+
if !description_b[scope] && description_a[scope]
|
163
|
+
diff[:meta][:uninspected][description_b.name] ||= Array.new
|
164
|
+
diff[:meta][:uninspected][description_b.name] << scope
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
diff.to_json
|
170
|
+
end
|
171
|
+
|
172
|
+
get "/compare/:a/:b" do
|
173
|
+
haml File.read(File.join(Machinery::ROOT, "html/comparison.html.haml")),
|
174
|
+
locals: { description_a: params[:a], description_b: params[:b] }
|
175
|
+
end
|
176
|
+
|
177
|
+
get "/compare/:a/:b/files/:scope/*" do
|
178
|
+
description1 = SystemDescription.load(params[:a], system_description_store)
|
179
|
+
description2 = SystemDescription.load(params[:b], system_description_store)
|
180
|
+
filename = File.join("/", params["splat"].first)
|
181
|
+
|
182
|
+
begin
|
183
|
+
diff = FileDiff.diff(description1, description2, params[:scope], filename)
|
184
|
+
rescue Machinery::Errors::BinaryDiffError
|
185
|
+
status 406
|
186
|
+
return "binary file"
|
187
|
+
end
|
188
|
+
|
189
|
+
diff.to_s(:html)
|
190
|
+
end
|
191
|
+
|
140
192
|
get "/:id" do
|
141
193
|
haml File.read(File.join(Machinery::ROOT, "html/index.html.haml")),
|
142
194
|
locals: { description_name: params[:id] }
|
data/lib/machinery.rb
CHANGED
@@ -34,6 +34,7 @@ require "find"
|
|
34
34
|
require "pathname"
|
35
35
|
require "nokogiri"
|
36
36
|
require "socket"
|
37
|
+
require "diffy"
|
37
38
|
|
38
39
|
require_relative "machinery_logger"
|
39
40
|
require_relative "zypper"
|
@@ -97,6 +98,7 @@ require_relative "scope_file_access_archive"
|
|
97
98
|
require_relative "man_task"
|
98
99
|
require_relative "comparison"
|
99
100
|
require_relative "serve_html_task"
|
101
|
+
require_relative "file_diff"
|
100
102
|
|
101
103
|
Dir[File.join(Machinery::ROOT, "plugins", "**", "*.rb")].each { |f| require(f) }
|
102
104
|
|
data/lib/remote_system.rb
CHANGED
@@ -83,10 +83,10 @@ class RemoteSystem < System
|
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
|
-
# Tries to
|
86
|
+
# Tries to run the noop-command(:) on the remote system as root (without a password or passphrase)
|
87
87
|
# and raises an Machinery::Errors::SshConnectionFailed exception when it's not successful.
|
88
88
|
def connect
|
89
|
-
LoggedCheetah.run "ssh", "-q", "-o", "BatchMode=yes", "#{remote_user}@#{host}"
|
89
|
+
LoggedCheetah.run "ssh", "-q", "-o", "BatchMode=yes", "#{remote_user}@#{host}", ":"
|
90
90
|
rescue Cheetah::ExecutionFailed
|
91
91
|
raise Machinery::Errors::SshConnectionFailed.new(
|
92
92
|
"Could not establish SSH connection to host '#{host}'. Please make sure that " \
|
data/lib/version.rb
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: machinery-tool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SUSE
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cheetah
|
@@ -164,6 +164,20 @@ dependencies:
|
|
164
164
|
- - "~>"
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: 0.3.0
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: diffy
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 3.0.7
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 3.0.7
|
167
181
|
- !ruby/object:Gem::Dependency
|
168
182
|
name: ronn
|
169
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -239,6 +253,7 @@ files:
|
|
239
253
|
- html/assets/collapse.js
|
240
254
|
- html/assets/compare/machinery-compare.js
|
241
255
|
- html/assets/compare/machinery.js
|
256
|
+
- html/assets/cross.png
|
242
257
|
- html/assets/jquery-2.1.1.min.js
|
243
258
|
- html/assets/logo-changed-managed-files-small.png
|
244
259
|
- html/assets/logo-changed-managed-files.png
|
@@ -289,6 +304,7 @@ files:
|
|
289
304
|
- lib/exceptions.rb
|
290
305
|
- lib/export_task.rb
|
291
306
|
- lib/exporter.rb
|
307
|
+
- lib/file_diff.rb
|
292
308
|
- lib/file_scope.rb
|
293
309
|
- lib/file_validator.rb
|
294
310
|
- lib/filter.rb
|