mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-10-31 18:46:07 +01:00
62 lines
1.9 KiB
Markdown
62 lines
1.9 KiB
Markdown
---
|
|
title: Known Issues
|
|
---
|
|
|
|
## Asnychronous PreReceiveRepositoryHooks do not work with subversion
|
|
|
|
The following example will fail to log the changesets.
|
|
|
|
```java
|
|
import com.github.legman.Subscribe;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import sonia.scm.plugin.Extension;
|
|
import sonia.scm.repository.Changeset;
|
|
import sonia.scm.repository.PreReceiveRepositoryHookEvent;
|
|
import sonia.scm.repository.api.HookChangesetBuilder;
|
|
|
|
@Extension
|
|
@EagerSingleton
|
|
public class DemoHook {
|
|
|
|
private static final Logger LOG = LoggerFactory.getLogger(DemoHook.class);
|
|
|
|
@Subscribe
|
|
public void handleEvent(PreReceiveRepositoryHookEvent event) {
|
|
HookChangesetBuilder changesetProvider = event.getContext().getChangesetProvider();
|
|
for (Changeset c : changesetProvider.getChangesets()) {
|
|
LOG.warn("received {} hook for changeset: {}", event.getType(), c.getId());
|
|
}
|
|
}
|
|
|
|
}
|
|
```
|
|
|
|
This is because of the transaction management of subversion. The scm-manager subversion provider becomes a transaction id for the changes of the current push, but the transaction has finished before scm-manager can resolve the incoming commit. To solve the issue, we could use a synchronous subscription instead e.g.:
|
|
|
|
```java
|
|
import com.github.legman.Subscribe;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import sonia.scm.plugin.Extension;
|
|
import sonia.scm.repository.Changeset;
|
|
import sonia.scm.repository.PreReceiveRepositoryHookEvent;
|
|
import sonia.scm.repository.api.HookChangesetBuilder;
|
|
|
|
@Extension
|
|
@EagerSingleton
|
|
public class DemoHook {
|
|
|
|
private static final Logger LOG = LoggerFactory.getLogger(DemoHook.class);
|
|
|
|
@Subscribe(async = false)
|
|
public void handleEvent(PreReceiveRepositoryHookEvent event) {
|
|
HookChangesetBuilder changesetProvider = event.getContext().getChangesetProvider();
|
|
for (Changeset c : changesetProvider.getChangesets()) {
|
|
LOG.warn("received {} hook for changeset: {}", event.getType(), c.getId());
|
|
}
|
|
}
|
|
|
|
}
|
|
```
|