在 TeamCity VCS 插件中实现功能分支
Implement feature branches in TeamCity VCS plugin
我目前正在 Plastic SCM VCS 插件中添加对功能分支的支持。我想我已经准备好了一切(显然我错了)但是 TeamCity 检测到所有新的变更集都属于所有分支。这会导致插件无法使用,因为默认分支中的新提交会触发所有活动分支中的构建。
我有一个 PlasticVcsSupport
class 扩展 ServerVcsSupport
。这是 PlasticVcsSupport.getCollectChangesPolicy()
方法:
@NotNull
public CollectChangesPolicy getCollectChangesPolicy() {
return new PlasticCollectChangesPolicy(this, currentSettings, settingsLock);
}
这是 PlasticCollectChangesPolicy
class 的概述:public class PlasticCollectChangesPolicy 实现 CollectChangesBetweenRepositories {
@NotNull
public RepositoryStateData getCurrentState(VcsRoot root) throws VcsException {
/* ... */
BranchInfo[] branches = QueryCommands.GetBranches(wi);
return RepositoryStateData.createVersionState(
mSettings.getSelectorBranch(), getBranchHeads(branches));
/* ... */
}
@NotNull
public List<ModificationData> collectChanges(
@NotNull VcsRoot fromRoot,
@NotNull RepositoryStateData fromState,
@NotNull VcsRoot toRoot,
@NotNull RepositoryStateData toState,
@NotNull CheckoutRules checkoutRules) throws VcsException {
return collectChanges(fromRoot, fromState, toState, checkoutRules);
}
public List<ModificationData> collectChanges(
@NotNull VcsRoot vcsRoot,
@NotNull RepositoryStateData fromState,
@NotNull RepositoryStateData toState,
@NotNull CheckoutRules checkoutRules) throws VcsException {
/* ... */
for (String branch : fromState.getBranchRevisions().keySet()){
result.addAll(getDifferencesBetweenVersions(
vcsRoot,
wkInfo,
branch,
fromState.getBranchRevisions().get(branch),
toState.getBranchRevisions().get(branch)));
}
/* ... */
return result;
}
}
getCurrentStatus()
方法似乎工作正常,因为可以正确检测到新的更改并且 from/to 状态传递给 collectChanges()
方法是有意义的。但是,我似乎缺少为返回的 ModificationData
对象设置的内容,因为 TeamCity 无法找到每个 ModificationData
的分支。我正在使用 addParentRevision(String)
方法设置正确的父变更集,但这没有任何效果。我也检查了 git 插件代码,但我看不出我遗漏了什么:-(
这是 ModificationData 的构建方式:
List<VcsChange> files = /* fill changeset data */;
ModificationData md = new ModificationData(
changeset.getDate(),
files,
changeset.getComments(),
changeset.getOwner(),
vcsRoot, // Unmodified
changeset.getSpec(),
changeset.getId());
md.addParentRevision(changeset.getParentSpec());
非常感谢任何形式的帮助:-)
谢谢!
确保包含覆盖:
public boolean isDAGBasedVcs() {return true;}
我目前正在 Plastic SCM VCS 插件中添加对功能分支的支持。我想我已经准备好了一切(显然我错了)但是 TeamCity 检测到所有新的变更集都属于所有分支。这会导致插件无法使用,因为默认分支中的新提交会触发所有活动分支中的构建。
我有一个 PlasticVcsSupport
class 扩展 ServerVcsSupport
。这是 PlasticVcsSupport.getCollectChangesPolicy()
方法:
@NotNull
public CollectChangesPolicy getCollectChangesPolicy() {
return new PlasticCollectChangesPolicy(this, currentSettings, settingsLock);
}
这是 PlasticCollectChangesPolicy
class 的概述:public class PlasticCollectChangesPolicy 实现 CollectChangesBetweenRepositories {
@NotNull
public RepositoryStateData getCurrentState(VcsRoot root) throws VcsException {
/* ... */
BranchInfo[] branches = QueryCommands.GetBranches(wi);
return RepositoryStateData.createVersionState(
mSettings.getSelectorBranch(), getBranchHeads(branches));
/* ... */
}
@NotNull
public List<ModificationData> collectChanges(
@NotNull VcsRoot fromRoot,
@NotNull RepositoryStateData fromState,
@NotNull VcsRoot toRoot,
@NotNull RepositoryStateData toState,
@NotNull CheckoutRules checkoutRules) throws VcsException {
return collectChanges(fromRoot, fromState, toState, checkoutRules);
}
public List<ModificationData> collectChanges(
@NotNull VcsRoot vcsRoot,
@NotNull RepositoryStateData fromState,
@NotNull RepositoryStateData toState,
@NotNull CheckoutRules checkoutRules) throws VcsException {
/* ... */
for (String branch : fromState.getBranchRevisions().keySet()){
result.addAll(getDifferencesBetweenVersions(
vcsRoot,
wkInfo,
branch,
fromState.getBranchRevisions().get(branch),
toState.getBranchRevisions().get(branch)));
}
/* ... */
return result;
}
}
getCurrentStatus()
方法似乎工作正常,因为可以正确检测到新的更改并且 from/to 状态传递给 collectChanges()
方法是有意义的。但是,我似乎缺少为返回的 ModificationData
对象设置的内容,因为 TeamCity 无法找到每个 ModificationData
的分支。我正在使用 addParentRevision(String)
方法设置正确的父变更集,但这没有任何效果。我也检查了 git 插件代码,但我看不出我遗漏了什么:-(
这是 ModificationData 的构建方式:
List<VcsChange> files = /* fill changeset data */;
ModificationData md = new ModificationData(
changeset.getDate(),
files,
changeset.getComments(),
changeset.getOwner(),
vcsRoot, // Unmodified
changeset.getSpec(),
changeset.getId());
md.addParentRevision(changeset.getParentSpec());
非常感谢任何形式的帮助:-)
谢谢!
确保包含覆盖:
public boolean isDAGBasedVcs() {return true;}