Semistructured Merge in JavaScript Systems - Online Appendix

Abstract

Industry widely uses unstructured merge tools that rely on textual analysis to detect and resolve conflicts between code contributions. Semistructured merge tools go further by partially exploring the syntactic structure of code artifacts, and, as a consequence, obtaining significant merge accuracy gains for Java-like languages. To understand whether semistructured merge and the observed gains generalize to other kinds of languages, we implement two semistructured merge tools for JavaScript, and compare them to an unstructured tool. We find that current semistructured merge algorithms and frameworks are not directly applicable for scripting languages like Javascript. By adapting the algorithms, and studying 10,345 merge scenarios from 50 JavaScript projects in GitHub, we find evidence that our JavaScript tools report fewer spurious conflicts than unstructured merge, without compromising the correctness of the merging process. The gains, however, are much smaller than the ones observed for Java-like languages, suggesting that semistructured merge advantages might be limited for languages that support both statements and commutative declarations at the same syntactic level.

Keywords: Collaborative development, Software merging, Semistructured merge, Version control systems, JavaScript.

Empirical Evaluation

Tools

As semistructured merge tools, we evaluated two versions of jsFSTMerge developed in this work. Online links to source code, available on GitHub, of both unstructured and semistructured tools are provided below:

Subject Systems

Name URL LOC Collaborators Commits Merge Commits Analyzed Merge Scenarios
Ace https://github.com/ajaxorg/ace 212,097 341 7,439 199 195
AngularJS https://github.com/angular/angular.js 116,483 1,599 8,951 34 34
Async https://github.com/caolan/async 12,878 216 1,707 372 372
BitcoinJS https://github.com/bitcoinjs/bitcoinjs-lib 6,812 60 2,403 375 375
Bluebird https://github.com/petkaantonov/bluebird 39,097 201 2,055 216 216
Bower https://github.com/bower/bower 9,951 210 2,712 427 427
Bowser https://github.com/lancedikson/bowser 1,853 65 625 129 129
Brackets https://github.com/adobe/brackets 382,360 356 17,702 88 88
Chance https://github.com/chancejs/chancejs 3,800 100 841 195 194
d3 https://github.com/d3/d3 40,633 123 4,157 198 159
director https://github.com/flatiron/director 5,027 53 747 77 77
Dox https://github.com/tj/dox 2,418 34 469 55 55
faker.js https://github.com/Marak/faker.js 989,523 149 984 179 178
fetch https://github.com/github/fetch 1,706 51 587 117 117
Flux https://github.com/facebook/flux 2,314 111 388 114 114
GitBook https://github.com/GitbookIO/gitbook 4,246 85 2,377 207 205
i18next https://github.com/i18next/i18next 1,995 115 1,284 247 229
impress.js https://github.com/impress/impress.js 1,144 59 362 59 59
Intro.js https://github.com/usablica/intro.js 817 74 629 169 169
Istanbul https://github.com/gotwarlost/istanbul 4,953 78 572 126 126
Jasmine https://github.com/jasmine/jasmine 24,743 181 1,915 285 285
jQuery https://github.com/jquery/jquery 38,069 273 6,362 248 245
jquery-pjax https://github.com/defunkt/jquery-pjax 13,483 62 508 98 98
JSHint https://github.com/jshint/jshint 46,360 235 2,081 337 337
Konva https://github.com/konvajs/konva 43,073 107 2,459 262 257
Less.js https://github.com/less/less.js 126,312 217 2,871 458 443
Mocha https://github.com/mochajs/mocha 15,727 397 3,072 187 186
Mousetrap https://github.com/ccampbell/mousetrap 16,137 22 370 36 36
mustache.js https://github.com/janl/mustache.js 1,295 90 731 134 134
Nightmare https://github.com/segmentio/nightmare 3,719 111 987 267 267
node_redis https://github.com/NodeRedis/node_redis 5,551 131 1,251 200 187
node-restify https://github.com/restify/node-restify 2,999 186 1,610 305 294
numbers.js https://github.com/numbers/numbers.js 3,241 26 392 92 92
page.js https://github.com/visionmedia/page.js 2,305 82 628 142 128
Paper.js https://github.com/paperjs/paper.js 13,658 64 7,177 412 411
Phaser https://github.com/photonstorm/phaser 396,498 400 12,123 199 198
PM2 https://github.com/Unitech/pm2 21,977 205 4,483 197 193
Pug https://github.com/pugjs/pug 13,358 208 2,526 459 451
Q https://github.com/kriskowal/q 8,333 70 894 152 148
Request https://github.com/request/request 2,791 284 2,263 200 185
RequireJS https://github.com/requirejs/requirejs 25,068 101 1,405 157 157
reveal.js https://github.com/hakimel/reveal.js 9,004 227 2,202 389 389
socket.io https://github.com/socketio/socket.io 1,806 155 1,714 309 290
StatsD https://github.com/etsy/statsd 2,936 170 934 287 287
Stylus https://github.com/stylus/stylus 3,501 156 3,908 189 188
three.js https://github.com/mrdoob/three.js 190,818 1,031 26,208 93 92
Underscore.js https://github.com/jashkenas/underscore 9,126 258 2,439 238 238
WebTorrent https://github.com/webtorrent/webtorrent 4,493 116 2,392 306 306
whistle https://github.com/avwo/whistle 3,022 9 7,498 63 63
Zepto.js https://github.com/madrobby/zepto 1,594 183 1,516 242 242
Total 2,891,104 9,837 161,910 10,526 10,345
Mean 57,822 197 3,238 211 207
Standard Deviation 158,984 256 4,665 112 111

