implement changelog parsing

This commit is contained in:
Cadey Ratio 2020-05-31 12:29:43 -04:00
parent ce84629fe7
commit d14bf14d4b
3 changed files with 117 additions and 0 deletions

41
CHANGELOG.md Normal file
View File

@ -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

75
src/changelog.rs Normal file
View File

@ -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(())
}

View File

@ -3,6 +3,7 @@ use reqwest::{header, Client};
use std::path::PathBuf;
use structopt::StructOpt;
mod changelog;
mod cmd;
mod gitea;