treat update of a git tag as delete and create for hooks

This commit is contained in:
Sebastian Sdorra
2018-02-07 11:24:53 +01:00
parent 0ff9b255c3
commit 9dd25b334a
2 changed files with 62 additions and 25 deletions

View File

@@ -68,17 +68,40 @@ public class GitHookTagProvider implements HookTagProvider {
if (Strings.isNullOrEmpty(tag)){
logger.debug("received ref name {} is not a tag", refName);
} else if (rc.getType() == ReceiveCommand.Type.CREATE) {
createdTagBuilder.add(new Tag(tag, GitUtil.getId(rc.getNewId())));
} else if (rc.getType() == ReceiveCommand.Type.DELETE){
deletedTagBuilder.add(new Tag(tag, GitUtil.getId(rc.getOldId())));
} else if (isCreate(rc)) {
createdTagBuilder.add(createTagFromNewId(rc, tag));
} else if (isDelete(rc)){
deletedTagBuilder.add(createTagFromOldId(rc, tag));
} else if (isUpdate(rc)) {
createdTagBuilder.add(createTagFromNewId(rc, tag));
deletedTagBuilder.add(createTagFromOldId(rc, tag));
}
}
createdTags = createdTagBuilder.build();
deletedTags = deletedTagBuilder.build();
}
private Tag createTagFromNewId(ReceiveCommand rc, String tag) {
return new Tag(tag, GitUtil.getId(rc.getNewId()));
}
private Tag createTagFromOldId(ReceiveCommand rc, String tag) {
return new Tag(tag, GitUtil.getId(rc.getOldId()));
}
private boolean isUpdate(ReceiveCommand rc) {
return rc.getType() == ReceiveCommand.Type.UPDATE || rc.getType() == ReceiveCommand.Type.UPDATE_NONFASTFORWARD;
}
private boolean isDelete(ReceiveCommand rc) {
return rc.getType() == ReceiveCommand.Type.DELETE;
}
private boolean isCreate(ReceiveCommand rc) {
return rc.getType() == ReceiveCommand.Type.CREATE;
}
@Override
public List<Tag> getCreatedTags() {
return createdTags;

View File

@@ -32,20 +32,23 @@
package sonia.scm.repository.api;
import com.google.common.collect.Lists;
import java.util.List;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.transport.ReceiveCommand;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import static org.hamcrest.Matchers.*;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.mockito.stubbing.OngoingStubbing;
import sonia.scm.repository.Tag;
import java.util.List;
import static org.hamcrest.Matchers.empty;
import static org.junit.Assert.*;
import static org.mockito.Mockito.when;
/**
* Unit tests for {@link GitHookTagProvider}.
*
@@ -54,6 +57,11 @@ import sonia.scm.repository.Tag;
@RunWith(MockitoJUnitRunner.class)
public class GitHookTagProviderTest {
private static final String ZERO = ObjectId.zeroId().getName();
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
@Mock
private ReceiveCommand command;
@@ -73,7 +81,7 @@ public class GitHookTagProviderTest {
@Test
public void testGetCreatedTags() {
String revision = "b2002b64013e54b78eac251df0672bd5d6a83aa7";
GitHookTagProvider provider = createProvider(ReceiveCommand.Type.CREATE, "refs/tags/1.0.0", revision);
GitHookTagProvider provider = createProvider(ReceiveCommand.Type.CREATE, "refs/tags/1.0.0", revision, ZERO);
assertTag("1.0.0", revision, provider.getCreatedTags());
assertThat(provider.getDeletedTags(), empty());
@@ -85,7 +93,7 @@ public class GitHookTagProviderTest {
@Test
public void testGetDeletedTags() {
String revision = "b2002b64013e54b78eac251df0672bd5d6a83aa7";
GitHookTagProvider provider = createProvider(ReceiveCommand.Type.DELETE, "refs/tags/1.0.0", revision);
GitHookTagProvider provider = createProvider(ReceiveCommand.Type.DELETE, "refs/tags/1.0.0", ZERO, revision);
assertThat(provider.getCreatedTags(), empty());
assertTag("1.0.0", revision, provider.getDeletedTags());
@@ -97,11 +105,24 @@ public class GitHookTagProviderTest {
@Test
public void testWithBranch(){
String revision = "b2002b64013e54b78eac251df0672bd5d6a83aa7";
GitHookTagProvider provider = createProvider(ReceiveCommand.Type.CREATE, "refs/heads/1.0.0", revision);
GitHookTagProvider provider = createProvider(ReceiveCommand.Type.CREATE, "refs/heads/1.0.0", revision, revision);
assertThat(provider.getCreatedTags(), empty());
assertThat(provider.getDeletedTags(), empty());
}
/**
* Tests {@link GitHookTagProvider} with update command.
*/
@Test
public void testUpdateTags() {
String newId = "b2002b64013e54b78eac251df0672bd5d6a83aa7";
String oldId = "e0f2be968b147ff7043684a7715d2fe852553db4";
GitHookTagProvider provider = createProvider(ReceiveCommand.Type.UPDATE, "refs/tags/1.0.0", newId, oldId);
assertTag("1.0.0", newId, provider.getCreatedTags());
assertTag("1.0.0", oldId, provider.getDeletedTags());
}
private void assertTag(String name, String revision, List<Tag> tags){
assertNotNull(tags);
@@ -112,19 +133,12 @@ public class GitHookTagProviderTest {
assertEquals(revision, tag.getRevision());
}
private GitHookTagProvider createProvider(ReceiveCommand.Type type, String ref, String id){
OngoingStubbing<ObjectId> ongoing;
if (type == ReceiveCommand.Type.CREATE){
ongoing = when(command.getNewId());
} else {
ongoing = when(command.getOldId());
}
ongoing.thenReturn(ObjectId.fromString(id));
private GitHookTagProvider createProvider(ReceiveCommand.Type type, String ref, String newId, String oldId){
when(command.getNewId()).thenReturn(ObjectId.fromString(newId));
when(command.getOldId()).thenReturn(ObjectId.fromString(oldId));
when(command.getType()).thenReturn(type);
when(command.getRefName()).thenReturn(ref);
return new GitHookTagProvider(commands);
}
}
}