Detailed Results of Integration Effort and Correctness Study

False positives added by unstructured merge with respect to merge scenarios

Project Merge Scenarios Merge Scenarios with Ordering Conflicts (%)
Ace 195 1 0.51
AngularJS 34 0 0
Async 372 2 0.54
BitcoinJS 375 0 0
Bluebird 216 0 0
Bower 427 0 0
Bowser 129 0 0
Brackets 88 0 0
Chance 194 0 0
d3 159 0 0
director 77 0 0
Dox 55 0 0
faker.js 178 5 2.81
fetch 117 0 0
Flux 114 0 0
GitBook 205 0 0
i18next 229 1 0.44
impress.js 59 1 1.69
Intro.js 169 0 0
Istanbul 126 0 0
Jasmine 285 0 0
jQuery 245 1 0.41
jquery-pjax 98 0 0
JSHint 337 0 0
Konva 257 0 0
Less.js 443 3 0.68
Mocha 186 0 0
Mousetrap 36 0 0
mustache.js 134 0 0
Nightmare 267 0 0
node_redis 187 1 0.53
node-restify 294 1 0.34
numbers.js 92 0 0
page.js 128 0 0
Paper.js 411 1 0.24
Phaser 198 0 0
PM2 193 0 0
Pug 451 0 0
Q 148 0 0
Request 185 0 0
RequireJS 157 2 1.27
reveal.js 389 6 1.54
socket.io 290 0 0
StatsD 287 4 1.39
Stylus 188 1 0.53
three.js 92 0 0
Underscore.js 238 0 0
WebTorrent 306 0 0
whistle 63 0 0
Zepto.js 242 0 0
Total 10,345 30 0.29
Mean 0.26
Standard Deviation 0.56

False positives added by unstructured merge with respect to conflicts

Project Conflicts Ordering Conflicts (%)
Ace 16 3 18.75
AngularJS 17 1 5.88
Async 26 2 7.69
BitcoinJS 7 0 0
Bluebird 8 0 0
Bower 22 0 0
Bowser 22 0 0
Brackets 11 0 0
Chance 25 5 20
d3 81 0 0
director 14 0 0
Dox 6 0 0
faker.js 54 9 16.67
fetch 6 0 0
Flux 8 0 0
GitBook 5 0 0
i18next 28 1 3.57
impress.js 1 1 100
Intro.js 23 0 0
Istanbul 2 0 0
Jasmine 58 0 0
jQuery 31 0 0
jquery-pjax 6 0 0
JSHint 37 6 16.22
Konva 58 4 6.90
Less.js 62 4 6.45
Mocha 2 0 0
Mousetrap 1 0 0
mustache.js 8 0 0
Nightmare 21 1 4.76
node_redis 2 1 50
node-restify 7 1 14.29
numbers.js 19 1 5.26
page.js 12 1 8.33
Paper.js 55 1 1.82
Phaser 4 0 0
PM2 2 0 0
Pug 4 0 0
Q 23 0 0
Request 2 0 0
RequireJS 8 2 25.00
reveal.js 39 9 23.08
socket.io 9 0 0
StatsD 19 4 21.05
Stylus 5 1 20
three.js 8 0 0
Underscore.js 5 0 0
WebTorrent 4 0 0
whistle 7 0 0
Zepto.js 18 0 0
Total 918 58 6.32
Mean 7.51
Standard Deviation 16.59

