All files / lib/resource-types makefile.js

100% Statements 126/126
100% Branches 17/17
100% Functions 5/5
100% Lines 126/126

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 1271x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 1x 1x 1x 1x 2x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 5x 5x 5x 5x 4x 4x 3x 3x 3x 1x 1x 1x 3x 1x 1x 1x 1x 1x 1x 3x 4x 4x 5x 1x 1x 1x 1x 1x 5x 4x 4x 5x 1x 1x 1x 1x 1x 1x 1x 1x 1x  
"use strict";
/**
 * @module resource-types/makefile
 */
import fs from "fs";
import makefileParser from "@kba/makefile-parser";
 
/**
 * Set version value in the Makefile resource's variable.
 *
 * @param {String} version - version value to set
 * @param {Object} resource - resource configuration
 * @param {String} resource.path - path to the Makefile
 * @param {String} resource.params.variable - name of the variable which
 *   contains the version
 * @param {Object} opts - optional settings
 * @param {Boolean} [opts.dryRun] - when true, Makefile won't be modified
 * @param {Function} cb - standard cb(err, result) callback
 */
function setVersion(version, resource, opts, cb) {
  const variable = resource.params.variable;
  let content = fs.readFileSync(resource.path, "UTF-8");
  const data = makefileParser(content);
 
  data.ast.forEach((elem) => {
    if (elem.variable && elem.variable === variable) {
      const matches = content.match(
        new RegExp(elem.variable + ".*" + elem.value),
      );
      if (matches && matches.length === 1) {
        content = content.replace(
          matches[0],
          matches[0].replace(elem.value, version),
        );
      }
    }
  });
  if (!opts.dryRun) {
    fs.writeFile(resource.path, content, cb);
  } else {
    cb();
  }
}
 
/**
 * Get version value from the Makefile resource's variable.
 *
 * @param {Object} resource - resource configuration
 * @param {String} resource.path - path to the Makefile
 * @param {String} resource.params.variable - name of the variable which
 *   contains the version
 * @param {Function} cb - standard cb(err, result) callback, result is the
 *   version value
 */
function getVersion(resource, cb) {
  const variable = resource.params.variable;
 
  function readCb(err, result) {
    let version;
    if (!err) {
      const data = makefileParser(result);
      data.ast.forEach((elem) => {
        if (elem.variable && elem.variable === variable) {
          version = elem.value;
        }
      });
    }
    cb(err, version);
  }
  fs.readFile(resource.path, "UTF-8", readCb);
}
 
/**
 * Check that the Makefile resource is ready for release, i.e. the variable
 * exists with a value. The Makefile parser doesn't reject invalid content, it skips the
 * lines it can't handle.
 *
 * @param {Object} resource - resource configuration
 * @param {String} resource.path - path to the Makefile
 * @param {String} resource.params.variable - name of the variable which
 *   contains the version
 * @param {Function} cb - standard cb(err, result) callback, result is true
 *   when the resource is ready for release, an error is passed when the
 *   variable is not configured, doesn't exist, or has no value
 */
function isReadyForRelease(resource, cb) {
  const variable = resource.params && resource.params.variable;
 
  function readCb(err, result) {
    let ready;
    if (!err) {
      const data = makefileParser(result);
      const elem = data.ast.find((elem) => elem.variable === variable);
      if (!elem) {
        err = new Error(
          `Variable ${variable} does not exist in Makefile resource ${resource.path}`,
        );
      } else if (!elem.value) {
        err = new Error(
          `Variable ${variable} has no value in Makefile resource ${resource.path}`,
        );
      } else {
        ready = true;
      }
    }
    cb(err, ready);
  }
  if (!variable) {
    cb(
      new Error(
        `Makefile resource ${resource.path} has no params.variable configured`,
      ),
    );
  } else {
    fs.readFile(resource.path, "UTF-8", readCb);
  }
}
 
const exports = {
  setReleaseVersion: setVersion,
  setPostReleaseVersion: setVersion,
  getVersion: getVersion,
  isReadyForRelease: isReadyForRelease,
};
 
export { exports as default };