groovy - 适用于版本范围的 JIRA MyGroovy JQL 脚本函数
问题描述
我正在尝试编写一个 JQL 函数,该函数返回一个要比较的版本列表。我们有一个 4 位数字作为技术发布版本,它会定期更新。我需要找到在给定编号(当前已安装)和新编号之后已修复的所有问题,这将是新安装的版本。
我在 JIRA Server 8.7.1 中使用 myGroovy 插件(免费)。
该脚本名为 releaseRange
我的代码没有产生我正在寻找的结果(零结果),我不知道为什么。完整性检查有效,如果验证失败,我会收到警告。
import com.atlassian.jira.JiraDataType
import com.atlassian.jira.JiraDataTypes
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.project.version.VersionManager
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.issue.search.SearchQuery
import com.atlassian.jira.jql.operand.QueryLiteral
import com.atlassian.jira.jql.query.QueryCreationContext
import com.atlassian.jira.jql.validator.NumberOfArgumentsValidator
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.util.MessageSet
import com.atlassian.jira.util.MessageSetImpl
import com.atlassian.query.clause.TerminalClause
import com.atlassian.query.operand.FunctionOperand
import ru.mail.jira.plugins.groovy.api.jql.ScriptedJqlValuesFunction
class ReleaseRange implements ScriptedJqlValuesFunction {
@Override
public JiraDataType getDataType() {
return JiraDataTypes.VERSION;
}
@Override
public int getMinimumNumberOfExpectedArguments() {
return 2;
}
@Override
public MessageSet validate(ApplicationUser searcher, FunctionOperand operand, TerminalClause terminalClause) {
def i18n = ComponentAccessor.getI18nHelperFactory().getInstance(searcher)
def numberValidMessage = new NumberOfArgumentsValidator(2i, i18n).validate(operand);
if (numberValidMessage.hasAnyErrors()) {
return numberValidMessage
}
def messageSet = new MessageSetImpl();
def from, until;
try {
from = operand.getArgs().get(0).toInteger();
} catch (any) {
messageSet.addErrorMessage("no valid technical release number:${operand.getArgs().get(0)}");
messageSet.addErrorMessage("${any}");
}
try {
until = operand.getArgs().get(1).toInteger();
} catch (any) {
messageSet.addErrorMessage("no valid technical release number:${operand.getArgs().get(1)}");
messageSet.addErrorMessage("${any}");
}
if (from >= until) {
messageSet.addErrorMessage("from version needs to be less than until version");
}
return messageSet;
}
List<QueryLiteral> getValues(QueryCreationContext queryCreationContext, FunctionOperand functionOperand, TerminalClause terminalClause) {
def versionManager = ComponentAccessor.getVersionManager();
def List<QueryLiteral> literals = new LinkedList<>();
def from = functionOperand.getArgs().get(0).toInteger();
def until = functionOperand.getArgs().get(1).toInteger();
while (from < until) {
from++;
literals << new QueryLiteral(functionOperand, versionManager.getVersion(10800, from.toString()).getId().toLong());
}
return literals;
}
}
查询
fixVersion in releaseRange(2279, 2291)
被接受,但不产生任何结果。
解决方案
看起来 getVersion 没有像我预期的那样工作,使用 getVersionsByName 解决了这个问题。需要像这样调整代码:
while (from < until) {
from++;
def versions = versionManager.getVersionsByName(from.toString());
versions.each{ version ->
literals << new QueryLiteral(functionOperand, version.getId().toLong());
}
推荐阅读
- awk - 如何将 awk 脚本附加到文件中?
- graph - 在 Ocaml 中检测无向图中的循环
- react-native - React native:使用计时器更改状态时组件不会重新呈现
- firebase - Firebase 用户身份验证不同实例上的多个用户
- javascript - JavaScript 数学计算 - 与 Excel 公式相比,结果不同
- reactjs - React Route 为每条路线渲染不同的横幅图像
- javascript - 如何等待异步?为什么等待不起作用?
- mapbox-gl-js - 在哪里可以找到 mapbox-gl 的绘制属性列表?
- php - 如何在 laravel 黄昏测试中共享用户数据
- sails.js - 为什么sailsjs 使用自定义包装器包装每个服务方法?