fix(git): handle file renames between folders (#6020)
* git storage: handle file renames between folders --------- Co-authored-by: Nicolas Giard <github@ngpixel.com>
This commit is contained in:
		| @@ -138,7 +138,7 @@ module.exports = { | |||||||
|           switch (WIKI.config.db.type) { |           switch (WIKI.config.db.type) { | ||||||
|             case 'postgres': |             case 'postgres': | ||||||
|               await conn.query(`set application_name = 'Wiki.js'`) |               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') { |               if (WIKI.config.db.schema && WIKI.config.db.schema !== 'public') { | ||||||
|                 await conn.query(`set search_path TO ${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' : '' }) |     const destinationHash = pageHelper.generateHash({ path: opts.destinationPath, locale: opts.destinationLocale, privateNS: opts.isPrivate ? 'TODO' : '' }) | ||||||
|  |  | ||||||
|     // -> Move page |     // -> 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({ |     await WIKI.models.pages.query().patch({ | ||||||
|       path: opts.destinationPath, |       path: opts.destinationPath, | ||||||
|       localeCode: opts.destinationLocale, |       localeCode: opts.destinationLocale, | ||||||
| @@ -745,6 +745,7 @@ module.exports = class Page extends Model { | |||||||
|       ...page, |       ...page, | ||||||
|       destinationPath: opts.destinationPath, |       destinationPath: opts.destinationPath, | ||||||
|       destinationLocaleCode: opts.destinationLocale, |       destinationLocaleCode: opts.destinationLocale, | ||||||
|  |       title: destinationTitle, | ||||||
|       destinationHash |       destinationHash | ||||||
|     }) |     }) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -135,7 +135,7 @@ module.exports = { | |||||||
|         transform: async (page, enc, cb) => { |         transform: async (page, enc, cb) => { | ||||||
|           const pageObject = await WIKI.models.pages.query().findById(page.id) |           const pageObject = await WIKI.models.pages.query().findById(page.id) | ||||||
|           page.tags = await pageObject.$relatedQuery('tags') |           page.tags = await pageObject.$relatedQuery('tags') | ||||||
|            |  | ||||||
|           let fileName = `${page.path}.${pageHelper.getFileExtension(page.contentType)}` |           let fileName = `${page.path}.${pageHelper.getFileExtension(page.contentType)}` | ||||||
|           if (WIKI.config.lang.code !== page.localeCode) { |           if (WIKI.config.lang.code !== page.localeCode) { | ||||||
|             fileName = `${page.localeCode}/${fileName}` |             fileName = `${page.localeCode}/${fileName}` | ||||||
|   | |||||||
| @@ -146,10 +146,24 @@ module.exports = { | |||||||
|       const diff = await this.git.diffSummary(['-M', currentCommitLog.hash, latestCommitLog.hash]) |       const diff = await this.git.diffSummary(['-M', currentCommitLog.hash, latestCommitLog.hash]) | ||||||
|       if (_.get(diff, 'files', []).length > 0) { |       if (_.get(diff, 'files', []).length > 0) { | ||||||
|         let filesToProcess = [] |         let filesToProcess = [] | ||||||
|  |         const filePattern = /(.*?)(?:{(.*?))? => (?:(.*?)})?(.*)/ | ||||||
|         for (const f of diff.files) { |         for (const f of diff.files) { | ||||||
|           const fMoved = f.file.split(' => ') |           const fMatch = f.file.match(filePattern) | ||||||
|           const fName = fMoved.length === 2 ? fMoved[1] : fMoved[0] |           const fNames = { | ||||||
|           const fPath = path.join(this.repoPath, fName) |             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 } |           let fStats = { size: 0 } | ||||||
|           try { |           try { | ||||||
|             fStats = await fs.stat(fPath) |             fStats = await fs.stat(fPath) | ||||||
| @@ -166,8 +180,8 @@ module.exports = { | |||||||
|               path: fPath, |               path: fPath, | ||||||
|               stats: fStats |               stats: fStats | ||||||
|             }, |             }, | ||||||
|             oldPath: fMoved[0], |             oldPath: fNames.old, | ||||||
|             relPath: fName |             relPath: fNames.new | ||||||
|           }) |           }) | ||||||
|         } |         } | ||||||
|         await this.processFiles(filesToProcess, rootUser) |         await this.processFiles(filesToProcess, rootUser) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user