From e3ad57821ba0d09b0040874978fe737557278a26 Mon Sep 17 00:00:00 2001 From: Chris Dickinson Date: Thu, 11 Aug 2011 19:35:56 -0500 Subject: [PATCH 01/19] Add simple test runner. --- test/index.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 test/index.js diff --git a/test/index.js b/test/index.js new file mode 100644 index 0000000..c362d60 --- /dev/null +++ b/test/index.js @@ -0,0 +1,48 @@ +var exp = {}; +var merge = function(what) { + Object.keys(what).forEach(function(key) { + exp[key] = what[key] + }) +} +merge(require('./delta_test')) +merge(require('./diff_test')) +merge(require('./http_remote_test')) +merge(require('./jsgit_test')) +merge(require('./memory_repo_test')) +merge(require('./object_test')) +merge(require('./pack_file_test')) +merge(require('./pack_index_test')) +merge(require('./remote_test')) +merge(require('./smart_http_remote_test')) + +var assert = require('assert'); + +var tests = Object.keys(exp).map(function(key) { + return Object.keys(this[key]).map(function(test) { + return [key + ' / '+ test, this[test].bind(this, assert)]; + }, this[key]); +}, exp).reduce(function(lhs, rhs) { + return lhs.concat(rhs); +}, []); + + +var recurse = function() { + if(!tests.length) + return; + else { + try { + tests.shift()[1]() + } catch(err) { + process.stderr.write('F'); + recurse() + } + } +}; + +assert.equals = assert.equal +assert.done = function() { + process.stderr.write('.'); + recurse(); +}; + +recurse() From 12fdf26942eb0c74b7c7644bfc81f6db557874e6 Mon Sep 17 00:00:00 2001 From: Chris Dickinson Date: Thu, 11 Aug 2011 20:12:21 -0500 Subject: [PATCH 02/19] Tests run using 'node test/index.js' now. --- test/diff_test.js | 34 ++++++++++++++++---------------- test/index.js | 42 ++++++++++++++++++++++++++++++++++++---- test/memory_repo_test.js | 10 +++++++--- 3 files changed, 62 insertions(+), 24 deletions(-) diff --git a/test/diff_test.js b/test/diff_test.js index 568c3c5..59a40f1 100644 --- a/test/diff_test.js +++ b/test/diff_test.js @@ -5,7 +5,7 @@ exports.NullEndpoints = { "null start": function(test) { var file1 = "" var file2 = ["a", "b", "c"].join("\n") - var diff = new Git.Diff(file1, file2) + var diff = new Git.FileDiff(file1, file2) test.deepEqual( diff.info, [{offset: 1, @@ -19,7 +19,7 @@ exports.NullEndpoints = { "null end": function(test) { var file1 = ["a", "b", "c"].join("\n") var file2 = "" - var diff = new Git.Diff(file1, file2) + var diff = new Git.FileDiff(file1, file2) test.deepEqual( diff.info, [{offset: 1, @@ -36,7 +36,7 @@ exports.SingleHunk = { "additions at end": function(test) { var file1 = ["a", "b", "c", "d", "e", "f"].join("\n") var file2 = ["a", "b", "c", "d", "e", "f", "g", "h"].join("\n") - var diff = new Git.Diff(file1, file2) + var diff = new Git.FileDiff(file1, file2) test.deepEqual( diff.info, [{offset: 7, @@ -53,7 +53,7 @@ exports.SingleHunk = { "additions at beginning": function(test) { var file1 = ["a", "b", "c", "d", "e", "f"].join("\n") var file2 = ["0", "1", "a", "b", "c", "d", "e", "f"].join("\n") - var diff = new Git.Diff(file1, file2) + var diff = new Git.FileDiff(file1, file2) test.deepEqual( diff.info, [{offset: 1, @@ -70,7 +70,7 @@ exports.SingleHunk = { "additions in middle": function(test) { var file1 = ["a", "b", "c", "d", "e", "f"].join("\n") var file2 = ["a", "b", "c", "0", "1", "d", "e", "f"].join("\n") - var diff = new Git.Diff(file1, file2) + var diff = new Git.FileDiff(file1, file2) test.deepEqual( diff.info, [{offset: 4, @@ -90,7 +90,7 @@ exports.SingleHunk = { "removals at end": function(test) { var file1 = ["a", "b", "c", "d", "e", "f"].join("\n") var file2 = ["a", "b", "c", "d"].join("\n") - var diff = new Git.Diff(file1, file2) + var diff = new Git.FileDiff(file1, file2) test.deepEqual( diff.info, [{offset: 5, @@ -107,7 +107,7 @@ exports.SingleHunk = { "removals at beginning": function(test) { var file1 = ["a", "b", "c", "d", "e", "f"].join("\n") var file2 = ["c", "d", "e", "f"].join("\n") - var diff = new Git.Diff(file1, file2) + var diff = new Git.FileDiff(file1, file2) test.deepEqual( diff.info, [{offset: 1, @@ -124,7 +124,7 @@ exports.SingleHunk = { "removals in middle": function(test) { var file1 = ["a", "b", "c", "d", "e", "f"].join("\n") var file2 = ["a", "b", "e", "f"].join("\n") - var diff = new Git.Diff(file1, file2) + var diff = new Git.FileDiff(file1, file2) test.deepEqual( diff.info, [{offset: 3, @@ -142,7 +142,7 @@ exports.SingleHunk = { "added and removed in middle of same length": function(test) { var file1 = ["a", "b", "c", "d", "e", "f"].join("\n") var file2 = ["a", "b", "0", "1", "e", "f"].join("\n") - var diff = new Git.Diff(file1, file2) + var diff = new Git.FileDiff(file1, file2) test.deepEqual( diff.info, [{offset: 3, @@ -162,7 +162,7 @@ exports.SingleHunk = { "more added than removed": function(test) { var file1 = ["a", "b", "c", "d", "e", "f"].join("\n") var file2 = ["a", "b", "0", "1", "2", "3", "e", "f"].join("\n") - var diff = new Git.Diff(file1, file2) + var diff = new Git.FileDiff(file1, file2) test.deepEqual( diff.info, [{offset: 3, @@ -184,7 +184,7 @@ exports.SingleHunk = { "more removed than added": function(test) { var file1 = ["a", "b", "c", "d", "e", "f"].join("\n") var file2 = ["a", "b", "0", "1", "f"].join("\n") - var diff = new Git.Diff(file1, file2) + var diff = new Git.FileDiff(file1, file2) test.deepEqual( diff.info, [{offset: 3, @@ -206,7 +206,7 @@ exports.MultipleSeparateHunks = { "added then added": function(test) { var file1 = "123456789".split("").join("\n") var file2 = "123xy4567zq89".split("").join("\n") - var diff = new Git.Diff(file1, file2, {context: 1}) + var diff = new Git.FileDiff(file1, file2, {context: 1}) test.deepEqual( diff.info[0], {offset: 4, @@ -231,7 +231,7 @@ exports.MultipleSeparateHunks = { "removed then removed": function(test) { var file1 = "123456789".split("").join("\n") var file2 = "1345689".split("").join("\n") - var diff = new Git.Diff(file1, file2, {context: 1}) + var diff = new Git.FileDiff(file1, file2, {context: 1}) test.deepEqual( diff.info[0], {offset: 2, @@ -254,7 +254,7 @@ exports.MultipleSeparateHunks = { "added then removed": function(test) { var file1 = "123456789".split("").join("\n") var file2 = "123xy45689".split("").join("\n") - var diff = new Git.Diff(file1, file2, {context: 1}) + var diff = new Git.FileDiff(file1, file2, {context: 1}) test.deepEqual( diff.info[0], {offset: 4, @@ -278,7 +278,7 @@ exports.MultipleSeparateHunks = { "removed then added": function(test) { var file1 = "123456789".split("").join("\n") var file2 = "134567xq89".split("").join("\n") - var diff = new Git.Diff(file1, file2, {context: 1}) + var diff = new Git.FileDiff(file1, file2, {context: 1}) test.deepEqual( diff.info[0], {offset: 2, @@ -304,7 +304,7 @@ exports.MultipleConnectedHunks = { "overlap by 1": function(test) { var file1 = "123456789".split("").join("\n") var file2 = "123xy4zq56789".split("").join("\n") - var diff = new Git.Diff(file1, file2, {context: 1}) + var diff = new Git.FileDiff(file1, file2, {context: 1}) test.equal(diff.info.length, 1) test.deepEqual( diff.info[0], @@ -324,7 +324,7 @@ exports.MultipleConnectedHunks = { "overlap by 2": function(test) { var file1 = "123456789".split("").join("\n") var file2 = "123xy4zq56789".split("").join("\n") - var diff = new Git.Diff(file1, file2, {context: 2}) + var diff = new Git.FileDiff(file1, file2, {context: 2}) test.equal(diff.info.length, 1) test.deepEqual( diff.info[0], diff --git a/test/index.js b/test/index.js index c362d60..3f772b6 100644 --- a/test/index.js +++ b/test/index.js @@ -15,7 +15,9 @@ merge(require('./pack_index_test')) merge(require('./remote_test')) merge(require('./smart_http_remote_test')) +var trace = require('tracejs').trace; var assert = require('assert'); +var errors = []; var tests = Object.keys(exp).map(function(key) { return Object.keys(this[key]).map(function(test) { @@ -25,15 +27,47 @@ var tests = Object.keys(exp).map(function(key) { return lhs.concat(rhs); }, []); +var total = tests.length; +var start = Date.now(); + +var finish = function() { + process.stderr.write('\n'); + var last = null; + errors.forEach(function(error) { + var name = error[0] + , err = error[1]; + + if(last !== name) { + console.error(' in '+name+':'); + last = name; + } + + var stack = trace(err); + process.stderr.write('\t'+err+'\n'); + stack.frames.forEach(function(frame) { + if(frame) { + process.stderr.write(frame.filename.replace(process.cwd(), '.')+' on line '+frame.line+' \n') + process.stderr.write(frame.get_lines(1,1).replace(/\n/g, '\t\n')+'\n') + } + }); + }); + + process.stderr.write('\n('+(total-errors.length)+' / '+total+') in '+(Date.now() - start)+'ms\n'); + return process.exit(errors.length) +}; var recurse = function() { if(!tests.length) - return; + return finish(); else { + var next = tests.shift() + , name = next[0] + , test = next[1]; try { - tests.shift()[1]() + test() } catch(err) { - process.stderr.write('F'); + process.stderr.write('F') + errors.push([name, err]) recurse() } } @@ -45,4 +79,4 @@ assert.done = function() { recurse(); }; -recurse() +return recurse() diff --git a/test/memory_repo_test.js b/test/memory_repo_test.js index e2e6ab6..8284b38 100644 --- a/test/memory_repo_test.js +++ b/test/memory_repo_test.js @@ -41,8 +41,12 @@ exports.MemoryRepo = { repo.makeAndAddObject("asdfasdf", "blob", "Hello World!") test.equals(repo.objectCount(), 1) - test.deepEqual(repo.getObject("asdfasdf").type, "blob") - test.deepEqual(repo.getObject("asdfasdf").data, "Hello World!") + repo.getObject("asdfasdf", function(err, obj) { + test.deepEqual(obj.type, "blob"); + }) + repo.getObject("asdfasdf", function(err, obj) { + test.deepEqual(obj.data, 'Hello World!'); + }) test.done() } } @@ -66,4 +70,4 @@ exports.GithubProxyRepo = { test.done() }, -} \ No newline at end of file +} From 65eee205d8e83715e1778c1e6221b821831e2a89 Mon Sep 17 00:00:00 2001 From: Chris Dickinson Date: Thu, 11 Aug 2011 21:17:17 -0500 Subject: [PATCH 03/19] Add package.json. --- package.json | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 package.json diff --git a/package.json b/package.json new file mode 100644 index 0000000..3a0c94f --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ + +{ + "name" : "git.js", + "version" : "0.0.1", + "description" : "pure javascript implementation of git", + "directories" : { + "lib" : ".", + "test" : "test" + }, + "dependencies" : { + }, + "devDependencies" : { + "tracejs" : "0.X.X" + }, + "scripts" : { + "test" : "node test/index.js" + }, + "repository" : { + "type" : "git", + "url" : "http://github.com/danlucraft/git.js.git" + }, + "keywords" : [ + "git", + "client", + "server" + ], + "license" : "MIT", + "engine" : { "node" : ">=0.4" } +} From 3927842f6ec15847e773edf3c5cebe2b67426b68 Mon Sep 17 00:00:00 2001 From: Chris Dickinson Date: Thu, 11 Aug 2011 21:25:48 -0500 Subject: [PATCH 04/19] Remove deprecated 'require.paths' modification, change to relative paths for require. --- lib/git-server.js | 46 ++++++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/lib/git-server.js b/lib/git-server.js index a244225..587e4d0 100644 --- a/lib/git-server.js +++ b/lib/git-server.js @@ -1,7 +1,5 @@ var path = require('path') -require.paths.unshift(__dirname) - window = global jsGitInNode = true @@ -12,28 +10,28 @@ require('../vendor/sha1') require('../vendor/sha2') require('../vendor/md5') require('../vendor/diff') -require('string_helpers') -require('binary_file') -require('git') -require('git/upload_pack_parser') -require('git/pack') -require('git/remote') -require('git/http_remote') -require('git/smart_http_remote') -require('git/objects') -require('git/file-diff') -require('git/tree-diff') -require('git/delta') -require('git/pack_index') -require('git/cli') -require('git/memory_repo') +require('./string_helpers') +require('./binary_file') +require('./git') +require('./git/upload_pack_parser') +require('./git/pack') +require('./git/remote') +require('./git/http_remote') +require('./git/smart_http_remote') +require('./git/objects') +require('./git/file-diff') +require('./git/tree-diff') +require('./git/delta') +require('./git/pack_index') +require('./git/cli') +require('./git/memory_repo') // Only for server -require('git/repo') -require('git/command-runner') -require('git/commands/show-command') -require('git/commands/branch-command') -require('git/commands/log-command') -require('git/commands/diff-command') -require('git/pack-file') +require('./git/repo') +require('./git/command-runner') +require('./git/commands/show-command') +require('./git/commands/branch-command') +require('./git/commands/log-command') +require('./git/commands/diff-command') +require('./git/pack-file') From 8b9fd6ebc027bc40546878d6df093ebb65b3e0de Mon Sep 17 00:00:00 2001 From: Chris Dickinson Date: Fri, 12 Aug 2011 01:46:49 -0500 Subject: [PATCH 05/19] Refactor to use CommonJS idioms. - Holy god, I'm sorry for this patchbomb. - This also includes some other fixes. Sorry. * the author parser in lib/git/objects.js only matched one side of UTC (+0000 vs -0000). * the repo branch collector failed on branch names that contain a slash (e.g, "feature/refactor", etc). - All tests pass. - All client commands seem to still work. --- bin/git.js | 4 +- lib/binary_file.js | 198 +++++----- lib/git-server.js | 4 +- lib/git.js | 97 +++-- lib/git/cli.js | 91 ++--- lib/git/command-runner.js | 49 +-- lib/git/commands/branch-command.js | 6 +- lib/git/commands/diff-command.js | 46 ++- lib/git/commands/log-command.js | 9 +- lib/git/commands/show-command.js | 6 +- lib/git/delta.js | 14 +- lib/git/file-diff.js | 242 ++++++------ lib/git/github_repo.js | 10 + lib/git/http_remote.js | 46 +-- lib/git/memory_repo.js | 169 ++++----- lib/git/objects.js | 19 +- lib/git/pack-file.js | 75 ++-- lib/git/pack.js | 573 +++++++++++++++-------------- lib/git/pack_index.js | 209 ++++++----- lib/git/remote.js | 134 +++---- lib/git/repo.js | 307 +++++++++------- lib/git/smart_http_remote.js | 33 +- lib/git/tree-diff.js | 386 +++++++++---------- lib/git/upload_pack_parser.js | 22 +- lib/git/utils.js | 52 +++ test/delta_test.js | 8 +- test/diff_test.js | 37 +- test/http_remote_test.js | 11 +- test/index.js | 8 +- test/jsgit_test.js | 25 +- test/memory_repo_test.js | 15 +- test/object_test.js | 20 +- test/pack_file_test.js | 10 +- test/pack_index_test.js | 27 +- test/remote_test.js | 22 +- test/smart_http_remote_test.js | 7 +- vendor/diff.js | 4 +- vendor/js-deflate/rawdeflate.js | 3 +- vendor/js-deflate/rawinflate.js | 3 +- vendor/sha1.js | 5 +- vendor/sha2.js | 2 +- 41 files changed, 1546 insertions(+), 1462 deletions(-) create mode 100644 lib/git/github_repo.js create mode 100644 lib/git/utils.js diff --git a/bin/git.js b/bin/git.js index e48bdde..5126de6 100755 --- a/bin/git.js +++ b/bin/git.js @@ -1,10 +1,10 @@ #!/usr/bin/env node -require('../lib/git-server') +var Cli = require('../lib/git/cli') // Get rid of process runner ('node' in most cases) var arg, args = [], argv = process.argv.slice(2); -var cli = new Git.Cli(argv) +var cli = new Cli(argv) cli.run() diff --git a/lib/binary_file.js b/lib/binary_file.js index d66dbf9..38d7cac 100644 --- a/lib/binary_file.js +++ b/lib/binary_file.js @@ -1,99 +1,117 @@ +var btoa = this.btoa || require('./btoa'); -BinaryFile = function(strData, iDataOffset, iDataLength) { - var data = strData; - var dataOffset = iDataOffset || 0; - var dataLength = 0; +// these are created (dynamically!) via +// a - diff --git a/demos/repo-viewer/repo-viewer.js b/demos/repo-viewer/repo-viewer.js index 1adaec4..f5f8169 100644 --- a/demos/repo-viewer/repo-viewer.js +++ b/demos/repo-viewer/repo-viewer.js @@ -4,7 +4,6 @@ var MemoryRepo = Git.require('lib/git/memory_repo') , _ = Git.require('underscore') , MyMD5 = Git.require('vendor/md5') -console.log(MyMD5) RepoViewer = { repo: null,