Compare commits

...

16 commits

Author SHA1 Message Date
semantic-release-bot d32c8a428e chore(release): v1.0.1 [skip ci]
## [1.0.1](https://src.mfgames.com/fedran-sources/i-will-hurt-you-only-once/compare/v1.0.0...v1.0.1) (2022-10-13)

### Bug Fixes

* tweaking build to force release ([a2ff2a9](a2ff2a9be9))
* updating project files ([8297e9b](8297e9b47e))
2022-10-13 02:47:04 +00:00
D. Moonfire 8297e9b47e fix: updating project files 2022-10-12 21:40:18 -05:00
D. Moonfire a2ff2a9be9 fix: tweaking build to force release 2022-10-12 21:04:30 -05:00
D. Moonfire bdfa42bda8 build: working on Gitea release process 2022-10-12 20:54:43 -05:00
D. Moonfire ea537d7e92 build: working on Gitea release process 2022-10-12 20:47:28 -05:00
D. Moonfire b374f1948f build: working on Woodpecker release process 2022-10-12 17:28:40 -05:00
D. Moonfire aae91bdf70 build: working on Woodpecker release process 2022-10-12 17:16:40 -05:00
D. Moonfire 6637156f74 build: working on Woodpecker environment variables 2022-10-12 17:03:06 -05:00
D. Moonfire d5d5042afb build: updating project layout 2022-10-12 16:50:03 -05:00
D. Moonfire 9897d37afb build: updating project layout 2022-10-12 16:41:53 -05:00
D. Moonfire f6a481891b build: implementing standard Fedran project layout 2022-10-12 16:27:56 -05:00
D. Moonfire 81ce113266 chore: added description 2022-10-09 22:20:16 -05:00
D. Moonfire 0ff4eb1b36 chore: adding some missing metadata 2022-10-09 22:10:53 -05:00
D. Moonfire a966b9ef35 chore: added metadata 2022-10-09 22:02:42 -05:00
D. Moonfire 41161e17bb chore: updating metadata 2022-03-04 17:18:30 -06:00
D. Moonfire a69813091d chore: updating metadata 2022-03-04 09:13:29 -06:00
28 changed files with 19528 additions and 3 deletions

26
.editorconfig Normal file
View file

@ -0,0 +1,26 @@
# EditorConfig is awesome: http://EditorConfig.org
# top-most EditorConfig file
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
max_line_length = 80
tab_width = 4
trim_trailing_whitespace = true
[*.{js,ts}]
quote_type = double
[*.yaml]
indent_size = 4
tab_width = 4
indent_style = space
[package.json]
indent_size = 2
tab_width = 2

2
.envrc Normal file
View file

@ -0,0 +1,2 @@
export PATH=$PWD/scripts:$PWD/node_modules/.bin:$PATH
use flake || use nix

13
.gitignore vendored Normal file
View file

@ -0,0 +1,13 @@
*~
node_modules/
.direnv/
tmp/
build/
.*-swp
dmoonfire*.pdf
dmoonfire*.docx
dmoonfire*.html
dmoonfire*.mobi
dmoonfire*.epub
*.bz2

17
.prettierignore Normal file
View file

@ -0,0 +1,17 @@
CHANGELOG.md
package-lock.json
yarn.lock
*~
archives/
build/
extras/
others/
node_modules/
submissions/
sample-edits/
maps/
.direnv/
tmp/
edit/

36
.woodpecker.yml Normal file
View file

@ -0,0 +1,36 @@
clone:
git:
image: woodpeckerci/plugin-git
settings:
tags: true
pipeline:
build:
image: registry.gitlab.com/dmoonfire/nix-flake-docker:latest
commands:
- nix profile install 'nixpkgs#fontconfig'
- nix develop --command scripts/build.sh
secrets:
- gitea_token
- s3_bucket
- s3_endpoint
- s3_access_key_id
- s3_secret_access_key
when:
event: [push, pull_request, tag]
tag: v*
release:
image: registry.gitlab.com/dmoonfire/nix-flake-docker:latest
commands:
- nix profile install 'nixpkgs#fontconfig'
- nix develop --command scripts/release.sh
secrets:
- gitea_token
- s3_bucket
- s3_endpoint
- s3_access_key_id
- s3_secret_access_key
when:
event: push
branch: main

7
CHANGELOG.md Normal file
View file

@ -0,0 +1,7 @@
## [1.0.1](https://src.mfgames.com/fedran-sources/i-will-hurt-you-only-once/compare/v1.0.0...v1.0.1) (2022-10-13)
### Bug Fixes
* tweaking build to force release ([a2ff2a9](https://src.mfgames.com/fedran-sources/i-will-hurt-you-only-once/commit/a2ff2a9be907e07e8f29334bf00657e8afc56507))
* updating project files ([8297e9b](https://src.mfgames.com/fedran-sources/i-will-hurt-you-only-once/commit/8297e9b47ed669c3764e3c9143bb4408ab3f8466))

View file

@ -2,14 +2,39 @@
title: I Will Hurt You Only Once
date: 2019-11-15
summary: >
Late at night, Gichyòbi is interrupted by his daughter who has questions about Rutejìmo's anger toward his clan. It is up to him to decide if he is going to risk his daughter's future magic to promise her that he would only ever hurt her once.
Late at night, Gichyòbi is interrupted by his daughter who has questions about Rutejìmo's anger toward his clan. It is up to him to decide if he is going to risk his daughter's future magic to promise her that he would only ever hurt her once.
characters:
primary:
- Gichyòbi
secondary:
- Rutejìmo
- Mapábyo
- Kidóri
- Nifaópi
- Galdinol (Epigraph)
locations:
primary:
- Wamifuko City
concepts:
secondary:
- hichifūma
organizations:
secondary:
- Wamifūko
- Shimusògo
warnings:
primary:
- Anxiety
referenced:
- Physical Abuse
- Emotional Abuse
---
> The strongest magic comes from the deepest trauma. That's the cruel price of magic. --- Galdinol Misfanic, *Civilization, or The Cause for Magic Leaving Our World*
> The strongest magic comes from the deepest trauma. That's the cruel price of magic. --- Galdinol Misfanic, _Civilization, or The Cause for Magic Leaving Our World_
Gichyòbi yawned as he headed to the front door. Joints in his knees and shoulder popped and cracked from sitting too long. He reached the entrance and pushed it open to let the cold desert air in.
Behind him, Rutejìmo and Mapábyo walked hand and hand. The younger couple were leaning against each other. Both looked exhausted but that made sense after a day of running across the desert and then talking until almost morning.
Behind him, Rutejìmo and Mapábyo walked hand and hand. The younger couple were leaning against each other. Both were exhausted from running across the desert the all day and then talking until almost morning.
Gichyòbi let his senses enter the stone underneath him. He felt the vibrations coming toward him from all directions. He could easily distinguish the distinct feel of other members of the Wamifūko clan compared to the few strangers still walking around so late in the morning. One of them was a few blocks away but in the path of the couple leaving.

6
commitlint.config.js Normal file
View file

@ -0,0 +1,6 @@
module.exports = {
extends: ["@commitlint/config-conventional"],
rules: {
"body-max-line-length": [0],
},
};

82
fedran.json Normal file
View file

@ -0,0 +1,82 @@
{
"version": 0,
"identifier": "0075-00",
"character": {
"pov": 75,
"name": "Gichyòbi",
"character_slug": "gichyobi"
},
"source": {
"pov": 75,
"volume": 0,
"title": "I Will Hurt You Only Once",
"description": {
"tag": "Will he risk her future to explain it now?",
"paragraphs": [
"The intensity and capability of a young person's magic is directly related to the amount of trauma they experience during their teenage years, but no one wants to see their children harmed or killed in the process. But knowing that there are adults ready to jump in and stop events from going too far hampers the magic, creating less powerful manifestations and potentially putting the entire clan at risk. But, when presented by an innocent question by his own daughter, will Gichyòbi risk her future to make sure she knows he would never abandon her?"
]
},
"word_count": 3401,
"length": "Story",
"title_slug": "i-will-hurt-you-only-once",
"identifier_slug": "0075-00-i-will-hurt-you-only-once",
"copyright_year": 2019,
"status": "Unstable",
"genres": [
"Drama"
],
"state": {
"public_source": true,
"started_chapters": true,
"finished_chapters": true
},
"languages": {
"miwafu": true
},
"has_dedication": false,
"git": {
"http_url": "https://src.mfgames.com/fedran-sources/i-will-hurt-you-only-once.git",
"branch": "main"
},
"links": {
"development": {
"git": "https://src.mfgames.com/fedran-sources/i-will-hurt-you-only-once/",
"issues": "https://src.mfgames.com/fedran-sources/i-will-hurt-you-only-once/issues"
}
},
"cover": {
"title_page_lines": [
"I Will",
"Hurt You",
"Only Once"
]
},
"warnings": {
"text": "This story contains scenes where the primary character and others experience anxiety. There are off-page references to emotional abuse and physical abuse. There is no sexual assault.",
"primary": [
"Anxiety"
],
"referenced": [
"Physical Abuse",
"Emotional Abuse"
]
},
"chapters": [
{
"title": "I Will Hurt You Only Once",
"word_count": 3401,
"date": "2019-11-15",
"summary": "Late at night, Gichyòbi is interrupted by his daughter who has questions about Rutejìmo's anger toward his clan. It is up to him to decide if he is going to risk his daughter's future magic to promise her that he would only ever hurt her once.\n",
"warnings": {
"primary": [
"Anxiety"
],
"referenced": [
"Physical Abuse",
"Emotional Abuse"
]
}
}
]
}
}

58
flake.lock Normal file
View file

@ -0,0 +1,58 @@
{
"nodes": {
"flake-utils": {
"locked": {
"lastModified": 1642700792,
"narHash": "sha256-XqHrk7hFb+zBvRg6Ghl+AZDq03ov6OshJLiSWOoX5es=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "846b2ae0fc4cc943637d3d1def4454213e203cba",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1643805626,
"narHash": "sha256-AXLDVMG+UaAGsGSpOtQHPIKB+IZ0KSd9WS77aanGzgc=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "554d2d8aa25b6e583575459c297ec23750adb6cb",
"type": "github"
},
"original": {
"id": "nixpkgs",
"ref": "nixos-unstable",
"type": "indirect"
}
},
"nixstable": {
"locked": {
"lastModified": 1622516815,
"narHash": "sha256-ZjBd81a6J3TwtlBr3rHsZspYUwT9OdhDk+a/SgSEf7I=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "7e9b0dff974c89e070da1ad85713ff3c20b0ca97",
"type": "github"
},
"original": {
"id": "nixpkgs",
"ref": "21.05",
"type": "indirect"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs",
"nixstable": "nixstable"
}
}
},
"root": "root",
"version": 7
}

28
flake.nix Normal file
View file

@ -0,0 +1,28 @@
{
inputs = {
nixstable.url = "nixpkgs/21.05";
nixpkgs.url = "nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, nixstable, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
stable = nixstable.legacyPackages.${system};
in {
devShell = pkgs.mkShell {
buildInputs = [
pkgs.epubcheck
pkgs.nixfmt
pkgs.nodejs-16_x
pkgs.pandoc
pkgs.pdftk
pkgs.python39Full
pkgs.python39Packages.weasyprint
pkgs.jq
pkgs.s3cmd
];
};
});
}

11
matter/about.md Normal file
View file

@ -0,0 +1,11 @@
---
title: About D. Moonfire
---
D. Moonfire is the remarkable intersection of a computer nerd and a scientist. He inherited a desire for learning, endless curiosity, and a talent for being a polymath from both of his parents. Instead of focusing on a single genre, he writes stories and novels in many different settings ranging from fantasy to science fiction. He also throws in the occasional romance or forensics murder mystery to mix things up.
In addition to having a borderline unhealthy obsession with the written word, he is also a developer who loves to code as much as he loves writing.
He lives near Cedar Rapids, Iowa with his wife, numerous pet computers, and a pair of highly mobile things of the male variety.
You can see more work by D. Moonfire at his website at [https://d.moonfire.us/](https://d.moonfire.us/). His fantasy world, Fedran, can be found at [https://fedran.com/](https://fedran.com/).

13
matter/fedran.md Normal file
View file

@ -0,0 +1,13 @@
---
title: Fedran
---
Fedran is a world caught on the cusp of two great ages.
For centuries, the Crystal Age shaped society through the exploration of magic. Every creature had the ability to affect the world using talents and spells. The only limitation was imagination, will, and the inescapable rules of resonance. But as society grew more civilized, magic became less reliable and weaker.
When an unexpected epiphany seemingly breaks the laws of resonance, everything changed. Artifacts no longer exploded when exposed to spells, but only if they were wrapped in cocoons of steel and brass. The humble fire rune becomes the fuel for new devices, ones powered by steam and pressure. These machines herald the birth of a new age, the Industrial Age.
Now, the powers of the old age struggle against the onslaught of new technologies and an alien way of approaching magic. Either the world will adapt or it will be washed away in the relentless march of innovation.
To explore the world of Fedran, check out [https://fedran.com/](https://fedran.com/). There you'll find stories, novels, character write-ups and more.

27
matter/legal.md Executable file
View file

@ -0,0 +1,27 @@
---
title: Legal
---
Copyright © 2019 D. Moonfire\
Some Rights Reserved\
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
Cover art by D. Moonfire
All characters, events, and locations are fictitious. Any resemblance to persons, past, present, and future is coincidental and highly unlikely.
This story contains scenes where the primary character and others experience anxiety. There are off-page references to emotional abuse and physical abuse. There is no sexual assault.
Broken Typewriter Press\
5001 1st Ave SE\
Ste 105 #243\
Cedar Rapids, IA 52402
Broken Typewriter Press\
[https://broken.typewriter.press/](https://broken.typewriter.press/)
{% if (edition.isbn) %}
ISBN {{edition.isbn}}
{% endif %}
Version {{edition.version}}

32
matter/license.md Executable file
View file

@ -0,0 +1,32 @@
---
title: License
---
This book is distributed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International license. More info can be found at [https://creativecommons.org/licenses/by-nc-sa/4.0/](https://creativecommons.org/licenses/by-nc-sa/4.0/). This means:
### You are free to:
- Share — copy and redistribute the material in any medium or format
- Adapt — remix, transform, and build upon the material
The licensor cannot revoke these freedoms as long as you follow the license terms.
### Under the following terms:
- Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
- NonCommercial — You may not use the material for commercial purposes.
- ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
### Preferred Attribution
The preferred attribution for this novel is:
> "I Will Hurt You Only Once" by D. Moonfire is licensed under CC BY-NC-SA 4.0
In the above attribution, use the following links:
- Flight of the Scions: [https://fedran.com/i-will-hurt-you-only-once/](https://fedran.com/i-will-hurt-you-only-once/)
- D. Moonfire: https://d.moonfire.us/
- CC BY-NC-SA 4.0: https://creativecommons.org/licenses/by-nc-sa/4.0/

61
matter/miwafu.html Normal file
View file

@ -0,0 +1,61 @@
---
title: Miwāfu
---
<p>
This novel has characters who come from the Mifuno Desert where the native
language is Miwāfu. Names in this language are significantly different from
English, so here is a short guide on pronunciation and usage.
</p>
<p>
The biggest difference is that every name is gendered, which is identified
by the accent on the penultimate syllable. There are three types of accents:
</p>
<ul>
<li>
<em>Grave</em> (as in hèru for stallion) is a tiny tick that goes down
to the right. The grave accent indicates a masculine aspect, either in
physical gender, size, or power. Names with grave accents either end in
a lower pitch or the entire word is spoken in a lower tone.
</li>
<li>
<em>Macron</em> (for example, hēru for colt) is a bar over the vowel.
This is a neuter term, used for many gender-free words or expressions
within the language. It is also used for mechanical devices, abstract
concepts, and children—both human and beast. Macrons are spoken as a
long vowel or drawing out the word just a beat longer than normal.
</li>
<li>
<em>Acute</em> (héru for mare) is a tiny tick that goes to the upper
right. The acute indicates feminine aspects of the word. It can
represent control without power or precision. These words end on a high
note or the entire word is spoken in a higher pitch.
</li>
</ul>
<p>
The only instances where accents arent used is adjectives or indication of
ownership. So, if a valley is owned by the clan Shimusògo, it is known as
Shimusogo Valley.
</p>
<p>
The names themselves are phonetic. A syllable is always from a consonant
cluster to the vowel. For examples: Mi.wā.fu (IPA
<span class="ipa">/mi.waː.ɸɯ̥/</span>), Shi.mu.sò.go (<span class="ipa"
>/ɕi.mɯ.ꜜso.ɡo/</span
>), and De.sò.chu (<span class="ipa">/de.ꜜso.tɕɯ̥/</span>). The only
exception is the letter “n” which is considered part of the syllable before
it when not followed by a vowel. For example, ga.n.ré.ko (<span class="ipa"
>/ɡa.ŋꜛɾe.ko/</span
>) and ka.né.ko (<span class="ipa">/ka.ꜛne.ko/</span>).
</p>
<p>
Miwāfu has no capital letters, they are added to satisfy English
conventions.
</p>

1
matter/pad.html Normal file
View file

@ -0,0 +1 @@
<br />

15
matter/title.html Executable file
View file

@ -0,0 +1,15 @@
---
title: Title
---
<div class="title">
<div class="title-area">
<div class="large">I Will</div>
<div class="large">Hurt You</div>
<div class="large">Only Once</div>
</div>
<div class="author">D. Moonfire</div>
<div class="publisher">Broken Typewriter Press &#8226; Cedar Rapids</div>
</div>

18726
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

50
package.json Normal file
View file

@ -0,0 +1,50 @@
{
"name": "i-will-hurt-you-only-once",
"version": "1.0.1",
"private": true,
"description": "\"I Will Hurt You Only Once\" is a story by D. Moonfire.",
"author": {
"name": "D. Moonfire"
},
"license": "CC-BY-NC-SA-4.0",
"repository": {
"type": "git",
"url": "git+https://src.mfgames.com/fedran-sources/i-will-hurt-you-only-once.git"
},
"homepage": "https://fedran.com/i-will-hurt-you-only-once/",
"scripts": {
"build:pdf": "mfgames-writing-format build pdf",
"build:epub": "mfgames-writing-format build epub",
"build:docx": "mfgames-writing-format build docx",
"build": "run-s build:*",
"prepare": "husky install"
},
"dependencies": {
"@fedran/writing-hyphen": "^1.0.0",
"@fedran/writing-theme": "^4.0.2",
"@mfgames-writing/contracts": "^4.4.0",
"@mfgames-writing/docx-format": "^1.0.2",
"@mfgames-writing/epub2-format": "^2.1.1",
"@mfgames-writing/format": "^3.3.1",
"@mfgames-writing/guillemet": "^1.0.0",
"@mfgames-writing/hyphen-pipeline": "^1.0.2",
"@mfgames-writing/liquid-theme": "^2.1.1",
"@mfgames-writing/weasyprint-format": "^5.0.4",
"markdown-it-multimd-table": "^4.1.3"
},
"devDependencies": {
"@commitlint/cli": "^15.0.0",
"@commitlint/config-conventional": "^15.0.0",
"@saithodev/semantic-release-gitea": "^2.1.0",
"@semantic-release/changelog": "^6.0.1",
"@semantic-release/exec": "^6.0.3",
"@semantic-release/git": "^10.0.1",
"@semantic-release/npm": "^8.0.3",
"@semantic-release/release-notes-generator": "^10.0.3",
"husky": "^7.0.2",
"markdowny": "^0.2.1",
"npm-run-all": "^4.1.5",
"prettier": "^2.0.5",
"semantic-release": "^18.0.1"
}
}

119
publication.json Normal file
View file

@ -0,0 +1,119 @@
{
"metadata": {
"title": "{{edition.fedran.source.title}}",
"author": "D. Moonfire",
"language": "en",
"theme": "@fedran/writing-theme",
"outputDirectory": ".",
"outputFilename": "dmoonfire-{{edition.fedran.source.title_slug}}-{{edition.name}}-{{edition.version}}.{{edition.ext}}",
"markdown": {
"extensions": [
{
"package": "markdown-it-multimd-table",
"options": {
"headerless": true
}
}
]
},
"style": {
"css": "td { width: 6em; } td[colspan=\"2\"] { width: 12em; }"
}
},
"includes": [
{
"json": "./fedran.json",
"merge": "metadata.fedran"
}
],
"editions": {
"epub": {
"format": "@mfgames-writing/epub2-format",
"ext": "epub"
},
"pdf": {
"format": "@mfgames-writing/weasyprint-format",
"isbn": "",
"images": {
"grayscale": true,
"opaque": true
},
"ext": "pdf"
},
"docx": {
"format": "@mfgames-writing/docx-format",
"ext": "docx"
}
},
"contents": [
{
"element": "bastard",
"source": "matter/title.html",
"linear": false,
"exclude": {
"editions": ["epub", "html"],
"toc": true
}
},
{
"element": "title",
"source": "matter/title.html",
"linear": false,
"exclude": {
"toc": true
}
},
{
"element": "legal",
"source": "matter/legal.md",
"liquid": true,
"linear": false
},
{
"element": "toc",
"linear": false,
"title": "Contents",
"exclude": {
"editions": ["pdf"]
}
},
{
"element": "preface",
"source": "matter/miwafu.html",
"linear": false
},
{
"element": "chapter",
"number": 1,
"directory": "chapters",
"source": "/^chapter-\\d+.(markdown|md)$/",
"start": true,
"page": 1,
"pipeline": [
{
"module": "@mfgames-writing/guillemet"
},
{
"module": "@fedran/writing-hyphen"
},
{
"module": "@mfgames-writing/hyphen-pipeline",
"exclude": ["`.*?`", "<code>.*?</code>"]
}
]
},
{
"element": "appendix",
"source": "matter/about.md"
},
{
"element": "appendix",
"source": "matter/fedran.md"
},
{
"element": "appendix",
"id": "license",
"source": "matter/license.md"
}
]
}

39
release.config.js Normal file
View file

@ -0,0 +1,39 @@
module.exports = {
branches: ["main"],
extends: ["@commitlint/config-conventional"],
message:
"chore(release): v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}",
plugins: [
[
"@semantic-release/commit-analyzer",
{
preset: "conventionalcommits",
},
],
"@semantic-release/release-notes-generator",
"@semantic-release/npm",
[
"@semantic-release/exec",
{
prepareCmd: "npm run build",
},
],
"@semantic-release/changelog",
"@semantic-release/git",
[
"@saithodev/semantic-release-gitea",
{
giteaUrl: "https://src.mfgames.com",
assets: [
{ path: "*.epub", label: "EPUB2", type: "other" },
{ path: "*.pdf", label: "PDF", type: "other" },
{ path: "*.docx", label: "DOCX", type: "other" },
],
},
],
],
};

18
scripts/build.sh Executable file
View file

@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Set up logging.
log() { echo "🛠️ $(basename $0): $@"; }
# Move into the root folder.
cd $(dirname $(dirname $0))
# Make sure everything is set up.
log "setting up project"
./scripts/setup.sh || exit 1
# Build the project outputs.
log "building PDF"
npm run build:pdf || exit 1
log "building EPUB"
npm run build:epub || exit 1

27
scripts/check-env-bucket.sh Executable file
View file

@ -0,0 +1,27 @@
#!/usr/bin/env bash
# Checks the environment to see if we have all the requisite components needed
# to upload or download from the S3 bucket.
# Set up logging.
log() { echo "⚗️ $(basename $0): $@"; }
# Move into the root folder.
cd $(dirname $(dirname $0))
for i in S3_ACCESS_KEY_ID S3_SECRET_ACCESS_KEY S3_ENDPOINT S3_BUCKET
do
if [ "x${!i}" = "x" ]
then
log "missing environment variable $i"
exit 1
fi
done
if [ ! which s3cmd 2> /dev/null ]
then
log "cannot find 's3cmd' to execute"
exit 1
fi
exit 0

36
scripts/release.sh Executable file
View file

@ -0,0 +1,36 @@
#!/usr/bin/env bash
# Builds the final versions of the book and then upload the results to various
# locations.
# Set up logging.
log() { echo "️🚢 $(basename $0): $@"; }
# Move into the root folder.
cd $(dirname $(dirname $0))
# Perform the basic environment checks and setup.
./scripts/setup.sh || exit 1
./scripts/check-env-bucket.sh || exit 1
# Clean up old versions of the file.
log "cleaning up prior versions which may not match versions"
rm -f dmoonfire*
# Perform the release process.
log "performing semantic release"
export GIT_CREDENTIALS="dmoonfire:$GITEA_TOKEN"
npx semantic-release || exit 1
# Create a tarball of the output files and upload them to S3.
if ls dmoonfire* &> /dev/null
then
log "packaging output into a tarball"
tar -cjf i-will-hurt-you-only-once.tar.bz2 dmoonfire*
log "uploading tarball to bucket"
s3cmd --access_key=$S3_ACCESS_KEY_ID --access_token=$S3_SECRET_ACCESS_KEY --host=$S3_ENDPOINT --host-bucket=$S3_ENDPOINT -P put i-will-hurt-you-only-once.tar.bz2 s3://$AWS_BUCKET || exit 1
else
log "no files to upload"
fi

24
scripts/setup-fonts.sh Executable file
View file

@ -0,0 +1,24 @@
#!/usr/bin/env bash
# Sets up the fonts for building the PDF output. It doesn't do it if we are not
# in a CI environment.
# Set up logging.
log() { echo "✒️ $(basename $0): $@"; }
# Move into the root directory.
cd $(dirname $(dirname $0))
# We only insert the fonts if we are on a CI server.
if [ "x$CI" == "x" ]
then
log "not in CI environment, not installing fonts"
else
log "installing fonts"
mkdir -p ~/.local/share/fonts
cp $(nix-build --no-out-link '<nixpkgs>' -A source-serif-pro)/share/fonts/opentype/*.otf ~/.local/share/fonts
cp $(nix-build --no-out-link '<nixpkgs>' -A source-sans-pro)/share/fonts/opentype/*.otf ~/.local/share/fonts
log "updating font caches"
fc-cache
fi

17
scripts/setup-node.sh Executable file
View file

@ -0,0 +1,17 @@
#!/usr/bin/env bash
# Installs the required Node packages
# Set up logging.
log() { echo "📦️ $(basename $0): $@"; }
# Move into the root directory.
cd $(dirname $(dirname $0))
if [ -d ./node_modules ]
then
log "node_modules already exists"
else
log "setting up node"
npm install --ci
fi

9
scripts/setup.sh Executable file
View file

@ -0,0 +1,9 @@
#!/usr/bin/env bash
# Move into the root folder.
cd $(dirname $(dirname $0))
# Run the setup commands.
./scripts/setup-fonts.sh || exit 1
./scripts/setup-node.sh || exit 1