Bugzilla 的 "Request System":其他问题跟踪工具有吗?

Bugzilla's "Request System": do other issue tracking tools have it?

我使用 Bugzilla 多年,我最喜欢的功能之一是 "request system" (http://www.bugzilla.org/features/#rs),也称为 "flags"。该问题可以标记(?)给用户;然后用户可以接受请求 (+) 或拒绝请求 (-)。

我正在重新评估我们的问题跟踪工具,除了 Bugzilla,我似乎找不到任何具有此功能的工具。

所以我想知道:

感谢您的建议(仅供参考:我目前倾向于 YouTrack)。


Alex V. 询问了有关 Bugzilla 请求系统功能的更多详细信息。这是一个例子:

可以在管理界面中创建任意的标志列表。编辑问题时,它们排成一行,示例如下:

接下来有人可以立flag求后续了。屏幕截图显示我 (dcherk) 为 john@doe.com:

设置 DJiNNInput 标志

请注意,可以多次请求同一标志(未显示)。

稍后,john@doe.com 可能会以某种方式对标志进行操作并将请求标记为已接受:

或者,john@doe.com 可能无法接受请求。那样的话,他就否认了:

不用说,所有这些更改都在问题历史记录中进行了跟踪,并且可以进行搜索和报告。

YouTrack 中没有此类功能。但是,您可以为用户加注星标,就好像用户自己做的一样。然后他们将收到有关它的通知,并且可以在该问题上留下星标,或将其删除。 不知道这些标志在 Bugzilla 中是如何工作的,所以它可能不是该功能的完全替代品。如果您详细说明所需的行为,我会让您知道如何(如果可能)完全模仿它。

仅供参考:

这就是我们最终在 YouTrack 中所做的事情:

创建了两个 user[*] 字段:

  • 输入请求(即请求输入的人)
  • 请求输入(即需要输入的用户)

用户始终可以手动设置这些字段,但我们还添加了以下工作流程规则来加快速度:

规则 1,涉及两个字段的更改:

rule Input Requested 

when Input Requested.changed { 
  if (Input Requested.isEmpty) { 
    Input Requesting.clear; 
  } else { 
    Input Requesting.add(loggedInUser); 
  } 
}

规则二,已关闭的问题不需要再输入:

rule Clear Input Requests When Issue Becomes Closed 

when State.becomes({Closed}) { 
  Input Requested.clear; 
  Input Requesting.clear; 
}

规则3,@mentioning设置字段;回复清除字段:

rule Input Requested via @mention 

when comments.added.isNotEmpty { 
  var separators = " `!#%^&*()=[]{}:;'\"\|,<>/?\n\r\t"; 
  var mentionedUsers = ""; 

  var myComment = comments.added.first; 
  var originalText = myComment.text; 
  var text = " " + originalText.lowerCase + " "; 

  var username = ""; 
  var user = loggedInUser; 
  var index = -1; 

  index = text.indexOf("@", opts); 

  while (index != -1) { 
    index = index + 1; 
    username = ""; 

    var nextSymbol = text.substring(index, index + 1); 
    while (!separators.contains(nextSymbol, opts)) { 
      username = username + nextSymbol; 
      index = index + 1; 
      nextSymbol = text.substring(index, index + 1); 
    } 

    if (username.endsWith(".", opts)) { 
      username = username.substringOfLength(username.length - 1, opts); 
    } 

    debug("Extracted @username: |" + username + "|"); 
    if (username.isNotEmpty) { 
      user = project.getUser(username); 

      if (user != null && !mentionedUsers.contains("@" + user.login + ",", ignoreCase) && (user.isInGroup(permittedGroup.name) || permittedGroup == null || user == reporter) && (myComment.permittedGroup == null || user.isInGroup(myComment.permittedGroup.name))) { 

        if (Input Requesting.contains(user)) { 
          Input Requested.remove(loggedInUser); 
          if (Input Requested.isEmpty) { 
            Input Requesting.clear; 
          } 
        } else { 
          Input Requested.add(user); 
          Input Requesting.add(loggedInUser); 
        } 

        mentionedUsers = mentionedUsers + "@" + user.login + ","; 
      } 
    } 

    text = text.substringRelative("@" + username, pos: after); 
    index = text.indexOf("@", opts); 
  } 
}

希望对一路上的任何人有所帮助。