False positives added by jsFSTMerge v1 with respect to merge scenarios

Project Merge Scenarios Merge Scenarios with Function Renaming Conflicts Merge Scenarios with Function Conversion Conflicts Merge Scenarios with Function Declaration Displacement Conflicts Merge Scenarios with No Longer Existing One-to-one Mapping Conflicts (%)
Ace 195 0 0 0 0 0
AngularJS 34 0 0 0 0 0
Async 372 0 0 0 0 0
BitcoinJS 375 0 1 0 0 0.27
Bluebird 216 0 0 0 0 0
Bower 427 0 0 0 0 0
Bowser 129 0 0 0 0 0
Brackets 88 0 0 0 0 0
Chance 194 0 0 0 0 0
d3 159 0 0 0 0 0
director 77 0 0 0 2 2.60
Dox 55 0 0 0 0 0
faker.js 178 0 0 0 0 0
fetch 117 0 0 0 0 0
Flux 114 0 0 0 0 0
GitBook 205 0 0 0 1 0.49
i18next 229 0 0 0 0 0
impress.js 59 0 0 0 0 0
Intro.js 169 0 0 0 0 0
Istanbul 126 0 0 0 0 0
Jasmine 285 0 0 0 0 0
jQuery 245 0 0 1 2 1.22
jquery-pjax 98 0 0 0 0 0
JSHint 337 0 0 0 1 0.30
Konva 257 0 0 0 0 0
Less.js 443 1 0 0 2 0.68
Mocha 186 0 0 0 0 0
Mousetrap 36 0 0 0 0 0
mustache.js 134 0 0 0 0 0
Nightmare 267 0 0 0 1 0.37
node_redis 187 0 0 0 4 2.14
node-restify 294 1 0 0 0 0.34
numbers.js 92 0 0 0 0 0
page.js 128 0 0 2 1 2.34
Paper.js 411 0 0 0 0 0
Phaser 198 0 0 0 0 0
PM2 193 0 0 0 1 0.52
Pug 451 0 0 0 0 0
Q 148 0 0 0 0 0
Request 185 0 1 0 0 0.54
RequireJS 157 0 0 0 0 0
reveal.js 389 0 0 0 0 0
socket.io 290 0 0 0 0 0
StatsD 287 0 0 0 0 0
Stylus 188 0 0 0 0 0
three.js 92 0 0 0 0 0
Underscore.js 238 0 0 0 0 0
WebTorrent 306 0 0 0 1 0.33
whistle 63 0 0 0 0 0
Zepto.js 242 0 0 0 0 0
Total 10,345 2 2 3 16 0.22
Mean 0.24
Standard Deviation 0.59

False positives added by jsFSTMerge v1 with respect to conflicts

