Skip to content

Commit

Permalink
add gitCommits2Log
Browse files Browse the repository at this point in the history
  • Loading branch information
cofcool committed Jan 19, 2023
1 parent 713388b commit 53a4730
Show file tree
Hide file tree
Showing 9 changed files with 187 additions and 26 deletions.
1 change: 1 addition & 0 deletions .github/workflows/maven.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,4 @@ jobs:
draft: false
prerelease: false
artifacts: "./target/*.zip"
bodyFile: "./target/changelog.md"
36 changes: 14 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,7 @@

使用 Java(最低要求 JDK 17), Python 等语言实现

<!-- @import "[TOC]" {cmd="toc" depthFrom=2 depthTo=2 orderedList=false} -->

<!-- code_chunk_output -->

- [1. dhtml2text](#1-dhtml2text)
- [2. listAllFiles](#2-listallfiles)
- [3. MenuGenerator](#3-menugenerator)
- [4. LinkCovertTool](#4-linkcoverttool)
- [5. Trello 导出的 JSON 文件导入到 Logseq](#5-trello-导出的-json-文件导入到-logseq)
- [6. 常用字符串转换工具](#6-常用字符串转换工具)

<!-- /code_chunk_output -->



## 1. dhtml2text
## dhtml2text

该脚本可以下载指定页面下的所有a标签对应的链接,也可把下载下来的html页面合并为纯文本文件。

Expand All @@ -41,33 +26,40 @@ pip3 install chardet
python3 dhtml2text.py
```

## 2. listAllFiles
## listAllFiles

Node.js,列出当前目录下的所有文件,并读取内容。

## 3. MenuGenerator
## MenuGenerator

Node.js,根据OpenAPI规范,可提取Swagger生成的api.json文件中的关键字并写入文件。

## 4. LinkCovertTool
## LinkCovertTool

Java,可把后缀为`.desktop``.webloc`的多个网页快捷文件提取到链接并输出到Markdown文件。

## 5. Trello 导出的 JSON 文件导入到 Logseq
## Trello 导出的 JSON 文件导入到 Logseq

支持把从 Trello 看板导出的 JSON 文件导入到 Logseq

## 6. 常用字符串转换工具
## 常用字符串转换工具

使用: `./my-tools.sh --name=converts --cmd="upper test"`

功能
支持功能(可通过 `|` 连接多个命令)

* md5,生成指定字符串的 md5 值
* kindle,Kindle 笔记内容转换为 Markdown 文档
* upper/lower,字符串大小写转换
* hdate,时间戳转换为易于阅读的时间格式
* timesp,把时间转换为时间戳
* now,当前时间戳
* replace,字符串替换
* ...

## 根据 Git 提交记录生成更新日志

使用: `./my-tools.sh --name=gitCommits2Log --path=./`

# 致谢

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/net/cofcool/toolbox/ToolName.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package net.cofcool.toolbox;

public enum ToolName {
trelloLogseqImporter, shell, link2Tool, kindle, converts
trelloLogseqImporter, shell, link2Tool, kindle, gitCommits2Log, converts
}
117 changes: 117 additions & 0 deletions src/main/java/net/cofcool/toolbox/internal/GitCommitsToChangelog.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
package net.cofcool.toolbox.internal;

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;
import net.cofcool.toolbox.Tool;
import net.cofcool.toolbox.ToolName;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

/**
* git-log PRETTY FORMATS
* <code>git log --format="%d;%h;%s"</code>
*/
public class GitCommitsToChangelog implements Tool {

private final Tool delegate = new ShellStarter();

@Override
public ToolName name() {
return ToolName.gitCommits2Log;
}

// (HEAD -> master, origin/master, origin/HEAD);117826a;Converts: now, replace
//;1788569;add debug mode
//;1ee4312;update doc
//;b676feb;update doc
// (tag: 1.0.1);a9d3e04;add Converts
@Override
public void run(Args args) throws Exception {
String out = args.readArg("out").orElse(new Arg("", "./target/changelog.md")).val();
var logFile = args.readArg("log");
var requiredTag = args.readArg("tag");

String commitLog;
if (logFile.isPresent()) {
commitLog = FileUtils.readFileToString(new File(logFile.get().val()), StandardCharsets.UTF_8);
} else {
String path = args.readArg("path").get().val();

String command = "git log --format=%d;%h;%s";
System.out.println("Run command: " + command);
Process process = Runtime
.getRuntime()
.exec(
command.split(" "),
null,
new File(path)
);

Process exec = process.onExit().get();
String error = IOUtils.toString(exec.getErrorStream(), StandardCharsets.UTF_8);
if (error != null && !error.isEmpty()) {
System.err.println(error);
return;
}
commitLog = IOUtils.toString(exec.getInputStream(), StandardCharsets.UTF_8);
}

if (commitLog != null && !commitLog.isEmpty()) {
var commits = new ArrayDeque<String>();
AtomicInteger tag = new AtomicInteger(0);
Arrays.stream(commitLog.split("\n"))
.map(a -> a.split(";"))
.filter(a -> a.length > 2)
.map(a -> new Commit(a[0], a[1], String.join(";", Arrays.copyOfRange(a, 2, a.length))))
.forEach(c -> {
if (tag.get() == 0) {
c.tag().ifPresent(t -> {
if (requiredTag.isPresent() && !requiredTag.get().val().equals(t)) {
return;
}
tag.set(1);
commits.addFirst("## v" + t.trim() + "\n");
commits.add(c.toString());
});
} else if (tag.get() == 1) {
if (c.tag().isPresent()) {
tag.set(2);
} else {
commits.add(c.toString());
}
}
});
FileUtils.writeStringToFile(new File(out), String.join("\n", commits), StandardCharsets.UTF_8);
System.out.println("Generate " + out + " ok");
}
}

@Override
public String help() {
return "[--path=./demo] [--out=demo-changelog.md] [--log=log.txt] [--tag=1.0.1]";
}

private record Commit(
String ref,
String hash,
String message
) {
public Optional<String> tag() {
if (ref.contains("tag")) {
return Arrays.stream(ref.replace("(", "").replace(")", "")
.split(",")).filter(a -> a.trim().startsWith("tag"))
.map(a -> a.split(":")[1].trim()).findAny();
}
return Optional.empty();
}

@Override
public String toString() {
return "* " + message + "(" + hash + ")";
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package net.cofcool.toolbox.internal;

import net.cofcool.toolbox.Tool;
import org.junit.jupiter.api.Test;

class GitCommitsToChangelogTest {

@Test
void runWithTag() throws Exception {
new GitCommitsToChangelog().run(new Tool.Args().arg("path", Utils.getTestResourcePath("/")).arg("tag", "1.0.0").arg("out", "./target/changelog-runWithTag.md"));
}

@Test
void run() throws Exception {
new GitCommitsToChangelog().run(new Tool.Args().arg("path", Utils.getTestResourcePath("/")));
}

@Test
void runWithLogPath() throws Exception {
new GitCommitsToChangelog().run(new Tool.Args().arg("log", Utils.getTestResourcePath("/gitCommitsToChangelogTest.txt")).arg("out", "./target/changelog-runWithLogPath.md"));
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
package net.cofcool.toolbox.internal;

import java.net.URL;
import net.cofcool.toolbox.Tool;
import org.junit.jupiter.api.Test;

class SplitKindleClippingsTest {

@Test
void run() throws Exception {
URL resource = SplitKindleClippings.class.getResource("/splitKindleClippingsTest.txt");
new SplitKindleClippings().run(new Tool.Args().arg("path", resource.toString().substring(5)).arg("out", "./target/splitKindleClippingsTest.md"));
new SplitKindleClippings().run(new Tool.Args().arg("path", Utils.getTestResourcePath("/splitKindleClippingsTest.txt")).arg("out", "./target/splitKindleClippingsTest.md"));
}

}
8 changes: 8 additions & 0 deletions src/test/java/net/cofcool/toolbox/internal/Utils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package net.cofcool.toolbox.internal;

public class Utils {

static String getTestResourcePath(String path) {
return SplitKindleClippings.class.getResource(path).toString().substring(5);
}
}
16 changes: 16 additions & 0 deletions src/test/resources/gitCommitsToChangelogTest.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
(HEAD -> master, tag: 1.0.4, origin/master, origin/HEAD);117826a;Converts: now, replace
;1788569;add debug mode
;1ee4312;update doc
;b676feb;update doc
(tag: 1.0.1);a9d3e04;add Converts
(tag: 1.0.0);1b67da0;Update maven.yml
;6474b63;Update maven.yml
;97a383e;Update maven.yml
;52ba1b8;Update maven.yml
;2e71e27;Update maven.yml
;61bfdff;Update maven.yml
;6e26d48;github action
;c92e596;fix action
;24f7178;github action
;8f989ce;fix readme
;dc723bc;init
7 changes: 7 additions & 0 deletions zip.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,13 @@
<include>README.md</include>
</includes>
</fileSet>
<fileSet>
<directory>target</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>changelog.md</include>
</includes>
</fileSet>
<fileSet>
<directory>imgs</directory>
<outputDirectory>/imgs</outputDirectory>
Expand Down

0 comments on commit 53a4730

Please sign in to comment.