diff --git a/languages/c/language.config.json b/languages/c/language.config.json index 185b0370..97e90519 100644 --- a/languages/c/language.config.json +++ b/languages/c/language.config.json @@ -10,5 +10,6 @@ "/include/Common/Module.h", "/src/Module_Common.cpp", "/src/JsonData_Module.h" - ] -} \ No newline at end of file + ], + "persistPermission": true +} diff --git a/src/macrofier/index.mjs b/src/macrofier/index.mjs index f8acada8..b1d61ee4 100644 --- a/src/macrofier/index.mjs +++ b/src/macrofier/index.mjs @@ -18,7 +18,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { emptyDir, readDir, readFiles, readJson, writeFiles, writeText } from '../shared/filesystem.mjs' +import { emptyDir, readDir, readFiles, readFilesPermissions, readJson, + writeFiles, writeFilesPermissions, writeText } from '../shared/filesystem.mjs' import { getTemplate, getTemplateForModule } from '../shared/template.mjs' import { getModule, hasPublicAPIs } from '../shared/modules.mjs' import { logHeader, logSuccess } from '../shared/io.mjs' @@ -42,6 +43,7 @@ const macrofy = async ( staticContent, templatesPerModule, templatesPerSchema, + persistPermission, createModuleDirectories, copySchemasIntoModules, aggregateFile, @@ -87,6 +89,12 @@ const macrofy = async ( const sharedTemplateList = await readDir(sharedTemplates, { recursive: true }) const templates = Object.assign(await readFiles(sharedTemplateList, sharedTemplates), await readFiles(sdkTemplateList, template)) // sdkTemplates are second so they win ties + let templatesPermission = {} + if (persistPermission) { + templatesPermission = Object.assign(await readFilesPermissions(sharedTemplateList, sharedTemplates), + await readFilesPermissions(sdkTemplateList, template)) + } + const exampleTemplates = {} for (var i=0; i chmodSync(ref, mode) + const readText = ref => readFile(ref) .then(resp => resp.toString()) @@ -39,6 +41,34 @@ const readDir = async (ref, options) => { return results.sort() } +const getIndex = (refs, base) => { + let index = base ? base.length : 0 + if (base && !refs[0].startsWith(base)) { + refs = refs.map(v => path.relative(base, v)) + index = 0 + } + else if (index === 0 && refs.length !== 1) { + // find the common prefix of all the files + while ((new Set(refs.map(r => r[index]))).size === 1) { + index++ + } + // back up one dirctory from the common prefix + index = path.join(path.join(refs[0].substring(0, index)), '..').length + } + return index +} + +const readFilesPermissions = (refs, base) => Promise.all(refs.map(ref => stat(ref))) + .then(permissions => { + if (!refs || refs.length === 0) { + return Promise.resolve({}) + } + const results = refs.map(v => [v.substring(getIndex(refs, base)), null]) + for (let i=0; i Promise.all(refs.map(ref => readFile(ref))) if (!refs || refs.length === 0) { return Promise.resolve({}) } - - let index = base ? base.length : 0 - if (base && !refs[0].startsWith(base)) { - refs = refs.map(v => path.relative(base, v)) - index = 0 - } - else if (index === 0 && refs.length !== 1) { - // find the common prefix of all the files - while ((new Set(refs.map(r => r[index]))).size === 1) { - index++ - } - - // back up one dirctory from the common prefix - index = path.join(path.join(refs[0].substring(0, index)), '..').length - } - - const results = refs.map(v => [v.substring(index), null]) + const results = refs.map(v => [v.substring(getIndex(refs, base)), null]) for (let i=0; i refs[i].endsWith(suffix))) { results[i][1] = contents[i] @@ -83,6 +97,11 @@ const writeFiles = (files) => { .map( ([file, contents]) => writeText(file, contents))) } +const writeFilesPermissions = (files) => { + return Promise.all(Object.entries(files) + .map( ([file, mode]) => setPermission(file, mode))) +} + export { readText, writeText, @@ -91,5 +110,7 @@ export { readDir, readFiles, writeFiles, - emptyDir -} \ No newline at end of file + emptyDir, + readFilesPermissions, + writeFilesPermissions +}