Project Conflicts Function Renaming Conflicts Function Conversion Conflicts Function Declaration Displacement Conflicts No Longer Existing One-to-one Mapping Conflicts (%)
Ace 13 0 0 0 0 0
AngularJS 16 0 0 0 0 0
Async 24 0 0 0 0 0
BitcoinJS 8 0 1 0 0 12.50
Bluebird 8 0 0 0 0 0
Bower 22 0 0 0 0 0
Bowser 22 0 0 0 0 0
Brackets 11 0 0 0 0 0
Chance 20 0 0 0 0 0
d3 81 0 0 0 0 0
director 16 0 0 0 2 12.50
Dox 6 0 0 0 0 0
faker.js 45 0 0 0 0 0
fetch 6 0 0 0 0 0
Flux 8 0 0 0 0 0
GitBook 6 0 0 0 1 16.67
i18next 27 0 0 0 0 0
impress.js 0 0 0 0 0 0
Intro.js 23 0 0 0 0 0
Istanbul 2 0 0 0 0 0
Jasmine 58 0 0 0 0 0
jQuery 33 0 0 1 2 9.09
jquery-pjax 6 0 0 0 0 0
JSHint 32 0 0 0 1 3.13
Konva 54 0 0 0 0 0
Less.js 61 1 0 0 2 4.92
Mocha 2 0 0 0 0 0
Mousetrap 1 0 0 0 0 0
mustache.js 8 0 0 0 0 0
Nightmare 22 0 0 0 2 9.09
node_redis 6 0 0 0 5 83.33
node-restify 7 1 0 0 0 14.29
numbers.js 18 0 0 0 0 0
page.js 14 0 0 2 1 21.43
Paper.js 54 0 0 0 0 0
Phaser 4 0 0 0 0 0
PM2 3 0 0 0 1 33.33
Pug 4 0 0 0 0 0
Q 23 0 0 0 0 0
Request 3 0 1 0 0 33.33
RequireJS 6 0 0 0 0 0
reveal.js 30 0 0 0 0 0
socket.io 9 0 0 0 0 0
StatsD 15 0 0 0 0 0
Stylus 4 0 0 0 0 0
three.js 8 0 0 0 0 0
Underscore.js 5 0 0 0 0 0
WebTorrent 5 0 0 0 1 20
whistle 7 0 0 0 0 0
Zepto.js 18 0 0 0 0 0
Total 884 2 2 3 18 2.83
Mean 5.47
Standard Deviation 13.94

False positives added by jsFSTMerge v2 with respect to merge scenarios

Project Merge Scenarios Merge Scenarios with Function Renaming Conflicts Merge Scenarios with Function Conversion Conflicts Merge Scenarios with Function Declaration Displacement Conflicts Merge Scenarios with No Longer Existing One-to-one Mapping Conflicts (%)
Ace 195 0 0 0 0 0
AngularJS 34 0 0 0 0 0
Async 372 0 0 0 0 0
BitcoinJS 375 0 1 0 0 0.27
Bluebird 216 0 0 0 0 0
Bower 427 0 0 0 0 0
Bowser 129 0 0 0 0 0
Brackets 88 0 0 0 0 0
Chance 194 0 0 0 0 0
d3 159 0 0 0 0 0
director 77 0 0 0 0 0
Dox 55 0 0 0 0 0
faker.js 178 0 0 0 0 0
fetch 117 0 0 0 0 0
Flux 114 0 0 0 0 0
GitBook 205 0 0 0 0 0
i18next 229 0 0 0 0 0
impress.js 59 0 0 0 0 0
Intro.js 169 0 0 0 0 0
Istanbul 126 0 0 0 0 0
Jasmine 285 0 0 0 0 0
jQuery 245 0 0 1 0 0.41
jquery-pjax 98 0 0 0 0 0
JSHint 337 0 0 0 0 0
Konva 257 0 0 0 0 0
Less.js 443 1 0 0 0 0.23
Mocha 186 0 0 0 0 0
Mousetrap 36 0 0 0 0 0
mustache.js 134 0 0 0 0 0
Nightmare 267 0 0 0 0 0
node_redis 187 0 0 0 0 0
node-restify 294 1 0 0 0 0.34
numbers.js 92 0 0 0 0 0
page.js 128 0 0 2 0 1.56
Paper.js 411 0 0 0 0 0
Phaser 198 0 0 0 0 0
PM2 193 0 0 0 0 0
Pug 451 0 0 0 0 0
Q 148 0 0 0 0 0
Request 185 0 1 0 0 0.54
RequireJS 157 0 0 0 0 0
reveal.js 389 0 0 0 0 0
socket.io 290 0 0 0 0 0
StatsD 287 0 0 0 0 0
Stylus 188 0 0 0 0 0
three.js 92 0 0 0 0 0
Underscore.js 238 0 0 0 0 0
WebTorrent 306 0 0 0 0 0
whistle 63 0 0 0 0 0
Zepto.js 242 0 0 0 0 0
Total 10,345 2 2 3 0 0.07
Mean 0.07
Standard Deviation 0.24

False positives added by jsFSTMerge v2 with respect to conflicts

Project Conflicts Function Renaming Conflicts Function Conversion Conflicts Function Declaration Displacement Conflicts No Longer Existing One-to-one Mapping Conflicts (%)
Ace 13 0 0 0 0 0
AngularJS 16 0 0 0 0 0
Async 24 0 0 0 0 0
BitcoinJS 8 0 1 0 0 12.50
Bluebird 8 0 0 0 0 0
Bower 22 0 0 0 0 0
Bowser 22 0 0 0 0 0
Brackets 11 0 0 0 0 0
Chance 20 0 0 0 0 0
d3 81 0 0 0 0 0
director 14 0 0 0 0 0
Dox 6 0 0 0 0 0
faker.js 45 0 0 0 0 0
fetch 6 0 0 0 0 0
Flux 8 0 0 0 0 0
GitBook 5 0 0 0 0 0
i18next 27 0 0 0 0 0
impress.js 0 0 0 0 0 0
Intro.js 23 0 0 0 0 0
Istanbul 2 0 0 0 0 0
Jasmine 58 0 0 0 0 0
jQuery 31 0 0 1 0 3.23
jquery-pjax 6 0 0 0 0 0
JSHint 31 0 0 0 0 0
Konva 54 0 0 0 0 0
Less.js 59 1 0 0 0 1.69
Mocha 2 0 0 0 0 0
Mousetrap 1 0 0 0 0 0
mustache.js 8 0 0 0 0 0
Nightmare 20 0 0 0 0 0
node_redis 1 0 0 0 0 0
node-restify 7 1 0 0 0 14.29
numbers.js 18 0 0 0 0 0
page.js 13 0 0 2 0 15.38
Paper.js 54 0 0 0 0 0
Phaser 4 0 0 0 0 0
PM2 2 0 0 0 0 0
Pug 4 0 0 0 0 0
Q 23 0 0 0 0 0
Request 3 0 1 0 0 33.33
RequireJS 6 0 0 0 0 0
reveal.js 30 0 0 0 0 0
socket.io 9 0 0 0 0 0
StatsD 15 0 0 0 0 0
Stylus 4 0 0 0 0 0
three.js 8 0 0 0 0 0
Underscore.js 5 0 0 0 0 0
WebTorrent 4 0 0 0 0 0
whistle 7 0 0 0 0 0
Zepto.js 18 0 0 0 0 0
Total 866 2 2 3 0 0.81
Mean 1.61
Standard Deviation 5.7

False negatives added by unstructured merge with respect to merge scenarios

Project Merge Scenarios Merge Scenarios with Duplicated Function Declaration Merge Scenarios with Call to Renamed Function Merge Scenarios with Early Call to No Longer Hoisted Function (%)
Ace 195 0 0 0 0
AngularJS 34 0 0 0 0
Async 372 0 0 0 0
BitcoinJS 375 0 0 0 0
Bluebird 216 0 0 0 0
Bower 427 0 0 0 0
Bowser 129 0 0 0 0
Brackets 88 0 0 0 0
Chance 194 0 0 0 0
d3 159 0 0 0 0
director 77 0 0 0 0
Dox 55 0 0 0 0
faker.js 178 0 0 0 0
fetch 117 0 0 0 0
Flux 114 0 0 0 0
GitBook 205 0 0 0 0
i18next 229 0 0 0 0
impress.js 59 0 0 0 0
Intro.js 169 0 0 0 0
Istanbul 126 0 0 0 0
Jasmine 285 0 0 0 0
jQuery 245 0 0 0 0
jquery-pjax 98 0 0 0 0
JSHint 337 0 0 0 0
Konva 257 0 0 0 0
Less.js 443 0 0 0 0
Mocha 186 0 0 0 0
Mousetrap 36 0 0 0 0
mustache.js 134 0 0 0 0
Nightmare 267 0 0 0 0
node_redis 187 0 0 0 0
node-restify 294 0 0 0 0
numbers.js 92 0 0 0 0
page.js 128 0 0 0 0
Paper.js 411 0 0 0 0
Phaser 198 0 0 0 0
PM2 193 0 0 0 0
Pug 451 0 0 0 0
Q 148 0 0 0 0
Request 185 0 0 0 0
RequireJS 157 0 0 0 0
reveal.js 389 0 0 0 0
socket.io 290 0 0 0 0
StatsD 287 0 0 0 0
Stylus 188 0 0 0 0
three.js 92 0 0 0 0
Underscore.js 238 0 0 0 0
WebTorrent 306 0 0 0 0
whistle 63 0 0 0 0
Zepto.js 242 0 0 0 0
Total 10,345 0 0 0 0
Mean 0
Standard Deviation 0

