projen
Version:
CDK for software projects
122 lines • 14.3 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.GitAttributesFile = exports.EndOfLine = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const file_1 = require("./file");
/**
* The end of line characters supported by git.
*/
var EndOfLine;
(function (EndOfLine) {
/**
* Maintain existing (mixed values within one file are normalised by looking
* at what's used after the first line)
*/
EndOfLine["AUTO"] = "auto";
/**
* Carriage Return + Line Feed characters (\r\n), common on Windows
*/
EndOfLine["CRLF"] = "crlf";
/**
* Line Feed only (\n), common on Linux and macOS as well as inside git repos
*/
EndOfLine["LF"] = "lf";
/**
* Disable and do not configure the end of line character
*/
EndOfLine["NONE"] = "none";
})(EndOfLine || (exports.EndOfLine = EndOfLine = {}));
/**
* Assign attributes to file names in a git repository.
*
* @see https://git-scm.com/docs/gitattributes
*/
class GitAttributesFile extends file_1.FileBase {
constructor(scope, options) {
super(scope, ".gitattributes", {
editGitignore: false,
});
this.attributes = new Map();
this.endOfLine = options?.endOfLine ?? EndOfLine.LF;
if (this.endOfLine != EndOfLine.NONE) {
let endOfLineAttributes = [`text=auto`];
if (this.endOfLine != EndOfLine.AUTO) {
endOfLineAttributes.push(`eol=${this.endOfLine}`);
}
// Setting a default end of line for all text files in the repository
// This line should be the first one in order to use it as a default for text files and allow for overriding in later lines
this.addAttributes("*", ...endOfLineAttributes);
}
}
/**
* Maps a set of attributes to a set of files.
* @param glob Glob pattern to match files in the repo.
* @param attributes Attributes to assign to these files.
*/
addAttributes(glob, ...attributes) {
if (!this.attributes.has(glob)) {
this.attributes.set(glob, new Set());
}
const set = this.attributes.get(glob);
for (const attribute of attributes) {
set.add(attribute);
}
}
/**
* Removes attributes from a set of files.
*
* If no attributes are provided, the glob pattern will be removed completely.
*
* @param glob Glob pattern to modify.
* @param attributes Attributes to remove from matched files.
*/
removeAttributes(glob, ...attributes) {
if (attributes.length === 0) {
this.attributes.delete(glob);
return;
}
const mapping = this.attributes.get(glob);
if (!mapping) {
return;
}
for (const attribute of attributes) {
mapping.delete(attribute);
}
if (mapping.size === 0) {
this.attributes.delete(glob);
}
}
/**
* Add attributes necessary to mark these files as stored in LFS
*/
addLfsPattern(glob) {
this.addAttributes(glob, "filter=lfs", "diff=lfs", "merge=lfs", "-text");
}
/**
* Whether the current gitattributes file has any LFS patterns
*/
get hasLfsPatterns() {
return Array.from(this.attributes.values()).some((attrs) => attrs.has("filter=lfs"));
}
preSynthesize() {
this.project.addPackageIgnore("/.gitattributes");
super.preSynthesize();
}
synthesizeContent(_) {
// We can assume the file map is never empty.
const entries = Array.from(this.attributes.entries()).sort(([l], [r]) => l.localeCompare(r));
if (entries.length === 0) {
return undefined;
}
return [
...(this.marker ? [`# ${this.marker}`] : []),
"",
...entries.map(([name, attributes]) => `${name} ${Array.from(attributes).join(" ")}`),
].join("\n");
}
}
exports.GitAttributesFile = GitAttributesFile;
_a = JSII_RTTI_SYMBOL_1;
GitAttributesFile[_a] = { fqn: "projen.GitAttributesFile", version: "0.99.51" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0YXR0cmlidXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9naXRhdHRyaWJ1dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsaUNBQWtDO0FBRWxDOztHQUVHO0FBQ0gsSUFBWSxTQXFCWDtBQXJCRCxXQUFZLFNBQVM7SUFDbkI7OztPQUdHO0lBQ0gsMEJBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsMEJBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsc0JBQVMsQ0FBQTtJQUVUOztPQUVHO0lBQ0gsMEJBQWEsQ0FBQTtBQUNmLENBQUMsRUFyQlcsU0FBUyx5QkFBVCxTQUFTLFFBcUJwQjtBQWdCRDs7OztHQUlHO0FBQ0gsTUFBYSxpQkFBa0IsU0FBUSxlQUFRO0lBUTdDLFlBQW1CLEtBQWlCLEVBQUUsT0FBa0M7UUFDdEUsS0FBSyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRTtZQUM3QixhQUFhLEVBQUUsS0FBSztTQUNyQixDQUFDLENBQUM7UUFWWSxlQUFVLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7UUFZM0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLEVBQUUsU0FBUyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFFcEQsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQyxJQUFJLG1CQUFtQixHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFeEMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDckMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUVELHFFQUFxRTtZQUNyRSwySEFBMkg7WUFDM0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFD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QUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUN0RTtTQUNGLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2YsQ0FBQzs7QUEvR0gsOENBZ0hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB0eXBlIHsgSVJlc29sdmVyIH0gZnJvbSBcIi4vZmlsZVwiO1xuaW1wb3J0IHsgRmlsZUJhc2UgfSBmcm9tIFwiLi9maWxlXCI7XG5cbi8qKlxuICogVGhlIGVuZCBvZiBsaW5lIGNoYXJhY3RlcnMgc3VwcG9ydGVkIGJ5IGdpdC5cbiAqL1xuZXhwb3J0IGVudW0gRW5kT2ZMaW5lIHtcbiAgLyoqXG4gICAqIE1haW50YWluIGV4aXN0aW5nIChtaXhlZCB2YWx1ZXMgd2l0aGluIG9uZSBmaWxlIGFyZSBub3JtYWxpc2VkIGJ5IGxvb2tpbmdcbiAgICogYXQgd2hhdCdzIHVzZWQgYWZ0ZXIgdGhlIGZpcnN0IGxpbmUpXG4gICAqL1xuICBBVVRPID0gXCJhdXRvXCIsXG5cbiAgLyoqXG4gICAqIENhcnJpYWdlIFJldHVybiArIExpbmUgRmVlZCBjaGFyYWN0ZXJzIChcXHJcXG4pLCBjb21tb24gb24gV2luZG93c1xuICAgKi9cbiAgQ1JMRiA9IFwiY3JsZlwiLFxuXG4gIC8qKlxuICAgKiBMaW5lIEZlZWQgb25seSAoXFxuKSwgY29tbW9uIG9uIExpbnV4IGFuZCBtYWNPUyBhcyB3ZWxsIGFzIGluc2lkZSBnaXQgcmVwb3NcbiAgICovXG4gIExGID0gXCJsZlwiLFxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGFuZCBkbyBub3QgY29uZmlndXJlIHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXJcbiAgICovXG4gIE5PTkUgPSBcIm5vbmVcIixcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBgR2l0QXR0cmlidXRlc0ZpbGVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdpdEF0dHJpYnV0ZXNGaWxlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBlbmQgb2YgbGluZSBjaGFyYWN0ZXIgZm9yIHRleHQgZmlsZXMuXG4gICAqXG4gICAqIGVuZE9mTGluZSBpdCdzIHVzZWZ1bCB0byBrZWVwIHRoZSBzYW1lIGVuZCBvZiBsaW5lIGJldHdlZW4gV2luZG93cyBhbmQgVW5peCBvcGVyYXRpdmUgc3lzdGVtcyBmb3IgZ2l0IGNoZWNraW5nL2NoZWNrb3V0IG9wZXJhdGlvbnMuIEhlbmNlLCBpdCBjYW4gYXZvaWQgc2ltcGxlIHJlcG9zaXRvcnkgbXV0YXRpb25zIGNvbnNpc3Rpbmcgb25seSBvZiBjaGFuZ2VzIGluIHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXJzLiBJdCB3aWxsIGJlIHNldCBpbiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgLmdpdGF0dHJpYnV0ZXMgZmlsZSB0byBtYWtlIGl0IHRoZSBmaXJzdCBtYXRjaCB3aXRoIGhpZ2ggcHJpb3JpdHkgYnV0IGl0IGNhbiBiZSBvdmVycmlkZW4gaW4gYSBsYXRlciBsaW5lLiBDYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyBleHBsaWNpdGx5OiBgeyBlbmRPZkxpbmU6IEVuZE9mTGluZS5OT05FIH1gLlxuICAgKlxuICAgKiBAZGVmYXVsdCBFbmRPZkxpbmUuTEZcbiAgICovXG4gIHJlYWRvbmx5IGVuZE9mTGluZT86IEVuZE9mTGluZTtcbn1cblxuLyoqXG4gKiBBc3NpZ24gYXR0cmlidXRlcyB0byBmaWxlIG5hbWVzIGluIGEgZ2l0IHJlcG9zaXRvcnkuXG4gKlxuICogQHNlZSBodHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0YXR0cmlidXRlc1xuICovXG5leHBvcnQgY2xhc3MgR2l0QXR0cmlidXRlc0ZpbGUgZXh0ZW5kcyBGaWxlQmFzZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXR0cmlidXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgZW5kIG9mIGxpbmUgY2hhcmFjdGVyIGZvciB0ZXh0IGZpbGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZE9mTGluZTogRW5kT2ZMaW5lO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogSUNvbnN0cnVjdCwgb3B0aW9ucz86IEdpdEF0dHJpYnV0ZXNGaWxlT3B0aW9ucykge1xuICAgIHN1cGVyKHNjb3BlLCBcIi5naXRhdHRyaWJ1dGVzXCIsIHtcbiAgICAgIGVkaXRHaXRpZ25vcmU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbmRPZkxpbmUgPSBvcHRpb25zPy5lbmRPZkxpbmUgPz8gRW5kT2ZMaW5lLkxGO1xuXG4gICAgaWYgKHRoaXMuZW5kT2ZMaW5lICE9IEVuZE9mTGluZS5OT05FKSB7XG4gICAgICBsZXQgZW5kT2ZMaW5lQXR0cmlidXRlcyA9IFtgdGV4dD1hdXRvYF07XG5cbiAgICAgIGlmICh0aGlzLmVuZE9mTGluZSAhPSBFbmRPZkxpbmUuQVVUTykge1xuICAgICAgICBlbmRPZkxpbmVBdHRyaWJ1dGVzLnB1c2goYGVvbD0ke3RoaXMuZW5kT2ZMaW5lfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXR0aW5nIGEgZGVmYXVsdCBlbmQgb2YgbGluZSBmb3IgYWxsIHRleHQgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnlcbiAgICAgIC8vIFRoaXMgbGluZSBzaG91bGQgYmUgdGhlIGZpcnN0IG9uZSBpbiBvcmRlciB0byB1c2UgaXQgYXMgYSBkZWZhdWx0IGZvciB0ZXh0IGZpbGVzIGFuZCBhbGxvdyBmb3Igb3ZlcnJpZGluZyBpbiBsYXRlciBsaW5lc1xuICAgICAgdGhpcy5hZGRBdHRyaWJ1dGVzKFwiKlwiLCAuLi5lbmRPZkxpbmVBdHRyaWJ1dGVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFwcyBhIHNldCBvZiBhdHRyaWJ1dGVzIHRvIGEgc2V0IG9mIGZpbGVzLlxuICAgKiBAcGFyYW0gZ2xvYiBHbG9iIHBhdHRlcm4gdG8gbWF0Y2ggZmlsZXMgaW4gdGhlIHJlcG8uXG4gICAqIEBwYXJhbSBhdHRyaWJ1dGVzIEF0dHJpYnV0ZXMgdG8gYXNzaWduIHRvIHRoZXNlIGZpbGVzLlxuICAgKi9cbiAgcHVibGljIGFkZEF0dHJpYnV0ZXMoZ2xvYjogc3RyaW5nLCAuLi5hdHRyaWJ1dGVzOiBzdHJpbmdbXSkge1xuICAgIGlmICghdGhpcy5hdHRyaWJ1dGVzLmhhcyhnbG9iKSkge1xuICAgICAgdGhpcy5hdHRyaWJ1dGVzLnNldChnbG9iLCBuZXcgU2V0KCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHNldCA9IHRoaXMuYXR0cmlidXRlcy5nZXQoZ2xvYikhO1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIHNldC5hZGQoYXR0cmlidXRlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhdHRyaWJ1dGVzIGZyb20gYSBzZXQgb2YgZmlsZXMuXG4gICAqXG4gICAqIElmIG5vIGF0dHJpYnV0ZXMgYXJlIHByb3ZpZGVkLCB0aGUgZ2xvYiBwYXR0ZXJuIHdpbGwgYmUgcmVtb3ZlZCBjb21wbGV0ZWx5LlxuICAgKlxuICAgKiBAcGFyYW0gZ2xvYiBHbG9iIHBhdHRlcm4gdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0gYXR0cmlidXRlcyBBdHRyaWJ1dGVzIHRvIHJlbW92ZSBmcm9tIG1hdGNoZWQgZmlsZXMuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQXR0cmlidXRlcyhnbG9iOiBzdHJpbmcsIC4uLmF0dHJpYnV0ZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKGF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmF0dHJpYnV0ZXMuZGVsZXRlKGdsb2IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcHBpbmcgPSB0aGlzLmF0dHJpYnV0ZXMuZ2V0KGdsb2IpO1xuICAgIGlmICghbWFwcGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIG1hcHBpbmcuZGVsZXRlKGF0dHJpYnV0ZSk7XG4gICAgfVxuXG4gICAgaWYgKG1hcHBpbmcuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5hdHRyaWJ1dGVzLmRlbGV0ZShnbG9iKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGF0dHJpYnV0ZXMgbmVjZXNzYXJ5IHRvIG1hcmsgdGhlc2UgZmlsZXMgYXMgc3RvcmVkIGluIExGU1xuICAgKi9cbiAgcHVibGljIGFkZExmc1BhdHRlcm4oZ2xvYjogc3RyaW5nKSB7XG4gICAgdGhpcy5hZGRBdHRyaWJ1dGVzKGdsb2IsIFwiZmlsdGVyPWxmc1wiLCBcImRpZmY9bGZzXCIsIFwibWVyZ2U9bGZzXCIsIFwiLXRleHRcIik7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY3VycmVudCBnaXRhdHRyaWJ1dGVzIGZpbGUgaGFzIGFueSBMRlMgcGF0dGVybnNcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzTGZzUGF0dGVybnMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5hdHRyaWJ1dGVzLnZhbHVlcygpKS5zb21lKChhdHRycykgPT5cbiAgICAgIGF0dHJzLmhhcyhcImZpbHRlcj1sZnNcIiksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBwcmVTeW50aGVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMucHJvamVjdC5hZGRQYWNrYWdlSWdub3JlKFwiLy5naXRhdHRyaWJ1dGVzXCIpO1xuXG4gICAgc3VwZXIucHJlU3ludGhlc2l6ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVDb250ZW50KF86IElSZXNvbHZlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gV2UgY2FuIGFzc3VtZSB0aGUgZmlsZSBtYXAgaXMgbmV2ZXIgZW1wdHkuXG4gICAgY29uc3QgZW50cmllcyA9IEFycmF5LmZyb20odGhpcy5hdHRyaWJ1dGVzLmVudHJpZXMoKSkuc29ydCgoW2xdLCBbcl0pID0+XG4gICAgICBsLmxvY2FsZUNvbXBhcmUociksXG4gICAgKTtcblxuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gW1xuICAgICAgLi4uKHRoaXMubWFya2VyID8gW2AjICR7dGhpcy5tYXJrZXJ9YF0gOiBbXSksXG4gICAgICBcIlwiLFxuICAgICAgLi4uZW50cmllcy5tYXAoXG4gICAgICAgIChbbmFtZSwgYXR0cmlidXRlc10pID0+IGAke25hbWV9ICR7QXJyYXkuZnJvbShhdHRyaWJ1dGVzKS5qb2luKFwiIFwiKX1gLFxuICAgICAgKSxcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH1cbn1cbiJdfQ==