mirror of
				https://e.coding.net/circlecloud/YumCore.git
				synced 2025-11-03 23:06:02 +00:00 
			
		
		
		
	feat: 更新 HttpKit 工具 添加 Gogs 仓库迁移脚本
Signed-off-by: 502647092 <admin@yumc.pw>
This commit is contained in:
		
							
								
								
									
										12
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								pom.xml
									
									
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
				
			|||||||
    <modelVersion>4.0.0</modelVersion>
 | 
					    <modelVersion>4.0.0</modelVersion>
 | 
				
			||||||
    <groupId>pw.yumc</groupId>
 | 
					    <groupId>pw.yumc</groupId>
 | 
				
			||||||
    <artifactId>YumCore</artifactId>
 | 
					    <artifactId>YumCore</artifactId>
 | 
				
			||||||
    <version>1.8</version>
 | 
					    <version>1.8.1</version>
 | 
				
			||||||
    <build>
 | 
					    <build>
 | 
				
			||||||
        <finalName>${project.artifactId}</finalName>
 | 
					        <finalName>${project.artifactId}</finalName>
 | 
				
			||||||
        <plugins>
 | 
					        <plugins>
 | 
				
			||||||
@@ -130,5 +130,15 @@
 | 
				
			|||||||
            <artifactId>worldedit-bukkit</artifactId>
 | 
					            <artifactId>worldedit-bukkit</artifactId>
 | 
				
			||||||
            <version>6.1.5</version>
 | 
					            <version>6.1.5</version>
 | 
				
			||||||
        </dependency>
 | 
					        </dependency>
 | 
				
			||||||
 | 
					        <dependency>
 | 
				
			||||||
 | 
					            <groupId>com.alibaba</groupId>
 | 
				
			||||||
 | 
					            <artifactId>fastjson</artifactId>
 | 
				
			||||||
 | 
					            <version>1.2.28</version>
 | 
				
			||||||
 | 
					        </dependency>
 | 
				
			||||||
 | 
					        <dependency>
 | 
				
			||||||
 | 
					            <groupId>org.projectlombok</groupId>
 | 
				
			||||||
 | 
					            <artifactId>lombok</artifactId>
 | 
				
			||||||
 | 
					            <version>1.16.8</version>
 | 
				
			||||||
 | 
					        </dependency>
 | 
				
			||||||
    </dependencies>
 | 
					    </dependencies>
 | 
				
			||||||
</project>
 | 
					</project>
 | 
				
			||||||
@@ -1,6 +1,11 @@
 | 
				
			|||||||
package pw.yumc.YumCore.kit;
 | 
					package pw.yumc.YumCore.kit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.*;
 | 
					import java.io.BufferedReader;
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.io.InputStream;
 | 
				
			||||||
 | 
					import java.io.InputStreamReader;
 | 
				
			||||||
 | 
					import java.io.OutputStream;
 | 
				
			||||||
 | 
					import java.io.UnsupportedEncodingException;
 | 
				
			||||||
import java.net.HttpURLConnection;
 | 
					import java.net.HttpURLConnection;
 | 
				
			||||||
import java.net.URL;
 | 
					import java.net.URL;
 | 
				
			||||||
import java.net.URLEncoder;
 | 
					import java.net.URLEncoder;
 | 
				
			||||||
@@ -12,16 +17,33 @@ import java.security.cert.X509Certificate;
 | 
				
			|||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
import java.util.Map.Entry;
 | 
					import java.util.Map.Entry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import javax.net.ssl.*;
 | 
					import javax.net.ssl.HostnameVerifier;
 | 
				
			||||||
 | 
					import javax.net.ssl.HttpsURLConnection;
 | 
				
			||||||
 | 
					import javax.net.ssl.SSLContext;
 | 
				
			||||||
 | 
					import javax.net.ssl.SSLSession;
 | 
				
			||||||
 | 
					import javax.net.ssl.SSLSocketFactory;
 | 
				
			||||||
 | 
					import javax.net.ssl.TrustManager;
 | 
				
			||||||
 | 
					import javax.net.ssl.X509TrustManager;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import lombok.Builder;
 | 
				
			||||||
 | 
					import lombok.Cleanup;
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					import lombok.SneakyThrows;
 | 
				
			||||||
 | 
					import lombok.val;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * HttpKit
 | 
					 * HttpKit
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
public class HttpKit {
 | 
					public class HttpKit {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static String GET = "GET";
 | 
					    public enum HttpMethod {
 | 
				
			||||||
 | 
					        GET,
 | 
				
			||||||
    private static String POST = "POST";
 | 
					        POST,
 | 
				
			||||||
 | 
					        PUT,
 | 
				
			||||||
 | 
					        HEADER,
 | 
				
			||||||
 | 
					        DELETE,
 | 
				
			||||||
 | 
					        PATCH
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static String CHARSET = "UTF-8";
 | 
					    private static String CHARSET = "UTF-8";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -39,7 +61,7 @@ public class HttpKit {
 | 
				
			|||||||
     * @return 网页HTML
 | 
					     * @return 网页HTML
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public static String get(String url) {
 | 
					    public static String get(String url) {
 | 
				
			||||||
        return get(url, null, null);
 | 
					        return get(url, null);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@@ -67,71 +89,11 @@ public class HttpKit {
 | 
				
			|||||||
     * @return 网页HTML
 | 
					     * @return 网页HTML
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public static String get(String url, Map<String, String> queryParas, Map<String, String> headers) {
 | 
					    public static String get(String url, Map<String, String> queryParas, Map<String, String> headers) {
 | 
				
			||||||
        HttpURLConnection conn = null;
 | 
					        return send(HttpInfo.builder().url(url).method(HttpMethod.GET).query(queryParas).header(headers).build());
 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), GET, headers);
 | 
					 | 
				
			||||||
            conn.connect();
 | 
					 | 
				
			||||||
            return readResponseString(conn);
 | 
					 | 
				
			||||||
        } catch (Exception e) {
 | 
					 | 
				
			||||||
            throw new RuntimeException(e);
 | 
					 | 
				
			||||||
        } finally {
 | 
					 | 
				
			||||||
            if (conn != null) {
 | 
					 | 
				
			||||||
                conn.disconnect();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Post 获取网页
 | 
					     * Post 方法获取HTML
 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param url
 | 
					 | 
				
			||||||
     *            网址
 | 
					 | 
				
			||||||
     * @param queryParas
 | 
					 | 
				
			||||||
     *            参数
 | 
					 | 
				
			||||||
     * @param data
 | 
					 | 
				
			||||||
     *            数据
 | 
					 | 
				
			||||||
     * @return 网页HTML
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public static String post(String url, Map<String, String> queryParas, String data) {
 | 
					 | 
				
			||||||
        return post(url, queryParas, data, null);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Post 获取网页
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param url
 | 
					 | 
				
			||||||
     *            网址
 | 
					 | 
				
			||||||
     * @param queryParas
 | 
					 | 
				
			||||||
     *            参数
 | 
					 | 
				
			||||||
     * @param data
 | 
					 | 
				
			||||||
     *            数据
 | 
					 | 
				
			||||||
     * @param headers
 | 
					 | 
				
			||||||
     *            头信息
 | 
					 | 
				
			||||||
     * @return 网页HTML
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public static String post(String url, Map<String, String> queryParas, String data, Map<String, String> headers) {
 | 
					 | 
				
			||||||
        HttpURLConnection conn = null;
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), POST, headers);
 | 
					 | 
				
			||||||
            conn.connect();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            OutputStream out = conn.getOutputStream();
 | 
					 | 
				
			||||||
            out.write(data.getBytes(CHARSET));
 | 
					 | 
				
			||||||
            out.flush();
 | 
					 | 
				
			||||||
            out.close();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            return readResponseString(conn);
 | 
					 | 
				
			||||||
        } catch (Exception e) {
 | 
					 | 
				
			||||||
            throw new RuntimeException(e);
 | 
					 | 
				
			||||||
        } finally {
 | 
					 | 
				
			||||||
            if (conn != null) {
 | 
					 | 
				
			||||||
                conn.disconnect();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Get 方法获取HTML
 | 
					 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param url
 | 
					     * @param url
 | 
				
			||||||
     *            网址
 | 
					     *            网址
 | 
				
			||||||
@@ -140,64 +102,94 @@ public class HttpKit {
 | 
				
			|||||||
     * @return 网页HTML
 | 
					     * @return 网页HTML
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public static String post(String url, String data) {
 | 
					    public static String post(String url, String data) {
 | 
				
			||||||
        return post(url, null, data, null);
 | 
					        return post(url, data, null);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Get 方法获取HTML
 | 
					     * Post 方法获取HTML
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param url
 | 
					     * @param url
 | 
				
			||||||
     *            网址
 | 
					     *            网址
 | 
				
			||||||
     * @param data
 | 
					     * @param data
 | 
				
			||||||
     *            查询参数
 | 
					     *            查询参数
 | 
				
			||||||
     * @param headers
 | 
					     * @param header
 | 
				
			||||||
     *            头信息
 | 
					     *            头信息
 | 
				
			||||||
     * @return 网页HTML
 | 
					     * @return 网页HTML
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public static String post(String url, String data, Map<String, String> headers) {
 | 
					    public static String post(String url, String data, Map<String, String> header) {
 | 
				
			||||||
        return post(url, null, data, headers);
 | 
					        return send(HttpInfo.builder().url(url).data(data).method(HttpMethod.POST).header(header).build());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * DELETE 方法
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param url
 | 
				
			||||||
 | 
					     *            地址
 | 
				
			||||||
 | 
					     * @param header
 | 
				
			||||||
 | 
					     *            头信息
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static String delete(String url, Map<String, String> header) {
 | 
				
			||||||
 | 
					        return send(HttpInfo.builder().url(url).method(HttpMethod.DELETE).header(header).build());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Post 获取网页
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param info
 | 
				
			||||||
 | 
					     *            链接信息
 | 
				
			||||||
 | 
					     * @return 网页HTML
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @SneakyThrows
 | 
				
			||||||
 | 
					    public static String send(HttpInfo info) {
 | 
				
			||||||
 | 
					        @Cleanup
 | 
				
			||||||
 | 
					        HttpURLConnection conn = getHttpConnection(buildUrlWithQueryString(info), info.getMethod().name(), info.getHeader());
 | 
				
			||||||
 | 
					        conn.connect();
 | 
				
			||||||
 | 
					        if (StrKit.notBlank(info.getData())) {
 | 
				
			||||||
 | 
					            OutputStream out = conn.getOutputStream();
 | 
				
			||||||
 | 
					            out.write(info.getData().getBytes(CHARSET));
 | 
				
			||||||
 | 
					            out.flush();
 | 
				
			||||||
 | 
					            out.close();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return readResponseString(conn);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Data
 | 
				
			||||||
 | 
					    @Builder
 | 
				
			||||||
 | 
					    public static class HttpInfo {
 | 
				
			||||||
 | 
					        private String url;
 | 
				
			||||||
 | 
					        private HttpMethod method;
 | 
				
			||||||
 | 
					        private Map<String, String> query;
 | 
				
			||||||
 | 
					        private String data;
 | 
				
			||||||
 | 
					        private Map<String, String> header;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 构建查询串为字符串
 | 
					     * 构建查询串为字符串
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param url
 | 
					     * @param info
 | 
				
			||||||
     *            网址
 | 
					     *            网址
 | 
				
			||||||
     * @param queryParas
 | 
					 | 
				
			||||||
     *            参数
 | 
					 | 
				
			||||||
     * @return 构建后的地址
 | 
					     * @return 构建后的地址
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private static String buildUrlWithQueryString(String url, Map<String, String> queryParas) {
 | 
					    private static String buildUrlWithQueryString(HttpInfo info) {
 | 
				
			||||||
        if (queryParas == null || queryParas.isEmpty()) { return url; }
 | 
					        val url = info.getUrl();
 | 
				
			||||||
 | 
					        val query = info.getQuery();
 | 
				
			||||||
 | 
					        if (query == null || query.isEmpty()) { return url; }
 | 
				
			||||||
        StringBuilder sb = new StringBuilder(url);
 | 
					        StringBuilder sb = new StringBuilder(url);
 | 
				
			||||||
        boolean isFirst;
 | 
					 | 
				
			||||||
        if (!url.contains("?")) {
 | 
					        if (!url.contains("?")) {
 | 
				
			||||||
            isFirst = true;
 | 
					 | 
				
			||||||
            sb.append("?");
 | 
					            sb.append("?");
 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            isFirst = false;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        query.entrySet().stream().filter(entry -> StrKit.isBlank(entry.getValue())).forEach(entry -> {
 | 
				
			||||||
        for (Entry<String, String> entry : queryParas.entrySet()) {
 | 
					 | 
				
			||||||
            if (isFirst) {
 | 
					 | 
				
			||||||
                isFirst = false;
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                sb.append("&");
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            String key = entry.getKey();
 | 
					            String key = entry.getKey();
 | 
				
			||||||
            String value = entry.getValue();
 | 
					            String value = entry.getValue();
 | 
				
			||||||
            if (StrKit.notBlank(value)) {
 | 
					 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
                value = URLEncoder.encode(value, CHARSET);
 | 
					                value = URLEncoder.encode(value, CHARSET);
 | 
				
			||||||
            } catch (UnsupportedEncodingException e) {
 | 
					            } catch (UnsupportedEncodingException e) {
 | 
				
			||||||
                throw new RuntimeException(e);
 | 
					                throw new RuntimeException(e);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            sb.append(key).append("=").append(value);
 | 
					            sb.append(key).append("=").append(value);
 | 
				
			||||||
        }
 | 
					        });
 | 
				
			||||||
        return sb.toString();
 | 
					        return sb.toString().substring(0, sb.length() - 1);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@@ -247,15 +239,12 @@ public class HttpKit {
 | 
				
			|||||||
     *
 | 
					     *
 | 
				
			||||||
     * @return 安全套接字工厂
 | 
					     * @return 安全套接字工厂
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 | 
					    @SneakyThrows
 | 
				
			||||||
    private static SSLSocketFactory initSSLSocketFactory() {
 | 
					    private static SSLSocketFactory initSSLSocketFactory() {
 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
        TrustManager[] tm = { new HttpKit.TrustAnyTrustManager() };
 | 
					        TrustManager[] tm = { new HttpKit.TrustAnyTrustManager() };
 | 
				
			||||||
        SSLContext sslContext = SSLContext.getInstance("TLS", "SunJSSE");
 | 
					        SSLContext sslContext = SSLContext.getInstance("TLS", "SunJSSE");
 | 
				
			||||||
        sslContext.init(null, tm, new java.security.SecureRandom());
 | 
					        sslContext.init(null, tm, new java.security.SecureRandom());
 | 
				
			||||||
        return sslContext.getSocketFactory();
 | 
					        return sslContext.getSocketFactory();
 | 
				
			||||||
        } catch (Exception e) {
 | 
					 | 
				
			||||||
            throw new RuntimeException(e);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@@ -265,28 +254,17 @@ public class HttpKit {
 | 
				
			|||||||
     *            HTTP连接
 | 
					     *            HTTP连接
 | 
				
			||||||
     * @return 字符串
 | 
					     * @return 字符串
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 | 
					    @SneakyThrows
 | 
				
			||||||
    private static String readResponseString(HttpURLConnection conn) {
 | 
					    private static String readResponseString(HttpURLConnection conn) {
 | 
				
			||||||
        StringBuilder sb = new StringBuilder();
 | 
					        StringBuilder sb = new StringBuilder();
 | 
				
			||||||
        InputStream inputStream = null;
 | 
					        @Cleanup
 | 
				
			||||||
        try {
 | 
					        InputStream inputStream = conn.getInputStream();
 | 
				
			||||||
            inputStream = conn.getInputStream();
 | 
					 | 
				
			||||||
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, CHARSET));
 | 
					        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, CHARSET));
 | 
				
			||||||
        String line;
 | 
					        String line;
 | 
				
			||||||
        while ((line = reader.readLine()) != null) {
 | 
					        while ((line = reader.readLine()) != null) {
 | 
				
			||||||
            sb.append(line).append("\n");
 | 
					            sb.append(line).append("\n");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return sb.toString();
 | 
					        return sb.toString();
 | 
				
			||||||
        } catch (Exception e) {
 | 
					 | 
				
			||||||
            throw new RuntimeException(e);
 | 
					 | 
				
			||||||
        } finally {
 | 
					 | 
				
			||||||
            if (inputStream != null) {
 | 
					 | 
				
			||||||
                try {
 | 
					 | 
				
			||||||
                    inputStream.close();
 | 
					 | 
				
			||||||
                } catch (IOException e) {
 | 
					 | 
				
			||||||
                    e.printStackTrace();
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										213
									
								
								src/test/java/pw/yumc/YumCore/plugin/MigrateCodingToGogs.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										213
									
								
								src/test/java/pw/yumc/YumCore/plugin/MigrateCodingToGogs.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,213 @@
 | 
				
			|||||||
 | 
					package pw.yumc.YumCore.plugin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.UnsupportedEncodingException;
 | 
				
			||||||
 | 
					import java.net.URLEncoder;
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.Base64;
 | 
				
			||||||
 | 
					import java.util.HashMap;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					import java.util.concurrent.ExecutorService;
 | 
				
			||||||
 | 
					import java.util.concurrent.Executors;
 | 
				
			||||||
 | 
					import java.util.concurrent.TimeUnit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.alibaba.fastjson.JSON;
 | 
				
			||||||
 | 
					import com.alibaba.fastjson.JSONArray;
 | 
				
			||||||
 | 
					import com.alibaba.fastjson.JSONObject;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import lombok.AllArgsConstructor;
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					import pw.yumc.YumCore.kit.HttpKit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Created with IntelliJ IDEA
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @author 喵♂呜
 | 
				
			||||||
 | 
					 *         Created on 2017/7/25 10:04.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class MigrateCodingToGogs {
 | 
				
			||||||
 | 
					    //private String site = "http://git.yumc.pw";
 | 
				
			||||||
 | 
					    private String site = "https://try.gogs.io";
 | 
				
			||||||
 | 
					    private String username = "xxxxxxxxx";// Gogs账号
 | 
				
			||||||
 | 
					    private String password = "xxxxxxxxx";// Gogs密码
 | 
				
			||||||
 | 
					    private Map<String, String> gogs_header;
 | 
				
			||||||
 | 
					    private String coding_token;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 删除所有项目
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void clearProject() {
 | 
				
			||||||
 | 
					        JSONObject userInfo = getUser();
 | 
				
			||||||
 | 
					        System.out.println("Gogs用户ID: " + userInfo.getString("id"));
 | 
				
			||||||
 | 
					        updateAuthorization(username);
 | 
				
			||||||
 | 
					        List<String> list = getNameListFromGogs();
 | 
				
			||||||
 | 
					        clearList(userInfo.getString("username"), list);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private void clearList(String u, List<String> list) {
 | 
				
			||||||
 | 
					        list.forEach(s -> delete("/repos/" + u + "/" + s));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 镜像所有项目
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void migrateProject() {
 | 
				
			||||||
 | 
					        JSONObject userInfo = getUser();
 | 
				
			||||||
 | 
					        System.out.println("Gogs用户ID: " + userInfo.getString("id"));
 | 
				
			||||||
 | 
					        updateAuthorization(username);
 | 
				
			||||||
 | 
					        List<RepoInfo> list = getListFromCoding(userInfo.getString("id"));
 | 
				
			||||||
 | 
					        List<String> exist = getNameListFromGogs();
 | 
				
			||||||
 | 
					        list.removeIf(repoInfo -> exist.contains(repoInfo.getName()));
 | 
				
			||||||
 | 
					        migrateList(list);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 更新Basic为token
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void updateAuthorization(String user) {
 | 
				
			||||||
 | 
					        String token = getUserToken(user);
 | 
				
			||||||
 | 
					        System.out.println("Gogs用户Toekn: " + token);
 | 
				
			||||||
 | 
					        getHeader().put("Authorization", "token " + token);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取或创建用户Token
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return 用户Token
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private String getUserToken(String user) {
 | 
				
			||||||
 | 
					        JSONArray tks = JSON.parseArray(get("/users/" + user + "/tokens"));
 | 
				
			||||||
 | 
					        if (tks.isEmpty()) {
 | 
				
			||||||
 | 
					            return JSON.parseObject(post("/users/" + user + "/tokens", "name=migrate")).getString("sha1");
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return tks.getJSONObject(0).getString("sha1");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public Map<String, String> getHeader() {
 | 
				
			||||||
 | 
					        if (gogs_header == null) {
 | 
				
			||||||
 | 
					            gogs_header = new HashMap<>();
 | 
				
			||||||
 | 
					            gogs_header.put("Content-Type", " application/x-www-form-urlencoded");
 | 
				
			||||||
 | 
					            gogs_header.put("Authorization", "Basic " + new String(Base64.getEncoder().encode((username + ":" + password).getBytes())));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return gogs_header;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private JSONObject getUser() {
 | 
				
			||||||
 | 
					        return JSON.parseObject(get("/user"));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private List<String> getNameListFromGogs() {
 | 
				
			||||||
 | 
					        List<String> exist = new ArrayList<>();
 | 
				
			||||||
 | 
					        JSONArray arr = JSON.parseArray(get("/user/repos"));
 | 
				
			||||||
 | 
					        for (int i = 0; i < arr.size(); i++) {
 | 
				
			||||||
 | 
					            JSONObject obj = arr.getJSONObject(i);
 | 
				
			||||||
 | 
					            exist.add(obj.getString("name"));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return exist;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public List<RepoInfo> getListFromCoding(String uid) {
 | 
				
			||||||
 | 
					        Map<String, String> coding_header = new HashMap<>();
 | 
				
			||||||
 | 
					        coding_header.put("Authorization", "token " + coding_token);
 | 
				
			||||||
 | 
					        String json = HttpKit.get("https://coding.net/api/projects?page=1&pageSize=1000&type=all", null, coding_header);
 | 
				
			||||||
 | 
					        JSONArray projs = JSON.parseObject(json).getJSONObject("data").getJSONArray("list");
 | 
				
			||||||
 | 
					        System.out.println("Coding仓库数量: " + projs.size());
 | 
				
			||||||
 | 
					        List<RepoInfo> list = new ArrayList<>();
 | 
				
			||||||
 | 
					        for (int i = 0; i < projs.size(); i++) {
 | 
				
			||||||
 | 
					            JSONObject proj = projs.getJSONObject(i);
 | 
				
			||||||
 | 
					            list.add(new RepoInfo(proj.getString("https_url"), proj.getString("name"), username, password, uid, !proj.getBooleanValue("is_public"), proj.getString("description")));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return list;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void migrateList(List<RepoInfo> projs) {
 | 
				
			||||||
 | 
					        long start = System.currentTimeMillis();
 | 
				
			||||||
 | 
					        ExecutorService executor = Executors.newFixedThreadPool(10);
 | 
				
			||||||
 | 
					        for (RepoInfo repoInfo : projs) {
 | 
				
			||||||
 | 
					            executor.execute(() -> migrate(repoInfo));
 | 
				
			||||||
 | 
					            migrate(repoInfo);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        executor.shutdown();
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            boolean loop;
 | 
				
			||||||
 | 
					            do { //等待所有任务完成
 | 
				
			||||||
 | 
					                loop = !executor.awaitTermination(2, TimeUnit.SECONDS); //阻塞,直到线程池里所有任务结束
 | 
				
			||||||
 | 
					            } while (loop);
 | 
				
			||||||
 | 
					        } catch (InterruptedException ignored) {
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        System.out.println(String.format("迁移完成 耗时 %s 毫秒!", System.currentTimeMillis() - start));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void migrate(RepoInfo info) {
 | 
				
			||||||
 | 
					        String data = new StringBuilder()
 | 
				
			||||||
 | 
					                .append("clone_addr=")
 | 
				
			||||||
 | 
					                .append(eu(info.getUrl()))
 | 
				
			||||||
 | 
					                .append("&auth_username=")
 | 
				
			||||||
 | 
					                .append(eu(info.getUser()))
 | 
				
			||||||
 | 
					                .append("&auth_password=")
 | 
				
			||||||
 | 
					                .append(eu(info.getPass()))
 | 
				
			||||||
 | 
					                .append("&uid=")
 | 
				
			||||||
 | 
					                .append(info.getUid())
 | 
				
			||||||
 | 
					                .append("&repo_name=")
 | 
				
			||||||
 | 
					                .append(eu(info.getName()))
 | 
				
			||||||
 | 
					                .append("&private=")
 | 
				
			||||||
 | 
					                .append(info.isPrivate() ? "on" : "off")
 | 
				
			||||||
 | 
					                .append("&mirror=on&description=")
 | 
				
			||||||
 | 
					                .append(eu(info.getDescription()))
 | 
				
			||||||
 | 
					                .toString();
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            get("/repos/" + username + "/" + info.getName());
 | 
				
			||||||
 | 
					            System.out.println("仓库: " + info.getName() + " 已存在!");
 | 
				
			||||||
 | 
					        } catch (Exception ex) {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                post("/repos/migrate", data);
 | 
				
			||||||
 | 
					            } catch (Exception ignored) {
 | 
				
			||||||
 | 
					                while (ignored.getCause() != null) {
 | 
				
			||||||
 | 
					                    ignored = (Exception) ignored.getCause();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                System.out.println("仓库: " + info.getName() + " 异常: " + ignored.getClass().getName() + ":" + ignored.getMessage());
 | 
				
			||||||
 | 
					                // 忽略超时以及其他异常
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            System.out.println("仓库: " + info.getName() + " 迁移完成!");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public String get(String url) {
 | 
				
			||||||
 | 
					        String result = HttpKit.get(site + "/api/v1" + url, getHeader());
 | 
				
			||||||
 | 
					        System.out.println("[DEBUG] URL: " + site + "/api/v1" + url + "\n[DEBUG] Result: " + result);
 | 
				
			||||||
 | 
					        return result;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public String delete(String url) {
 | 
				
			||||||
 | 
					        String result = HttpKit.delete(site + "/api/v1" + url, getHeader());
 | 
				
			||||||
 | 
					        System.out.println("[DEBUG] URL: " + site + "/api/v1" + url + "\n[DEBUG] Result: " + result);
 | 
				
			||||||
 | 
					        return result;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public String post(String url, String data) {
 | 
				
			||||||
 | 
					        String result = HttpKit.post(site + "/api/v1" + url, data, getHeader());
 | 
				
			||||||
 | 
					        System.out.println("[DEBUG] URL: " + site + "/api/v1" + url + " DATA: " + data + "\n[DEBUG] Result: " + result);
 | 
				
			||||||
 | 
					        return result;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static String eu(String str) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            return URLEncoder.encode(str, "UTF-8");
 | 
				
			||||||
 | 
					        } catch (UnsupportedEncodingException e) {
 | 
				
			||||||
 | 
					            return "";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Data
 | 
				
			||||||
 | 
					    @AllArgsConstructor
 | 
				
			||||||
 | 
					    public static class RepoInfo {
 | 
				
			||||||
 | 
					        private String url;
 | 
				
			||||||
 | 
					        private String name;
 | 
				
			||||||
 | 
					        private String user;
 | 
				
			||||||
 | 
					        private String pass;
 | 
				
			||||||
 | 
					        private String uid;
 | 
				
			||||||
 | 
					        private boolean isPrivate;
 | 
				
			||||||
 | 
					        private String description;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user