Merge pull request #76 from bkeepers/relative-to-source

Include content relative to source repository
This commit is contained in:
Brandon Keepers 2016-12-09 09:38:29 -06:00 committed by GitHub
commit 3d123908ba
3 changed files with 59 additions and 9 deletions

View File

@ -4,16 +4,18 @@ const url = require('./util/github-url');
const log = require('./log');
module.exports = class Configuration {
static load(context, path) {
const options = context.toRepo(url(path));
static load(context, path, source) {
const options = context.toRepo(url(path, source));
log.debug(options, 'Fetching config');
return context.github.repos.getContent(options).then(data => {
return new Configuration(context).parse(new Buffer(data.content, 'base64').toString());
const config = new Configuration(context, options);
return config.parse(new Buffer(data.content, 'base64').toString());
});
}
constructor(context) {
constructor(context, source) {
this.context = context;
this.source = source || {};
this.workflows = [];
this.api = {
@ -30,7 +32,7 @@ module.exports = class Configuration {
}
include(path) {
const load = Configuration.load(this.context, path);
const load = Configuration.load(this.context, path, this.source);
this.workflows.push({
execute() {
@ -42,7 +44,7 @@ module.exports = class Configuration {
}
contents(path) {
const options = this.context.toRepo(url(path));
const options = this.context.toRepo(url(path, this.source));
log.debug(options, 'Getting contents');
return this.context.github.repos.getContent(options).then(data => {
return new Buffer(data.content, 'base64').toString();

View File

@ -1,7 +1,7 @@
const REGEX = /^(?:([\w-]+)\/([\w-]+):)?([^#]*)(?:#(.*))?$/;
// Parses paths in the form of `owner/repo:path/to/file#ref`
module.exports = function (url) {
module.exports = function (url, source) {
const [, owner, repo, path, ref] = url.match(REGEX);
return Object.assign({path}, owner && {owner, repo}, ref && {ref});
return Object.assign({}, source, {path}, owner && {owner, repo}, ref && {ref});
};

View File

@ -71,8 +71,10 @@ describe('integration', () => {
});
describe('include', () => {
let content;
beforeEach(() => {
const content = require('./fixtures/content/probot.json');
content = require('./fixtures/content/probot.json');
content.content = new Buffer('on("issues").comment("Hello!");').toString('base64');
github.repos.getContent.andReturn(Promise.resolve(content));
@ -95,6 +97,28 @@ describe('integration', () => {
done();
});
});
it('includes files relative to included repository', () => {
github.repos.getContent.andCall(params => {
if (params.path === 'script-a.js') {
return Promise.resolve({
content: new Buffer('include("script-b.js")').toString('base64')
});
} else {
return Promise.resolve({content: ''});
}
});
const config = configure('include("other/repo:script-a.js");');
return config.execute().then(() => {
expect(github.repos.getContent).toHaveBeenCalledWith({
owner: 'other',
repo: 'repo',
path: 'script-b.js'
});
});
});
});
describe('contents', () => {
@ -115,5 +139,29 @@ describe('integration', () => {
});
});
});
it('gets contents relative to included repository', () => {
github.repos.getContent.andCall(params => {
if (params.path === 'script-a.js') {
return Promise.resolve({
content: new Buffer(`
on("issues").comment(contents("content.md"));
`).toString('base64')
});
} else {
return Promise.resolve({content: ''});
}
});
const config = configure('include("other/repo:script-a.js");');
return config.execute().then(() => {
expect(github.repos.getContent).toHaveBeenCalledWith({
owner: 'other',
repo: 'repo',
path: 'content.md'
});
});
});
});
});