mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-12 16:35:45 +01:00
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:
committed by
René Pfeuffer
parent
a712c89f6a
commit
ec57aa88fa
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -111,7 +111,6 @@ import sonia.scm.web.security.DefaultAdministrationContext;
|
||||
import javax.net.ssl.SSLContext;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Sebastian Sdorra
|
||||
*/
|
||||
class ScmServletModule extends ServletModule {
|
||||
|
||||
Reference in New Issue
Block a user