False negatives added by unstructured merge with respect to conflicts

Project Conflicts Duplicated Function Declaration Call to Renamed Function Early Call to No Longer Hoisted Function (%)
Ace 195 0 0 0 0
AngularJS 34 0 0 0 0
Async 372 0 0 0 0
BitcoinJS 375 0 0 0 0
Bluebird 216 0 0 0 0
Bower 427 0 0 0 0
Bowser 129 0 0 0 0
Brackets 88 0 0 0 0
Chance 194 0 0 0 0
d3 159 0 0 0 0
director 77 0 0 0 0
Dox 55 0 0 0 0
faker.js 178 0 0 0 0
fetch 117 0 0 0 0
Flux 114 0 0 0 0
GitBook 205 0 0 0 0
i18next 229 0 0 0 0
impress.js 59 0 0 0 0
Intro.js 169 0 0 0 0
Istanbul 126 0 0 0 0
Jasmine 285 0 0 0 0
jQuery 245 0 0 0 0
jquery-pjax 98 0 0 0 0
JSHint 337 0 0 0 0
Konva 257 0 0 0 0
Less.js 443 0 0 0 0
Mocha 186 0 0 0 0
Mousetrap 36 0 0 0 0
mustache.js 134 0 0 0 0
Nightmare 267 0 0 0 0
node_redis 187 0 0 0 0
node-restify 294 0 0 0 0
numbers.js 92 0 0 0 0
page.js 128 0 0 0 0
Paper.js 411 0 0 0 0
Phaser 198 0 0 0 0
PM2 193 0 0 0 0
Pug 451 0 0 0 0
Q 148 0 0 0 0
Request 185 0 0 0 0
RequireJS 157 0 0 0 0
reveal.js 389 0 0 0 0
socket.io 290 0 0 0 0
StatsD 287 0 0 0 0
Stylus 188 0 0 0 0
three.js 92 0 0 0 0
Underscore.js 238 0 0 0 0
WebTorrent 306 0 0 0 0
whistle 63 0 0 0 0
Zepto.js 242 0 0 0 0
Total 918 0 0 0 0
Mean 0
Standard Deviation 0

False negatives added by jsFSTMerge v1 with respect to merge scenarios

Project Merge Scenarios Merge Scenarios with Accidental Conflicts (%)
Ace 195 0 0
AngularJS 34 0 0
Async 372 0 0
BitcoinJS 375 0 0
Bluebird 216 0 0
Bower 427 0 0
Bowser 129 0 0
Brackets 88 0 0
Chance 194 0 0
d3 159 0 0
director 77 0 0
Dox 55 0 0
faker.js 178 0 0
fetch 117 0 0
Flux 114 0 0
GitBook 205 0 0
i18next 229 0 0
impress.js 59 0 0
Intro.js 169 0 0
Istanbul 126 0 0
Jasmine 285 0 0
jQuery 245 1 0.41
jquery-pjax 98 0 0
JSHint 337 0 0
Konva 257 0 0
Less.js 443 0 0
Mocha 186 0 0
Mousetrap 36 0 0
mustache.js 134 0 0
Nightmare 267 0 0
node_redis 187 0 0
node-restify 294 0 0
numbers.js 92 0 0
page.js 128 0 0
Paper.js 411 0 0
Phaser 198 0 0
PM2 193 0 0
Pug 451 0 0
Q 148 0 0
Request 185 0 0
RequireJS 157 0 0
reveal.js 389 0 0
socket.io 290 0 0
StatsD 287 0 0
Stylus 188 0 0
three.js 92 0 0
Underscore.js 238 0 0
WebTorrent 306 0 0
whistle 63 0 0
Zepto.js 242 0 0
Total 10,345 1 0.01
Mean 0.01
Standard Deviation 0.06

False negatives added by jsFSTMerge v1 with respect to conflicts

