Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: .diff-to* versions #157

Merged
merged 2 commits into from
Aug 31, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5,285 changes: 5,285 additions & 0 deletions generated/ghes-2.18.diff-to-ghes-2.19.deref.json

Large diffs are not rendered by default.

1,835 changes: 1,835 additions & 0 deletions generated/ghes-2.18.diff-to-ghes-2.19.json

Large diffs are not rendered by default.

98,744 changes: 98,744 additions & 0 deletions generated/ghes-2.19.diff-to-ghes-2.20.deref.json

Large diffs are not rendered by default.

12,071 changes: 12,071 additions & 0 deletions generated/ghes-2.19.diff-to-ghes-2.20.json

Large diffs are not rendered by default.

95,764 changes: 95,764 additions & 0 deletions generated/ghes-2.20.diff-to-ghes-2.21.deref.json

Large diffs are not rendered by default.

11,619 changes: 11,619 additions & 0 deletions generated/ghes-2.20.diff-to-ghes-2.21.json

Large diffs are not rendered by default.

101,095 changes: 101,095 additions & 0 deletions generated/ghes-2.21.diff-to-ghes-2.22.deref.json

Large diffs are not rendered by default.

13,462 changes: 13,462 additions & 0 deletions generated/ghes-2.21.diff-to-ghes-2.22.json

Large diffs are not rendered by default.

5,370 changes: 5,370 additions & 0 deletions generated/ghes-2.22.diff-to-ghes-3.0.deref.json

Large diffs are not rendered by default.

1,783 changes: 1,783 additions & 0 deletions generated/ghes-2.22.diff-to-ghes-3.0.json

Large diffs are not rendered by default.

12,686 changes: 12,686 additions & 0 deletions generated/ghes-3.0.diff-to-ghes-3.1.deref.json

Large diffs are not rendered by default.

2,985 changes: 2,985 additions & 0 deletions generated/ghes-3.0.diff-to-ghes-3.1.json

Large diffs are not rendered by default.

79,654 changes: 79,654 additions & 0 deletions generated/ghes-3.1.diff-to-api.github.com.deref.json

Large diffs are not rendered by default.

15,280 changes: 15,280 additions & 0 deletions generated/ghes-3.1.diff-to-api.github.com.json

Large diffs are not rendered by default.

5,266 changes: 5,266 additions & 0 deletions generated/github.ae.diff-to-api.github.com.deref.json

Large diffs are not rendered by default.

2,943 changes: 2,943 additions & 0 deletions generated/github.ae.diff-to-api.github.com.json

Large diffs are not rendered by default.

98 changes: 94 additions & 4 deletions scripts/build.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const { createWriteStream, readdirSync, writeFileSync } = require("fs");
const { resolve } = require("path");
const { basename, resolve } = require("path");

const prettier = require("prettier");
const execa = require("execa");
Expand Down Expand Up @@ -69,7 +69,7 @@ async function run() {

const fromPath = `generated/${toFromFilename(file)}`;
const toPath = `generated/${file}`;
const diffPath = `generated/${toDiffFilename(file)}`;
const diffPath = `generated/${toAniccaDiffFilename(file)}`;

const cmd = `cargo run --bin cli diff ${resolve(fromPath)} ${resolve(
toPath
Expand Down Expand Up @@ -151,6 +151,10 @@ async function run() {
fromPath.replace(".deref", ""),
toPath.replace(".deref", "")
);

// add diff files
createDiffVersion(toPath);
createDiffVersion(toPath.replace(".deref", ""));
}

let schemasCode = "";
Expand Down Expand Up @@ -179,7 +183,8 @@ async function run() {
);
}

function toFromFilename(filename) {
function toFromFilename(path) {
const filename = basename(path);
if (filename.startsWith("github.ae")) {
return "api.github.com.deref.json";
}
Expand All @@ -205,11 +210,26 @@ function toFromFilename(filename) {
throw new Error(`Cannot calculate base version for ${filename}`);
}

function toDiffFilename(filename) {
function toAniccaDiffFilename(path) {
const filename = basename(path);
const fromFilename = toFromFilename(filename);
return filename.replace(".deref.json", `.anicca-diff-to-${fromFilename}`);
}

function toDiffFilename(path) {
const filename = basename(path);
const fromFilename = toFromFilename(filename);

if (filename.includes(".deref")) {
return filename.replace(/\.deref\.json/, `.diff-to-${fromFilename}`);
}

return filename.replace(
/\.json/,
`.diff-to-${fromFilename.replace(".deref", "")}`
);
}

function filenameToVersion(filename) {
return filename.replace(/^generated\//, "").replace(/\.deref\.json$/, "");
}
Expand Down Expand Up @@ -391,3 +411,73 @@ function addDiffExtensions(diffJson, fromPath, toPath) {

console.log(`"x-octokit".diff extension added to ${toPath}`);
}

function createDiffVersion(path) {
const schema = require(`../${path}`);
const newPaths = {};
let refs = new Set();

// remove all paths that didn't change and keep track of refs
for (const [path, methods] of Object.entries(schema.paths)) {
for (const [method, operation] of Object.entries(methods)) {
if (!operation["x-octokit"]?.diff) continue;

_.set(newPaths, `${path}.${method}`, operation);
refs = new Set([...refs, ...findRefs(operation, refs)]);
}
}
schema.paths = newPaths;

// go through all refs recursively
refs.forEach((ref) => {
const component = _.get(schema, ref);
findAllRefs(schema, component, refs);
});

// remove all components that didn't change
const newComponents = {};
refs.forEach((ref) => {
_.set(newComponents, ref, _.get(schema, ref));
});
schema.components = newComponents.components;

console.log("%d components left over", refs.size);

const newPath = "generated/" + toDiffFilename(path);

writeFileSync(
newPath,
prettier.format(JSON.stringify(schema), { parser: "json" })
);

console.log("%s updated", newPath);
}

function findRefs(obj) {
const newRefs = new Set();
mapObj(
obj,
(key, value) => {
if (key === "$ref") {
// value is e.g. "#/components/parameters/per-page"
newRefs.add(value.substr(2).replace(/\//g, "."));
}

return [key, value];
},
{ deep: true }
);

return newRefs;
}

function findAllRefs(schema, component, refs) {
const newRefs = findRefs(refs, component);

newRefs.forEach((ref) => {
if (refs.has(ref)) return;
refs.add(ref);

findAllRefs(schema, _.get(schema, ref), refs);
});
}