mirror of
				https://github.com/scm-manager/scm-manager.git
				synced 2025-10-31 02:25:53 +01:00 
			
		
		
		
	
		
			
				
	
	
	
		
			1.9 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	
			1.9 KiB
		
	
	
	
	
	
	
	
title
| title | 
|---|
| Known Issues | 
Asnychronous PreReceiveRepositoryHooks do not work with subversion
The following example will fail to log the changesets.
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.:
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());
    }
  }
}