Project Conflicts Accidental Conflicts (%)
Ace 13 0 0
AngularJS 16 0 0
Async 24 0 0
BitcoinJS 8 0 0
Bluebird 8 0 0
Bower 22 0 0
Bowser 22 0 0
Brackets 11 0 0
Chance 20 0 0
d3 81 0 0
director 16 0 0
Dox 6 0 0
faker.js 45 0 0
fetch 6 0 0
Flux 8 0 0
GitBook 6 0 0
i18next 27 0 0
impress.js 0 0 0
Intro.js 23 0 0
Istanbul 2 0 0
Jasmine 58 0 0
jQuery 33 1 3.03
jquery-pjax 6 0 0
JSHint 32 0 0
Konva 54 0 0
Less.js 61 0 0
Mocha 2 0 0
Mousetrap 1 0 0
mustache.js 8 0 0
Nightmare 22 0 0
node_redis 6 0 0
node-restify 7 0 0
numbers.js 18 0 0
page.js 14 0 0
Paper.js 54 0 0
Phaser 4 0 0
PM2 3 0 0
Pug 4 0 0
Q 23 0 0
Request 3 0 0
RequireJS 6 0 0
reveal.js 30 0 0
socket.io 9 0 0
StatsD 15 0 0
Stylus 4 0 0
three.js 8 0 0
Underscore.js 5 0 0
WebTorrent 5 0 0
whistle 7 0 0
Zepto.js 18 0 0
Total 884 1 0.11
Mean 0.06
Standard Deviation 0.43

False negatives added by jsFSTMerge v2 with respect to merge scenarios

Project Merge Scenarios Merge Scenarios with Accidental Conflicts (%)
Ace 195 0 0
AngularJS 34 0 0
Async 372 0 0
BitcoinJS 375 0 0
Bluebird 216 0 0
Bower 427 0 0
Bowser 129 0 0
Brackets 88 0 0
Chance 194 0 0
d3 159 0 0
director 77 0 0
Dox 55 0 0
faker.js 178 0 0
fetch 117 0 0
Flux 114 0 0
GitBook 205 0 0
i18next 229 0 0
impress.js 59 0 0
Intro.js 169 0 0
Istanbul 126 0 0
Jasmine 285 0 0
jQuery 245 1 0.41
jquery-pjax 98 0 0
JSHint 337 0 0
Konva 257 0 0
Less.js 443 0 0
Mocha 186 0 0
Mousetrap 36 0 0
mustache.js 134 0 0
Nightmare 267 0 0
node_redis 187 0 0
node-restify 294 0 0
numbers.js 92 0 0
page.js 128 0 0
Paper.js 411 0 0
Phaser 198 0 0
PM2 193 0 0
Pug 451 0 0
Q 148 0 0
Request 185 0 0
RequireJS 157 0 0
reveal.js 389 0 0
socket.io 290 0 0
StatsD 287 0 0
Stylus 188 0 0
three.js 92 0 0
Underscore.js 238 0 0
WebTorrent 306 0 0
whistle 63 0 0
Zepto.js 242 0 0
Total 10,345 1 0.01
Mean 0.01
Standard Deviation 0.06

False negatives added by jsFSTMerge v2 with respect to conflicts

Project Conflicts Accidental Conflicts (%)
Ace 13 0 0
AngularJS 16 0 0
Async 24 0 0
BitcoinJS 8 0 0
Bluebird 8 0 0
Bower 22 0 0
Bowser 22 0 0
Brackets 11 0 0
Chance 20 0 0
d3 81 0 0
director 16 0 0
Dox 6 0 0
faker.js 45 0 0
fetch 6 0 0
Flux 8 0 0
GitBook 6 0 0
i18next 27 0 0
impress.js 0 0 0
Intro.js 23 0 0
Istanbul 2 0 0
Jasmine 58 0 0
jQuery 33 1 3.03
jquery-pjax 6 0 0
JSHint 32 0 0
Konva 54 0 0
Less.js 61 0 0
Mocha 2 0 0
Mousetrap 1 0 0
mustache.js 8 0 0
Nightmare 22 0 0
node_redis 6 0 0
node-restify 7 0 0
numbers.js 18 0 0
page.js 14 0 0
Paper.js 54 0 0
Phaser 4 0 0
PM2 3 0 0
Pug 4 0 0
Q 23 0 0
Request 3 0 0
RequireJS 6 0 0
reveal.js 30 0 0
socket.io 9 0 0
StatsD 15 0 0
Stylus 4 0 0
three.js 8 0 0
Underscore.js 5 0 0
WebTorrent 5 0 0
whistle 7 0 0
Zepto.js 18 0 0
Total 884 1 0.11
Mean 0.06
Standard Deviation 0.43