├── test ├── testProvXMLData.xml ├── support │ └── env.js ├── testProvNdata.n3 ├── testProvOdata.n3 ├── test.js └── testProvJSONData.json ├── .gitignore ├── .npmignore ├── public_html ├── logo.jpg ├── logo.psd ├── images │ ├── logo.jpg │ ├── favicon.png │ ├── vulogo.png │ ├── mmlablogo.png │ ├── ugentlogo.png │ ├── ajax-loader.gif │ ├── git2provlogo.png │ ├── git2provlogo.psd │ ├── imindslogo.png │ └── Git-Logo-2Color.png ├── css │ ├── git2prov.css │ └── bootstrap-responsive.css ├── webpage.provn ├── contact.html ├── about.html └── index.html ├── TODO.md ├── .travis.yml ├── sonar-project.properties ├── bin ├── git2prov-server ├── proxy.js └── git2prov ├── lib ├── router.js ├── server.js ├── requestHandlers.js ├── git2provConverter.js └── provSerializer.js ├── .jshintrc ├── package.json ├── scripts └── git2prov └── README.md /test/testProvXMLData.xml: -------------------------------------------------------------------------------- 1 | serialization unsupported -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | temp 3 | .idea 4 | coverage -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | coverage/ 2 | docs/ 3 | test/ 4 | .travis.yml -------------------------------------------------------------------------------- /test/support/env.js: -------------------------------------------------------------------------------- 1 | process.env.NODE_ENV = 'test'; 2 | -------------------------------------------------------------------------------- /public_html/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IDLabResearch/Git2PROV/HEAD/public_html/logo.jpg -------------------------------------------------------------------------------- /public_html/logo.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IDLabResearch/Git2PROV/HEAD/public_html/logo.psd -------------------------------------------------------------------------------- /public_html/images/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IDLabResearch/Git2PROV/HEAD/public_html/images/logo.jpg -------------------------------------------------------------------------------- /public_html/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IDLabResearch/Git2PROV/HEAD/public_html/images/favicon.png -------------------------------------------------------------------------------- /public_html/images/vulogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IDLabResearch/Git2PROV/HEAD/public_html/images/vulogo.png -------------------------------------------------------------------------------- /public_html/images/mmlablogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IDLabResearch/Git2PROV/HEAD/public_html/images/mmlablogo.png -------------------------------------------------------------------------------- /public_html/images/ugentlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IDLabResearch/Git2PROV/HEAD/public_html/images/ugentlogo.png -------------------------------------------------------------------------------- /public_html/images/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IDLabResearch/Git2PROV/HEAD/public_html/images/ajax-loader.gif -------------------------------------------------------------------------------- /public_html/images/git2provlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IDLabResearch/Git2PROV/HEAD/public_html/images/git2provlogo.png -------------------------------------------------------------------------------- /public_html/images/git2provlogo.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IDLabResearch/Git2PROV/HEAD/public_html/images/git2provlogo.psd -------------------------------------------------------------------------------- /public_html/images/imindslogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IDLabResearch/Git2PROV/HEAD/public_html/images/imindslogo.png -------------------------------------------------------------------------------- /public_html/images/Git-Logo-2Color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IDLabResearch/Git2PROV/HEAD/public_html/images/Git-Logo-2Color.png -------------------------------------------------------------------------------- /TODO.md: -------------------------------------------------------------------------------- 1 | TODO: 2 | - make a API request to get the SVG 3 | 4 | 5 | NOT URGENT TODOs and IDEAS: 6 | - expose a SPARQL endpoint 7 | - integrate with PROV-O visualizer 8 | 9 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 0.10 4 | 5 | script: "npm run-script test && npm run-script test-travis" 6 | after_script: "npm install coveralls@2.10.0 && cat ./coverage/lcov.info | coveralls" 7 | -------------------------------------------------------------------------------- /sonar-project.properties: -------------------------------------------------------------------------------- 1 | # required metadata 2 | sonar.language = js 3 | 4 | sonar.projectKey=Git2Prov:CodeQuality 5 | sonar.projectName=Git2Prov 6 | sonar.projectVersion=0.1 7 | 8 | sonar.projectDescription=Git2Prov Quality Build 9 | 10 | sonar.sources=lib,test -------------------------------------------------------------------------------- /bin/git2prov-server: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | var server = require("../lib/server"); 3 | var router = require("../lib/router"); 4 | var requestHandlers = require("../lib/requestHandlers"); 5 | 6 | const PORT = process.env.PORT || 8905; 7 | var handle = { '/git2prov': requestHandlers.git2prov }; 8 | server.start(router.route, handle); 9 | console.log("Server running on http://localhost:" + PORT + "/"); 10 | -------------------------------------------------------------------------------- /lib/router.js: -------------------------------------------------------------------------------- 1 | /* This module routes the incoming requests to the correct handler */ 2 | var url = require("url"); 3 | 4 | function route(handle, request, response, next) { 5 | var pathname = url.parse(request.url).pathname; 6 | //console.log("Request for " + pathname + " received."); 7 | if (typeof handle[pathname] === "function") { 8 | return handle[pathname](request, response); 9 | } else { 10 | next(); 11 | } 12 | } 13 | 14 | exports.route = route; -------------------------------------------------------------------------------- /bin/proxy.js: -------------------------------------------------------------------------------- 1 | /* The proxy server, to run as root on port 80 */ 2 | var http = require('http'), 3 | httpProxy = require('http-proxy'); 4 | /* Default: 80 */ 5 | var proxyPort = 80; 6 | /* Default: 8905 */ 7 | var port = 8905; 8 | if(process.argv[2]){ 9 | proxyPort = parseInt(process.argv[2]); 10 | } 11 | if(process.argv[3]){ 12 | port = parseInt(process.argv[3]); 13 | } 14 | console.log("Redirecting port " + proxyPort + " to port " + port + "."); 15 | 16 | httpProxy.createServer(port, 'localhost').listen(proxyPort); -------------------------------------------------------------------------------- /lib/server.js: -------------------------------------------------------------------------------- 1 | /* The HTTP server module */ 2 | var express = require('express'), 3 | path = require('path'); 4 | const PORT = process.env.PORT || 8905; 5 | function start(route, handle) { 6 | function onRequest(request, response, next) { 7 | route(handle, request, response, next); 8 | } 9 | 10 | express() 11 | .use(express.cookieParser()) 12 | .use(express.session({secret: 'everything to prov'})) 13 | .use(onRequest) 14 | .use(express.static(path.join(__dirname, '../public_html'))) 15 | .listen(PORT); 16 | } 17 | 18 | exports.start = start; 19 | -------------------------------------------------------------------------------- /bin/git2prov: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | var path = require('path'), 3 | os = require('os'), 4 | convert = require("../lib/git2provConverter").convert; 5 | 6 | // Parse arguments 7 | var args = process.argv.slice(2); 8 | if (args.length < 1 || args.length > 2) { 9 | console.error('usage: git2prov git_url [{PROV-JSON,PROV-O,PROV-XML,SVG}]'); 10 | return process.exit(1); 11 | } 12 | var gitUrl = args[0], 13 | serialization = args[1] || 'PROV-JSON', 14 | tempDir = path.join(os.tmpdir(), 'git2prov', process.pid.toString()), 15 | requestUrl = 'http://localhost/', 16 | options = {}; 17 | 18 | // Output the provenance 19 | convert(gitUrl, serialization, tempDir, requestUrl, options, function (prov, error) { 20 | if (error) 21 | throw error; 22 | console.log(prov); 23 | }); 24 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "node": true, // Allow use of node.js globals. 3 | "loopfunc": true, // Allow functions to be defined within loops. 4 | "proto": true, // Allow use of `__proto__`. 5 | "expr": true, // Allow expressions where statements are allowed. 6 | "boss": true, // Allow assignments where expressions are allowed. 7 | "trailing": false, // Do not leave trailing whitespace. 8 | "strict": false, // Do not enforce strict mode. 9 | "undef": true, // Don't use undefined variables. 10 | "unused": true, // Warn about unused variables. 11 | "-W086": true, // Allow fall-through in switch statement. 12 | "globals": { // Allow mocha globals in tests. 13 | "describe": true, 14 | "it": true, 15 | "before": true, 16 | "beforeEach": true 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /public_html/css/git2prov.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | margin: 0; 3 | padding: 0; 4 | } 5 | html { 6 | padding: 40px; 7 | } 8 | #git2provContainer{ 9 | text-align:center; 10 | margin-top:80px; 11 | margin-bottom:50px; 12 | text-align:center; 13 | } 14 | #contentContainer{ 15 | width: 100%; 16 | text-align: left; 17 | } 18 | #giturlContainer{ 19 | width: 70%; 20 | } 21 | #logo { 22 | float: left; 23 | height: 150px; 24 | width: 150px; 25 | margin-right: 20px; 26 | margin-bottom: 20px; 27 | } 28 | #instututions{ 29 | width: 100%; 30 | margin-left: 20px; 31 | } 32 | .git2provButton { 33 | color:#FFFFFF; 34 | background-color:#5bbf30; 35 | border-style:solid; 36 | border-color:#FFFFFF; 37 | border-width:1px; 38 | } 39 | #ajax-loader { 40 | visibility:hidden; 41 | margin-left:-105px; 42 | } 43 | -------------------------------------------------------------------------------- /public_html/webpage.provn: -------------------------------------------------------------------------------- 1 | document 2 | prefix ex 3 | 4 | entity(ex:git2prov_webpage) 5 | agent(ex:tdn, [prov:type="prov:Person", prov:label="Tom De Nies"]) 6 | agent(ex:mmlab, [prov:type="prov:Organization", prov:label="Ghent University - iMinds - MMlab"]) 7 | agent(ex:ruben, [prov:type="prov:Person", prov:label="Ruben Verborgh"]) 8 | agent(ex:sme340, [prov:type="prov:Person", prov:label="Sara Magliacane"]) 9 | agent(ex:vu, [prov:type="prov:Organization", prov:label="VU University Amsterdam - Data2Semantics]) 10 | wasAttributedTo(ex:git2prov_webpage, ex:tdn) 11 | actedOnBehalfOf(ex:tdn, ex:mmlab) 12 | wasAttributedTo(ex:git2prov_webpage, ex:ruben) 13 | actedOnBehalfOf(ex:ruben, ex:mmlab) 14 | wasAttributedTo(ex:git2prov_webpage, ex:sme340) 15 | actedOnBehalfOf(ex:sme340, ex:vu) 16 | endDocument 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "git2prov", 3 | "version": "0.1.2", 4 | "description": "Unleash the potential of Git in the new W3C standard for provenance.", 5 | "bin": [ 6 | "bin/git2prov", 7 | "bin/git2prov-server" 8 | ], 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/mmlab/Git2PROV.git" 12 | }, 13 | "keywords": [ 14 | "git", 15 | "prov", 16 | "provenance" 17 | ], 18 | "author": [ 19 | "Tom De Nies", 20 | "Sara Magliacane", 21 | "Ruben Verborgh" 22 | ], 23 | "license": "GPLv3", 24 | "bugs": { 25 | "url": "https://github.com/mmlab/Git2PROV/issues" 26 | }, 27 | "homepage": "http://git2prov.org/", 28 | "dependencies": { 29 | "n3": "~0.2.3", 30 | "http-proxy": "~1.0.2", 31 | "express": "~3.4.8" 32 | }, 33 | "devDependencies": { 34 | "istanbul": "0.3.0", 35 | "mocha": "~1.21.4", 36 | "should": "~4.0.0", 37 | "sinon": "~1.10.3", 38 | "jshint": "~2.1.10", 39 | "supertest": "~0.13.0", 40 | "xunit-file": "~0.0.5" 41 | }, 42 | "scripts": { 43 | "start": "node ./bin/git2prov-server", 44 | "test": "mocha --require test/support/env --reporter xunit-file -t 5000 --bail --check-leaks test/", 45 | "hint": "./node_modules/jshint/bin/jshint lib test", 46 | "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- -i -g Integration --require test/support/env --reporter spec --check-leaks test/", 47 | "cov-jenkins": "istanbul report cobertura", 48 | "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- -i -g Integration --require test/support/env --reporter spec --check-leaks test/" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /scripts/git2prov: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Startup script for the Git2Prov service 3 | ### BEGIN INIT INFO 4 | # Provides: git2prov 5 | # Required-Start: $syslog $remote_fs 6 | # Required-Stop: $syslog $remote_fs 7 | # Should-Start: $local_fs 8 | # Should-Stop: $local_fs 9 | # Default-Start: 2 3 4 5 10 | # Default-Stop: 0 1 6 11 | # Short-Description: Git2Prov Service 12 | # Description: Git2Prov Service 13 | ### END INIT INFO 14 | PID_FILE=/var/run/git2prov.pid 15 | PROXY_PID_FILE=/var/run/proxy.pid 16 | LOG_FILE=/var/log/git2prov.log 17 | APPLICATION_DIR=/home/node/git2prov/ 18 | 19 | start() { 20 | if [ -f $PID_FILE ] 21 | then 22 | echo "$PID_FILE exists, process is already running or crashed" 23 | RETVAL=0 24 | else 25 | echo "Starting server..." 26 | cd $APPLICATION_DIR 27 | sudo node bin/proxy 80 8905 & 28 | echo $! > $PROXY_PID_FILE 29 | sudo node bin/git2prov-server 8905 2>&1 >> $LOG_FILE & 30 | echo $! > $PID_FILE; 31 | RETVAL=$? 32 | fi 33 | } 34 | stop() { 35 | if [ ! -f $PID_FILE ] 36 | then 37 | echo "$PID_FILE does not exist, process is not running" 38 | RETVAL=0 39 | else 40 | echo "Stopping server..." 41 | echo "Killing `cat $PID_FILE`" 42 | kill `cat $PID_FILE`; 43 | rm $PID_FILE; 44 | echo "Killing `cat $PROXY_PID_FILE`" 45 | kill `cat $PROXY_PID_FILE`; 46 | rm $PROXY_PID_FILE; 47 | echo "Server stopped" 48 | RETVAL=$? 49 | fi 50 | } 51 | 52 | case "$1" in 53 | start) 54 | start 55 | ;; 56 | stop) 57 | stop 58 | ;; 59 | restart) 60 | stop 61 | start 62 | ;; 63 | *) 64 | echo "Usage: {start|stop|restart}" 65 | exit 1 66 | ;; 67 | esac 68 | exit $RETVAL 69 | -------------------------------------------------------------------------------- /lib/requestHandlers.js: -------------------------------------------------------------------------------- 1 | /* This module contains the handlers for the incoming requests */ 2 | var url = require("url"); 3 | var fs = require('fs'); 4 | var os = require('os'); 5 | var path = require('path'); 6 | var git2provConverter = require("./git2provConverter"); 7 | 8 | function git2prov(request, response) { 9 | var query = url.parse(request.url, true).query; 10 | var options = {}; 11 | if(query['ignore']) { 12 | options['ignore'] = query['ignore']; 13 | } 14 | if(query['shortHashes']) { 15 | options['shortHashes'] = query['shortHashes']; 16 | } 17 | if(query['giturl']){ 18 | var tempPath = path.join(os.tmpdir(), 'git2provserver'); 19 | //Windows workaround to overcome permission issues with the C:\Users\{user}\AppData\Local\Temp\ folder. 20 | //If the folder C:\Users\{user}\AppData\Local\Temp\git2provserver doesn't exist yet, every request hangs at the clone stage. 21 | if(!fs.existsSync(tempPath)){ 22 | fs.mkdirSync(tempPath); 23 | } 24 | var repositoryPath = path.join(tempPath, request.sessionID); 25 | git2provConverter.convert(query['giturl'], query['serialization'], repositoryPath, 26 | "http://" + request.headers.host + request.url, options, function(prov, error, contentType) { 27 | //console.log("prov: " + prov + " error: " + error); 28 | if (error !== null){ 29 | response.writeHead(400, "Git repository could not be cloned." + error); 30 | response.end(); 31 | } else { 32 | response.writeHead(200, {"Content-Type": contentType}); 33 | response.write(prov); 34 | response.end(); 35 | } 36 | request.session.destroy(); 37 | }); 38 | }else{ 39 | response.writeHead(400, "Missing one or more required parameters."); 40 | response.end(); 41 | } 42 | } 43 | 44 | exports.git2prov = git2prov; 45 | -------------------------------------------------------------------------------- /public_html/contact.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Git2PROV: Contact 6 | 7 | 8 | 9 | 10 | 11 | 12 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 42 | 43 | 46 | 47 | 48 |
49 |
50 | 51 | 52 | 53 |

54 | For more information about Git2PROV, contact one of the corresponding authors: 55 |

59 |

