implement changelog parsing
This commit is contained in:
parent
ce84629fe7
commit
d14bf14d4b
|
@ -0,0 +1,41 @@
|
||||||
|
# Changelog
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## Unreleased
|
||||||
|
|
||||||
|
## 0.1.0
|
||||||
|
|
||||||
|
This is the first release of `gitea-release`!
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ gitea-release release --help
|
||||||
|
gitea-release-release 0.1.0
|
||||||
|
Create a new tag and release on Gitea
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
gitea-release release [FLAGS] [OPTIONS] --auth-user <auth-user> --owner <owner> --repo <repo> --server <server> --token <token>
|
||||||
|
|
||||||
|
FLAGS:
|
||||||
|
--draft Draft release
|
||||||
|
-h, --help Prints help information
|
||||||
|
-p, --pre-release Pre-release (not suitable for production)
|
||||||
|
-V, --version Prints version information
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
-a, --auth-user <auth-user> The gitea user to authenticate as [env: GITEA_AUTH_USER=cadey]
|
||||||
|
-c, --changelog <changelog> Changelog file to read from to create the release description [default:
|
||||||
|
./CHANGELOG.md]
|
||||||
|
-n, --name <name> Release name
|
||||||
|
-o, --owner <owner> The owner of the gitea repo [env: GITEA_OWNER=]
|
||||||
|
-r, --repo <repo> The gitea repo to operate on [env: GITEA_REPO=]
|
||||||
|
-s, --server <server> The gitea server to connect to [env: GITEA_SERVER=https://tulpa.dev]
|
||||||
|
--token <token> The gitea token to authenticate with [env: GITEA_TOKEN=]
|
||||||
|
```
|
||||||
|
|
||||||
|
### ADDED
|
||||||
|
|
||||||
|
- Basic functionality
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
use anyhow::Result;
|
||||||
|
use comrak::nodes::{AstNode, NodeValue};
|
||||||
|
use comrak::{format_commonmark, parse_document, Arena, ComrakOptions};
|
||||||
|
use std::cell::RefCell;
|
||||||
|
use std::fs::read_to_string;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
pub(crate) fn read(fname: PathBuf, tag: String) -> Result<String> {
|
||||||
|
let data = read_to_string(fname)?;
|
||||||
|
let arena = Arena::new();
|
||||||
|
let mut root = parse_document(&arena, &data, &ComrakOptions::default());
|
||||||
|
|
||||||
|
let collect = RefCell::new(false);
|
||||||
|
let buf = RefCell::new(Vec::<u8>::new());
|
||||||
|
|
||||||
|
iter_nodes(&mut root, &|node| {
|
||||||
|
let nd = node.data.borrow();
|
||||||
|
|
||||||
|
match nd.value {
|
||||||
|
NodeValue::Heading(ref hdr) => {
|
||||||
|
if hdr.level == 2 {
|
||||||
|
if *collect.borrow() {
|
||||||
|
collect.swap(&RefCell::new(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
let found_tag = String::from_utf8(nd.content.clone())?;
|
||||||
|
|
||||||
|
if found_tag == tag {
|
||||||
|
collect.swap(&RefCell::new(true));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if *collect.borrow() {
|
||||||
|
let mut apd = buf.borrow_mut();
|
||||||
|
let mut new_buf = Vec::<u8>::new();
|
||||||
|
format_commonmark(&node, &ComrakOptions::default(), &mut new_buf)?;
|
||||||
|
apd.append(&mut new_buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
NodeValue::Item(_) => Ok(()),
|
||||||
|
_ => {
|
||||||
|
if *collect.borrow() {
|
||||||
|
let mut apd = buf.borrow_mut();
|
||||||
|
let mut new_buf = Vec::<u8>::new();
|
||||||
|
format_commonmark(&node, &ComrakOptions::default(), &mut new_buf)?;
|
||||||
|
apd.append(&mut new_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})?;
|
||||||
|
|
||||||
|
Ok(String::from_utf8(buf.into_inner())?)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn iter_nodes<'a, F>(node: &'a AstNode<'a>, f: &F) -> Result<()>
|
||||||
|
where
|
||||||
|
F: Fn(&'a AstNode<'a>) -> Result<()>,
|
||||||
|
{
|
||||||
|
f(node)?;
|
||||||
|
for c in node.children() {
|
||||||
|
match c.data.borrow().value {
|
||||||
|
NodeValue::Text(_) => {}
|
||||||
|
NodeValue::Item(_) => {}
|
||||||
|
NodeValue::Code(_) => {}
|
||||||
|
_ => {
|
||||||
|
iter_nodes(c, f)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ use reqwest::{header, Client};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use structopt::StructOpt;
|
use structopt::StructOpt;
|
||||||
|
|
||||||
|
mod changelog;
|
||||||
mod cmd;
|
mod cmd;
|
||||||
mod gitea;
|
mod gitea;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue