Skip to content

Commit 42088c9

Browse files
committed
Merge pull request #188 from nodegit/auto-gen-structs
Auto gen structs
2 parents 61b5583 + 2332599 commit 42088c9

File tree

13 files changed

+25639
-294
lines changed

13 files changed

+25639
-294
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
/src/*
1212
!/src/functions/copy.cc
1313
!/src/wrapper.cc
14-
!/src/nodegit.cc
1514

1615
/include/*
1716
!/include/functions/copy.h
1817
!/include/wrapper.h
1918

2019
/generate/idefs.json
20+
/binding.gyp

.travis.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,3 @@ git:
77
branches:
88
only:
99
- master
10-
matrix:
11-
fast_finish: true
12-
allow_failures:
13-
- node_js: 0.11

appveyor.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,6 @@ environment:
1515
- nodejs_version: 0.11
1616
- nodejs_version: 0.10
1717

18-
matrix:
19-
allow_failures:
20-
- nodejs_version: 0.11
21-
2218
# Get the latest stable version of Node 0.STABLE.latest
2319
install:
2420
- ps: Update-NodeJsInstallation (Get-NodeJsLatestBuild $env:nodejs_version)

binding.gyp

Lines changed: 0 additions & 104 deletions
This file was deleted.

generate/descriptor.json

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -254,29 +254,6 @@
254254
"../include/diff.h",
255255
"../include/oid.h",
256256
"../include/types.h"
257-
],
258-
259-
"fields": [
260-
{
261-
"name": "oid",
262-
"cType": "git_oid"
263-
},
264-
{
265-
"name": "path",
266-
"cType": "const char *"
267-
},
268-
{
269-
"name": "size",
270-
"cType": "git_off_t"
271-
},
272-
{
273-
"name": "flags",
274-
"cType": "uint32_t"
275-
},
276-
{
277-
"name": "mode",
278-
"cType": "uint16_t"
279-
}
280257
]
281258
},
282259

@@ -375,6 +352,8 @@
375352
},
376353

377354
"filter": {
355+
"forwardDeclare": true,
356+
"fields": []
378357
},
379358

380359
"graph": {
@@ -420,6 +399,8 @@
420399
},
421400

422401
"oid": {
402+
"fields": [],
403+
423404
"functions": {
424405
"git_oid_fromstr": {
425406
"isAsync": false,

generate/index.js

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ const ejs = require("ejs");
44
const path = require("path");
55
const idefs = require("./idefs");
66

7-
87
var local = path.join.bind(null, __dirname);
98

109
var classTemplate = ejs.compile(
@@ -17,16 +16,29 @@ var headerTemplate = ejs.compile(
1716
filename: "header.h"
1817
});
1918

20-
Object.keys(idefs).forEach(function(keyName) {
21-
var idef = idefs[keyName];
19+
var bindingTemplate = ejs.compile(
20+
"" + fs.readFileSync(local("templates/binding.gyp.ejs")), {});
21+
22+
var nodegitSourceTemplate = ejs.compile(
23+
"" + fs.readFileSync(local("templates/nodegit.cc.ejs")), {});
2224

23-
if (idef.ignore) {
24-
return;
25-
}
25+
var enabled = idefs.filter(function(idef) {
26+
idef.name = path.basename(idef.filename, ".h");
27+
return !idef.ignore;
28+
});
2629

30+
enabled.forEach(function(idef) {
2731
fs.writeFileSync(local("../include/", idef.filename), headerTemplate(idef));
2832

2933
fs.writeFileSync(
3034
local("../src/", path.basename(idef.filename, ".h")) + ".cc",
3135
classTemplate(idef));
36+
37+
fs.writeFileSync(local("../binding.gyp"), bindingTemplate({
38+
idefs: idefs
39+
}));
40+
41+
fs.writeFileSync(local("../src/nodegit.cc"), nodegitSourceTemplate({
42+
idefs: idefs
43+
}));
3244
});

generate/setup.js

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ var version = require("../package.json").libgit2.version;
55
var descriptor = require("./descriptor.json");
66
var libgit2 = require("./v" + version + ".json");
77

8+
var structs = libgit2.types.reduce(function(memo, current) {
9+
return memo[current[0]] = current[1], memo;
10+
}, {});
11+
812
// Extracted types.
913
var typeMap = require("./types.json");
1014

@@ -29,7 +33,15 @@ typeMap.__proto__ = {
2933
"git_branch_iterator **": { cpp: "BranchIterator", js: "Iterator" },
3034
"git_branch_t *": { cpp: "GitBranch", js: "Branch" },
3135
"const git_commit *[]": { cpp: "Array", js: "Array" },
32-
"git_diff_file": { cpp: "GitDiffFile", js: "DiffFile" }
36+
"git_diff_file": { cpp: "GitDiffFile", js: "DiffFile" },
37+
"git_strarray": { cpp: "Array", js: "Array" },
38+
"git_diff_notify_cb": { cpp: "GitDiffNotifyCb", js: "DiffNotifyCb" },
39+
"unsigned char [20]": { cpp: "Array", js: "Array" },
40+
"git_filter_init_fn": { cpp: "Function", js: "Function" },
41+
"git_filter_shutdown_fn": { cpp: "Function", js: "Function" },
42+
"git_filter_check_fn": { cpp: "Function", js: "Function" },
43+
"git_filter_apply_fn": { cpp: "Function", js: "Function" },
44+
"git_filter_cleanup_fn": { cpp: "Function", js: "Function" },
3345
};
3446

3547
var files = [];
@@ -58,6 +70,7 @@ var fileNames = Object.keys(descriptor);
5870

5971
fileNames.forEach(function(fileName, index) {
6072
var file = descriptor[fileName];
73+
var structFile = structs["git_" + fileName];
6174

6275
// Constants.
6376
file.filename = fileName + ".h";
@@ -90,6 +103,7 @@ fileNames.forEach(function(fileName, index) {
90103
// No functions.
91104
cFile = Object.create(file);
92105
cFile.functions = [];
106+
cFile.fields = descriptor[fileName].fields || structFile.fields;
93107
}
94108

95109
// Doesn't actually exist.
@@ -146,17 +160,18 @@ fileNames.forEach(function(fileName, index) {
146160
js: file.jsClassName
147161
};
148162

149-
var fields = file.fields || [];
163+
var fields = file.fields || cFile.fields || (structFile ? structFile.fields || [] : []);
150164

151165
// Decorate fields.
152166
file.fields = fields.map(function(field) {
153167
try {
168+
field.cType = field.cType || field.type;
154169
field.cppFunctionName = titleCase(field.name);
155170
field.jsFunctionName = camelCase(field.name);
156171
field.cppClassName = typeMap[field.cType].cpp;
157172
field.jsClassName = typeMap[field.cType].js;
158173
} catch (ex) {
159-
console.error(field.name + " is missing a definition.");
174+
console.error(file.filename, field.cType + " is missing a definition.");
160175
}
161176

162177
return field;

generate/templates/binding.gyp.ejs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# This is a generated file, modify: generate/templates/binding.gyp.ejs.
2+
{
3+
"targets": [
4+
{
5+
"target_name": "nodegit",
6+
7+
"dependencies": [
8+
"<(module_root_dir)/vendor/libgit2.gyp:libgit2"
9+
],
10+
11+
"sources": [
12+
"src/nodegit.cc",
13+
"src/wrapper.cc",
14+
"src/functions/copy.cc",
15+
<% idefs.forEach(function(idef) { -%>
16+
"src/<%- idef.name %>.cc",
17+
<% }); -%>
18+
],
19+
20+
"include_dirs": [
21+
"vendor/libv8-convert",
22+
"<!(node -e \"require('nan')\")"
23+
],
24+
25+
"cflags": [
26+
"-Wall",
27+
],
28+
29+
"conditions": [
30+
[
31+
"OS=='mac'", {
32+
"xcode_settings": {
33+
"GCC_ENABLE_CPP_EXCEPTIONS": "YES",
34+
35+
"WARNING_CFLAGS": [
36+
"-Wno-unused-variable",
37+
],
38+
}
39+
}
40+
]
41+
]
42+
},
43+
]
44+
}

generate/templates/class.cc.ejs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@
2323
else { return '0'; }
2424
}
2525
-%>
26-
/**
27-
* This code is auto-generated; unless you know what you're doing, do not modify!
28-
**/
26+
// This is a generated file, modify: generate/templates/class.cc.ejs.
2927
#include <nan.h>
3028
#include <string.h>
3129

32-
#include "git2.h"
30+
extern "C" {
31+
#include <git2.h>
32+
}
3333

3434
#include "../include/functions/copy.h"
3535

generate/templates/header.h.ejs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
/**
2-
* This code is auto-generated; unless you know what you're doing, do not modify!
3-
**/
4-
1+
// This is a generated file, modify: generate/templates/header.h.ejs.
52
#ifndef <%- cppClassName.toUpperCase() %>_H
63
#define <%- cppClassName.toUpperCase() %>_H
74

85
#include <nan.h>
96
#include <string>
107

11-
#include "git2.h"
8+
extern "C" {
9+
#include <git2.h>
10+
}
1211

1312
<% if (typeof dependencies != 'undefined') { -%>
1413
<% for (d in dependencies) { -%>

0 commit comments

Comments
 (0)