60 | 67 |
68 |
69 | 70 | 71 | 72 | 79 | 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | [![Build Status](https://travis-ci.org/vladistan/Git2PROV.svg?branch=feature%2Funit-tests)](https://travis-ci.org/vladistan/Git2PROV.svg?branch=feature%2Funit-tests) 3 | [![Coverage Status](https://img.shields.io/coveralls/vladistan/Git2PROV.svg)](https://coveralls.io/r/vladistan/Git2PROV) 4 | 5 | #Git2PROV 6 | Check out our [One-minute Git2PROV tutorial on Vimeo](http://vimeo.com/70980809) 7 | 8 | For an in-depth description of this tool and its creation, we refer to the following paper: 9 | 10 | [Git2PROV: Exposing Version Control System Content as W3C PROV](http://www.iswc2013.semanticweb.org/sites/default/files/iswc_demo_32_0.pdf) 11 | by Tom De Nies, Sara Magliacane, Ruben Verborgh, Sam Coppens, Paul Groth, Erik Mannens, and Rik Van de Walle 12 | Published in 2013 in the Poster and Demo Proceedings of the 12th International Semantic Web Conference. 13 | 14 | #Disclaimer and License 15 | Git2PROV is a joint work of [Ghent University](http://www.ugent.be/) - [iMinds](http://www.iminds.be/) - [Multimedia Lab](http://mmlab.be/), and the [Data2Semantics](http://www.data2semantics.org/) project of the [VU University Amsterdam](http://www.vu.nl/) . 16 | 17 | The people involved are: 18 | * Tom De Nies (Ghent University - iMinds - MMLab) 19 | * Sara Magliacane (VU Amsterdam) 20 | * Ruben Verborgh (Ghent University - iMinds - MMLab) 21 | * Sam Coppens (Ghent University - iMinds - MMLab) 22 | * Paul Groth (VU Amsterdam) 23 | * Erik Mannens (Ghent University - iMinds - MMLab) 24 | * Rik Van de Walle (Ghent University - iMinds - MMLab) 25 | 26 | We chose to make Git2PROV open source under [GPL Version 3 license](http://www.gnu.org/licenses/gpl.html) because we believe this will lead it to its full potential, and be of much more value to the Web community than a single isolated instance running on a server somewhere. 27 | 28 | So in short, you are free to use and modify Git2PROV for non-commercial purposes, as long as you make your stuff open source as well and you properly credit us. This is most conveniently done by citing the paper mentioned above. 29 | 30 | #Installation 31 | 32 | Make sure you have node.js and git installed and in the system PATH variable. Then, run: 33 | ``` 34 | [sudo] npm install -g git2prov 35 | ``` 36 | 37 | ## Converting a repository 38 | To convert a single repository, run: 39 | 40 | git2prov git_url [serialization] 41 | 42 | For example: 43 | 44 | git2prov git@github.com:RubenVerborgh/N3.js.git PROV-JSON 45 | 46 | ## Running the server 47 | To run the server, use the following command: 48 | 49 | git2prov-server [port] 50 | 51 | For example: 52 | 53 | git2prov-server 8905 54 | 55 | Then go to your browser and enter the following url: 56 | http://localhost:8905/ 57 | 58 | This will give you the [standard Git2PROV homepage](http://git2prov.org). 59 | 60 | TO use the service directly, use the following URL: 61 | http://localhost:8905/git2prov?giturl=&serialization=&[optional parameters] 62 | The OPTIONAL parameters are: 63 | 64 | serialization: 65 | * PROV-N (default) 66 | * PROV-JSON 67 | * PROV-O 68 | * PROV-XML 69 | 70 | shortHashes 71 | * true ---> This will force the git log to use short hashes, making the output more readable by humans 72 | 73 | ignore 74 | * ---> This provenance relation will not appear in the output. Multiple values are possible. 75 | 76 | Example: 77 | http://localhost:8905/git2prov?giturl=&serialization=PROV-JSON&shortHashes=true&ignore=wasInformedBy&ignore=used 78 | 79 | To start a proxy server: 80 | node proxy.js 81 | for example: 82 | node proxy.js 80 8905 83 | 84 | ##Running as a service on a Linux/UNIX machine 85 | This script is used in combination with init.d. You could also modify it to work with upstart. 86 | 87 | Copy the startup script "git2prov" to your /etc/init.d directory: 88 | ``` 89 | sudo cp scripts/git2prov /etc/init.d/git2prov 90 | ``` 91 | Make it executable 92 | ``` 93 | sudo chmod a+x /etc/init.d/git2prov 94 | ``` 95 | add it to the startup services 96 | ``` 97 | update-rc.d git2prov defaults 98 | ``` 99 | You can now do commands such as 100 | ``` 101 | sudo service git2prov start 102 | sudo service git2prov restart 103 | sudo service git2prov stop 104 | ``` 105 | 106 | And the service should automatically start when the machine is rebooted. 107 | -------------------------------------------------------------------------------- /public_html/about.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Git2PROV: About 6 | 7 | 8 | 9 | 10 | 11 | 12 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 42 | 43 | 46 | 47 | 48 |
49 |
50 | 51 |

One-minute Git2Prov tutorial on Vimeo.

52 | 53 | 54 |

Git2PROV is a joint work of Ghent University - iMinds - Multimedia Lab, and the Data2Semantics project of the VU University Amsterdam . 55 |

56 |

The people involved are: 57 |

    58 |
  • Tom De Nies (Ghent University - iMinds - MMLab)
  • 59 |
  • Sara Magliacane (VU Amsterdam)
  • 60 |
  • Ruben Verborgh (Ghent University - iMinds - MMLab)
  • 61 |
  • Sam Coppens (Ghent University - iMinds - MMLab)
  • 62 |
  • Paul Groth (VU Amsterdam)
  • 63 |
  • Erik Mannens (Ghent University - iMinds - MMLab)
  • 64 |
  • Rik Van de Walle (Ghent University - iMinds - MMLab)
  • 65 |
66 |

67 |

Git2PROV is open source! To run it locally, or to contribute to its development, go to our Github repository.

68 |

For an in-depth description of this tool and its creation, we refer to the following paper:
69 | Git2PROV: Exposing Version Control System Content as W3C PROV
70 | by Tom De Nies, Sara Magliacane, Ruben Verborgh, Sam Coppens, Paul Groth, Erik Mannens, and Rik Van de Walle 71 |
Published in 2013 in the Poster and Demo Proceedings of the 12th International Semantic Web Conference.

72 |

Erratum: Note that the version of this paper on CEUR-WS has a small mistake in Fig.1 on page 3. 73 | The arrows indicating specializationOf should be pointing towards node "f", not away from it. The version on the ISWC website is correct.

74 | 75 |
76 | 77 |
78 | 79 | 80 |
81 |
82 | 83 |
84 | 85 | 86 | 87 | 88 | 95 | 96 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /public_html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Git2PROV 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 38 | 39 | 40 |
41 | 42 |
43 |
44 |
45 | 50 |
51 | 52 | 53 |
54 | 55 | 56 | 57 | 58 | 59 | 60 | 69 |
70 | 71 | 72 | 74 | 76 | 78 | 80 | 81 |
82 |
83 |
84 |
85 |
86 | 87 | 88 |
89 |
90 | 91 | 92 | 93 |
94 |
Powered by: 95 | Ghent University 96 | iMinds 97 | MMLab 98 | & VU University Amsterdam 99 |
100 | Source code available on Github 101 | 102 | 103 | 104 | 127 | 128 | 129 | 130 | 131 | 132 | -------------------------------------------------------------------------------- /lib/git2provConverter.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | /* A converter for a git url to PROV-N */ 4 | var exec = require('child_process').exec; 5 | var serialize = require('./provSerializer').serialize; 6 | 7 | /* Convert the git repository at giturl to PROV in the specified serialization. 8 | RepositoryPath will be used to temporarily store the cloned repository on the server. 9 | */ 10 | function convert(giturl, serialization, repositoryPath, requestUrl, options, callback) { 11 | // Convert git URLs to https URLs 12 | if(giturl.indexOf("git@github.com:") > -1) { 13 | giturl = giturl.replace("git@github.com:", "https://github.com/"); 14 | } 15 | // get the repository name. 16 | var repository = giturl.substring(giturl.lastIndexOf('/')+1, giturl.lastIndexOf('.git')); 17 | // clone the git repository 18 | clone(giturl, repositoryPath, function(error) { 19 | if (error !== null){ 20 | callback(null, error); 21 | // cleanup - delete the repository 22 | exec("rm -rf " + repositoryPath); 23 | } else { 24 | // convert the information from the git url to PROV 25 | convertRepositoryToProv(repositoryPath, serialization, requestUrl, options, function(prov,contentType){ 26 | callback(prov,null,contentType); 27 | // cleanup - delete the repository 28 | exec("rm -rf " + repositoryPath); 29 | }); 30 | } 31 | }); 32 | } 33 | 34 | /* Clone a git repository (at giturl) to the specified repositoryPath on the server */ 35 | function clone(giturl, repositoryPath, callback) { 36 | exec('git clone '+ giturl + ' ' + repositoryPath, { timeout : 30000 },function (error) { 37 | if( error !== null ) { 38 | callback(error); 39 | } else { 40 | callback(null); 41 | } 42 | }); 43 | } 44 | 45 | function getProvObject(prefixes, urlprefix) { 46 | var provObject = {}; 47 | provObject.prefixes = prefixes; 48 | provObject.bundle = urlprefix + ":provenance"; 49 | provObject.alternateBundle = "fullResult:provenance"; 50 | provObject.entities = {}; 51 | provObject.agents = {}; 52 | provObject.activities = {}; 53 | provObject.starts = {}; 54 | provObject.ends = {}; 55 | provObject.attributions = {}; 56 | provObject.associations = {}; 57 | provObject.communications = {}; 58 | provObject.specializations = {}; 59 | provObject.usages = {}; 60 | provObject.generations = {}; 61 | provObject.derivations = {}; 62 | provObject.invalidations = {}; 63 | return provObject; 64 | } 65 | 66 | function getCommitObj(line) { 67 | 68 | // remove the trailing filename from the --name-status line 69 | line = line.substring(0, line.lastIndexOf(',') + 2); 70 | 71 | var commitObj = {}; 72 | var data = line.split(","); 73 | 74 | commitObj.entity = "file-" + data[0].replace(/ /g, "-"); 75 | commitObj.id = "commit-" + data[1]; 76 | commitObj.parents = data[2] ? data[2].split(" ") : []; 77 | commitObj.author = "user-" + data[3].replace(/ /g, "-"); 78 | commitObj.author_label = data[3]; 79 | commitObj.author_date = new Date(data[4]).toISOString(); 80 | commitObj.commiter = "user-" + data[5].replace(/ /g, "-"); 81 | commitObj.commiter_label = data[5]; 82 | commitObj.commiter_date = new Date(data[6]).toISOString(); 83 | commitObj.subject = data[7]; 84 | commitObj.modification_type = data[8]; 85 | return commitObj; 86 | } 87 | 88 | function updateProvObj(provObject, urlprefix, commitObj){ 89 | 90 | var commitEntity = commitObj.entity + "_" + commitObj.id; 91 | 92 | 93 | // Add the commit activity to the activities object 94 | provObject.activities[urlprefix + ":" + commitObj.id] = {"prov:label" : commitObj.subject};// No need to add the parents as well, since we will eventually loop over them anyway 95 | provObject.starts[urlprefix + ":" + commitObj.id + "_start"] ={ 96 | "prov:activity" : urlprefix + ":" + commitObj.id, "prov:time" : commitObj.author_date}; 97 | provObject.ends[urlprefix + ":" + commitObj.id + "_end"] = { 98 | "prov:activity" : urlprefix + ":" + commitObj.id, "prov:time" : commitObj.commiter_date}; 99 | // Add the commit entities (files) to the entities, specializations and derivations object 100 | provObject.entities[urlprefix + ":" + commitEntity] = {}; 101 | provObject.specializations[urlprefix + ":" + commitEntity + "_spec"] = { 102 | "prov:generalEntity" : urlprefix + ":" + commitObj.entity, 103 | "prov:specificEntity" : urlprefix + ":" + commitEntity}; 104 | switch(commitObj.modification_type){ 105 | case "D": 106 | // The file was deleted in this commit 107 | provObject.invalidations[urlprefix + ":" + commitEntity + "_inv"] = { 108 | "prov:entity": urlprefix + ":" + commitEntity, 109 | "prov:activity": urlprefix + ":" + commitObj.id, 110 | "prov:time": commitObj.author_date 111 | }; 112 | break; 113 | case "A": 114 | // The file was added in this commit 115 | provObject.generations[urlprefix + ":" + commitEntity + "_gen"] = { 116 | "prov:entity": urlprefix + ":" + commitEntity, 117 | "prov:activity": urlprefix + ":" + commitObj.id, 118 | "prov:time": commitObj.author_date 119 | }; 120 | break; 121 | default: 122 | // The file was modified in this commit 123 | var generation = urlprefix + ":" + commitEntity + "_gen"; 124 | provObject.generations[generation] = { 125 | "prov:activity": urlprefix + ":" + commitObj.id, 126 | "prov:entity": urlprefix + ":" + commitEntity, 127 | "prov:time": commitObj.author_date 128 | }; 129 | 130 | commitObj.parents.forEach(function(parent){ 131 | if(parent !== ""){ 132 | var parentEntity = commitObj.entity + "_commit-" + parent; 133 | var usage = urlprefix + ":" + parentEntity + "_" + commitObj.id + "_use"; 134 | provObject.usages[usage] = { 135 | "prov:activity": urlprefix + ":" + commitObj.id, 136 | "prov:entity": urlprefix + ":" + parentEntity, 137 | "prov:time": commitObj.author_date 138 | }; 139 | provObject.derivations[urlprefix + ":" + commitEntity + "_" + parent + "_der"] = { 140 | "prov:activity": urlprefix + ":" + commitObj.id, 141 | "prov:generatedEntity": urlprefix + ":" + commitEntity, 142 | "prov:usedEntity": urlprefix + ":" + parentEntity, 143 | "prov:generation": generation, 144 | "prov:usage": usage 145 | }; 146 | provObject.communications[urlprefix + ":" + commitObj.id + "_" + parent + "_comm"] = { 147 | "prov:informant": urlprefix + ":" + "commit-" + parent, 148 | "prov:informed": urlprefix + ":" + commitObj.id 149 | }; 150 | } 151 | }); 152 | break; 153 | } 154 | // Add the agents to the stack of agents 155 | provObject.agents[urlprefix + ":" + commitObj.author] = {"prov:label" : commitObj.author_label}; 156 | // The file is definitly attributed to the author 157 | provObject.attributions[urlprefix + ":" + commitObj.entity + "_" + commitObj.id + "_" + commitObj.author + "_attr"] = { 158 | "prov:entity" : urlprefix + ":" + commitEntity, 159 | "prov:agent" : urlprefix + ":" + commitObj.author, 160 | "prov:type" : "authorship" 161 | }; 162 | // And he/she is definitely associated with the commit activity 163 | provObject.associations[urlprefix + ":" + commitObj.id + "_" + commitObj.author + "_assoc"] = { 164 | "prov:activity" : urlprefix + ":" + commitObj.id, 165 | "prov:agent" : urlprefix + ":" + commitObj.author, 166 | "prov:role" : "author" 167 | }; 168 | provObject.agents[urlprefix + ":" + commitObj.commiter] = {"prov:label" : commitObj.commiter_label}; 169 | // We can't say that the file was attributed to the committer, but we can associate the commit activity with him/her 170 | if(provObject.associations[urlprefix + ":" + commitObj.id + "_" + commitObj.commiter + "_assoc"]){ 171 | provObject.associations[urlprefix + ":" + commitObj.id + "_" + commitObj.commiter + "_assoc"]["prov:role"] += ", committer"; 172 | } else { 173 | provObject.associations[urlprefix + ":" + commitObj.id + "_" + commitObj.commiter + "_assoc"] = { 174 | "prov:activity" : urlprefix + ":" + commitObj.id, 175 | "prov:agent" : urlprefix + ":" + commitObj.commiter, 176 | "prov:role" : "committer" 177 | }; 178 | } 179 | } 180 | 181 | function getPrefixes(urlprefix, requestUrl, serialization) { 182 | var prefixes = {}; 183 | prefixes[urlprefix] = requestUrl + "#"; 184 | prefixes.fullResult = requestUrl.substring(0, requestUrl.indexOf('&')) + "&serialization=" + serialization + "#"; 185 | return prefixes; 186 | } 187 | 188 | function getLogCmds(provObject, fileList, urlprefix, options) { 189 | 190 | var files = fileList.toString().split('\n'); 191 | // For some reason, git log appends empty lines here and there. Let's fitler them out. 192 | files = files.filter(function(element) { return element !== ""; }); 193 | 194 | var logCmds = files.map(function (file) { 195 | var commitHash = options.shortHashes ? "%h" : "%H"; 196 | var parentHash = options.shortHashes ? "%p" : "%P"; 197 | 198 | //console.log('Processing ' + file); 199 | // Because all identifiers need to be QNames in PROV, and we need valid turtle as well, we need to get rid of the slashes, spaces and dots 200 | var currentEntity = file.replace(/[\/. ]/g, "-"); 201 | provObject.entities[urlprefix + ":file-" + currentEntity] = {"prov:label": file}; 202 | // Next, do a git log for each file to find out about all commits, authors, the commit parents, and the modification type 203 | // This will output the following: Commit hash, Parent hash(es), Author name, Author date, Committer name, Committer date, Subject, name-status 204 | // This translates to: activity (commit), derivations, agent (author), starttime, agent (committer), endtime, prov:label (Commit message) 205 | return 'git --no-pager log --date=iso --name-status --pretty=format:"' + currentEntity + ',' + commitHash + ',' + parentHash + ',%an,%ad,%cn,%cd,%s,&" -- ' + file; 206 | }); 207 | return logCmds; 208 | } 209 | 210 | /* We convert git concepts to PROV concepts as follows: 211 | 212 | commit c with subject s ---> activity(c, [prov:label="s"]) 213 | file f ---> entity(f) 214 | author a ---> agent(a) 215 | ---> wasAssociatedWith(c, a, [prov:role="author"]) 216 | ---> wasAttributedTo(f_c, a, [prov:type="authorship"]) 217 | committer ca ---> agent(ca) 218 | ---> wasAssociatedWith(c, ca, [prov:role="committer"]) 219 | author date ad ---> wasStartedBy(c, -, -, ad) 220 | commit date cd ---> wasEndedBy(c, -, -, cd) 221 | file f in commit c ---> specializationOf(f_c, f) 222 | file f_c added in commit c ---> wasGeneratedBy(f_c, c, authordate) 223 | file f_c in commit c modified f_c2 from parent commit c2 224 | ---> wasGeneratedBy(f_c, c, authordate) 225 | ---> used(c, f_c2, authordate) 226 | ---> wasDerivedFrom(f_c, f_c2, c) 227 | ---> wasInformedBy(c, c2) 228 | file f_c deleted in commit c ---> wasInvalidatedBy(f_c, c, authordate) 229 | */ 230 | 231 | function convertRepositoryToProv(repositoryPath, serialization, requestUrl, options, callback) { 232 | // set the corresponding variables according to the options 233 | var ignore = options.ignore ? options.ignore : []; 234 | // determine a QName for the bundle 235 | var urlprefix = "result"; 236 | 237 | var prefixes = getPrefixes(urlprefix, requestUrl, serialization); 238 | 239 | // We store these assertions in the PROV-JSON format, so they need to be objects. 240 | // PROV-JSON spec: http://www.w3.org/Submission/prov-json/ 241 | var provObject = getProvObject(prefixes, urlprefix); 242 | 243 | // first, do a git log to find out about all files that ever existed in the repository 244 | exec('git --no-pager log --pretty=format: --name-only --diff-filter=A', { cwd : repositoryPath }, function (error, stdout) { 245 | // Keep track of how many files have been processed 246 | var logCmds = getLogCmds(provObject, stdout, urlprefix, options); 247 | 248 | executeLogCmd(logCmds.pop()); 249 | function executeLogCmd(logcmd) { 250 | exec( logcmd, { cwd : repositoryPath }, function (error, stdout) { 251 | var output = stdout.toString().replace(/&\n/g,''); 252 | var lines = output.split('\n'); 253 | // For some reason, git log appends empty lines here and there. Let's fitler them out. 254 | lines = lines.filter(function(element) { return element !== ""; }); 255 | lines.forEach(function(line){ 256 | updateProvObj(provObject, urlprefix, getCommitObj(line)); }); 257 | if (logCmds.length) { 258 | executeLogCmd(logCmds.pop()); 259 | } 260 | else { 261 | serialize(serialization, provObject, ignore, callback); 262 | } 263 | }); 264 | } 265 | }); 266 | } 267 | 268 | exports.convert = convert; 269 | exports.getProvObject = getProvObject; 270 | exports.getCommitObj = getCommitObj; 271 | exports.updateProvObj = updateProvObj; 272 | exports.getPrefixes = getPrefixes; 273 | exports.getLogCommands = getLogCmds; -------------------------------------------------------------------------------- /test/testProvNdata.n3: -------------------------------------------------------------------------------- 1 | document 2 | prefix result 3 | prefix fullResult 4 | bundle result:provenance 5 | entity(result:file--gitignore, [prov:label=".gitignore"]) 6 | entity(result:file-Berksfile, [prov:label="Berksfile"]) 7 | entity(result:file-Linux-call_watcher-c, [prov:label="Linux/call_watcher.c"]) 8 | entity(result:file-Linux-test-sh, [prov:label="Linux/test.sh"]) 9 | entity(result:file-Mac-call_watcher-c, [prov:label="Mac/call_watcher.c"]) 10 | entity(result:file-Mac-test-c, [prov:label="Mac/test.c"]) 11 | entity(result:file-Mac-test-sh, [prov:label="Mac/test.sh"]) 12 | entity(result:file-Vagrantfile, [prov:label="Vagrantfile"]) 13 | entity(result:file-LICENSE, [prov:label="LICENSE"]) 14 | entity(result:file-README-md, [prov:label="README.md"]) 15 | entity(result:file-Linux-Makefile, [prov:label="Linux/Makefile"]) 16 | entity(result:file-Linux-myPreload-c, [prov:label="Linux/myPreload.c"]) 17 | entity(result:file-Linux-test-c, [prov:label="Linux/test.c"]) 18 | entity(result:file-Mac-Makefile, [prov:label="Mac/Makefile"]) 19 | entity(result:file-Mac-inject-h, [prov:label="Mac/inject.h"]) 20 | entity(result:file-Mac-inject-m, [prov:label="Mac/inject.m"]) 21 | entity(result:file-Mac-open-c, [prov:label="Mac/open.c"]) 22 | entity(result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d) 23 | entity(result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162) 24 | entity(result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d) 25 | entity(result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162) 26 | entity(result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d) 27 | entity(result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162) 28 | entity(result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d) 29 | entity(result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162) 30 | entity(result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d) 31 | entity(result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162) 32 | entity(result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d) 33 | entity(result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162) 34 | entity(result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d) 35 | entity(result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162) 36 | entity(result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d) 37 | entity(result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a) 38 | entity(result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a) 39 | entity(result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d) 40 | entity(result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d) 41 | entity(result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d) 42 | entity(result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d) 43 | entity(result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d) 44 | entity(result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d) 45 | entity(result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d) 46 | entity(result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d) 47 | agent(result:user-vlad, [prov:label="vlad"]) 48 | agent(result:user-Vlad-Korolev, [prov:label="Vlad Korolev"]) 49 | activity(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, [prov:label="Modernized and harmonized the code"]) 50 | activity(result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, [prov:label="Initial import"]) 51 | activity(result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, [prov:label="Initial commit"]) 52 | wasStartedBy(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, -, -, 2014-08-14T13:42:05.000Z) 53 | wasStartedBy(result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, -, -, 2014-08-13T00:06:41.000Z) 54 | wasStartedBy(result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, -, -, 2014-08-14T15:21:06.000Z) 55 | wasEndedBy(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, -, -, 2014-08-14T15:50:51.000Z) 56 | wasEndedBy(result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, -, -, 2014-08-13T00:06:41.000Z) 57 | wasEndedBy(result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, -, -, 2014-08-14T15:41:35.000Z) 58 | wasAttributedTo(result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"]) 59 | wasAttributedTo(result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:user-vlad, [prov:type="authorship"]) 60 | wasAttributedTo(result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"]) 61 | wasAttributedTo(result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:user-vlad, [prov:type="authorship"]) 62 | wasAttributedTo(result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"]) 63 | wasAttributedTo(result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:user-vlad, [prov:type="authorship"]) 64 | wasAttributedTo(result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"]) 65 | wasAttributedTo(result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:user-vlad, [prov:type="authorship"]) 66 | wasAttributedTo(result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"]) 67 | wasAttributedTo(result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:user-vlad, [prov:type="authorship"]) 68 | wasAttributedTo(result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"]) 69 | wasAttributedTo(result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:user-vlad, [prov:type="authorship"]) 70 | wasAttributedTo(result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"]) 71 | wasAttributedTo(result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:user-vlad, [prov:type="authorship"]) 72 | wasAttributedTo(result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"]) 73 | wasAttributedTo(result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:user-Vlad-Korolev, [prov:type="authorship"]) 74 | wasAttributedTo(result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:user-Vlad-Korolev, [prov:type="authorship"]) 75 | wasAttributedTo(result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"]) 76 | wasAttributedTo(result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"]) 77 | wasAttributedTo(result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"]) 78 | wasAttributedTo(result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"]) 79 | wasAttributedTo(result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"]) 80 | wasAttributedTo(result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"]) 81 | wasAttributedTo(result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"]) 82 | wasAttributedTo(result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:type="authorship"]) 83 | wasAssociatedWith(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:user-vlad, [prov:role="author, committer"]) 84 | wasAssociatedWith(result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:user-vlad, [prov:role="author, committer"]) 85 | wasAssociatedWith(result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:user-Vlad-Korolev, [prov:role="author"]) 86 | wasAssociatedWith(result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:user-vlad, [prov:role="committer, committer"]) 87 | wasInformedBy(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a) 88 | specializationOf(result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-open-c) 89 | specializationOf(result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:file-Mac-open-c) 90 | specializationOf(result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-inject-m) 91 | specializationOf(result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:file-Mac-inject-m) 92 | specializationOf(result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-inject-h) 93 | specializationOf(result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:file-Mac-inject-h) 94 | specializationOf(result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-Makefile) 95 | specializationOf(result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:file-Mac-Makefile) 96 | specializationOf(result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-test-c) 97 | specializationOf(result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:file-Linux-test-c) 98 | specializationOf(result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-myPreload-c) 99 | specializationOf(result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:file-Linux-myPreload-c) 100 | specializationOf(result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-Makefile) 101 | specializationOf(result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:file-Linux-Makefile) 102 | specializationOf(result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-README-md) 103 | specializationOf(result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:file-README-md) 104 | specializationOf(result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:file-LICENSE) 105 | specializationOf(result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Vagrantfile) 106 | specializationOf(result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-test-sh) 107 | specializationOf(result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-test-c) 108 | specializationOf(result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-call_watcher-c) 109 | specializationOf(result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-test-sh) 110 | specializationOf(result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-call_watcher-c) 111 | specializationOf(result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Berksfile) 112 | specializationOf(result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file--gitignore) 113 | wasGeneratedBy(result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, 2014-08-13T00:06:41.000Z) 114 | wasGeneratedBy(result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, 2014-08-13T00:06:41.000Z) 115 | wasGeneratedBy(result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, 2014-08-13T00:06:41.000Z) 116 | wasGeneratedBy(result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z) 117 | wasGeneratedBy(result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, 2014-08-13T00:06:41.000Z) 118 | wasGeneratedBy(result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z) 119 | wasGeneratedBy(result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, 2014-08-13T00:06:41.000Z) 120 | wasGeneratedBy(result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, 2014-08-13T00:06:41.000Z) 121 | wasGeneratedBy(result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z) 122 | wasGeneratedBy(result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162, 2014-08-13T00:06:41.000Z) 123 | wasGeneratedBy(result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z) 124 | wasGeneratedBy(result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, 2014-08-14T15:21:06.000Z) 125 | wasGeneratedBy(result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, 2014-08-14T15:21:06.000Z) 126 | wasGeneratedBy(result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z) 127 | wasGeneratedBy(result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z) 128 | wasGeneratedBy(result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z) 129 | wasGeneratedBy(result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z) 130 | wasGeneratedBy(result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z) 131 | wasGeneratedBy(result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z) 132 | wasGeneratedBy(result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z) 133 | wasGeneratedBy(result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z) 134 | used(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, 2014-08-14T13:42:05.000Z) 135 | used(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, 2014-08-14T13:42:05.000Z) 136 | used(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, 2014-08-14T13:42:05.000Z) 137 | used(result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, 2014-08-14T13:42:05.000Z) 138 | wasDerivedFrom(result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen, result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use) 139 | wasDerivedFrom(result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen, result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use) 140 | wasDerivedFrom(result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen, result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use) 141 | wasDerivedFrom(result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen, result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use) 142 | wasInvalidatedBy(result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z) 143 | wasInvalidatedBy(result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z) 144 | wasInvalidatedBy(result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z) 145 | wasInvalidatedBy(result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d, 2014-08-14T13:42:05.000Z) 146 | endBundle 147 | endDocument 148 | -------------------------------------------------------------------------------- /test/testProvOdata.n3: -------------------------------------------------------------------------------- 1 | @prefix fullResult: . 2 | @prefix prov: . 3 | @prefix rdfs: . 4 | @prefix result: . 5 | @prefix xsd: . 6 | result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a a prov:Activity ; 7 | prov:endedAtTime "2014-08-14T15:41:35.000Z"^^xsd:dateTime ; 8 | prov:qualifiedAssociation [ a prov:Association ; prov:agent result:user-vlad ; prov:hadRole "committer, committer"@en ] , 9 | [ a prov:Association ; prov:agent result:user-Vlad-Korolev ; prov:hadRole "author"@en ] ; 10 | prov:startedAtTime "2014-08-14T15:21:06.000Z"^^xsd:dateTime ; 11 | prov:wasAssociatedWith result:user-vlad , 12 | result:user-Vlad-Korolev ; 13 | rdfs:label "Initial commit"@en . 14 | result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Activity ; 15 | prov:endedAtTime "2014-08-14T15:50:51.000Z"^^xsd:dateTime ; 16 | prov:qualifiedAssociation [ a prov:Association ; prov:agent result:user-vlad ; prov:hadRole "author, committer"@en ] ; 17 | prov:qualifiedUsage [ a prov:Usage ; prov:entity result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] , 18 | [ a prov:Usage ; prov:entity result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] , 19 | [ a prov:Usage ; prov:entity result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] , 20 | [ a prov:Usage ; prov:entity result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ; 21 | prov:startedAtTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ; 22 | prov:used result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a , 23 | result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a , 24 | result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a , 25 | result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; 26 | prov:wasAssociatedWith result:user-vlad ; 27 | prov:wasInformedBy result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; 28 | rdfs:label "Modernized and harmonized the code"@en . 29 | result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 a prov:Activity ; 30 | prov:endedAtTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ; 31 | prov:qualifiedAssociation [ a prov:Association ; prov:agent result:user-vlad ; prov:hadRole "author, committer"@en ] ; 32 | prov:startedAtTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ; 33 | prov:wasAssociatedWith result:user-vlad ; 34 | rdfs:label "Initial import"@en . 35 | result:file--gitignore a prov:Entity ; 36 | rdfs:label ".gitignore"@en . 37 | result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ; 38 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 39 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ; 40 | prov:specializationOf result:file--gitignore ; 41 | prov:wasAttributedTo result:user-vlad ; 42 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d . 43 | result:file-Berksfile a prov:Entity ; 44 | rdfs:label "Berksfile"@en . 45 | result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ; 46 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 47 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ; 48 | prov:specializationOf result:file-Berksfile ; 49 | prov:wasAttributedTo result:user-vlad ; 50 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d . 51 | result:file-LICENSE a prov:Entity ; 52 | rdfs:label "LICENSE"@en . 53 | result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a a prov:Entity ; 54 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-Vlad-Korolev ; a "authorship"@en ] ; 55 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:atTime "2014-08-14T15:21:06.000Z"^^xsd:dateTime ] ; 56 | prov:specializationOf result:file-LICENSE ; 57 | prov:wasAttributedTo result:user-Vlad-Korolev ; 58 | prov:wasGeneratedBy result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a . 59 | result:file-Linux-call_watcher-c a prov:Entity ; 60 | rdfs:label "Linux/call_watcher.c"@en . 61 | result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ; 62 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 63 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ; 64 | prov:specializationOf result:file-Linux-call_watcher-c ; 65 | prov:wasAttributedTo result:user-vlad ; 66 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d . 67 | result:file-Linux-Makefile a prov:Entity ; 68 | rdfs:label "Linux/Makefile"@en . 69 | result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ; 70 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 71 | prov:qualifiedDerivation [ a prov:Derivation ; prov:entity result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:hadGeneration result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen ; prov:hadUsage result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use ; prov:hadActivity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ] ; 72 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ; 73 | prov:specializationOf result:file-Linux-Makefile ; 74 | prov:wasAttributedTo result:user-vlad ; 75 | prov:wasDerivedFrom result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; 76 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d . 77 | result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 a prov:Entity ; 78 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 79 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 ; prov:atTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ] ; 80 | prov:specializationOf result:file-Linux-Makefile ; 81 | prov:wasAttributedTo result:user-vlad ; 82 | prov:wasGeneratedBy result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 . 83 | result:file-Linux-myPreload-c a prov:Entity ; 84 | rdfs:label "Linux/myPreload.c"@en . 85 | result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ; 86 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 87 | prov:qualifiedInvalidation [ a prov:Invalidation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ; 88 | prov:specializationOf result:file-Linux-myPreload-c ; 89 | prov:wasAttributedTo result:user-vlad ; 90 | prov:wasInvalidatedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d . 91 | result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 a prov:Entity ; 92 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 93 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 ; prov:atTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ] ; 94 | prov:specializationOf result:file-Linux-myPreload-c ; 95 | prov:wasAttributedTo result:user-vlad ; 96 | prov:wasGeneratedBy result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 . 97 | result:file-Linux-test-c a prov:Entity ; 98 | rdfs:label "Linux/test.c"@en . 99 | result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ; 100 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 101 | prov:qualifiedDerivation [ a prov:Derivation ; prov:entity result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:hadGeneration result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen ; prov:hadUsage result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use ; prov:hadActivity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ] ; 102 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ; 103 | prov:specializationOf result:file-Linux-test-c ; 104 | prov:wasAttributedTo result:user-vlad ; 105 | prov:wasDerivedFrom result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; 106 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d . 107 | result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 a prov:Entity ; 108 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 109 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 ; prov:atTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ] ; 110 | prov:specializationOf result:file-Linux-test-c ; 111 | prov:wasAttributedTo result:user-vlad ; 112 | prov:wasGeneratedBy result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 . 113 | result:file-Linux-test-sh a prov:Entity ; 114 | rdfs:label "Linux/test.sh"@en . 115 | result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ; 116 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 117 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ; 118 | prov:specializationOf result:file-Linux-test-sh ; 119 | prov:wasAttributedTo result:user-vlad ; 120 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d . 121 | result:file-Mac-call_watcher-c a prov:Entity ; 122 | rdfs:label "Mac/call_watcher.c"@en . 123 | result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ; 124 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 125 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ; 126 | prov:specializationOf result:file-Mac-call_watcher-c ; 127 | prov:wasAttributedTo result:user-vlad ; 128 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d . 129 | result:file-Mac-inject-h a prov:Entity ; 130 | rdfs:label "Mac/inject.h"@en . 131 | result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ; 132 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 133 | prov:qualifiedInvalidation [ a prov:Invalidation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ; 134 | prov:specializationOf result:file-Mac-inject-h ; 135 | prov:wasAttributedTo result:user-vlad ; 136 | prov:wasInvalidatedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d . 137 | result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 a prov:Entity ; 138 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 139 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 ; prov:atTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ] ; 140 | prov:specializationOf result:file-Mac-inject-h ; 141 | prov:wasAttributedTo result:user-vlad ; 142 | prov:wasGeneratedBy result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 . 143 | result:file-Mac-inject-m a prov:Entity ; 144 | rdfs:label "Mac/inject.m"@en . 145 | result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ; 146 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 147 | prov:qualifiedInvalidation [ a prov:Invalidation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ; 148 | prov:specializationOf result:file-Mac-inject-m ; 149 | prov:wasAttributedTo result:user-vlad ; 150 | prov:wasInvalidatedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d . 151 | result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 a prov:Entity ; 152 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 153 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 ; prov:atTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ] ; 154 | prov:specializationOf result:file-Mac-inject-m ; 155 | prov:wasAttributedTo result:user-vlad ; 156 | prov:wasGeneratedBy result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 . 157 | result:file-Mac-Makefile a prov:Entity ; 158 | rdfs:label "Mac/Makefile"@en . 159 | result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ; 160 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 161 | prov:qualifiedDerivation [ a prov:Derivation ; prov:entity result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:hadGeneration result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen ; prov:hadUsage result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use ; prov:hadActivity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ] ; 162 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ; 163 | prov:specializationOf result:file-Mac-Makefile ; 164 | prov:wasAttributedTo result:user-vlad ; 165 | prov:wasDerivedFrom result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; 166 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d . 167 | result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 a prov:Entity ; 168 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 169 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 ; prov:atTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ] ; 170 | prov:specializationOf result:file-Mac-Makefile ; 171 | prov:wasAttributedTo result:user-vlad ; 172 | prov:wasGeneratedBy result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 . 173 | result:file-Mac-open-c a prov:Entity ; 174 | rdfs:label "Mac/open.c"@en . 175 | result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ; 176 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 177 | prov:qualifiedInvalidation [ a prov:Invalidation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ; 178 | prov:specializationOf result:file-Mac-open-c ; 179 | prov:wasAttributedTo result:user-vlad ; 180 | prov:wasInvalidatedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d . 181 | result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 a prov:Entity ; 182 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 183 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 ; prov:atTime "2014-08-13T00:06:41.000Z"^^xsd:dateTime ] ; 184 | prov:specializationOf result:file-Mac-open-c ; 185 | prov:wasAttributedTo result:user-vlad ; 186 | prov:wasGeneratedBy result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162 . 187 | result:file-Mac-test-c a prov:Entity ; 188 | rdfs:label "Mac/test.c"@en . 189 | result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ; 190 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 191 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ; 192 | prov:specializationOf result:file-Mac-test-c ; 193 | prov:wasAttributedTo result:user-vlad ; 194 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d . 195 | result:file-Mac-test-sh a prov:Entity ; 196 | rdfs:label "Mac/test.sh"@en . 197 | result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ; 198 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 199 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ; 200 | prov:specializationOf result:file-Mac-test-sh ; 201 | prov:wasAttributedTo result:user-vlad ; 202 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d . 203 | result:file-README-md a prov:Entity ; 204 | rdfs:label "README.md"@en . 205 | result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a a prov:Entity ; 206 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-Vlad-Korolev ; a "authorship"@en ] ; 207 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:atTime "2014-08-14T15:21:06.000Z"^^xsd:dateTime ] ; 208 | prov:specializationOf result:file-README-md ; 209 | prov:wasAttributedTo result:user-Vlad-Korolev ; 210 | prov:wasGeneratedBy result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a . 211 | result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ; 212 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 213 | prov:qualifiedDerivation [ a prov:Derivation ; prov:entity result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; prov:hadGeneration result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen ; prov:hadUsage result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use ; prov:hadActivity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ] ; 214 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ; 215 | prov:specializationOf result:file-README-md ; 216 | prov:wasAttributedTo result:user-vlad ; 217 | prov:wasDerivedFrom result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a ; 218 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d . 219 | result:file-Vagrantfile a prov:Entity ; 220 | rdfs:label "Vagrantfile"@en . 221 | result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d a prov:Entity ; 222 | prov:qualifiedAttribution [ a prov:Attribution ; prov:agent result:user-vlad ; a "authorship"@en ] ; 223 | prov:qualifiedGeneration [ a prov:Generation ; prov:activity result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d ; prov:atTime "2014-08-14T13:42:05.000Z"^^xsd:dateTime ] ; 224 | prov:specializationOf result:file-Vagrantfile ; 225 | prov:wasAttributedTo result:user-vlad ; 226 | prov:wasGeneratedBy result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d . 227 | result:provenance a prov:Bundle ; 228 | prov:alternateOf fullResult:provenance . 229 | result:user-vlad a prov:Agent ; 230 | rdfs:label "vlad"@en . 231 | result:user-Vlad-Korolev a prov:Agent ; 232 | rdfs:label "Vlad Korolev"@en . -------------------------------------------------------------------------------- /lib/provSerializer.js: -------------------------------------------------------------------------------- 1 | /* A module that has functions to serialize arrays of data into PROV-N, PROV-O or PROV-XML */ 2 | var n3 = require('n3'); 3 | 4 | /* Serialize the specified entries in the specified serialization (default: PROV-N) */ 5 | function serialize(serialization, provObject, ignore, callback){ 6 | switch(serialization) { 7 | case "PROV-JSON": 8 | serializePROVJSON(provObject, ignore, callback); 9 | break; 10 | case "PROV-O": 11 | serializePROVO(provObject, ignore, callback); 12 | break; 13 | case "PROV-XML": 14 | serializePROVXML(provObject, ignore, callback); 15 | break; 16 | default: 17 | serializePROVN(provObject, ignore, callback); 18 | } 19 | } 20 | 21 | function shouldBeAdded(provSet, ignoreBLock, arg, ignoreAttr) { 22 | return provSet.hasOwnProperty(arg) && ignoreBLock.indexOf(ignoreAttr) < 0; 23 | } 24 | 25 | function addToJSONBundleIfNeeded(provJSONObject, provObject, ignoreBlock, attrPlural, attrSingular) { 26 | 27 | var provSet = provObject[attrPlural]; 28 | var bundlename = provObject.bundle; 29 | 30 | if (provSet && ignoreBlock.indexOf(attrSingular) < 0) { 31 | provJSONObject.bundle[bundlename][attrSingular] = provSet; 32 | } 33 | } 34 | 35 | 36 | /* Serialize the specified entries as a PROV-JSON object */ 37 | function serializePROVJSON(provObject, ignore, callback){ 38 | 39 | var provJSONObject = {}; 40 | provJSONObject.prefix = provObject.prefixes; 41 | provJSONObject.bundle = {}; 42 | provJSONObject.bundle[provObject.bundle] = {}; 43 | 44 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'entities', 'entity'); 45 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'agents', 'agent'); 46 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'activities', 'activity'); 47 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'starts', 'wasStartedBy'); 48 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'ends', 'wasEndedBy'); 49 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'attributions', 'wasAttributedTo'); 50 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'associations', 'wasAssociatedWith'); 51 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'communications', 'wasInformedBy'); 52 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'specializations', 'specializationOf'); 53 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'generations', 'wasGeneratedBy'); 54 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'usages', 'used'); 55 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'derivations', 'wasDerivedFrom'); 56 | addToJSONBundleIfNeeded(provJSONObject, provObject, ignore, 'invalidations', 'wasInvalidatedBy'); 57 | 58 | callback(JSON.stringify(provJSONObject, undefined, 2),"text/plain");//TODO: change to text/json 59 | } 60 | 61 | 62 | 63 | function addProvNEntries(provObject, ignore, prov, section, singular, getRecord, altSubj) { 64 | 65 | 66 | var entry_collection = provObject[section]; 67 | 68 | for (var entity in entry_collection) { 69 | if (shouldBeAdded(entry_collection, ignore, entity, singular)) { 70 | var subj = (altSubj ? entry_collection[entity][altSubj] : entity ); 71 | prov += singular + "(" + subj + getRecord(entry_collection, entity) + ")" + "\n"; 72 | } 73 | } 74 | return prov; 75 | } 76 | 77 | 78 | function addPrefixes(provObject, prov) { 79 | for (var prefix in provObject.prefixes) { 80 | if (provObject.prefixes.hasOwnProperty(prefix)) { 81 | prov += "prefix " + prefix + " <" + provObject.prefixes[prefix] + ">" + "\n"; 82 | } 83 | } 84 | return prov; 85 | } 86 | 87 | function getEntityRecord(entities, entity) { 88 | return (entities[entity]["prov:label"] ? ", [prov:label=\"" + entities[entity]["prov:label"] + "\"]" : ""); 89 | } 90 | 91 | function getWasStartedByRecord(starts, start) { 92 | return ", -, -, " + starts[start]["prov:time"]; 93 | } 94 | 95 | function getAttributionRecord(attributions, attribution) { 96 | return ", " + attributions[attribution]["prov:agent"] + ", [prov:type=\"" + attributions[attribution]["prov:type"] + "\"]"; 97 | } 98 | 99 | function getAssociationsRecord(associations, association) { 100 | return ", " + associations[association]["prov:agent"] + ", [prov:role=\"" + associations[association]["prov:role"] + "\"]"; 101 | } 102 | 103 | function getCommunicationRecord(communications, communication) { 104 | return ", " + communications[communication]["prov:informant"]; 105 | } 106 | 107 | function getSpecializationRecord(specializations, specialization) { 108 | return ", " + specializations[specialization]["prov:generalEntity"]; 109 | } 110 | 111 | function getGenerationRecord(generations, generation) { 112 | return ", " + generations[generation]["prov:activity"] + ", " + generations[generation]["prov:time"]; 113 | } 114 | 115 | function getUsageRecord(usages, usage) { 116 | return ", " + usages[usage]["prov:entity"] + ", " + usages[usage]["prov:time"]; 117 | } 118 | 119 | 120 | function getDerivationRecord(derivations, derivation) { 121 | return ", " + derivations[derivation]["prov:usedEntity"] + ", " + derivations[derivation]["prov:activity"] + 122 | ", " + derivations[derivation]["prov:generation"] + ", " + derivations[derivation]["prov:usage"]; 123 | } 124 | 125 | function getInvalidationRecord(invalidations, invalidation) { 126 | return ", " + invalidations[invalidation]["prov:activity"] + ", " + invalidations[invalidation]["prov:time"]; 127 | } 128 | 129 | /* Serialize the specified PROV-JSON object in PROV-N */ 130 | function serializePROVN(provObject, ignore, callback){ 131 | //write everything to the result string 132 | var prov = "document" + "\n"; 133 | 134 | prov = addPrefixes(provObject, prov); 135 | prov += "bundle " + provObject.bundle + "\n"; 136 | 137 | prov = addProvNEntries(provObject, ignore, prov, 'entities', 'entity', getEntityRecord); 138 | prov = addProvNEntries(provObject, ignore, prov, 'agents', 'agent', getEntityRecord); 139 | prov = addProvNEntries(provObject, ignore, prov, 'activities', 'activity', getEntityRecord); 140 | prov = addProvNEntries(provObject, ignore, prov, 'starts', 'wasStartedBy', getWasStartedByRecord, "prov:activity"); 141 | prov = addProvNEntries(provObject, ignore, prov, 'ends', 'wasEndedBy', getWasStartedByRecord, "prov:activity" ); 142 | prov = addProvNEntries(provObject, ignore, prov, 'attributions', 'wasAttributedTo', getAttributionRecord, "prov:entity" ); 143 | prov = addProvNEntries(provObject, ignore, prov, 'associations', 'wasAssociatedWith', getAssociationsRecord, "prov:activity" ); 144 | prov = addProvNEntries(provObject, ignore, prov, 'communications', 'wasInformedBy', getCommunicationRecord, "prov:informed" ); 145 | prov = addProvNEntries(provObject, ignore, prov, 'specializations', 'specializationOf', getSpecializationRecord, "prov:specificEntity" ); 146 | prov = addProvNEntries(provObject, ignore, prov, 'generations', 'wasGeneratedBy', getGenerationRecord, "prov:entity" ); 147 | prov = addProvNEntries(provObject, ignore, prov, 'usages', 'used', getUsageRecord, "prov:activity" ); 148 | prov = addProvNEntries(provObject, ignore, prov, 'derivations', 'wasDerivedFrom', getDerivationRecord, "prov:generatedEntity" ); 149 | prov = addProvNEntries(provObject, ignore, prov, 'invalidations', 'wasInvalidatedBy', getInvalidationRecord, "prov:entity" ); 150 | 151 | 152 | prov += "endBundle " + "\n"; 153 | prov += "endDocument" + "\n"; 154 | callback(prov,"text/plain");//TODO: change to text/prov-notation 155 | } 156 | 157 | function cmp(a, b) { 158 | return (a.toLowerCase() > b.toLowerCase()) ? 1 : 159 | ((a.toLowerCase() < b.toLowerCase()) ? -1 : 0); 160 | } 161 | 162 | 163 | /* Serialize the specified PROV-JSON object in PROV-O */ 164 | function statementFromTriple(triple, count, sameSubj, samePred) { 165 | 166 | var statement = ""; 167 | 168 | if (count > 0) { 169 | statement += (sameSubj ? (samePred ? "," : ";") : ".") + "\n"; 170 | } 171 | 172 | if (sameSubj) { 173 | statement += "\t" + "\t"; 174 | } else { 175 | statement += triple.subject + "\t"; 176 | } 177 | 178 | if (sameSubj && samePred) { 179 | statement += "\t"; 180 | } else { 181 | statement += triple.predicate; 182 | } 183 | 184 | statement += "\t" + triple.object + " "; 185 | 186 | return statement; 187 | } 188 | 189 | 190 | function getTurtle(store) { 191 | var provo = ""; 192 | 193 | 194 | var triples = store.find(); 195 | triples = triples.sort(function (a, b) { 196 | return cmp(a.subject, b.subject) || cmp(a.predicate, b.predicate) || cmp(a.object, b.object); 197 | }); 198 | 199 | 200 | var previousTriple = {}; 201 | var count = 0; 202 | triples.forEach(function (triple) { 203 | if (triple.subject === "@prefix") { 204 | // For prefixes, always rewrite the subject 205 | provo += triple.subject + " " + triple.predicate + " " + triple.object + " .\n"; 206 | } else { 207 | // For all other triples, don't re-write the subject/predicate when it's the same as the previous 208 | var prevSubj = previousTriple.subject === triple.subject; 209 | var prevPred = previousTriple.predicate === triple.predicate; 210 | provo += statementFromTriple(triple, count, prevSubj, prevPred); 211 | count++; 212 | } 213 | previousTriple = triple; 214 | }); 215 | provo += "."; 216 | return provo; 217 | } 218 | 219 | 220 | function capitalize(string){ 221 | return string.charAt(0).toUpperCase() + string.slice(1); 222 | } 223 | 224 | 225 | 226 | function addEntityRecord(store, entityCollection, entity, subject) { 227 | store.addTriple(subject, "rdfs:label", "\"" + entityCollection[entity]["prov:label"] + "\"@en"); 228 | } 229 | 230 | function addActivityStartedAtRecord(store, entityCollection, entity, subject) { 231 | store.addTriple(subject, "prov:startedAtTime", "\"" + entityCollection[entity]["prov:time"] + "\"^^xsd:dateTime"); 232 | } 233 | 234 | function addActivityEndedAtRecord(store, entityCollection, entity, subject) { 235 | store.addTriple(subject, "prov:endedAtTime", "\"" + entityCollection[entity]["prov:time"] + "\"^^xsd:dateTime"); 236 | } 237 | 238 | function addCommunicationRecord(store, entityCollection, entity, subject) { 239 | store.addTriple(subject, "prov:wasInformedBy", entityCollection[entity]["prov:informant"]); 240 | } 241 | 242 | function addGeneralizationRecord(store, entityCollection, entity, subject) { 243 | store.addTriple(subject, "prov:specializationOf", entityCollection[entity]["prov:generalEntity"]); 244 | } 245 | 246 | 247 | function addGenerationsRecords(store, entityCollection, entity, singular, subj) { 248 | 249 | var record = entityCollection[entity]; 250 | store.addTriple(subj, "prov:"+ singular, record["prov:activity"]); 251 | if (record["prov:time"]) { 252 | store.addTriple(subj, "prov:qualifiedGeneration", 253 | "[ a prov:Generation ; prov:activity " + record["prov:activity"] + " ; " + 254 | "prov:atTime \"" + record["prov:time"] + "\"^^xsd:dateTime ]"); 255 | } 256 | //TODO: format this better 257 | } 258 | 259 | function addUsageRecords(store, entityCollection, entity, singular, subj) { 260 | 261 | var record = entityCollection[entity]; 262 | store.addTriple(subj, "prov:" + singular, record["prov:entity"]); 263 | if (record["prov:time"]) { 264 | store.addTriple(subj, "prov:qualifiedUsage", 265 | "[ a prov:Usage ; prov:entity " + record["prov:entity"] + " ; " + 266 | "prov:atTime \"" + record["prov:time"] + "\"^^xsd:dateTime ]"); 267 | } 268 | //TODO: format this better 269 | } 270 | 271 | 272 | function addDerivationRecords(store, entityCollection, entity, singular, subj) { 273 | 274 | var record = entityCollection[entity]; 275 | store.addTriple(subj, "prov:"+ singular, record["prov:usedEntity"]); 276 | if (record["prov:generation"] && record["prov:usage"] && 277 | record["prov:activity"]) { 278 | store.addTriple(subj, "prov:qualifiedDerivation", 279 | "[ a prov:Derivation ; prov:entity " + record["prov:usedEntity"] + " ; " + 280 | "prov:hadGeneration " + record["prov:generation"] + " ; " + 281 | "prov:hadUsage " + record["prov:usage"] + " ; " + 282 | "prov:hadActivity " + record["prov:activity"] + " ]"); 283 | } 284 | //TODO: format this better 285 | } 286 | 287 | function addInvalidationRecords(store, entityCollection, entity, singular, subj) { 288 | 289 | store.addTriple(subj, "prov:"+ singular, entityCollection[entity]["prov:activity"]); 290 | if (entityCollection[entity]["prov:time"]) { 291 | store.addTriple(subj, "prov:qualifiedInvalidation", 292 | "[ a prov:Invalidation ; prov:activity " + entityCollection[entity]["prov:activity"] + " ; " + 293 | "prov:atTime \"" + entityCollection[entity]["prov:time"] + "\"^^xsd:dateTime ]"); 294 | } 295 | } 296 | 297 | 298 | 299 | function addAttributionRecords(store, entityCollection, entity, singular, subj) { 300 | store.addTriple(subj, "prov:" + singular, entityCollection[entity]["prov:agent"]); 301 | if (entityCollection[entity]["prov:type"]) { 302 | store.addTriple(subj, "prov:qualifiedAttribution", 303 | "[ a prov:Attribution ; prov:agent " + entityCollection[entity]["prov:agent"] + " ; " + 304 | "a \"" + entityCollection[entity]["prov:type"] + "\"@en ]"); 305 | } 306 | } 307 | 308 | function addAssociationRecords(store, entityCollection, entity, singular, subj) { 309 | var record = entityCollection[entity]; 310 | store.addTriple(subj, "prov:" + singular, record["prov:agent"]); 311 | if (record["prov:role"]) { 312 | store.addTriple(subj, "prov:qualifiedAssociation", 313 | "[ a prov:Association ; prov:agent " + record["prov:agent"] + " ; " + 314 | "prov:hadRole \"" + record["prov:role"] + "\"@en ]"); 315 | } 316 | } 317 | 318 | 319 | function addProvEntityTriples(store, provObject, ignore, section, singular, recordWriter, altSubj) { 320 | var entityCollection = provObject[section]; 321 | for (var entity in entityCollection) { 322 | if (shouldBeAdded(entityCollection, ignore, entity, singular)) { 323 | altSubj || store.addTriple(entity, "a", "prov:" + capitalize(singular)); 324 | if (entityCollection[entity]["prov:label"] || altSubj ) { 325 | var subj = (altSubj ? entityCollection[entity][altSubj] : entity ); 326 | recordWriter(store, entityCollection, entity, subj); 327 | } 328 | } 329 | } 330 | } 331 | 332 | function addProvEntityTriplesDbl(store, provObject, ignore, section, singular, recordWriter, altSubj) { 333 | var entityCollection = provObject[section]; 334 | for (var entity in entityCollection) { 335 | if (shouldBeAdded(entityCollection, ignore, entity, singular)) { 336 | var subj = entityCollection[entity][altSubj]; 337 | recordWriter(store, entityCollection, entity, singular, subj); 338 | //TODO: format this better 339 | } 340 | } 341 | } 342 | 343 | 344 | function addPrefixTriples(store, provObject) { 345 | store.addTriple("@prefix", "prov:", ""); 346 | store.addTriple("@prefix", "rdfs:", ""); 347 | store.addTriple("@prefix", "xsd:", ""); 348 | 349 | for (var prefix in provObject.prefixes) { 350 | if (provObject.prefixes.hasOwnProperty(prefix)) { 351 | store.addTriple("@prefix", prefix + ":", "<" + provObject.prefixes[prefix] + ">"); 352 | } 353 | } 354 | } 355 | 356 | 357 | function addAltBundleTriples(provObject, store) { 358 | if (provObject.bundle) { 359 | store.addTriple(provObject.bundle, "a", "prov:Bundle"); 360 | if (provObject.alternateBundle) { 361 | store.addTriple(provObject.bundle, "prov:alternateOf", provObject.alternateBundle); 362 | } 363 | } 364 | } 365 | 366 | 367 | 368 | function storeProvInN3(store, provObject, ignore) { 369 | 370 | addPrefixTriples(store, provObject); 371 | addAltBundleTriples(provObject, store); 372 | 373 | 374 | addProvEntityTriples(store, provObject, ignore, 'entities', 'entity', addEntityRecord); 375 | addProvEntityTriples(store, provObject, ignore, 'agents', 'agent', addEntityRecord); 376 | addProvEntityTriples(store, provObject, ignore, 'activities', 'activity', addEntityRecord); 377 | addProvEntityTriples(store, provObject, ignore, 'starts', 'wasStartedBy', addActivityStartedAtRecord, "prov:activity"); 378 | addProvEntityTriples(store, provObject, ignore, 'ends', 'wasEndedBy', addActivityEndedAtRecord, "prov:activity"); 379 | 380 | addProvEntityTriplesDbl(store, provObject, ignore, 'attributions', 'wasAttributedTo', addAttributionRecords, "prov:entity"); 381 | addProvEntityTriplesDbl(store, provObject, ignore, 'associations', 'wasAssociatedWith', addAssociationRecords, "prov:activity"); 382 | 383 | addProvEntityTriples(store, provObject, ignore, 'communications', 'wasInformedBy', addCommunicationRecord, "prov:informed"); 384 | addProvEntityTriples(store, provObject, ignore, 'specializations', 'specializationOf', addGeneralizationRecord, "prov:specificEntity"); 385 | 386 | addProvEntityTriplesDbl(store, provObject, ignore, 'generations', 'wasGeneratedBy', addGenerationsRecords, "prov:entity"); 387 | addProvEntityTriplesDbl(store, provObject, ignore, 'usages', 'used', addUsageRecords, "prov:activity"); 388 | addProvEntityTriplesDbl(store, provObject, ignore, 'derivations', 'wasDerivedFrom', addDerivationRecords, "prov:generatedEntity"); 389 | addProvEntityTriplesDbl(store, provObject, ignore, 'invalidations', 'wasInvalidatedBy', addInvalidationRecords, "prov:entity"); 390 | 391 | } 392 | 393 | 394 | function serializePROVO(provObject, ignore, callback){ 395 | 396 | 397 | //write everything to the triple store 398 | var store = new n3.Store(); 399 | 400 | storeProvInN3(store, provObject, ignore); 401 | 402 | // Now write everything to nice turtle 403 | callback(getTurtle(store), "text/plain");//TODO: change to RDF 404 | 405 | } 406 | 407 | /* Serialize the specified PROV-JSON object in PROV-XML */ 408 | function serializePROVXML(provObject, ignore, callback){ 409 | callback("serialization unsupported", "text/plain");//TODO: change to text/X 410 | } 411 | 412 | exports.serialize = serialize; 413 | exports.shouldBeAdded = shouldBeAdded; 414 | exports.addToJSONBundleIfNeeded = addToJSONBundleIfNeeded; 415 | exports.recordWriters = {}; 416 | exports.recordWriters.provN = {}; 417 | exports.recordWriters.provN.entity = getEntityRecord; 418 | exports.recordWriters.provN.association = getAssociationsRecord; 419 | exports.recordWriters.provN.attribution = getAttributionRecord; 420 | exports.recordWriters.provN.communication = getCommunicationRecord; 421 | exports.recordWriters.provN.wasStartedBy = getWasStartedByRecord; 422 | exports.recordWriters.provN.specialization = getSpecializationRecord; 423 | exports.recordWriters.provN.generation = getGenerationRecord; 424 | exports.recordWriters.provN.usage = getUsageRecord; 425 | exports.recordWriters.provN.invalidation = getInvalidationRecord; 426 | exports.recordWriters.provN.derivation = getDerivationRecord; 427 | exports.recordWriters.provN.addProvNEntries = addProvNEntries; 428 | exports.recordWriters.provN.addPrefixes = addPrefixes; 429 | exports.recordWriters.provO = {}; 430 | exports.recordWriters.provO.addEntities = addProvEntityTriples; 431 | exports.recordWriters.provO.addEntitiesD = addProvEntityTriplesDbl; 432 | exports.recordWriters.provO.addPrefix = addPrefixTriples; 433 | exports.recordWriters.provO.addAltBundle = addAltBundleTriples; 434 | exports.recordWriters.provO.entity = addEntityRecord; 435 | exports.recordWriters.provO.activityStart = addActivityStartedAtRecord; 436 | exports.recordWriters.provO.activityEnd = addActivityEndedAtRecord; 437 | exports.recordWriters.provO.communication = addCommunicationRecord; 438 | exports.recordWriters.provO.generalization = addGeneralizationRecord; 439 | exports.recordWriters.provO.attribution = addAttributionRecords; 440 | exports.recordWriters.provO.association = addAssociationRecords; 441 | exports.recordWriters.provO.generation = addGenerationsRecords; 442 | exports.recordWriters.provO.usage = addUsageRecords; 443 | exports.recordWriters.provO.derivation = addDerivationRecords; 444 | exports.recordWriters.provO.invalidation = addInvalidationRecords; 445 | exports.recordWriters.provO.cmp = cmp; 446 | exports.recordWriters.provO.statementFromTriple = statementFromTriple; 447 | exports.recordWriters.provO.getTurtle = getTurtle; 448 | 449 | exports.serializePROVXML = serializePROVXML; 450 | exports.serializePROVJSON = serializePROVJSON; 451 | exports.serializePROVN = serializePROVN; 452 | exports.serializePROVO = serializePROVO; -------------------------------------------------------------------------------- /public_html/css/bootstrap-responsive.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Responsive v2.2.1 3 | * 4 | * Copyright 2012 Twitter, Inc 5 | * Licensed under the Apache License v2.0 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Designed and built with all the love in the world @twitter by @mdo and @fat. 9 | */ 10 | 11 | .clearfix { 12 | *zoom: 1; 13 | } 14 | 15 | .clearfix:before, 16 | .clearfix:after { 17 | display: table; 18 | line-height: 0; 19 | content: ""; 20 | } 21 | 22 | .clearfix:after { 23 | clear: both; 24 | } 25 | 26 | .hide-text { 27 | font: 0/0 a; 28 | color: transparent; 29 | text-shadow: none; 30 | background-color: transparent; 31 | border: 0; 32 | } 33 | 34 | .input-block-level { 35 | display: block; 36 | width: 100%; 37 | min-height: 30px; 38 | -webkit-box-sizing: border-box; 39 | -moz-box-sizing: border-box; 40 | box-sizing: border-box; 41 | } 42 | 43 | .hidden { 44 | display: none; 45 | visibility: hidden; 46 | } 47 | 48 | .visible-phone { 49 | display: none !important; 50 | } 51 | 52 | .visible-tablet { 53 | display: none !important; 54 | } 55 | 56 | .hidden-desktop { 57 | display: none !important; 58 | } 59 | 60 | .visible-desktop { 61 | display: inherit !important; 62 | } 63 | 64 | @media (min-width: 768px) and (max-width: 979px) { 65 | .hidden-desktop { 66 | display: inherit !important; 67 | } 68 | .visible-desktop { 69 | display: none !important ; 70 | } 71 | .visible-tablet { 72 | display: inherit !important; 73 | } 74 | .hidden-tablet { 75 | display: none !important; 76 | } 77 | } 78 | 79 | @media (max-width: 767px) { 80 | .hidden-desktop { 81 | display: inherit !important; 82 | } 83 | .visible-desktop { 84 | display: none !important; 85 | } 86 | .visible-phone { 87 | display: inherit !important; 88 | } 89 | .hidden-phone { 90 | display: none !important; 91 | } 92 | } 93 | 94 | @media (min-width: 1200px) { 95 | .row { 96 | margin-left: -30px; 97 | *zoom: 1; 98 | } 99 | .row:before, 100 | .row:after { 101 | display: table; 102 | line-height: 0; 103 | content: ""; 104 | } 105 | .row:after { 106 | clear: both; 107 | } 108 | [class*="span"] { 109 | float: left; 110 | min-height: 1px; 111 | margin-left: 30px; 112 | } 113 | .container, 114 | .navbar-static-top .container, 115 | .navbar-fixed-top .container, 116 | .navbar-fixed-bottom .container { 117 | width: 1170px; 118 | } 119 | .span12 { 120 | width: 1170px; 121 | } 122 | .span11 { 123 | width: 1070px; 124 | } 125 | .span10 { 126 | width: 970px; 127 | } 128 | .span9 { 129 | width: 870px; 130 | } 131 | .span8 { 132 | width: 770px; 133 | } 134 | .span7 { 135 | width: 670px; 136 | } 137 | .span6 { 138 | width: 570px; 139 | } 140 | .span5 { 141 | width: 470px; 142 | } 143 | .span4 { 144 | width: 370px; 145 | } 146 | .span3 { 147 | width: 270px; 148 | } 149 | .span2 { 150 | width: 170px; 151 | } 152 | .span1 { 153 | width: 70px; 154 | } 155 | .offset12 { 156 | margin-left: 1230px; 157 | } 158 | .offset11 { 159 | margin-left: 1130px; 160 | } 161 | .offset10 { 162 | margin-left: 1030px; 163 | } 164 | .offset9 { 165 | margin-left: 930px; 166 | } 167 | .offset8 { 168 | margin-left: 830px; 169 | } 170 | .offset7 { 171 | margin-left: 730px; 172 | } 173 | .offset6 { 174 | margin-left: 630px; 175 | } 176 | .offset5 { 177 | margin-left: 530px; 178 | } 179 | .offset4 { 180 | margin-left: 430px; 181 | } 182 | .offset3 { 183 | margin-left: 330px; 184 | } 185 | .offset2 { 186 | margin-left: 230px; 187 | } 188 | .offset1 { 189 | margin-left: 130px; 190 | } 191 | .row-fluid { 192 | width: 100%; 193 | *zoom: 1; 194 | } 195 | .row-fluid:before, 196 | .row-fluid:after { 197 | display: table; 198 | line-height: 0; 199 | content: ""; 200 | } 201 | .row-fluid:after { 202 | clear: both; 203 | } 204 | .row-fluid [class*="span"] { 205 | display: block; 206 | float: left; 207 | width: 100%; 208 | min-height: 30px; 209 | margin-left: 2.564102564102564%; 210 | *margin-left: 2.5109110747408616%; 211 | -webkit-box-sizing: border-box; 212 | -moz-box-sizing: border-box; 213 | box-sizing: border-box; 214 | } 215 | .row-fluid [class*="span"]:first-child { 216 | margin-left: 0; 217 | } 218 | .row-fluid .controls-row [class*="span"] + [class*="span"] { 219 | margin-left: 2.564102564102564%; 220 | } 221 | .row-fluid .span12 { 222 | width: 100%; 223 | *width: 99.94680851063829%; 224 | } 225 | .row-fluid .span11 { 226 | width: 91.45299145299145%; 227 | *width: 91.39979996362975%; 228 | } 229 | .row-fluid .span10 { 230 | width: 82.90598290598291%; 231 | *width: 82.8527914166212%; 232 | } 233 | .row-fluid .span9 { 234 | width: 74.35897435897436%; 235 | *width: 74.30578286961266%; 236 | } 237 | .row-fluid .span8 { 238 | width: 65.81196581196582%; 239 | *width: 65.75877432260411%; 240 | } 241 | .row-fluid .span7 { 242 | width: 57.26495726495726%; 243 | *width: 57.21176577559556%; 244 | } 245 | .row-fluid .span6 { 246 | width: 48.717948717948715%; 247 | *width: 48.664757228587014%; 248 | } 249 | .row-fluid .span5 { 250 | width: 40.17094017094017%; 251 | *width: 40.11774868157847%; 252 | } 253 | .row-fluid .span4 { 254 | width: 31.623931623931625%; 255 | *width: 31.570740134569924%; 256 | } 257 | .row-fluid .span3 { 258 | width: 23.076923076923077%; 259 | *width: 23.023731587561375%; 260 | } 261 | .row-fluid .span2 { 262 | width: 14.52991452991453%; 263 | *width: 14.476723040552828%; 264 | } 265 | .row-fluid .span1 { 266 | width: 5.982905982905983%; 267 | *width: 5.929714493544281%; 268 | } 269 | .row-fluid .offset12 { 270 | margin-left: 105.12820512820512%; 271 | *margin-left: 105.02182214948171%; 272 | } 273 | .row-fluid .offset12:first-child { 274 | margin-left: 102.56410256410257%; 275 | *margin-left: 102.45771958537915%; 276 | } 277 | .row-fluid .offset11 { 278 | margin-left: 96.58119658119658%; 279 | *margin-left: 96.47481360247316%; 280 | } 281 | .row-fluid .offset11:first-child { 282 | margin-left: 94.01709401709402%; 283 | *margin-left: 93.91071103837061%; 284 | } 285 | .row-fluid .offset10 { 286 | margin-left: 88.03418803418803%; 287 | *margin-left: 87.92780505546462%; 288 | } 289 | .row-fluid .offset10:first-child { 290 | margin-left: 85.47008547008548%; 291 | *margin-left: 85.36370249136206%; 292 | } 293 | .row-fluid .offset9 { 294 | margin-left: 79.48717948717949%; 295 | *margin-left: 79.38079650845607%; 296 | } 297 | .row-fluid .offset9:first-child { 298 | margin-left: 76.92307692307693%; 299 | *margin-left: 76.81669394435352%; 300 | } 301 | .row-fluid .offset8 { 302 | margin-left: 70.94017094017094%; 303 | *margin-left: 70.83378796144753%; 304 | } 305 | .row-fluid .offset8:first-child { 306 | margin-left: 68.37606837606839%; 307 | *margin-left: 68.26968539734497%; 308 | } 309 | .row-fluid .offset7 { 310 | margin-left: 62.393162393162385%; 311 | *margin-left: 62.28677941443899%; 312 | } 313 | .row-fluid .offset7:first-child { 314 | margin-left: 59.82905982905982%; 315 | *margin-left: 59.72267685033642%; 316 | } 317 | .row-fluid .offset6 { 318 | margin-left: 53.84615384615384%; 319 | *margin-left: 53.739770867430444%; 320 | } 321 | .row-fluid .offset6:first-child { 322 | margin-left: 51.28205128205128%; 323 | *margin-left: 51.175668303327875%; 324 | } 325 | .row-fluid .offset5 { 326 | margin-left: 45.299145299145295%; 327 | *margin-left: 45.1927623204219%; 328 | } 329 | .row-fluid .offset5:first-child { 330 | margin-left: 42.73504273504273%; 331 | *margin-left: 42.62865975631933%; 332 | } 333 | .row-fluid .offset4 { 334 | margin-left: 36.75213675213675%; 335 | *margin-left: 36.645753773413354%; 336 | } 337 | .row-fluid .offset4:first-child { 338 | margin-left: 34.18803418803419%; 339 | *margin-left: 34.081651209310785%; 340 | } 341 | .row-fluid .offset3 { 342 | margin-left: 28.205128205128204%; 343 | *margin-left: 28.0987452264048%; 344 | } 345 | .row-fluid .offset3:first-child { 346 | margin-left: 25.641025641025642%; 347 | *margin-left: 25.53464266230224%; 348 | } 349 | .row-fluid .offset2 { 350 | margin-left: 19.65811965811966%; 351 | *margin-left: 19.551736679396257%; 352 | } 353 | .row-fluid .offset2:first-child { 354 | margin-left: 17.094017094017094%; 355 | *margin-left: 16.98763411529369%; 356 | } 357 | .row-fluid .offset1 { 358 | margin-left: 11.11111111111111%; 359 | *margin-left: 11.004728132387708%; 360 | } 361 | .row-fluid .offset1:first-child { 362 | margin-left: 8.547008547008547%; 363 | *margin-left: 8.440625568285142%; 364 | } 365 | input, 366 | textarea, 367 | .uneditable-input { 368 | margin-left: 0; 369 | } 370 | .controls-row [class*="span"] + [class*="span"] { 371 | margin-left: 30px; 372 | } 373 | input.span12, 374 | textarea.span12, 375 | .uneditable-input.span12 { 376 | width: 1156px; 377 | } 378 | input.span11, 379 | textarea.span11, 380 | .uneditable-input.span11 { 381 | width: 1056px; 382 | } 383 | input.span10, 384 | textarea.span10, 385 | .uneditable-input.span10 { 386 | width: 956px; 387 | } 388 | input.span9, 389 | textarea.span9, 390 | .uneditable-input.span9 { 391 | width: 856px; 392 | } 393 | input.span8, 394 | textarea.span8, 395 | .uneditable-input.span8 { 396 | width: 756px; 397 | } 398 | input.span7, 399 | textarea.span7, 400 | .uneditable-input.span7 { 401 | width: 656px; 402 | } 403 | input.span6, 404 | textarea.span6, 405 | .uneditable-input.span6 { 406 | width: 556px; 407 | } 408 | input.span5, 409 | textarea.span5, 410 | .uneditable-input.span5 { 411 | width: 456px; 412 | } 413 | input.span4, 414 | textarea.span4, 415 | .uneditable-input.span4 { 416 | width: 356px; 417 | } 418 | input.span3, 419 | textarea.span3, 420 | .uneditable-input.span3 { 421 | width: 256px; 422 | } 423 | input.span2, 424 | textarea.span2, 425 | .uneditable-input.span2 { 426 | width: 156px; 427 | } 428 | input.span1, 429 | textarea.span1, 430 | .uneditable-input.span1 { 431 | width: 56px; 432 | } 433 | .thumbnails { 434 | margin-left: -30px; 435 | } 436 | .thumbnails > li { 437 | margin-left: 30px; 438 | } 439 | .row-fluid .thumbnails { 440 | margin-left: 0; 441 | } 442 | } 443 | 444 | @media (min-width: 768px) and (max-width: 979px) { 445 | .row { 446 | margin-left: -20px; 447 | *zoom: 1; 448 | } 449 | .row:before, 450 | .row:after { 451 | display: table; 452 | line-height: 0; 453 | content: ""; 454 | } 455 | .row:after { 456 | clear: both; 457 | } 458 | [class*="span"] { 459 | float: left; 460 | min-height: 1px; 461 | margin-left: 20px; 462 | } 463 | .container, 464 | .navbar-static-top .container, 465 | .navbar-fixed-top .container, 466 | .navbar-fixed-bottom .container { 467 | width: 724px; 468 | } 469 | .span12 { 470 | width: 724px; 471 | } 472 | .span11 { 473 | width: 662px; 474 | } 475 | .span10 { 476 | width: 600px; 477 | } 478 | .span9 { 479 | width: 538px; 480 | } 481 | .span8 { 482 | width: 476px; 483 | } 484 | .span7 { 485 | width: 414px; 486 | } 487 | .span6 { 488 | width: 352px; 489 | } 490 | .span5 { 491 | width: 290px; 492 | } 493 | .span4 { 494 | width: 228px; 495 | } 496 | .span3 { 497 | width: 166px; 498 | } 499 | .span2 { 500 | width: 104px; 501 | } 502 | .span1 { 503 | width: 42px; 504 | } 505 | .offset12 { 506 | margin-left: 764px; 507 | } 508 | .offset11 { 509 | margin-left: 702px; 510 | } 511 | .offset10 { 512 | margin-left: 640px; 513 | } 514 | .offset9 { 515 | margin-left: 578px; 516 | } 517 | .offset8 { 518 | margin-left: 516px; 519 | } 520 | .offset7 { 521 | margin-left: 454px; 522 | } 523 | .offset6 { 524 | margin-left: 392px; 525 | } 526 | .offset5 { 527 | margin-left: 330px; 528 | } 529 | .offset4 { 530 | margin-left: 268px; 531 | } 532 | .offset3 { 533 | margin-left: 206px; 534 | } 535 | .offset2 { 536 | margin-left: 144px; 537 | } 538 | .offset1 { 539 | margin-left: 82px; 540 | } 541 | .row-fluid { 542 | width: 100%; 543 | *zoom: 1; 544 | } 545 | .row-fluid:before, 546 | .row-fluid:after { 547 | display: table; 548 | line-height: 0; 549 | content: ""; 550 | } 551 | .row-fluid:after { 552 | clear: both; 553 | } 554 | .row-fluid [class*="span"] { 555 | display: block; 556 | float: left; 557 | width: 100%; 558 | min-height: 30px; 559 | margin-left: 2.7624309392265194%; 560 | *margin-left: 2.709239449864817%; 561 | -webkit-box-sizing: border-box; 562 | -moz-box-sizing: border-box; 563 | box-sizing: border-box; 564 | } 565 | .row-fluid [class*="span"]:first-child { 566 | margin-left: 0; 567 | } 568 | .row-fluid .controls-row [class*="span"] + [class*="span"] { 569 | margin-left: 2.7624309392265194%; 570 | } 571 | .row-fluid .span12 { 572 | width: 100%; 573 | *width: 99.94680851063829%; 574 | } 575 | .row-fluid .span11 { 576 | width: 91.43646408839778%; 577 | *width: 91.38327259903608%; 578 | } 579 | .row-fluid .span10 { 580 | width: 82.87292817679558%; 581 | *width: 82.81973668743387%; 582 | } 583 | .row-fluid .span9 { 584 | width: 74.30939226519337%; 585 | *width: 74.25620077583166%; 586 | } 587 | .row-fluid .span8 { 588 | width: 65.74585635359117%; 589 | *width: 65.69266486422946%; 590 | } 591 | .row-fluid .span7 { 592 | width: 57.18232044198895%; 593 | *width: 57.12912895262725%; 594 | } 595 | .row-fluid .span6 { 596 | width: 48.61878453038674%; 597 | *width: 48.56559304102504%; 598 | } 599 | .row-fluid .span5 { 600 | width: 40.05524861878453%; 601 | *width: 40.00205712942283%; 602 | } 603 | .row-fluid .span4 { 604 | width: 31.491712707182323%; 605 | *width: 31.43852121782062%; 606 | } 607 | .row-fluid .span3 { 608 | width: 22.92817679558011%; 609 | *width: 22.87498530621841%; 610 | } 611 | .row-fluid .span2 { 612 | width: 14.3646408839779%; 613 | *width: 14.311449394616199%; 614 | } 615 | .row-fluid .span1 { 616 | width: 5.801104972375691%; 617 | *width: 5.747913483013988%; 618 | } 619 | .row-fluid .offset12 { 620 | margin-left: 105.52486187845304%; 621 | *margin-left: 105.41847889972962%; 622 | } 623 | .row-fluid .offset12:first-child { 624 | margin-left: 102.76243093922652%; 625 | *margin-left: 102.6560479605031%; 626 | } 627 | .row-fluid .offset11 { 628 | margin-left: 96.96132596685082%; 629 | *margin-left: 96.8549429881274%; 630 | } 631 | .row-fluid .offset11:first-child { 632 | margin-left: 94.1988950276243%; 633 | *margin-left: 94.09251204890089%; 634 | } 635 | .row-fluid .offset10 { 636 | margin-left: 88.39779005524862%; 637 | *margin-left: 88.2914070765252%; 638 | } 639 | .row-fluid .offset10:first-child { 640 | margin-left: 85.6353591160221%; 641 | *margin-left: 85.52897613729868%; 642 | } 643 | .row-fluid .offset9 { 644 | margin-left: 79.8342541436464%; 645 | *margin-left: 79.72787116492299%; 646 | } 647 | .row-fluid .offset9:first-child { 648 | margin-left: 77.07182320441989%; 649 | *margin-left: 76.96544022569647%; 650 | } 651 | .row-fluid .offset8 { 652 | margin-left: 71.2707182320442%; 653 | *margin-left: 71.16433525332079%; 654 | } 655 | .row-fluid .offset8:first-child { 656 | margin-left: 68.50828729281768%; 657 | *margin-left: 68.40190431409427%; 658 | } 659 | .row-fluid .offset7 { 660 | margin-left: 62.70718232044199%; 661 | *margin-left: 62.600799341718584%; 662 | } 663 | .row-fluid .offset7:first-child { 664 | margin-left: 59.94475138121547%; 665 | *margin-left: 59.838368402492065%; 666 | } 667 | .row-fluid .offset6 { 668 | margin-left: 54.14364640883978%; 669 | *margin-left: 54.037263430116376%; 670 | } 671 | .row-fluid .offset6:first-child { 672 | margin-left: 51.38121546961326%; 673 | *margin-left: 51.27483249088986%; 674 | } 675 | .row-fluid .offset5 { 676 | margin-left: 45.58011049723757%; 677 | *margin-left: 45.47372751851417%; 678 | } 679 | .row-fluid .offset5:first-child { 680 | margin-left: 42.81767955801105%; 681 | *margin-left: 42.71129657928765%; 682 | } 683 | .row-fluid .offset4 { 684 | margin-left: 37.01657458563536%; 685 | *margin-left: 36.91019160691196%; 686 | } 687 | .row-fluid .offset4:first-child { 688 | margin-left: 34.25414364640884%; 689 | *margin-left: 34.14776066768544%; 690 | } 691 | .row-fluid .offset3 { 692 | margin-left: 28.45303867403315%; 693 | *margin-left: 28.346655695309746%; 694 | } 695 | .row-fluid .offset3:first-child { 696 | margin-left: 25.69060773480663%; 697 | *margin-left: 25.584224756083227%; 698 | } 699 | .row-fluid .offset2 { 700 | margin-left: 19.88950276243094%; 701 | *margin-left: 19.783119783707537%; 702 | } 703 | .row-fluid .offset2:first-child { 704 | margin-left: 17.12707182320442%; 705 | *margin-left: 17.02068884448102%; 706 | } 707 | .row-fluid .offset1 { 708 | margin-left: 11.32596685082873%; 709 | *margin-left: 11.219583872105325%; 710 | } 711 | .row-fluid .offset1:first-child { 712 | margin-left: 8.56353591160221%; 713 | *margin-left: 8.457152932878806%; 714 | } 715 | input, 716 | textarea, 717 | .uneditable-input { 718 | margin-left: 0; 719 | } 720 | .controls-row [class*="span"] + [class*="span"] { 721 | margin-left: 20px; 722 | } 723 | input.span12, 724 | textarea.span12, 725 | .uneditable-input.span12 { 726 | width: 710px; 727 | } 728 | input.span11, 729 | textarea.span11, 730 | .uneditable-input.span11 { 731 | width: 648px; 732 | } 733 | input.span10, 734 | textarea.span10, 735 | .uneditable-input.span10 { 736 | width: 586px; 737 | } 738 | input.span9, 739 | textarea.span9, 740 | .uneditable-input.span9 { 741 | width: 524px; 742 | } 743 | input.span8, 744 | textarea.span8, 745 | .uneditable-input.span8 { 746 | width: 462px; 747 | } 748 | input.span7, 749 | textarea.span7, 750 | .uneditable-input.span7 { 751 | width: 400px; 752 | } 753 | input.span6, 754 | textarea.span6, 755 | .uneditable-input.span6 { 756 | width: 338px; 757 | } 758 | input.span5, 759 | textarea.span5, 760 | .uneditable-input.span5 { 761 | width: 276px; 762 | } 763 | input.span4, 764 | textarea.span4, 765 | .uneditable-input.span4 { 766 | width: 214px; 767 | } 768 | input.span3, 769 | textarea.span3, 770 | .uneditable-input.span3 { 771 | width: 152px; 772 | } 773 | input.span2, 774 | textarea.span2, 775 | .uneditable-input.span2 { 776 | width: 90px; 777 | } 778 | input.span1, 779 | textarea.span1, 780 | .uneditable-input.span1 { 781 | width: 28px; 782 | } 783 | } 784 | 785 | @media (max-width: 767px) { 786 | body { 787 | padding-right: 20px; 788 | padding-left: 20px; 789 | } 790 | .navbar-fixed-top, 791 | .navbar-fixed-bottom, 792 | .navbar-static-top { 793 | margin-right: -20px; 794 | margin-left: -20px; 795 | } 796 | .container-fluid { 797 | padding: 0; 798 | } 799 | .dl-horizontal dt { 800 | float: none; 801 | width: auto; 802 | clear: none; 803 | text-align: left; 804 | } 805 | .dl-horizontal dd { 806 | margin-left: 0; 807 | } 808 | .container { 809 | width: auto; 810 | } 811 | .row-fluid { 812 | width: 100%; 813 | } 814 | .row, 815 | .thumbnails { 816 | margin-left: 0; 817 | } 818 | .thumbnails > li { 819 | float: none; 820 | margin-left: 0; 821 | } 822 | [class*="span"], 823 | .uneditable-input[class*="span"], 824 | .row-fluid [class*="span"] { 825 | display: block; 826 | float: none; 827 | width: 100%; 828 | margin-left: 0; 829 | -webkit-box-sizing: border-box; 830 | -moz-box-sizing: border-box; 831 | box-sizing: border-box; 832 | } 833 | .span12, 834 | .row-fluid .span12 { 835 | width: 100%; 836 | -webkit-box-sizing: border-box; 837 | -moz-box-sizing: border-box; 838 | box-sizing: border-box; 839 | } 840 | .row-fluid [class*="offset"]:first-child { 841 | margin-left: 0; 842 | } 843 | .input-large, 844 | .input-xlarge, 845 | .input-xxlarge, 846 | input[class*="span"], 847 | select[class*="span"], 848 | textarea[class*="span"], 849 | .uneditable-input { 850 | display: block; 851 | width: 100%; 852 | min-height: 30px; 853 | -webkit-box-sizing: border-box; 854 | -moz-box-sizing: border-box; 855 | box-sizing: border-box; 856 | } 857 | .input-prepend input, 858 | .input-append input, 859 | .input-prepend input[class*="span"], 860 | .input-append input[class*="span"] { 861 | display: inline-block; 862 | width: auto; 863 | } 864 | .controls-row [class*="span"] + [class*="span"] { 865 | margin-left: 0; 866 | } 867 | .modal { 868 | position: fixed; 869 | top: 20px; 870 | right: 20px; 871 | left: 20px; 872 | width: auto; 873 | margin: 0; 874 | } 875 | .modal.fade { 876 | top: -100px; 877 | } 878 | .modal.fade.in { 879 | top: 20px; 880 | } 881 | } 882 | 883 | @media (max-width: 480px) { 884 | .nav-collapse { 885 | -webkit-transform: translate3d(0, 0, 0); 886 | } 887 | .page-header h1 small { 888 | display: block; 889 | line-height: 20px; 890 | } 891 | input[type="checkbox"], 892 | input[type="radio"] { 893 | border: 1px solid #ccc; 894 | } 895 | .form-horizontal .control-label { 896 | float: none; 897 | width: auto; 898 | padding-top: 0; 899 | text-align: left; 900 | } 901 | .form-horizontal .controls { 902 | margin-left: 0; 903 | } 904 | .form-horizontal .control-list { 905 | padding-top: 0; 906 | } 907 | .form-horizontal .form-actions { 908 | padding-right: 10px; 909 | padding-left: 10px; 910 | } 911 | .media .pull-left, 912 | .media .pull-right { 913 | display: block; 914 | float: none; 915 | margin-bottom: 10px; 916 | } 917 | .media-object { 918 | margin-right: 0; 919 | margin-left: 0; 920 | } 921 | .modal { 922 | top: 10px; 923 | right: 10px; 924 | left: 10px; 925 | } 926 | .modal-header .close { 927 | padding: 10px; 928 | margin: -10px; 929 | } 930 | .carousel-caption { 931 | position: static; 932 | } 933 | } 934 | 935 | @media (max-width: 979px) { 936 | body { 937 | padding-top: 0; 938 | } 939 | .navbar-fixed-top, 940 | .navbar-fixed-bottom { 941 | position: static; 942 | } 943 | .navbar-fixed-top { 944 | margin-bottom: 20px; 945 | } 946 | .navbar-fixed-bottom { 947 | margin-top: 20px; 948 | } 949 | .navbar-fixed-top .navbar-inner, 950 | .navbar-fixed-bottom .navbar-inner { 951 | padding: 5px; 952 | } 953 | .navbar .container { 954 | width: auto; 955 | padding: 0; 956 | } 957 | .navbar .brand { 958 | padding-right: 10px; 959 | padding-left: 10px; 960 | margin: 0 0 0 -5px; 961 | } 962 | .nav-collapse { 963 | clear: both; 964 | } 965 | .nav-collapse .nav { 966 | float: none; 967 | margin: 0 0 10px; 968 | } 969 | .nav-collapse .nav > li { 970 | float: none; 971 | } 972 | .nav-collapse .nav > li > a { 973 | margin-bottom: 2px; 974 | } 975 | .nav-collapse .nav > .divider-vertical { 976 | display: none; 977 | } 978 | .nav-collapse .nav .nav-header { 979 | color: #777777; 980 | text-shadow: none; 981 | } 982 | .nav-collapse .nav > li > a, 983 | .nav-collapse .dropdown-menu a { 984 | padding: 9px 15px; 985 | font-weight: bold; 986 | color: #777777; 987 | -webkit-border-radius: 3px; 988 | -moz-border-radius: 3px; 989 | border-radius: 3px; 990 | } 991 | .nav-collapse .btn { 992 | padding: 4px 10px 4px; 993 | font-weight: normal; 994 | -webkit-border-radius: 4px; 995 | -moz-border-radius: 4px; 996 | border-radius: 4px; 997 | } 998 | .nav-collapse .dropdown-menu li + li a { 999 | margin-bottom: 2px; 1000 | } 1001 | .nav-collapse .nav > li > a:hover, 1002 | .nav-collapse .dropdown-menu a:hover { 1003 | background-color: #f2f2f2; 1004 | } 1005 | .navbar-inverse .nav-collapse .nav > li > a, 1006 | .navbar-inverse .nav-collapse .dropdown-menu a { 1007 | color: #999999; 1008 | } 1009 | .navbar-inverse .nav-collapse .nav > li > a:hover, 1010 | .navbar-inverse .nav-collapse .dropdown-menu a:hover { 1011 | background-color: #111111; 1012 | } 1013 | .nav-collapse.in .btn-group { 1014 | padding: 0; 1015 | margin-top: 5px; 1016 | } 1017 | .nav-collapse .dropdown-menu { 1018 | position: static; 1019 | top: auto; 1020 | left: auto; 1021 | display: none; 1022 | float: none; 1023 | max-width: none; 1024 | padding: 0; 1025 | margin: 0 15px; 1026 | background-color: transparent; 1027 | border: none; 1028 | -webkit-border-radius: 0; 1029 | -moz-border-radius: 0; 1030 | border-radius: 0; 1031 | -webkit-box-shadow: none; 1032 | -moz-box-shadow: none; 1033 | box-shadow: none; 1034 | } 1035 | .nav-collapse .open > .dropdown-menu { 1036 | display: block; 1037 | } 1038 | .nav-collapse .dropdown-menu:before, 1039 | .nav-collapse .dropdown-menu:after { 1040 | display: none; 1041 | } 1042 | .nav-collapse .dropdown-menu .divider { 1043 | display: none; 1044 | } 1045 | .nav-collapse .nav > li > .dropdown-menu:before, 1046 | .nav-collapse .nav > li > .dropdown-menu:after { 1047 | display: none; 1048 | } 1049 | .nav-collapse .navbar-form, 1050 | .nav-collapse .navbar-search { 1051 | float: none; 1052 | padding: 10px 15px; 1053 | margin: 10px 0; 1054 | border-top: 1px solid #f2f2f2; 1055 | border-bottom: 1px solid #f2f2f2; 1056 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); 1057 | -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); 1058 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); 1059 | } 1060 | .navbar-inverse .nav-collapse .navbar-form, 1061 | .navbar-inverse .nav-collapse .navbar-search { 1062 | border-top-color: #111111; 1063 | border-bottom-color: #111111; 1064 | } 1065 | .navbar .nav-collapse .nav.pull-right { 1066 | float: none; 1067 | margin-left: 0; 1068 | } 1069 | .nav-collapse, 1070 | .nav-collapse.collapse { 1071 | height: 0; 1072 | overflow: hidden; 1073 | } 1074 | .navbar .btn-navbar { 1075 | display: block; 1076 | } 1077 | .navbar-static .navbar-inner { 1078 | padding-right: 10px; 1079 | padding-left: 10px; 1080 | } 1081 | } 1082 | 1083 | @media (min-width: 980px) { 1084 | .nav-collapse.collapse { 1085 | height: auto !important; 1086 | overflow: visible !important; 1087 | } 1088 | } 1089 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | var assert = require("assert"); 2 | var sinon = require('sinon'); 3 | var git2provCvt = require("../lib/git2provConverter"); 4 | var fs = require('fs'); 5 | var exec = require('child_process').exec; 6 | var serializers = require('../lib/provSerializer'); 7 | 8 | 9 | 10 | describe('Unit', function(){ 11 | 12 | var log_line1 = "Mac-open-c,9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d,21fd9dde98de5b31f4ca89fe0347b44fd2a1997a," + 13 | "jill,2014-08-14 09:42:05 -0400,vlad,2014-08-14 11:50:51 -0400,Modernized and harmonized the code,D"; 14 | var log_line2 = "Mac-open-c,e01161193fe24e3c8f08a6d80c27ea33dac0c162,x y,bob,2014-08-12 20:06:41 -0400," + 15 | "john,2014-08-12 20:06:41 -0400,Initial import,A"; 16 | var log_line3 = "README-md,9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d," + 17 | "21fd9dde98de5b31f4ca89fe0347b44fd2a1997a,vlad,2014-08-14 09:42:05 -0400,vlad,2014-08-14 11:50:51 -0400," + 18 | "Modernized and harmonized the code,M README.md"; 19 | 20 | 21 | describe('ProvSerializer ShouldBeAdded', function() { 22 | var testColl = { 'a': 1, 'd': 23, 'bill': 9 }; 23 | var ignoreBlock = "bob;bill,dope"; 24 | it('Should allow to add property for which we have entry', function() { 25 | var a = 'a'; 26 | var rv = serializers.shouldBeAdded(testColl, ignoreBlock, a, 'a-block'); 27 | assert.equal(rv, true); 28 | } ); 29 | 30 | it('Should not-allow to add property which we have in ignore block', function() { 31 | var a = 'bill'; 32 | var rv = serializers.shouldBeAdded(testColl, ignoreBlock, a, 'bill'); 33 | assert.equal(rv, false); 34 | } ); 35 | 36 | it('Should not-allow to add property which is not in a collection', function() { 37 | var a = 'bruce'; 38 | var rv = serializers.shouldBeAdded(testColl, ignoreBlock, a, 'bruce'); 39 | assert.equal(rv, false); 40 | } ); 41 | }); 42 | 43 | describe('Add to JSON bundle', function() { 44 | 45 | var jSONObj; 46 | var ignoreBlock = "bob;dope"; 47 | var provObj = { 'bills': [1,2,3], 'bundle': 'bill' }; 48 | 49 | beforeEach(function(complete) { 50 | jSONObj = {'bundle': { 'bill': {}}}; 51 | complete(); 52 | }); 53 | 54 | it('Should add bundle to JSON object', function() { 55 | 56 | serializers.addToJSONBundleIfNeeded(jSONObj,provObj,ignoreBlock,'bills','bill'); 57 | assert.deepEqual({bill: [1,2,3]}, jSONObj.bundle.bill); 58 | 59 | } ); 60 | 61 | it('Should add bundle to JSON object if set is ignored', function() { 62 | 63 | serializers.addToJSONBundleIfNeeded(jSONObj,provObj,"bill",'bills','bill'); 64 | assert.deepEqual({}, jSONObj.bundle.bill); 65 | 66 | } ); 67 | 68 | it('Should not add bundle to JSON object if receptacle is not there', function() { 69 | serializers.addToJSONBundleIfNeeded(jSONObj,provObj,ignoreBlock,'drews','drew'); 70 | assert.deepEqual({}, jSONObj.bundle.bill); 71 | 72 | } ); 73 | }); 74 | 75 | describe('Record writers', function() { 76 | 77 | var agentsTestData = {'agents':{ 78 | 'e1': {'prov:label': 'E1'}, 79 | 'e2': {'prov:label': 'E2'} 80 | }}; 81 | 82 | var communicationTestData = { 'x': {'prov:informant': 'Bob'} }; 83 | var specializationTestData = { 'x': {'prov:agent': 'Alice', 'prov:generalEntity': 'Person'} }; 84 | var attributionTestData = { 'x': {'prov:agent': 'Alice', 'prov:type': 'rumor'} }; 85 | var qualifiedAttributionTestData = { 'x': {'prov:agent': 'Alice', 'prov:type': 'rumor', 86 | 'prov:role' : 'editor'} }; 87 | var associationTestData = { 'x': {'prov:agent': 'Alice', 'prov:role': 'editor'} }; 88 | var generationTestData = { 'x': {'prov:activity': 'Editing', 'prov:time': '12:44'} }; 89 | var usageTestData = { 'x': {'prov:entity': 'Pamphlet1', 'prov:time': '12:44'} }; 90 | var derivationTestData = { 'x': { 'prov:usedEntity': 'Table5', 'prov:activity': 'Editing', 91 | 'prov:generation': 'Table5_Gen', 'prov:usage': 'Table5_Use' }}; 92 | var invalidationTestData = { 'x': {'prov:activity': 'Editing', 'prov:time': '12:44'} }; 93 | 94 | 95 | function getN3Stub(triples) { 96 | var n3API = function () {}; 97 | n3API.prototype.addTriple = function () {}; 98 | n3API.prototype.find = function () {}; 99 | var store = sinon.stub(new n3API()); 100 | store.find.returns(triples); 101 | return store; 102 | } 103 | 104 | describe('PROV-N', function() { 105 | 106 | it("should add PROV-N entries correctly", function(){ 107 | var initialRec = "[PREV]\n"; 108 | var rv = serializers.recordWriters.provN.addProvNEntries( 109 | agentsTestData, 110 | "bob", initialRec,'agents','X', function(x,y) { 111 | return " : " + x[y]['prov:label'] ; 112 | }); 113 | assert.equal(rv, initialRec + "X(e1 : E1)\nX(e2 : E2)\n" ); 114 | }); 115 | 116 | 117 | it("should add PROV-N entries correctly, using alternate subject", function(){ 118 | var initialRec = "[PREV]\n"; 119 | var rv = serializers.recordWriters.provN.addProvNEntries( 120 | {'agents':{ 121 | 'e1-extra': {'prov:label': 'E1', 'prov:xactivity': 'e1'}, 122 | 'e2-extra': {'prov:label': 'E2', 'prov:xactivity': 'e2'} 123 | }}, 124 | "bob", initialRec,'agents','X', function(x,y) { 125 | return " : " + x[y]['prov:label'] ; 126 | }, "prov:xactivity" ); 127 | assert.equal(rv, initialRec + "X(e1 : E1)\nX(e2 : E2)\n" ); 128 | }); 129 | 130 | it("should add PROV-N prefixes correctly", function(){ 131 | var rv = serializers.recordWriters.provN.addPrefixes( 132 | {'prefixes':{ 133 | 'p1': 'prefix1', 134 | 'p2': 'prefix2' 135 | }}, 136 | "{S}\n" ); 137 | assert.equal(rv, "{S}\nprefix p1 \nprefix p2 \n" ); 138 | }); 139 | 140 | 141 | 142 | it('Should give correct record for entity', function () { 143 | var rv = serializers.recordWriters.provN.entity({ 'x': {'prov:label': 'X'} }, 'x'); 144 | assert.equal(rv, ", [prov:label=\"X\"]"); 145 | }); 146 | 147 | it('Should give correct record for was started by', function () { 148 | var rv = serializers.recordWriters.provN.wasStartedBy({ 'x': {'prov:time': '11111'} }, 'x'); 149 | assert.equal(rv, ", -, -, 11111"); 150 | }); 151 | 152 | it('Should give correct record for communication', function () { 153 | var rv = serializers.recordWriters.provN.communication(communicationTestData, 'x'); 154 | assert.equal(rv, ", Bob"); 155 | }); 156 | 157 | it('Should give correct record for attribution', function () { 158 | var rv = serializers.recordWriters.provN.attribution(attributionTestData, 'x'); 159 | assert.equal(rv, ", Alice, [prov:type=\"rumor\"]"); 160 | }); 161 | 162 | it('Should give correct record for association', function () { 163 | var rv = serializers.recordWriters.provN.association(associationTestData, 'x'); 164 | assert.equal(rv, ", Alice, [prov:role=\"editor\"]"); 165 | }); 166 | 167 | it('Should give correct record for specialization', function () { 168 | var rv = serializers.recordWriters.provN.specialization(specializationTestData, 'x'); 169 | assert.equal(rv, ", Person"); 170 | }); 171 | 172 | it('Should give correct record for generation', function () { 173 | var rv = serializers.recordWriters.provN.generation(generationTestData, 'x'); 174 | assert.equal(rv, ", Editing, 12:44"); 175 | }); 176 | 177 | it('Should give correct record for usage', function () { 178 | var rv = serializers.recordWriters.provN.usage(usageTestData, 'x'); 179 | assert.equal(rv, ", Pamphlet1, 12:44"); 180 | }); 181 | 182 | it('Should give correct record for invalidation', function () { 183 | var rv = serializers.recordWriters.provN.invalidation(invalidationTestData, 'x'); 184 | assert.equal(rv, ", Editing, 12:44"); 185 | }); 186 | 187 | it('Should give correct record for derivation', function () { 188 | 189 | var rv = serializers.recordWriters.provN.derivation(derivationTestData, 'x'); 190 | assert.equal(rv, ", Table5, Editing, Table5_Gen, Table5_Use"); 191 | }); 192 | 193 | }); 194 | 195 | describe('ProvO', function(){ 196 | 197 | var store; 198 | 199 | beforeEach(function() { 200 | store = getN3Stub(); 201 | }); 202 | 203 | it('Should add prefixes correctly', function() { 204 | 205 | serializers.recordWriters.provO.addPrefix( store, 206 | {'prefixes':{ 207 | 'e1-extra': "http://x1", 208 | 'e2-extra': "http://x2" 209 | }}); 210 | 211 | assert.equal(store.addTriple.called,true); 212 | assert.deepEqual(store.addTriple.getCall(0).args,["@prefix","prov:",""]); 213 | assert.deepEqual(store.addTriple.getCall(1).args,["@prefix","rdfs:",""]); 214 | assert.deepEqual(store.addTriple.getCall(2).args,["@prefix","xsd:",""]); 215 | assert.deepEqual(store.addTriple.getCall(3).args,["@prefix","e1-extra:",""]); 216 | assert.deepEqual(store.addTriple.getCall(4).args,["@prefix","e2-extra:",""]); 217 | }); 218 | 219 | it('Should add alt bundles correctly', function() { 220 | 221 | serializers.recordWriters.provO.addAltBundle( 222 | {'bundle': 'A1', 'alternateBundle': 'A44' }, store); 223 | 224 | assert.equal(store.addTriple.called,true); 225 | assert.deepEqual(store.addTriple.getCall(0).args,["A1","a","prov:Bundle"]); 226 | assert.deepEqual(store.addTriple.getCall(1).args,["A1","prov:alternateOf","A44"]); 227 | 228 | }); 229 | 230 | it('Should add entities correctly', function() { 231 | serializers.recordWriters.provO.addEntities( store, 232 | {'entities':{ 233 | 'e1-extra': {'prov:label': 'E1', 'prov:xactivity': 'e1'}, 234 | 'e2-extra': {'prov:label': 'E2', 'prov:xactivity': 'e2'} 235 | }}, "bob",'entities','entity', serializers.recordWriters.provO.entity); 236 | 237 | assert.equal(store.addTriple.called,true); 238 | assert.deepEqual(store.addTriple.getCall(0).args,["e1-extra","a","prov:Entity"]); 239 | assert.deepEqual(store.addTriple.getCall(1).args,["e1-extra","rdfs:label","\"E1\"@en"]); 240 | assert.deepEqual(store.addTriple.getCall(2).args,["e2-extra","a","prov:Entity"]); 241 | assert.deepEqual(store.addTriple.getCall(3).args,["e2-extra","rdfs:label","\"E2\"@en"]); 242 | }); 243 | 244 | it('Should add entities correctly', function() { 245 | serializers.recordWriters.provO.addEntitiesD( store, 246 | {'g': { 'e1': {'spec': 'x', 'prov:generalEntity': 'E5' }}}, 247 | "bob",'g','generated', serializers.recordWriters.provO.generalization, 'spec'); 248 | assert.equal(store.addTriple.called,true); 249 | assert.deepEqual(store.addTriple.getCall(0).args,["generated","prov:specializationOf","E5"]); 250 | }); 251 | 252 | it('Should add agents correctly', function() { 253 | 254 | serializers.recordWriters.provO.addEntities( store, agentsTestData, 255 | "bob",'agents','agent',serializers.recordWriters.provO.entity); 256 | 257 | assert.equal(store.addTriple.called,true); 258 | assert.deepEqual(store.addTriple.getCall(0).args,["e1","a","prov:Agent"]); 259 | assert.deepEqual(store.addTriple.getCall(1).args,["e1","rdfs:label","\"E1\"@en"]); 260 | assert.deepEqual(store.addTriple.getCall(2).args,["e2","a","prov:Agent"]); 261 | assert.deepEqual(store.addTriple.getCall(3).args,["e2","rdfs:label","\"E2\"@en"]); 262 | }); 263 | 264 | it('Should add communication correctly', function() { 265 | serializers.recordWriters.provO.communication( store, communicationTestData,'x','F5'); 266 | assert.equal(store.addTriple.called,true); 267 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:wasInformedBy","Bob"]); 268 | }); 269 | 270 | it('Should add specialization correctly', function() { 271 | serializers.recordWriters.provO.generalization( store, specializationTestData,'x','Alice'); 272 | assert.equal(store.addTriple.called,true); 273 | assert.deepEqual(store.addTriple.getCall(0).args,["Alice","prov:specializationOf","Person"]); 274 | }); 275 | 276 | it('Should add attribution correctly', function() { 277 | serializers.recordWriters.provO.attribution(store, attributionTestData,'x','wasAttributedTo','F5'); 278 | assert.equal(store.addTriple.called,true); 279 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:wasAttributedTo","Alice"]); 280 | }); 281 | 282 | it('Should add qualified attribution correctly', function() { 283 | serializers.recordWriters.provO.attribution(store, qualifiedAttributionTestData,'x','wasAttributedTo','F5'); 284 | assert.equal(store.addTriple.called,true); 285 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:wasAttributedTo","Alice"]); 286 | assert.deepEqual(store.addTriple.getCall(1).args,["F5","prov:qualifiedAttribution","[ a prov:Attribution ; prov:agent Alice ; a \"rumor\"@en ]"]); 287 | }); 288 | 289 | it('Should add association correctly', function() { 290 | serializers.recordWriters.provO.association(store, associationTestData,'x','wasAssociatedWith','F5'); 291 | assert.equal(store.addTriple.called,true); 292 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:wasAssociatedWith","Alice"]); 293 | assert.deepEqual(store.addTriple.getCall(1).args,["F5","prov:qualifiedAssociation","[ a prov:Association ; prov:agent Alice ; prov:hadRole \"editor\"@en ]"]); 294 | }); 295 | 296 | it('Should add activity start correctly', function() { 297 | var testData = { 'x': {'prov:time': '10:44'} }; 298 | serializers.recordWriters.provO.activityStart(store, testData,'x','F5'); 299 | assert.equal(store.addTriple.called,true); 300 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:startedAtTime","\"10:44\"^^xsd:dateTime"]); 301 | }); 302 | 303 | it('Should add activity end correctly', function() { 304 | var testData = { 'x': {'prov:time': '10:44'} }; 305 | serializers.recordWriters.provO.activityEnd(store, testData,'x','F5'); 306 | assert.equal(store.addTriple.called,true); 307 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:endedAtTime","\"10:44\"^^xsd:dateTime"]); 308 | }); 309 | 310 | it('Should add generation correctly', function() { 311 | serializers.recordWriters.provO.generation(store, generationTestData,'x','wasGeneratedBy', 'F5'); 312 | assert.equal(store.addTriple.called,true); 313 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:wasGeneratedBy","Editing"]); 314 | assert.deepEqual(store.addTriple.getCall(1).args,["F5", 315 | "prov:qualifiedGeneration", 316 | "[ a prov:Generation ; prov:activity Editing ; prov:atTime \"12:44\"^^xsd:dateTime ]"]); 317 | }); 318 | 319 | it('Should add usage correctly', function() { 320 | serializers.recordWriters.provO.usage(store, usageTestData,'x','usedBy', 'F5'); 321 | assert.equal(store.addTriple.called,true); 322 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:usedBy","Pamphlet1"]); 323 | assert.deepEqual(store.addTriple.getCall(1).args,["F5", 324 | "prov:qualifiedUsage", 325 | "[ a prov:Usage ; prov:entity Pamphlet1 ; prov:atTime \"12:44\"^^xsd:dateTime ]"]); 326 | }); 327 | 328 | it('Should add derivation correctly', function() { 329 | serializers.recordWriters.provO.derivation(store, derivationTestData,'x','derived', 'F5'); 330 | assert.equal(store.addTriple.called,true); 331 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:derived","Table5"]); 332 | assert.deepEqual(store.addTriple.getCall(1).args,["F5", 333 | "prov:qualifiedDerivation", 334 | "[ a prov:Derivation ; prov:entity Table5 ; prov:hadGeneration Table5_Gen ; prov:hadUsage Table5_Use ; prov:hadActivity Editing ]"]); 335 | }); 336 | 337 | it('Should add invalidation correctly', function() { 338 | serializers.recordWriters.provO.invalidation(store, invalidationTestData,'x','invalidated', 'F5'); 339 | assert.equal(store.addTriple.called,true); 340 | assert.deepEqual(store.addTriple.getCall(0).args,["F5","prov:invalidated","Editing"]); 341 | assert.deepEqual(store.addTriple.getCall(1).args,["F5", 342 | "prov:qualifiedInvalidation", 343 | "[ a prov:Invalidation ; prov:activity Editing ; prov:atTime \"12:44\"^^xsd:dateTime ]"]); 344 | }); 345 | 346 | 347 | describe("Nice Turtle writer", function(){ 348 | 349 | describe('CMP', function(){ 350 | 351 | it('should return 0 when properties are the same', function(){ 352 | var rv = serializers.recordWriters.provO.cmp('a','a'); 353 | assert.equal(0,rv);}); 354 | 355 | it('should return -1 when first property is smaller', function(){ 356 | var rv = serializers.recordWriters.provO.cmp('a','b'); 357 | assert.equal(-1,rv);}); 358 | 359 | it('should return 1 when first property is larger', function(){ 360 | var rv = serializers.recordWriters.provO.cmp('f','b'); 361 | assert.equal(1,rv);}); 362 | 363 | }); 364 | 365 | describe('Statement from Triple', function(){ 366 | 367 | var triple = { 'subject': 'bob', 'predicate': 'eats', 'object': 'pie'}; 368 | var statementFromTriple = serializers.recordWriters.provO.statementFromTriple; 369 | 370 | it('should output whole statement when no specialial cases apply', function() { 371 | var rv = statementFromTriple(triple,0,false,false); 372 | assert.equal(rv, "bob\teats\tpie "); 373 | }); 374 | 375 | it('should prepend statement with .\\n if it is not a first triple ', function() { 376 | 377 | var rv = statementFromTriple(triple,5,false,false); 378 | assert.equal(rv, ".\nbob\teats\tpie "); 379 | }); 380 | 381 | it('should skip subject if it is the same as previous ', function() { 382 | 383 | var rv = statementFromTriple(triple,5,true,false); 384 | assert.equal(rv, ";\n\t\teats\tpie "); 385 | }); 386 | 387 | it('should skip predicate if it is the same as previous ', function() { 388 | var rv = statementFromTriple(triple,5,true,true); 389 | assert.equal(rv, ",\n\t\t\t\tpie "); 390 | }); 391 | 392 | }); 393 | 394 | 395 | describe('Get turtle from N3', function(){ 396 | 397 | var store = getN3Stub([ 398 | {subject:'@prefix',predicate:'b',object:'c'}, 399 | {subject:'a',predicate:'b',object:'c'} 400 | ]); 401 | 402 | it('should get correct representation of triples', function(){ 403 | var rv = serializers.recordWriters.provO.getTurtle(store); 404 | assert.equal("@prefix b c .\n" + 405 | "a\tb\tc .",rv); 406 | }); 407 | 408 | }); 409 | 410 | }); 411 | 412 | 413 | }); 414 | 415 | }); 416 | 417 | 418 | describe('ProvObject', function() { 419 | 420 | 421 | 422 | it('should be constructed and have all necessary sections', function(){ 423 | var p = git2provCvt.getProvObject([],"http:/x"); 424 | assert.equal(p.bundle, "http:/x:provenance"); 425 | assert.deepEqual(p.entities, {}); 426 | }); 427 | 428 | describe('Update based on commit obj', function(){ 429 | 430 | var cm1 = git2provCvt.getCommitObj(log_line1); 431 | var cm2 = git2provCvt.getCommitObj(log_line2); 432 | var cm3 = git2provCvt.getCommitObj(log_line3); 433 | 434 | var pObj = git2provCvt.getProvObject([],"http://y"); 435 | 436 | before(function(){ 437 | git2provCvt.updateProvObj(pObj,"http://y",cm1); 438 | git2provCvt.updateProvObj(pObj,"http://y",cm2); 439 | git2provCvt.updateProvObj(pObj,"http://y",cm3); 440 | }); 441 | 442 | it('Should contain 2 commits in the activity section', function(){ 443 | assert.deepEqual(Object.keys(pObj.activities).sort(),[ 444 | "http://y:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 445 | "http://y:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162" 446 | ]); 447 | }); 448 | 449 | it('Should contain 2 files in the entities section', function(){ 450 | assert.deepEqual(Object.keys(pObj.entities).sort(),[ 451 | "http://y:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 452 | "http://y:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 453 | "http://y:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 454 | ]); 455 | }); 456 | 457 | it('Should contain 2 starts in the starts section', function(){ 458 | assert.deepEqual(Object.keys(pObj.starts).sort(),[ 459 | "http://y:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_start", 460 | "http://y:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_start" 461 | ]); 462 | }); 463 | 464 | it('Should contain information linkage in the communications section', function(){ 465 | var comm_1 = "http://y:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_comm"; 466 | assert.deepEqual(Object.keys(pObj.communications).sort(),[ 467 | comm_1 468 | ]); 469 | 470 | assert.equal(pObj.communications[comm_1]["prov:informant"],"http://y:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a"); 471 | assert.equal(pObj.communications[comm_1]["prov:informed"],"http://y:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"); 472 | }); 473 | 474 | 475 | it('Should contain derivation linkage in the communications section', function(){ 476 | var comm_1 = "http://y:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_der"; 477 | assert.deepEqual(Object.keys(pObj.derivations).sort(),[ 478 | comm_1 479 | ]); 480 | 481 | assert.equal(pObj.derivations[comm_1]["prov:generation"],"http://y:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen"); 482 | assert.equal(pObj.derivations[comm_1]["prov:usedEntity"],"http://y:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a"); 483 | }); 484 | 485 | 486 | 487 | }); 488 | 489 | }); 490 | 491 | describe('Commit Obj', function(){ 492 | 493 | 494 | var obj1 = git2provCvt.getCommitObj(log_line1); 495 | var obj2 = git2provCvt.getCommitObj(log_line2); 496 | 497 | it("should contain entity id", function() { 498 | assert.equal(obj1.entity, "file-Mac-open-c"); 499 | assert.equal(obj2.entity, "file-Mac-open-c"); 500 | }); 501 | 502 | it("should contain commit-id", function() { 503 | assert.equal(obj1.id, "commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d"); 504 | assert.equal(obj2.id, "commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162"); 505 | }); 506 | 507 | it("should contain parents id", function() { 508 | assert.deepEqual(obj1.parents, ["21fd9dde98de5b31f4ca89fe0347b44fd2a1997a"]); 509 | assert.deepEqual(obj2.parents, ["x","y"]); 510 | }); 511 | 512 | it("should contain author", function() { 513 | assert.equal(obj1.author, "user-jill"); 514 | assert.equal(obj2.author, "user-bob"); 515 | }); 516 | 517 | it("should contain author label", function() { 518 | assert.equal(obj1.author_label, "jill"); 519 | assert.equal(obj2.author_label, "bob"); 520 | }); 521 | 522 | it("should contain author date", function() { 523 | assert.equal(obj1.author_date, "2014-08-14T13:42:05.000Z"); 524 | assert.equal(obj2.author_date, "2014-08-13T00:06:41.000Z"); 525 | }); 526 | 527 | it("should contain committer", function() { 528 | assert.equal(obj1.commiter, "user-vlad"); 529 | assert.equal(obj2.commiter, "user-john"); 530 | }); 531 | 532 | it("should contain committer label", function() { 533 | assert.equal(obj1.commiter_label, "vlad"); 534 | assert.equal(obj2.commiter_label, "john"); 535 | }); 536 | 537 | it("should contain committer date", function() { 538 | assert.equal(obj1.commiter_date, "2014-08-14T15:50:51.000Z"); 539 | assert.equal(obj2.commiter_date, "2014-08-13T00:06:41.000Z"); 540 | }); 541 | 542 | it("should contain subject", function() { 543 | assert.equal(obj1.subject, "Modernized and harmonized the code"); 544 | assert.equal(obj2.subject, "Initial import"); 545 | }); 546 | 547 | it("should contain mod type", function() { 548 | assert.equal(obj1.modification_type, "D"); 549 | assert.equal(obj2.modification_type, "A"); 550 | }); 551 | 552 | 553 | 554 | 555 | }); 556 | 557 | describe('Get Prefixes', function(){ 558 | 559 | it('Shoud generate correct prefix map',function(){ 560 | 561 | var prefixes = git2provCvt.getPrefixes("result", "http://xx/", "PROV-O"); 562 | 563 | assert.deepEqual(prefixes,{ 564 | "fullResult": "&serialization=PROV-O#", 565 | "result": "http://xx/#" 566 | }); 567 | 568 | }); 569 | 570 | 571 | }); 572 | 573 | describe('Process file list into log commands ', function(){ 574 | 575 | var provObj = git2provCvt.getProvObject(git2provCvt.getPrefixes("result:","http:/zz","PROV-O")); 576 | var fileList = "README.md\n\n\n\ngit2provConverter.js\nindex.js"; 577 | var log_cmds; 578 | 579 | before(function(){ 580 | log_cmds = git2provCvt.getLogCommands(provObj,fileList,"result:",{}); 581 | }); 582 | 583 | it("process file into correct log command list", function(){ 584 | 585 | assert.deepEqual(log_cmds,[ 586 | "git --no-pager log --date=iso --name-status --pretty=format:\"README-md,%H,%P,%an,%ad,%cn,%cd,%s,&\" -- README.md", 587 | "git --no-pager log --date=iso --name-status --pretty=format:\"git2provConverter-js,%H,%P,%an,%ad,%cn,%cd,%s,&\" -- git2provConverter.js", 588 | "git --no-pager log --date=iso --name-status --pretty=format:\"index-js,%H,%P,%an,%ad,%cn,%cd,%s,&\" -- index.js" 589 | ]); 590 | 591 | } ); 592 | 593 | }); 594 | 595 | var rqURL = "http://x/"; 596 | var provObject; 597 | 598 | 599 | 600 | describe('PROV-XML serialization', function(){ 601 | 602 | it("Should return serialization unsupported", function(done){ 603 | 604 | var prefixes = git2provCvt.getPrefixes("result:", rqURL, "PROV-XML"); 605 | provObject = git2provCvt.getProvObject(prefixes, rqURL); 606 | 607 | 608 | serializers.serializePROVXML( 609 | git2provCvt.getProvObject(provObject, rqURL), 610 | '', 611 | function(result,type){ 612 | 613 | assert.equal(type,"text/plain"); 614 | assert.equal(result,"serialization unsupported"); 615 | 616 | done(); 617 | } 618 | ); 619 | }); 620 | }); 621 | 622 | 623 | describe('Serialization', function(){ 624 | 625 | var prefixes = git2provCvt.getPrefixes("result:", rqURL, "PROV-XML"); 626 | provObject = git2provCvt.getProvObject(prefixes, rqURL); 627 | 628 | 629 | it("Should return correct minimal PROV-N", function(done){ 630 | 631 | var prefixes = git2provCvt.getPrefixes("result:", rqURL, "PROV-N"); 632 | provObject = git2provCvt.getProvObject(prefixes, rqURL); 633 | 634 | serializers.serializePROVN (provObject,'',function(result,type){ 635 | 636 | assert.equal(type,"text/plain"); 637 | assert.deepEqual(result.split("\n"),[ 638 | "document", 639 | "prefix result: ", 640 | "prefix fullResult <&serialization=PROV-N#>", 641 | "bundle http://x/:provenance", 642 | "endBundle ", 643 | "endDocument", 644 | "" 645 | ]); 646 | 647 | done(); 648 | } 649 | ); 650 | }); 651 | 652 | 653 | it("Should return correct minimal PROV-O", function(done){ 654 | 655 | var prefixes = git2provCvt.getPrefixes("result:", rqURL, "PROV-O"); 656 | provObject = git2provCvt.getProvObject(prefixes, rqURL); 657 | 658 | serializers.serializePROVO (provObject,'',function(result,type){ 659 | 660 | assert.equal(type,"text/plain"); 661 | assert.deepEqual(result.split("\n"),[ 662 | "@prefix fullResult: <&serialization=PROV-O#> .", 663 | "@prefix prov: .", 664 | "@prefix rdfs: .", 665 | "@prefix result:: .", 666 | "@prefix xsd: .", 667 | "http://x/:provenance\ta\tprov:Bundle ;", 668 | "\t\tprov:alternateOf\tfullResult:provenance ." 669 | ]); 670 | 671 | done(); 672 | } 673 | ); 674 | }); 675 | 676 | 677 | it("Should return correct minimal PROV-JSON", function(done){ 678 | 679 | var rqURL = "http://x/"; 680 | var provObject = git2provCvt.getProvObject(git2provCvt.getPrefixes("result:", rqURL, "PROV-JSON"), rqURL); 681 | 682 | var prefixes = git2provCvt.getPrefixes("result:", rqURL, "PROV-JSON"); 683 | provObject = git2provCvt.getProvObject(prefixes, rqURL); 684 | 685 | 686 | serializers.serializePROVJSON(provObject, '', function(result,type){ 687 | 688 | assert.equal(type,"text/plain"); 689 | assert.equal(result,"{\n \"prefix\": {\n" + 690 | " \"result:\": \"http://x/#\",\n" + 691 | " \"fullResult\": \"&serialization=PROV-JSON#\"\n },\n" + 692 | " \"bundle\": {\n \"http://x/:provenance\": {\n \"entity\": {},\n" + 693 | " \"agent\": {},\n \"activity\": {},\n \"wasStartedBy\": {},\n" + 694 | " \"wasEndedBy\": {},\n \"wasAttributedTo\": {},\n" + 695 | " \"wasAssociatedWith\": {},\n" + 696 | " \"wasInformedBy\": {},\n" + 697 | " \"specializationOf\": {},\n" + 698 | " \"wasGeneratedBy\": {},\n" + 699 | " \"used\": {},\n" + 700 | " \"wasDerivedFrom\": {},\n" + 701 | " \"wasInvalidatedBy\": {}\n" + 702 | " }\n }\n}"); 703 | 704 | done(); 705 | } 706 | ); 707 | }); 708 | }); 709 | 710 | 711 | }); 712 | 713 | 714 | describe('Integration', function(){ 715 | 716 | 717 | beforeEach(function(complete) { 718 | exec("rm -rf testRepo", { timeout : 5000 }, 719 | function() { complete(); }); 720 | }); 721 | 722 | describe('Test Repo', function(){ 723 | 724 | it('should give correct PROV-O serialization on test ProvTrace repo', function(done){ 725 | 726 | fs.readFile('test/testProvOdata.n3','utf8', function(err,provOData) { 727 | 728 | git2provCvt.convert("https://github.com/vladistan/ProvTrace","PROV-O","testRepo","http://xxx.bob&d=1" , [], function(a,b,c){ 729 | assert.deepEqual(a.split('\n'), provOData.split('\n')); 730 | assert.equal(b, null); 731 | assert.equal(c,"text/plain"); 732 | done(); 733 | 734 | }); 735 | }); 736 | }); 737 | 738 | it('should give correct PROV-JSON serialization on test ProvTrace repo', function(done){ 739 | 740 | fs.readFile('test/testProvJSONData.json','utf8', function(err,provJSONData) { 741 | git2provCvt.convert("https://github.com/vladistan/ProvTrace","PROV-JSON","testRepo","http://xxx.bob&d=1" , [], function(a,b,c){ 742 | var parsedTestData = JSON.parse(provJSONData); 743 | var parsedProvData = JSON.parse(a); 744 | assert.deepEqual(parsedProvData, parsedTestData); 745 | assert.equal(b, null); 746 | assert.equal(c,"text/plain"); 747 | done(); 748 | }); 749 | }); 750 | }); 751 | 752 | it('should give correct PROV-XML serialization on test ProvTrace repo', function(done){ 753 | 754 | fs.readFile('test/testProvXMLData.xml','utf8', function(err,provXMLData) { 755 | git2provCvt.convert("https://github.com/vladistan/ProvTrace","PROV-XML","testRepo","http://xxx.bob&d=1" , [], function(a,b,c){ 756 | assert.deepEqual(a, provXMLData); 757 | assert.equal(b, null); 758 | assert.equal(c,"text/plain"); 759 | done(); 760 | }); 761 | }); 762 | }); 763 | 764 | it('should give correct PROV-N serialization on test ProvTrace repo', function(done){ 765 | 766 | fs.readFile('test/testProvNdata.n3','utf8', function(err,provXMLData) { 767 | 768 | git2provCvt.convert("https://github.com/vladistan/ProvTrace","PROV-N","testRepo","http://xxx.bob&d=1" , [], function(a,b,c){ 769 | assert.deepEqual(a, provXMLData); 770 | assert.equal(b, null); 771 | assert.equal(c,"text/plain"); 772 | done(); 773 | }); 774 | }); 775 | }); 776 | 777 | }); 778 | }); 779 | 780 | -------------------------------------------------------------------------------- /test/testProvJSONData.json: -------------------------------------------------------------------------------- 1 | { 2 | "prefix": { 3 | "result": "http://xxx.bob&d=1#", 4 | "fullResult": "http://xxx.bob&serialization=PROV-JSON#" 5 | }, 6 | "bundle": { 7 | "result:provenance": { 8 | "entity": { 9 | "result:file--gitignore": { 10 | "prov:label": ".gitignore" 11 | }, 12 | "result:file-Berksfile": { 13 | "prov:label": "Berksfile" 14 | }, 15 | "result:file-Linux-call_watcher-c": { 16 | "prov:label": "Linux/call_watcher.c" 17 | }, 18 | "result:file-Linux-test-sh": { 19 | "prov:label": "Linux/test.sh" 20 | }, 21 | "result:file-Mac-call_watcher-c": { 22 | "prov:label": "Mac/call_watcher.c" 23 | }, 24 | "result:file-Mac-test-c": { 25 | "prov:label": "Mac/test.c" 26 | }, 27 | "result:file-Mac-test-sh": { 28 | "prov:label": "Mac/test.sh" 29 | }, 30 | "result:file-Vagrantfile": { 31 | "prov:label": "Vagrantfile" 32 | }, 33 | "result:file-LICENSE": { 34 | "prov:label": "LICENSE" 35 | }, 36 | "result:file-README-md": { 37 | "prov:label": "README.md" 38 | }, 39 | "result:file-Linux-Makefile": { 40 | "prov:label": "Linux/Makefile" 41 | }, 42 | "result:file-Linux-myPreload-c": { 43 | "prov:label": "Linux/myPreload.c" 44 | }, 45 | "result:file-Linux-test-c": { 46 | "prov:label": "Linux/test.c" 47 | }, 48 | "result:file-Mac-Makefile": { 49 | "prov:label": "Mac/Makefile" 50 | }, 51 | "result:file-Mac-inject-h": { 52 | "prov:label": "Mac/inject.h" 53 | }, 54 | "result:file-Mac-inject-m": { 55 | "prov:label": "Mac/inject.m" 56 | }, 57 | "result:file-Mac-open-c": { 58 | "prov:label": "Mac/open.c" 59 | }, 60 | "result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {}, 61 | "result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162": {}, 62 | "result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {}, 63 | "result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162": {}, 64 | "result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {}, 65 | "result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162": {}, 66 | "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {}, 67 | "result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162": {}, 68 | "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {}, 69 | "result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162": {}, 70 | "result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {}, 71 | "result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162": {}, 72 | "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {}, 73 | "result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162": {}, 74 | "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {}, 75 | "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a": {}, 76 | "result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a": {}, 77 | "result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {}, 78 | "result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {}, 79 | "result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {}, 80 | "result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {}, 81 | "result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {}, 82 | "result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {}, 83 | "result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {}, 84 | "result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": {} 85 | }, 86 | "agent": { 87 | "result:user-vlad": { 88 | "prov:label": "vlad" 89 | }, 90 | "result:user-Vlad-Korolev": { 91 | "prov:label": "Vlad Korolev" 92 | } 93 | }, 94 | "activity": { 95 | "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d": { 96 | "prov:label": "Modernized and harmonized the code" 97 | }, 98 | "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162": { 99 | "prov:label": "Initial import" 100 | }, 101 | "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a": { 102 | "prov:label": "Initial commit" 103 | } 104 | }, 105 | "wasStartedBy": { 106 | "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_start": { 107 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 108 | "prov:time": "2014-08-14T13:42:05.000Z" 109 | }, 110 | "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_start": { 111 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 112 | "prov:time": "2014-08-13T00:06:41.000Z" 113 | }, 114 | "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_start": { 115 | "prov:activity": "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 116 | "prov:time": "2014-08-14T15:21:06.000Z" 117 | } 118 | }, 119 | "wasEndedBy": { 120 | "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_end": { 121 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 122 | "prov:time": "2014-08-14T15:50:51.000Z" 123 | }, 124 | "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_end": { 125 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 126 | "prov:time": "2014-08-13T00:06:41.000Z" 127 | }, 128 | "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_end": { 129 | "prov:activity": "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 130 | "prov:time": "2014-08-14T15:41:35.000Z" 131 | } 132 | }, 133 | "wasAttributedTo": { 134 | "result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": { 135 | "prov:entity": "result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 136 | "prov:agent": "result:user-vlad", 137 | "prov:type": "authorship" 138 | }, 139 | "result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_user-vlad_attr": { 140 | "prov:entity": "result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 141 | "prov:agent": "result:user-vlad", 142 | "prov:type": "authorship" 143 | }, 144 | "result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": { 145 | "prov:entity": "result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 146 | "prov:agent": "result:user-vlad", 147 | "prov:type": "authorship" 148 | }, 149 | "result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_user-vlad_attr": { 150 | "prov:entity": "result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 151 | "prov:agent": "result:user-vlad", 152 | "prov:type": "authorship" 153 | }, 154 | "result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": { 155 | "prov:entity": "result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 156 | "prov:agent": "result:user-vlad", 157 | "prov:type": "authorship" 158 | }, 159 | "result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_user-vlad_attr": { 160 | "prov:entity": "result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 161 | "prov:agent": "result:user-vlad", 162 | "prov:type": "authorship" 163 | }, 164 | "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": { 165 | "prov:entity": "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 166 | "prov:agent": "result:user-vlad", 167 | "prov:type": "authorship" 168 | }, 169 | "result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_user-vlad_attr": { 170 | "prov:entity": "result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 171 | "prov:agent": "result:user-vlad", 172 | "prov:type": "authorship" 173 | }, 174 | "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": { 175 | "prov:entity": "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 176 | "prov:agent": "result:user-vlad", 177 | "prov:type": "authorship" 178 | }, 179 | "result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_user-vlad_attr": { 180 | "prov:entity": "result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 181 | "prov:agent": "result:user-vlad", 182 | "prov:type": "authorship" 183 | }, 184 | "result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": { 185 | "prov:entity": "result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 186 | "prov:agent": "result:user-vlad", 187 | "prov:type": "authorship" 188 | }, 189 | "result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_user-vlad_attr": { 190 | "prov:entity": "result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 191 | "prov:agent": "result:user-vlad", 192 | "prov:type": "authorship" 193 | }, 194 | "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": { 195 | "prov:entity": "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 196 | "prov:agent": "result:user-vlad", 197 | "prov:type": "authorship" 198 | }, 199 | "result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_user-vlad_attr": { 200 | "prov:entity": "result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 201 | "prov:agent": "result:user-vlad", 202 | "prov:type": "authorship" 203 | }, 204 | "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": { 205 | "prov:entity": "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 206 | "prov:agent": "result:user-vlad", 207 | "prov:type": "authorship" 208 | }, 209 | "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_user-Vlad-Korolev_attr": { 210 | "prov:entity": "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 211 | "prov:agent": "result:user-Vlad-Korolev", 212 | "prov:type": "authorship" 213 | }, 214 | "result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_user-Vlad-Korolev_attr": { 215 | "prov:entity": "result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 216 | "prov:agent": "result:user-Vlad-Korolev", 217 | "prov:type": "authorship" 218 | }, 219 | "result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": { 220 | "prov:entity": "result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 221 | "prov:agent": "result:user-vlad", 222 | "prov:type": "authorship" 223 | }, 224 | "result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": { 225 | "prov:entity": "result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 226 | "prov:agent": "result:user-vlad", 227 | "prov:type": "authorship" 228 | }, 229 | "result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": { 230 | "prov:entity": "result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 231 | "prov:agent": "result:user-vlad", 232 | "prov:type": "authorship" 233 | }, 234 | "result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": { 235 | "prov:entity": "result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 236 | "prov:agent": "result:user-vlad", 237 | "prov:type": "authorship" 238 | }, 239 | "result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": { 240 | "prov:entity": "result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 241 | "prov:agent": "result:user-vlad", 242 | "prov:type": "authorship" 243 | }, 244 | "result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": { 245 | "prov:entity": "result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 246 | "prov:agent": "result:user-vlad", 247 | "prov:type": "authorship" 248 | }, 249 | "result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": { 250 | "prov:entity": "result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 251 | "prov:agent": "result:user-vlad", 252 | "prov:type": "authorship" 253 | }, 254 | "result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_attr": { 255 | "prov:entity": "result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 256 | "prov:agent": "result:user-vlad", 257 | "prov:type": "authorship" 258 | } 259 | }, 260 | "wasAssociatedWith": { 261 | "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_user-vlad_assoc": { 262 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 263 | "prov:agent": "result:user-vlad", 264 | "prov:role": "author, committer" 265 | }, 266 | "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_user-vlad_assoc": { 267 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 268 | "prov:agent": "result:user-vlad", 269 | "prov:role": "author, committer" 270 | }, 271 | "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_user-Vlad-Korolev_assoc": { 272 | "prov:activity": "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 273 | "prov:agent": "result:user-Vlad-Korolev", 274 | "prov:role": "author" 275 | }, 276 | "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_user-vlad_assoc": { 277 | "prov:activity": "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 278 | "prov:agent": "result:user-vlad", 279 | "prov:role": "committer, committer" 280 | } 281 | }, 282 | "wasInformedBy": { 283 | "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_comm": { 284 | "prov:informant": "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 285 | "prov:informed": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 286 | } 287 | }, 288 | "specializationOf": { 289 | "result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": { 290 | "prov:generalEntity": "result:file-Mac-open-c", 291 | "prov:specificEntity": "result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 292 | }, 293 | "result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_spec": { 294 | "prov:generalEntity": "result:file-Mac-open-c", 295 | "prov:specificEntity": "result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162" 296 | }, 297 | "result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": { 298 | "prov:generalEntity": "result:file-Mac-inject-m", 299 | "prov:specificEntity": "result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 300 | }, 301 | "result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_spec": { 302 | "prov:generalEntity": "result:file-Mac-inject-m", 303 | "prov:specificEntity": "result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162" 304 | }, 305 | "result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": { 306 | "prov:generalEntity": "result:file-Mac-inject-h", 307 | "prov:specificEntity": "result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 308 | }, 309 | "result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_spec": { 310 | "prov:generalEntity": "result:file-Mac-inject-h", 311 | "prov:specificEntity": "result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162" 312 | }, 313 | "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": { 314 | "prov:generalEntity": "result:file-Mac-Makefile", 315 | "prov:specificEntity": "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 316 | }, 317 | "result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_spec": { 318 | "prov:generalEntity": "result:file-Mac-Makefile", 319 | "prov:specificEntity": "result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162" 320 | }, 321 | "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": { 322 | "prov:generalEntity": "result:file-Linux-test-c", 323 | "prov:specificEntity": "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 324 | }, 325 | "result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_spec": { 326 | "prov:generalEntity": "result:file-Linux-test-c", 327 | "prov:specificEntity": "result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162" 328 | }, 329 | "result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": { 330 | "prov:generalEntity": "result:file-Linux-myPreload-c", 331 | "prov:specificEntity": "result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 332 | }, 333 | "result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_spec": { 334 | "prov:generalEntity": "result:file-Linux-myPreload-c", 335 | "prov:specificEntity": "result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162" 336 | }, 337 | "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": { 338 | "prov:generalEntity": "result:file-Linux-Makefile", 339 | "prov:specificEntity": "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 340 | }, 341 | "result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_spec": { 342 | "prov:generalEntity": "result:file-Linux-Makefile", 343 | "prov:specificEntity": "result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162" 344 | }, 345 | "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": { 346 | "prov:generalEntity": "result:file-README-md", 347 | "prov:specificEntity": "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 348 | }, 349 | "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_spec": { 350 | "prov:generalEntity": "result:file-README-md", 351 | "prov:specificEntity": "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a" 352 | }, 353 | "result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_spec": { 354 | "prov:generalEntity": "result:file-LICENSE", 355 | "prov:specificEntity": "result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a" 356 | }, 357 | "result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": { 358 | "prov:generalEntity": "result:file-Vagrantfile", 359 | "prov:specificEntity": "result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 360 | }, 361 | "result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": { 362 | "prov:generalEntity": "result:file-Mac-test-sh", 363 | "prov:specificEntity": "result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 364 | }, 365 | "result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": { 366 | "prov:generalEntity": "result:file-Mac-test-c", 367 | "prov:specificEntity": "result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 368 | }, 369 | "result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": { 370 | "prov:generalEntity": "result:file-Mac-call_watcher-c", 371 | "prov:specificEntity": "result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 372 | }, 373 | "result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": { 374 | "prov:generalEntity": "result:file-Linux-test-sh", 375 | "prov:specificEntity": "result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 376 | }, 377 | "result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": { 378 | "prov:generalEntity": "result:file-Linux-call_watcher-c", 379 | "prov:specificEntity": "result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 380 | }, 381 | "result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": { 382 | "prov:generalEntity": "result:file-Berksfile", 383 | "prov:specificEntity": "result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 384 | }, 385 | "result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_spec": { 386 | "prov:generalEntity": "result:file--gitignore", 387 | "prov:specificEntity": "result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d" 388 | } 389 | }, 390 | "wasGeneratedBy": { 391 | "result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_gen": { 392 | "prov:entity": "result:file-Mac-open-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 393 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 394 | "prov:time": "2014-08-13T00:06:41.000Z" 395 | }, 396 | "result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_gen": { 397 | "prov:entity": "result:file-Mac-inject-m_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 398 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 399 | "prov:time": "2014-08-13T00:06:41.000Z" 400 | }, 401 | "result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_gen": { 402 | "prov:entity": "result:file-Mac-inject-h_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 403 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 404 | "prov:time": "2014-08-13T00:06:41.000Z" 405 | }, 406 | "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": { 407 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 408 | "prov:entity": "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 409 | "prov:time": "2014-08-14T13:42:05.000Z" 410 | }, 411 | "result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_gen": { 412 | "prov:entity": "result:file-Mac-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 413 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 414 | "prov:time": "2014-08-13T00:06:41.000Z" 415 | }, 416 | "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": { 417 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 418 | "prov:entity": "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 419 | "prov:time": "2014-08-14T13:42:05.000Z" 420 | }, 421 | "result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_gen": { 422 | "prov:entity": "result:file-Linux-test-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 423 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 424 | "prov:time": "2014-08-13T00:06:41.000Z" 425 | }, 426 | "result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_gen": { 427 | "prov:entity": "result:file-Linux-myPreload-c_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 428 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 429 | "prov:time": "2014-08-13T00:06:41.000Z" 430 | }, 431 | "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": { 432 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 433 | "prov:entity": "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 434 | "prov:time": "2014-08-14T13:42:05.000Z" 435 | }, 436 | "result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162_gen": { 437 | "prov:entity": "result:file-Linux-Makefile_commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 438 | "prov:activity": "result:commit-e01161193fe24e3c8f08a6d80c27ea33dac0c162", 439 | "prov:time": "2014-08-13T00:06:41.000Z" 440 | }, 441 | "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": { 442 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 443 | "prov:entity": "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 444 | "prov:time": "2014-08-14T13:42:05.000Z" 445 | }, 446 | "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_gen": { 447 | "prov:entity": "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 448 | "prov:activity": "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 449 | "prov:time": "2014-08-14T15:21:06.000Z" 450 | }, 451 | "result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_gen": { 452 | "prov:entity": "result:file-LICENSE_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 453 | "prov:activity": "result:commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 454 | "prov:time": "2014-08-14T15:21:06.000Z" 455 | }, 456 | "result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": { 457 | "prov:entity": "result:file-Vagrantfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 458 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 459 | "prov:time": "2014-08-14T13:42:05.000Z" 460 | }, 461 | "result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": { 462 | "prov:entity": "result:file-Mac-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 463 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 464 | "prov:time": "2014-08-14T13:42:05.000Z" 465 | }, 466 | "result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": { 467 | "prov:entity": "result:file-Mac-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 468 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 469 | "prov:time": "2014-08-14T13:42:05.000Z" 470 | }, 471 | "result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": { 472 | "prov:entity": "result:file-Mac-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 473 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 474 | "prov:time": "2014-08-14T13:42:05.000Z" 475 | }, 476 | "result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": { 477 | "prov:entity": "result:file-Linux-test-sh_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 478 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 479 | "prov:time": "2014-08-14T13:42:05.000Z" 480 | }, 481 | "result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": { 482 | "prov:entity": "result:file-Linux-call_watcher-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 483 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 484 | "prov:time": "2014-08-14T13:42:05.000Z" 485 | }, 486 | "result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": { 487 | "prov:entity": "result:file-Berksfile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 488 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 489 | "prov:time": "2014-08-14T13:42:05.000Z" 490 | }, 491 | "result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen": { 492 | "prov:entity": "result:file--gitignore_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 493 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 494 | "prov:time": "2014-08-14T13:42:05.000Z" 495 | } 496 | }, 497 | "used": { 498 | "result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use": { 499 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 500 | "prov:entity": "result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 501 | "prov:time": "2014-08-14T13:42:05.000Z" 502 | }, 503 | "result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use": { 504 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 505 | "prov:entity": "result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 506 | "prov:time": "2014-08-14T13:42:05.000Z" 507 | }, 508 | "result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use": { 509 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 510 | "prov:entity": "result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 511 | "prov:time": "2014-08-14T13:42:05.000Z" 512 | }, 513 | "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use": { 514 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 515 | "prov:entity": "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 516 | "prov:time": "2014-08-14T13:42:05.000Z" 517 | } 518 | }, 519 | "wasDerivedFrom": { 520 | "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_der": { 521 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 522 | "prov:generatedEntity": "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 523 | "prov:usedEntity": "result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 524 | "prov:generation": "result:file-Mac-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen", 525 | "prov:usage": "result:file-Mac-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use" 526 | }, 527 | "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_der": { 528 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 529 | "prov:generatedEntity": "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 530 | "prov:usedEntity": "result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 531 | "prov:generation": "result:file-Linux-test-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen", 532 | "prov:usage": "result:file-Linux-test-c_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use" 533 | }, 534 | "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_der": { 535 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 536 | "prov:generatedEntity": "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 537 | "prov:usedEntity": "result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 538 | "prov:generation": "result:file-Linux-Makefile_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen", 539 | "prov:usage": "result:file-Linux-Makefile_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use" 540 | }, 541 | "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_der": { 542 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 543 | "prov:generatedEntity": "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 544 | "prov:usedEntity": "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a", 545 | "prov:generation": "result:file-README-md_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_gen", 546 | "prov:usage": "result:file-README-md_commit-21fd9dde98de5b31f4ca89fe0347b44fd2a1997a_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_use" 547 | } 548 | }, 549 | "wasInvalidatedBy": { 550 | "result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_inv": { 551 | "prov:entity": "result:file-Mac-open-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 552 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 553 | "prov:time": "2014-08-14T13:42:05.000Z" 554 | }, 555 | "result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_inv": { 556 | "prov:entity": "result:file-Mac-inject-m_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 557 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 558 | "prov:time": "2014-08-14T13:42:05.000Z" 559 | }, 560 | "result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_inv": { 561 | "prov:entity": "result:file-Mac-inject-h_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 562 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 563 | "prov:time": "2014-08-14T13:42:05.000Z" 564 | }, 565 | "result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d_inv": { 566 | "prov:entity": "result:file-Linux-myPreload-c_commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 567 | "prov:activity": "result:commit-9ff4ed4636c15aa04c262f9e89c52d451a2c1e6d", 568 | "prov:time": "2014-08-14T13:42:05.000Z" 569 | } 570 | } 571 | } 572 | } 573 | } --------------------------------------------------------------------------------