首页 > 解决方案 > 如何创建一个拒绝使用错误文件名推送的 BitBucket 挂钩?

问题描述

我正在尝试制作一个 BitBucket 挂钩,如果它包含与命名约定不匹配的文件,它将拒绝推送。到目前为止,我已经能够创建注册以下回调的 PreRepositoryHook 实现。

public class MyPreRepositoryHook implements PreRepositoryHook<RepositoryHookRequest> {

public MyPreRepositoryHook () {
}

@Nonnull
@Override
public RepositoryHookResult preUpdate(@Nonnull PreRepositoryHookContext context,
                                      @Nonnull RepositoryHookRequest request) {

    // hook only wants commits added to the repository
    context.registerCommitCallback(
            new MyPreCommitCallback(),
            RepositoryHookCommitFilter.ADDED_TO_REPOSITORY);

    // return accepted() here, the callback gets a chance to reject the change when getResult() is called
    return RepositoryHookResult.accepted();
}

在 MyPreCommitCallback 中:

    @Override
    public boolean onCommitAdded(@Nonnull CommitAddedDetails commitDetails) {

        Commit commit = commitDetails.getCommit();

        SimpleChangeset.Builder builder = new SimpleChangeset.Builder(commit);
        SimpleChangeset simpleChangeset = builder.build();

        Page<Change> changes = simpleChangeset.getChanges();
}

但是我无法获取文件列表,因为对 simpleChangeset.getChanges 的调用总是返回 null。

获取文件名列表的任何帮助将不胜感激。谢谢你。

标签: bitbucket-serveratlassian-plugin-sdk

解决方案


@Component
public class AltresPreRepositoryHook implements PreRepositoryHook<RepositoryHookRequest> {

private final CommitService commitService;

@Autowired
public AltresPreRepositoryHook(@ComponentImport CommitService commitService) {
    this.commitService = commitService;
}




private static class AltresPreCommitCallback implements PreRepositoryHookCommitCallback {

private final RepositoryHookRequest request;
private final CommitService commitService;

private RepositoryHookResult result = RepositoryHookResult.accepted();

public AltresPreCommitCallback(RepositoryHookRequest request, CommitService commitService) {
    this.request = request;
    this.commitService = commitService;
}

@Nonnull
@Override
public RepositoryHookResult getResult() {
    return result;
}

@Override
public boolean onCommitAdded(@Nonnull CommitAddedDetails commitDetails) {

    Commit commit = commitDetails.getCommit();
    ChangesRequest.Builder builder = new ChangesRequest.Builder(commit.getRepository(), commit.getId());
    ChangesRequest changesRequest = builder.build();

    final ChangedPathsCollector changedPathsCollector = new ChangedPathsCollector();

    commitService.streamChanges(changesRequest, changedPathsCollector);

    Collection<String> changedPaths = changedPathsCollector.getChangedPaths();

推荐阅读