Browse Source
fix(git): handle file renames between folders (#6020)
* git storage: handle file renames between folders
---------
Co-authored-by: Nicolas Giard <github@ngpixel.com>
pull/6031/merge
Eric Knibbe
2 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with
23 additions and
8 deletions
-
server/core/db.js
-
server/models/pages.js
-
server/modules/storage/disk/storage.js
-
server/modules/storage/git/storage.js
|
|
@ -138,7 +138,7 @@ module.exports = { |
|
|
|
switch (WIKI.config.db.type) { |
|
|
|
case 'postgres': |
|
|
|
await conn.query(`set application_name = 'Wiki.js'`) |
|
|
|
// -> Set schema if it's not public
|
|
|
|
// -> Set schema if it's not public
|
|
|
|
if (WIKI.config.db.schema && WIKI.config.db.schema !== 'public') { |
|
|
|
await conn.query(`set search_path TO ${WIKI.config.db.schema}, public;`) |
|
|
|
} |
|
|
|
|
|
@ -725,7 +725,7 @@ module.exports = class Page extends Model { |
|
|
|
const destinationHash = pageHelper.generateHash({ path: opts.destinationPath, locale: opts.destinationLocale, privateNS: opts.isPrivate ? 'TODO' : '' }) |
|
|
|
|
|
|
|
// -> Move page
|
|
|
|
const destinationTitle = (page.title === page.path ? opts.destinationPath : page.title) |
|
|
|
const destinationTitle = (page.title === _.last(page.path.split('/')) ? _.last(opts.destinationPath.split('/')) : page.title) |
|
|
|
await WIKI.models.pages.query().patch({ |
|
|
|
path: opts.destinationPath, |
|
|
|
localeCode: opts.destinationLocale, |
|
|
@ -745,6 +745,7 @@ module.exports = class Page extends Model { |
|
|
|
...page, |
|
|
|
destinationPath: opts.destinationPath, |
|
|
|
destinationLocaleCode: opts.destinationLocale, |
|
|
|
title: destinationTitle, |
|
|
|
destinationHash |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
@ -135,7 +135,7 @@ module.exports = { |
|
|
|
transform: async (page, enc, cb) => { |
|
|
|
const pageObject = await WIKI.models.pages.query().findById(page.id) |
|
|
|
page.tags = await pageObject.$relatedQuery('tags') |
|
|
|
|
|
|
|
|
|
|
|
let fileName = `${page.path}.${pageHelper.getFileExtension(page.contentType)}` |
|
|
|
if (WIKI.config.lang.code !== page.localeCode) { |
|
|
|
fileName = `${page.localeCode}/${fileName}` |
|
|
|
|
|
@ -146,10 +146,24 @@ module.exports = { |
|
|
|
const diff = await this.git.diffSummary(['-M', currentCommitLog.hash, latestCommitLog.hash]) |
|
|
|
if (_.get(diff, 'files', []).length > 0) { |
|
|
|
let filesToProcess = [] |
|
|
|
const filePattern = /(.*?)(?:{(.*?))? => (?:(.*?)})?(.*)/ |
|
|
|
for (const f of diff.files) { |
|
|
|
const fMoved = f.file.split(' => ') |
|
|
|
const fName = fMoved.length === 2 ? fMoved[1] : fMoved[0] |
|
|
|
const fPath = path.join(this.repoPath, fName) |
|
|
|
const fMatch = f.file.match(filePattern) |
|
|
|
const fNames = { |
|
|
|
old: null, |
|
|
|
new: null |
|
|
|
} |
|
|
|
if (!fMatch) { |
|
|
|
fNames.old = f.file |
|
|
|
fNames.new = f.file |
|
|
|
} else if (!fMatch[2] && !fMatch[3]) { |
|
|
|
fNames.old = fMatch[1] |
|
|
|
fNames.new = fMatch[4] |
|
|
|
} else { |
|
|
|
fNames.old = (fMatch[1]+fMatch[2]+fMatch[4]).replace('//', '/'), |
|
|
|
fNames.new = (fMatch[1]+fMatch[3]+fMatch[4]).replace('//', '/') |
|
|
|
} |
|
|
|
const fPath = path.join(this.repoPath, fNames.new) |
|
|
|
let fStats = { size: 0 } |
|
|
|
try { |
|
|
|
fStats = await fs.stat(fPath) |
|
|
@ -166,8 +180,8 @@ module.exports = { |
|
|
|
path: fPath, |
|
|
|
stats: fStats |
|
|
|
}, |
|
|
|
oldPath: fMoved[0], |
|
|
|
relPath: fName |
|
|
|
oldPath: fNames.old, |
|
|
|
relPath: fNames.new |
|
|
|
}) |
|
|
|
} |
|
|
|
await this.processFiles(filesToProcess, rootUser) |
|
|
|