add co-authors if available to changeset view

refactor ChangesetAuthor.tsx

get interfaces right / fix unit test / cleanup

fix table layout

use Set constructor injection to bind the implementation for the new changesetTrailers API

cleanup / update CHANGELOG.md

cleanup

fix formatting
This commit is contained in:
Eduard Heimbuch
2020-05-28 11:45:15 +02:00
committed by René Pfeuffer
parent a712c89f6a
commit ec57aa88fa
15 changed files with 208 additions and 80 deletions

View File

@@ -25,7 +25,10 @@
package sonia.scm.api.v2.resources;
import com.google.common.collect.ImmutableList;
import sonia.scm.repository.ChangesetTrailerTypes;
import sonia.scm.plugin.Extension;
import sonia.scm.repository.Changeset;
import sonia.scm.repository.ChangesetTrailers;
import sonia.scm.repository.Repository;
import javax.inject.Inject;
import java.util.ArrayList;
@@ -33,24 +36,24 @@ import java.util.List;
import java.util.Scanner;
import java.util.regex.Pattern;
public class ChangesetTrailerExtractor {
@Extension
public class ChangesetDescriptionTrailers implements ChangesetTrailers {
private final ChangesetTrailerTypes changesetTrailerTypes;
private static final List<String> types = ImmutableList.of("Co-authored-by", "Reviewed-by", "Signed-off-by", "Committed-by");
@Inject
public ChangesetTrailerExtractor(ChangesetTrailerTypes changesetTrailerTypes) {
this.changesetTrailerTypes = changesetTrailerTypes;
}
public ChangesetDescriptionTrailers() {}
List<TrailerPersonDto> extractTrailersFromCommitMessage(String commitMessage) {
@Override
public List<TrailerPersonDto> getTrailers(Repository repository, Changeset changeset) {
List<TrailerPersonDto> persons = new ArrayList<>();
try (Scanner scanner = new Scanner(commitMessage)) {
scanner.useDelimiter(Pattern.compile("[\\n;]"));
try (Scanner scanner = new Scanner(changeset.getDescription())) {
scanner.useDelimiter(Pattern.compile("[\\n]"));
while (scanner.hasNext()) {
String line = scanner.next();
for (String trailerType : changesetTrailerTypes.getTrailerTypes()) {
for (String trailerType : types) {
if (line.contains(trailerType)) {
TrailerPersonDto personDto = createPersonDtoFromUser(line);
personDto.setTrailerType(trailerType);
@@ -59,7 +62,6 @@ public class ChangesetTrailerExtractor {
}
}
}
return persons;
}
@@ -77,12 +79,4 @@ public class ChangesetTrailerExtractor {
return personDto;
}
static class TrailerTypes implements ChangesetTrailerTypes {
@Override
public List<String> getTrailerTypes() {
return ImmutableList.of("Co-authored-by", "Reviewed-by", "Signed-off-by", "Committed-by");
}
}
}

View File

@@ -21,14 +21,20 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package sonia.scm.api.v2.resources;
import de.otto.edison.hal.Embedded;
import de.otto.edison.hal.Links;
import org.mapstruct.*;
import org.mapstruct.AfterMapping;
import org.mapstruct.Context;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.ObjectFactory;
import sonia.scm.repository.Branch;
import sonia.scm.repository.Changeset;
import sonia.scm.repository.ChangesetTrailers;
import sonia.scm.repository.Repository;
import sonia.scm.repository.Tag;
import sonia.scm.repository.api.Command;
@@ -37,8 +43,12 @@ import sonia.scm.repository.api.RepositoryServiceFactory;
import sonia.scm.web.EdisonHalAppender;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import java.util.function.Function;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static de.otto.edison.hal.Embedded.embeddedBuilder;
@@ -46,7 +56,7 @@ import static de.otto.edison.hal.Link.link;
import static de.otto.edison.hal.Links.linkingTo;
@Mapper
public abstract class DefaultChangesetToChangesetDtoMapper extends HalAppenderMapper implements InstantAttributeMapper, ChangesetToChangesetDtoMapper{
public abstract class DefaultChangesetToChangesetDtoMapper extends HalAppenderMapper implements InstantAttributeMapper, ChangesetToChangesetDtoMapper {
@Inject
private RepositoryServiceFactory serviceFactory;
@@ -64,14 +74,32 @@ public abstract class DefaultChangesetToChangesetDtoMapper extends HalAppenderMa
private TagCollectionToDtoMapper tagCollectionToDtoMapper;
@Inject
private ChangesetTrailerExtractor changesetTrailerExtractor;
private Set<ChangesetTrailers> changesetTrailersSet;
@Mapping(target = "attributes", ignore = true) // We do not map HAL attributes
public abstract ChangesetDto map(Changeset changeset, @Context Repository repository);
@AfterMapping
void appendTrailerPersons(Changeset changeset, @MappingTarget ChangesetDto target) {
target.setTrailerPersons(changesetTrailerExtractor.extractTrailersFromCommitMessage(changeset.getDescription()));
void appendTrailerPersons(Changeset changeset, @MappingTarget ChangesetDto target, @Context Repository repository) {
List<TrailerPersonDto> collectedTrailers = new ArrayList<>();
changesetTrailersSet.forEach(changesetTrailers -> collectedTrailers.addAll(changesetTrailers.getTrailers(repository, changeset)));
target.setTrailerPersons(collectedTrailers);
}
@AfterMapping
void removeTrailerFromChangesetDescription(@MappingTarget ChangesetDto target) {
StringBuilder builder = new StringBuilder();
try (Scanner scanner = new Scanner(target.getDescription())) {
scanner.useDelimiter(Pattern.compile("[\\n]"));
while (scanner.hasNext()) {
String line = scanner.next();
if (!line.contains("-by:")) {
builder.append(line).append("\n");
}
}
}
target.setDescription(builder.toString());
}
@ObjectFactory

View File

@@ -27,7 +27,6 @@ package sonia.scm.api.v2.resources;
import com.google.inject.AbstractModule;
import com.google.inject.servlet.ServletScopes;
import org.mapstruct.factory.Mappers;
import sonia.scm.repository.ChangesetTrailerTypes;
import sonia.scm.web.api.RepositoryToHalMapper;
public class MapperModule extends AbstractModule {
@@ -78,7 +77,6 @@ public class MapperModule extends AbstractModule {
bind(MeDtoFactory.class);
bind(UIPluginDtoMapper.class);
bind(UIPluginDtoCollectionMapper.class);
bind(ChangesetTrailerTypes.class).to(ChangesetTrailerExtractor.TrailerTypes.class);
bind(ScmPathInfoStore.class).in(ServletScopes.REQUEST);

View File

@@ -111,7 +111,6 @@ import sonia.scm.web.security.DefaultAdministrationContext;
import javax.net.ssl.SSLContext;
/**
*
* @author Sebastian Sdorra
*/
class ScmServletModule extends ServletModule {