feat: Save uploaded avatar as png instead of jpg to avoid quality loss (OD-2594)

This commit is contained in:
Robin Shen 2025-10-30 10:36:59 +08:00
parent c40ed5b998
commit ecace0afe3
73 changed files with 137 additions and 104 deletions

View File

@ -9,7 +9,7 @@
<version>1.2.3</version>
</parent>
<artifactId>server</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
<packaging>pom</packaging>
<build>
<finalName>${project.groupId}.${project.artifactId}-${project.version}</finalName>

View File

@ -7,7 +7,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<build>
<plugins>

View File

@ -24,8 +24,8 @@ public class AvatarGenerator {
ImmutableSet.copyOf(localGraphics.getAvailableFontFamilyNames());
}
private static final int DEFAULT_WIDTH = 256;
private static final int DEFAULT_HEIGHT = 256;
private static final int DEFAULT_WIDTH = 240;
private static final int DEFAULT_HEIGHT = 240;
private static final String DEFAULT_FONT = "Helvetica";
private static final int VERSION = 1;

View File

@ -18,9 +18,9 @@ public interface AvatarService {
void useProjectAvatar(Long projectId, @Nullable String avatarData);
File getUserUploadedFile(Long userId);
File getUserUploadedFile(Long userId, @Nullable String extension);
File getProjectUploadedFile(Long projectId);
File getProjectUploadedFile(Long projectId, @Nullable String extension);
void copyProjectAvatar(Long fromProjectId, Long toProjectId);

View File

@ -61,6 +61,10 @@ public class DefaultAvatarService implements AvatarService, Serializable {
return new ManagedSerializedForm(AvatarService.class);
}
private String getFileExtension(File file) {
return StringUtils.substringAfterLast(file.getName(), ".");
}
@Override
public String getUserAvatarUrl(Long userId) {
if (userId.equals(User.UNKNOWN_ID)) {
@ -68,9 +72,9 @@ public class DefaultAvatarService implements AvatarService, Serializable {
} else if (userId.equals(User.SYSTEM_ID)) {
return AVATARS_BASE_URL + "onedev.png";
} else {
File uploadedFile = getUserUploadedFile(userId);
File uploadedFile = getUserUploadedFile(userId, null);
if (uploadedFile.exists())
return AVATARS_BASE_URL + "uploaded/users/" + userId + ".jpg?version=" + uploadedFile.lastModified();
return AVATARS_BASE_URL + "uploaded/users/" + userId + "." + getFileExtension(uploadedFile) + "?version=" + uploadedFile.lastModified();
EmailAddressFacade emailAddress = emailAddressService.findPrimaryFacade(userId);
UserFacade user = userService.findFacadeById(userId);
@ -154,8 +158,17 @@ public class DefaultAvatarService implements AvatarService, Serializable {
}
@Override
public File getUserUploadedFile(Long userId) {
return new File(Bootstrap.getSiteDir(), "assets/avatars/uploaded/users/" + userId + ".jpg");
public File getUserUploadedFile(Long userId, String extension) {
var pathSegments = "assets/avatars/uploaded/users/";
if (extension != null) {
return new File(Bootstrap.getSiteDir(), pathSegments + userId + "." + extension);
} else {
var file = new File(Bootstrap.getSiteDir(), pathSegments + userId + ".png");
if (file.exists())
return file;
else
return new File(Bootstrap.getSiteDir(), pathSegments + userId + ".jpg");
}
}
private String getUserUploadedLockName(Long userId) {
@ -165,18 +178,26 @@ public class DefaultAvatarService implements AvatarService, Serializable {
@Override
public void useUserAvatar(Long userId, String avatarData) {
clusterService.runOnAllServers(() -> write(getUserUploadedLockName(userId), () -> {
File avatarFile = getUserUploadedFile(userId);
File avatarFile = getUserUploadedFile(userId, "png");
createDir(avatarFile.getParentFile());
writeToFile(avatarFile, avatarData);
if (avatarData != null) {
writeToFile(avatarFile, avatarData);
} else {
if (avatarFile.exists())
FileUtils.deleteFile(avatarFile);
avatarFile = getUserUploadedFile(userId, "jpg");
if (avatarFile.exists())
FileUtils.deleteFile(avatarFile);
}
return null;
}));
}
@Override
public String getProjectAvatarUrl(Long projectId) {
File avatarFile = getProjectUploadedFile(projectId);
File avatarFile = getProjectUploadedFile(projectId, null);
if (avatarFile.exists())
return AVATARS_BASE_URL + "uploaded/projects/" + projectId + ".jpg?version=" + avatarFile.lastModified();
return AVATARS_BASE_URL + "uploaded/projects/" + projectId + "." + getFileExtension(avatarFile) + "?version=" + avatarFile.lastModified();
else
return AVATARS_BASE_URL + "project.png";
}
@ -184,16 +205,33 @@ public class DefaultAvatarService implements AvatarService, Serializable {
@Override
public void useProjectAvatar(Long projectId, String avatarData) {
clusterService.runOnAllServers(() -> write(getProjectUploadedLockName(projectId), () -> {
File avatarFile = getProjectUploadedFile(projectId);
File avatarFile = getProjectUploadedFile(projectId, "png");
createDir(avatarFile.getParentFile());
writeToFile(avatarFile, avatarData);
if (avatarData != null) {
writeToFile(avatarFile, avatarData);
} else {
if (avatarFile.exists())
FileUtils.deleteFile(avatarFile);
avatarFile = getProjectUploadedFile(projectId, "jpg");
if (avatarFile.exists())
FileUtils.deleteFile(avatarFile);
}
return null;
}));
}
@Override
public File getProjectUploadedFile(Long projectId) {
return new File(Bootstrap.getSiteDir(), "assets/avatars/uploaded/projects/" + projectId + ".jpg");
public File getProjectUploadedFile(Long projectId, String extension) {
var pathSegments = "assets/avatars/uploaded/projects/";
if (extension != null) {
return new File(Bootstrap.getSiteDir(), pathSegments + projectId + "." + extension);
} else {
var file = new File(Bootstrap.getSiteDir(), pathSegments + projectId + ".png");
if (file.exists())
return file;
else
return new File(Bootstrap.getSiteDir(), pathSegments + projectId + ".jpg");
}
}
private String getProjectUploadedLockName(Long projectId) {
@ -203,10 +241,10 @@ public class DefaultAvatarService implements AvatarService, Serializable {
@Override
public void copyProjectAvatar(Long fromProjectId, Long toProjectId) {
clusterService.runOnAllServers(() -> {
var fromFile = getProjectUploadedFile(fromProjectId);
var toFile = getProjectUploadedFile(toProjectId);
var fromFile = getProjectUploadedFile(fromProjectId, null);
var toFile = getProjectUploadedFile(toProjectId, getFileExtension(fromFile));
var readLockName = getProjectUploadedLockName(fromProjectId);
if (read(readLockName, () -> fromFile.exists())) {
if (fromFile.exists()) {
var tempFile = new File(toFile.getParentFile(), UUID.randomUUID().toString());
try {
read(readLockName, () -> {

View File

@ -5,7 +5,6 @@ import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import org.jspecify.annotations.Nullable;
import javax.imageio.ImageIO;
import javax.xml.bind.DatatypeConverter;
@ -22,7 +21,6 @@ import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import io.onedev.commons.utils.FileUtils;
import io.onedev.commons.utils.StringUtils;
import io.onedev.server.web.behavior.AbstractPostAjaxBehavior;
@ -71,17 +69,13 @@ public class AvatarUploadField extends FormComponentPanel<String> {
setConvertedInput(dataField.getConvertedInput());
}
public static void writeToFile(File file, @Nullable String avatarData) {
if (avatarData != null) {
byte[] imageBytes = DatatypeConverter.parseBase64Binary(StringUtils.substringAfter(avatarData, ","));
try {
BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes));
ImageIO.write(image, "jpeg", file);
} catch (IOException e) {
throw new RuntimeException(e);
}
} else if (file.exists()) {
FileUtils.deleteFile(file);
public static void writeToFile(File file, String avatarData) {
byte[] imageBytes = DatatypeConverter.parseBase64Binary(StringUtils.substringAfter(avatarData, ","));
try {
BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes));
ImageIO.write(image, "png", file);
} catch (IOException e) {
throw new RuntimeException(e);
}
}

View File

@ -50,7 +50,7 @@ public class AvatarEditPanel extends GenericPanel<User> {
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(getAvatarService().getUserUploadedFile(getUser().getId()).exists());
setVisible(getAvatarService().getUserUploadedFile(getUser().getId(), null).exists());
}
@Override

View File

@ -2,6 +2,8 @@ package io.onedev.server.web.page.project.setting.avatar;
import static io.onedev.server.web.translation.Translation._T;
import javax.inject.Inject;
import org.apache.wicket.Component;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.event.IEvent;
@ -21,16 +23,15 @@ import io.onedev.server.web.page.project.setting.ProjectSettingPage;
public class AvatarEditPage extends ProjectSettingPage {
@Inject
private AvatarService avatarService;
private String uploadedAvatarData;
public AvatarEditPage(PageParameters params) {
super(params);
}
private AvatarService getAvatarService() {
return OneDev.getInstance(AvatarService.class);
}
@Override
protected void onInitialize() {
super.onInitialize();
@ -42,12 +43,12 @@ public class AvatarEditPage extends ProjectSettingPage {
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(getAvatarService().getProjectUploadedFile(getProject().getId()).exists());
setVisible(avatarService.getProjectUploadedFile(getProject().getId(), null).exists());
}
@Override
public void onClick() {
getAvatarService().useProjectAvatar(getProject().getId(), null);
avatarService.useProjectAvatar(getProject().getId(), null);
setResponsePage(AvatarEditPage.class, AvatarEditPage.paramsOf(getProject()));
}

@ -1 +1 @@
Subproject commit 6ee966cf6f50eb9754d8aca94b0a03889bbfa9b4
Subproject commit fc8f4fad4f001fce72b1f6805383e0b0951dd17a

View File

@ -6,7 +6,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -6,7 +6,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<build>
<resources>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.authenticator.ldap.LdapModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.buildspec.bazel.BazelModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.buildspec.node.NodePluginModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -6,7 +6,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.executor.kubernetes.KubernetesModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.executor.serverdocker.ServerDockerModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.executor.servershell.ServerShellModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.imports.bitbucketcloud.BitbucketModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.imports.gitea.GiteaModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.imports.github.GitHubModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.imports.gitlab.GitLabModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.imports.jiracloud.JiraModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.imports.url.UrlModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.imports.youtrack.YouTrackModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.mail.gmail.GmailModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.mail.office365.Office365Module</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.mail.smtpimap.SmtpImapModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.notification.discord.DiscordModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.notification.ntfy.NtfyModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.notification.slack.SlackModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -6,7 +6,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.report.coverage.CoverageModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.report.html.HtmlModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.report.markdown.MarkdownModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.report.problem.ProblemModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.report.unittest.UnitTestModule</moduleClass>

View File

@ -5,7 +5,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.sso.discord.DiscordModule</moduleClass>

View File

@ -6,7 +6,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server-plugin</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<properties>
<moduleClass>io.onedev.server.plugin.sso.openid.OpenIdModule</moduleClass>

View File

@ -7,7 +7,7 @@
<parent>
<groupId>io.onedev</groupId>
<artifactId>server</artifactId>
<version>13.0.9</version>
<version>13.0.10</version>
</parent>
<dependencies>
<dependency>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 21 KiB