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.
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:
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |