{"id":13595509,"url":"https://github.com/rustic-games/jilu","last_synced_at":"2025-05-07T17:44:08.412Z","repository":{"id":35056456,"uuid":"201504422","full_name":"rustic-games/jilu","owner":"rustic-games","description":"Generate a change log based on the state of your Git repository.","archived":false,"fork":false,"pushed_at":"2023-01-20T23:38:18.000Z","size":135,"stargazers_count":105,"open_issues_count":18,"forks_count":6,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-18T05:53:16.851Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rustic-games.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-08-09T16:25:41.000Z","updated_at":"2025-02-11T15:36:56.000Z","dependencies_parsed_at":"2023-02-12T06:45:16.227Z","dependency_job_id":null,"html_url":"https://github.com/rustic-games/jilu","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rustic-games%2Fjilu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rustic-games%2Fjilu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rustic-games%2Fjilu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rustic-games%2Fjilu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rustic-games","download_url":"https://codeload.github.com/rustic-games/jilu/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240783138,"owners_count":19856780,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-01T16:01:51.440Z","updated_at":"2025-02-26T03:15:53.905Z","avatar_url":"https://github.com/rustic-games.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n  \u003ch1\u003e记录\u003c/h1\u003e\n  \u003csup\u003ejìlù, \u003cem\u003eto memorize\u003c/em\u003e\u003c/sup\u003e\n  \u003cbr /\u003e\n  \u003cbr /\u003e\n\n  \u003cp\u003e\n    \u003cstrong\u003e\u003ccode\u003ejilu\u003c/code\u003e generates a change log based on the state of your Git repository.\u003c/strong\u003e\n  \u003c/p\u003e\n\n  \u003cbr /\u003e\n\n  \u003cp\u003e\u003csub\u003e\n    \u003cem\u003econvert \u003ca href=\"https://www.conventionalcommits.org\"\u003econventional commits\u003c/a\u003e into a \u003cstrong\u003ehuman readable\u003c/strong\u003e change log\u003c/em\u003e\n    \u003cbr /\u003e––––––––––\u003cbr /\u003e\n    \u003cem\u003euse Git tags to \u003cstrong\u003eannotate your releases\u003c/strong\u003e with release titles and richly formatted release notes\u003c/em\u003e\n    \u003cbr /\u003e–––––\u003cbr /\u003e\n    \u003cem\u003e\u003cstrong\u003ecustomize your change log template\u003c/strong\u003e to best serve your community\u003c/em\u003e\n    \u003cbr /\u003e––––––––––\u003cbr /\u003e\n    \u003cem\u003eintegrate the \u003ccode\u003ejilu\u003c/code\u003e binary into your CI workflow for \u003cstrong\u003eautomated updates\u003c/strong\u003e\u003c/em\u003e\n  \u003c/sub\u003e\u003c/p\u003e\n\n  \u003cbr /\u003e\n  \u003cbr /\u003e\n\n\u003c/div\u003e\n\nThe way you structure and document your projects is personal, and transforms\nover time into what works best for you and your community. **Jilu** tries to\ndeliver a nice and simple way to expose your project changes to the outside\nworld. It's flexible, but it can never replace all possible workflows, and it\ndoesn't pretend to.\n\nUsing **Jilu** requires using [conventional commits], and while some like the\nrigor of structured commits, others don't, both have valid reasons. If you have\nan existing workflow that works for you, or an existing project without\nconventional commits, there won't be much to gain for you here.\n\nWhat matters most is the success of your project, with or without the help of\n**Jilu**.\n\n### Quick Start\n\n1. Check out the [change log of this project].\n\n2. Install `jilu`:\n\n   - Using [release binaries]:\n\n     ```shell\n     curl -L https://github.com/rustic-games/jilu/releases/download/v0.4.0/jilu_0.4.0_$(uname)_x86_64.tar.gz | tar -xvf - jilu\n     ```\n\n   - ~~Using [Homebrew]~~ _(soon)_:\n\n     ```shell\n     brew install jilu\n     ```\n\n   - Using [Cargo]:\n\n     ```shell\n     cargo install jilu --git https://github.com/rustic-games/jilu\n     ```\n\n3. Visit any local repository:\n\n   ```shell\n   cd /path/to/repository\n   ```\n\n4. Print change log:\n\n   ```shell\n   jilu\n   ```\n\n5. ~~Get more details~~ _(soon)_:\n\n   ```shell\n   jilu --help\n   ```\n\n6. Integrate into your CI workflow.\n\n[change log of this project]: ./CHANGELOG.md\n[cargo]: https://www.rust-lang.org/tools/install\n[homebrew]: https://brew.sh\n[release binaries]: https://github.com/rustic-games/jilu/releases\n\n### About\n\nAs a fan of [Conventional Commits], and an avid reader of open-source change\nlogs, It always saddens me when a change log is missing, or is lacking important\ncontextual details. Things like release dates, unreleased changes, or breaking\nchanges are an important part of the public documentation of a project. On top\nof that, as an open-source contributor, I can't ignore the warm fuzzy feeling I\nget when people thank me for my contributions, but keeping track of all those\ncontributions cuts into the time you have available for a project _(still,\nautomated thank-you's aren't as personal as an individual one, remember that)_.\n\nConventional commits and auto-generated change logs are quite popular in the\nJavaScript community, and there are [tons][] [of][] [tools][] to help you adhere\nto the standards, but all the ones I tried came with downsides, the biggest ones\nbeing the lack of a single binary, lack of easy configuration, riddled with\nEmoji _(I don't mind an Emoji or two, mind you ✌️)_, or trying to be a complete\nrelease management tool, which inevitably means heavy focus on the JavaScript\necosystem _(and not adhering to the Unix philosophy of small single-purpose\ntools)_.\n\n**Jilu** is the tool I envisioned I would like to use to generate my project\nchange logs, and I've open-sourced it so that it may help you in your\nopen-source endeavors as well. Have fun using it, and feel free to [propose new\nfeatures], or [provide bug fixes]!\n\n[tons]: https://github.com/conventional-changelog/commitlint\n[of]: https://commitizen.github.io/cz-cli/\n[tools]: https://github.com/conventional-changelog/standard-version\n\n[propose new features]: https://github.com/rustic-games/jilu/issues/new?title=[feature%20request]\n[provide bug fixes]: https://github.com/rustic-games/jilu/issues/new\n\n### Usage\n\nPipe the output of `jilu` to your change log file:\n\n```\njilu \u003e CHANGELOG.md\n```\n\nNote, if you've added [custom configurations] to your change log, this won't\nwork, as Unix will empty the `CHANGELOG.md` file first, before `jilu` can read\nits contents, meaning it won't be able to read any existing configuration.\n\nTo work around this, use a tool like [`sponge`] to soak up the output of `jilu`\nbefore redirecting it to the file:\n\n```\njilu | sponge CHANGELOG.md\n```\n\n[custom configurations]: #configurable\n[`sponge`]: https://linux.die.net/man/1/sponge\n\n### Design\n\nWant to know what makes **Jilu** tick? Read on.\n\n#### Structured\n\nThe library uses existing conventions and specifications to structure the change\nlog. Specifically, you are expected to use [SemVer] for tagging releases,\n[Conventional Commits] for commit messages, and the change log itself adheres to\nthe [Keep a Changelog] conventions.\n\n#### Automated\n\nRelease notes are generated by parsing the Git history. Clone any repository\nlocally, and run `jilu` to print the generated release notes.\n\nCommits are parsed using the [Conventional Commits] format.\n\nGit tags are used to determine which commits should be part of what release. The\nmessages of annotated tags are used to add hand-written release notes to the\nrelease. Similar to conventional commits, the first line of the tag annotation\nis used as the release title, the rest as the release notes.\n\nAny commits _after_ the latest tagged release are added to the \"unreleased\"\nsection.\n\n**_work in progress_** ~~If a tag annotation contains a line starting with\n`YANKED:`, it will be marked as such in the change log, with anything following\nthat marker being used as the reason for yanking the release. Git tag\nannotations [can be replaced after pushing them][] (while retaining the tag date\nand author), with some command-line-fu.~~\n\n~~You can optionally run `jilu --release MAJOR.MINOR.PATCH` if you want to\ngenerate a change log with the unreleased commits grouped in a new release. When\ndoing this, your `$EDITOR` will open to provide release notes. This will also\ncreate a Git tag with the same details (unless you supply `--no-tag`).~~\n\n~~The release feature is added to make sure the updated change log is part of\nthat new release. Otherwise, opening the change log in the repository state at\nthe point of a release tag would still show the new changes in the _unreleased_\nsection.~~\n\n[can be edited after pushing them]: https://stackoverflow.com/a/29019547/747032\n\n#### Readable\n\nIn the spirit of the [Keep a Changelog] guidelines, `jilu` produces a\nhuman-readable change log by including the following information:\n\n- [x] markdown formatting for improved readability\n- [x] custom change log introduction paragraph\n- [x] table of contents\n- [x] unreleased changes at the top\n- [x] release versions, titles and dates\n- [x] release changes grouped by type (features, fixes, etc.)\n- [x] manually written release notes\n- [x] short git refs linking specific commits\n- [x] optional thank-you's to contributors\n- [x] optional GitHub linking to release/tag/compare views\n\n#### Forgiving\n\nCommit messages that need to be excluded can be, based on a set of rules:\n\n- [x] non-conventional commit messages are ignored\n- [x] conventional commit types (such as `chore`) can be excluded\n- [ ] **_work in progress_** ~~a list of blacklisted commits can be provided~~\n- [ ] **_work in progress_** ~~a root commit can be provided to ignore older\n      commits~~\n\n#### Configurable\n\n**Jilu** has a powerful configuration system that stays out of your way when you\ndon't need it, but allows you to automate the construction of your change log\nin a way that works best for your project or community.\n\nYou can:\n\n- [x] set header names for grouped changes (features, fixes, etc.)\n- [x] ignore specific commit types\n- [x] fully customize the change log template\n\nYou can check out the bottom of [this project's change log] for its\nconfiguration, and [the default template][tpl] to see how the templating system\nworks.\n\nHere's a quick example of what's possible (this snippet goes at the bottom of\nyour own `CHANGELOG.md` file):\n\n```markdown\n\u003c!--\nConfig(\n  github: ( repo: \"rustic-games/jilu\" ),\n  accept_types: [\"feat\", \"fix\", \"perf\"],\n  type_headers: {\n    \"feat\": \"Features\",\n    \"fix\": \"Bug Fixes\",\n    \"perf\": \"Performance Improvements\"\n  },\n  scope_headers: {\n    \"ui\": \"User Interface\",\n  }\n)\n\nTemplate(\n# My Change Log\n\n## Upcoming Changes\n\n{% for change in unreleased.changes %}\n- {{ change.description }} ([`{{ change.commit.short_id }}`])\n{%- endfor %}\n)\n--\u003e\n```\n\nPutting the configuration _inside_ the change log file itself ensures that the\nconfiguration can be read by **Jilu**, but won't show up in the markdown\nrendered document and is easy to ignore in text format, since it will always be\nat the end of the change log. It also means you don't need to add _another_\nconfiguration file to your Git repository root.\n\nThe templating system uses the [Tera] library to provide Django-like syntax. If\nno template is defined, the [default template][tpl] is used instead.\n\n[this project's change log]: https://raw.githubusercontent.com/rustic-games/jilu/master/CHANGELOG.md\n[tera]: https://tera.netlify.com/\n[tpl]: https://raw.githubusercontent.com/rustic-games/jilu/master/template.md\n[conventional commits]: https://www.conventionalcommits.org/en/v1.0.0-beta.4/\n[semver]: https://semver.org/\n[keep a changelog]: https://keepachangelog.com/en/1.0.0/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frustic-games%2Fjilu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frustic-games%2Fjilu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frustic-games%2Fjilu/lists"}