diff --git a/example/config.yml b/example/config.yml index 06fe0687..a930e59b 100644 --- a/example/config.yml +++ b/example/config.yml @@ -3,7 +3,6 @@ backend: delay: 0.1 media_folder: "assets/uploads" -publish_mode: branch collections: # A list of collections the CMS should be able to edit - name: "posts" # Used in routes, ie.: /admin/collections/:slug/edit diff --git a/src/backends/backend.js b/src/backends/backend.js index 05fbc153..d588aea6 100644 --- a/src/backends/backend.js +++ b/src/backends/backend.js @@ -1,8 +1,8 @@ import TestRepoBackend from './test-repo/implementation'; import GitHubBackend from './github/implementation'; import { resolveFormat } from '../formats/formats'; -import { randomStr } from '../lib/randomGenerator'; import { createEntry } from '../valueObjects/Entry'; +import { SIMPLE, BRANCH } from './constants'; class LocalStorageAuthStore { storageKey = 'nf-cms-user'; @@ -93,12 +93,12 @@ class Backend { } getPublishMode(config) { - const publish_modes = ['simple', 'branch']; - const mode = config.get('publish_mode'); + const publish_modes = [SIMPLE, BRANCH]; + const mode = config.getIn(['backend', 'publish_mode']); if (publish_modes.indexOf(mode) !== -1) { return mode; } else { - return 'simple'; + return SIMPLE; } } diff --git a/src/backends/constants.js b/src/backends/constants.js new file mode 100644 index 00000000..6f6c6852 --- /dev/null +++ b/src/backends/constants.js @@ -0,0 +1,3 @@ +// Create/edit modes +export const SIMPLE = 'simple'; +export const BRANCH = 'branch'; diff --git a/src/backends/github/implementation.js b/src/backends/github/implementation.js index fbd18407..b742ce62 100644 --- a/src/backends/github/implementation.js +++ b/src/backends/github/implementation.js @@ -3,6 +3,8 @@ import MediaProxy from '../../valueObjects/MediaProxy'; import { createEntry } from '../../valueObjects/Entry'; import AuthenticationPage from './AuthenticationPage'; import { Base64 } from 'js-base64'; +import { randomStr } from '../../lib/randomGenerator'; +import { BRANCH } from '../constants'; const API_ROOT = 'https://api.github.com'; @@ -47,6 +49,7 @@ class API { let filename, part, parts, subtree; const fileTree = {}; const files = []; + const branchName = ( options.mode === BRANCH ) ? 'cms-' + randomStr() : this.branch; mediaFiles.concat(entry).forEach((file) => { if (file.uploaded) { return; } files.push(this.uploadBlob(file)); @@ -62,9 +65,15 @@ class API { }); return Promise.all(files) - .then(() => this.getBranch()) - .then((branchData) => { - return this.updateTree(branchData.commit.sha, '/', fileTree); + .then(() => { + if (options.mode === BRANCH) { + return this.createBranch(branchName); + } else { + return this.getBranch(); + } + }) + .then((BranchCommit) => { + return this.updateTree(BranchCommit.sha, '/', fileTree); }) .then((changeTree) => { return this.request(`${this.repoURL}/git/commits`, { @@ -72,7 +81,7 @@ class API { body: JSON.stringify({ message: options.commitMessage, tree: changeTree.sha, parents: [changeTree.parentSha] }) }); }).then((response) => { - return this.request(`${this.repoURL}/git/refs/heads/${this.branch}`, { + return this.request(`${this.repoURL}/git/refs/heads/${branchName}`, { method: 'PATCH', body: JSON.stringify({ sha: response.sha }) }); @@ -108,8 +117,24 @@ class API { }); } + createBranch(branchName) { + return this.getBranch() + .then(branchCommit => { + const branchData = { + ref: 'refs/heads/' + branchName, + sha: branchCommit.sha + }; + return this.request(`${this.repoURL}/git/refs`, { + method: 'POST', + body: JSON.stringify(branchData), + }); + }) + .then(branchData => branchData.object); + } + getBranch() { - return this.request(`${this.repoURL}/branches/${this.branch}`); + return this.request(`${this.repoURL}/branches/${this.branch}`) + .then(branchData => branchData.commit); } getTree(sha) {