diff options
author | EuAndreh <eu@euandre.org> | 2025-03-31 21:51:40 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2025-03-31 21:51:40 -0300 |
commit | 570ec471d1605318aeefb030cd78682ae442235b (patch) | |
tree | 51e17eabe37c6689f8799b55e6875c3480329a2c /src/content/tils/2020/08 | |
parent | Makefile, mkdeps.sh: Derive index.html and feed.xml from more static "sortdat... (diff) | |
download | euandre.org-570ec471d1605318aeefb030cd78682ae442235b.tar.gz euandre.org-570ec471d1605318aeefb030cd78682ae442235b.tar.xz |
src/content/: Update all files left to asciidoc
Diffstat (limited to 'src/content/tils/2020/08')
-rw-r--r-- | src/content/tils/2020/08/12/filename-timestamp.adoc | 38 | ||||
-rw-r--r-- | src/content/tils/2020/08/13/code-jekyll.adoc | 102 | ||||
-rw-r--r-- | src/content/tils/2020/08/14/browse-git.adoc | 67 | ||||
-rw-r--r-- | src/content/tils/2020/08/16/git-search.adoc | 51 | ||||
-rw-r--r-- | src/content/tils/2020/08/28/grep-online.adoc | 83 |
5 files changed, 152 insertions, 189 deletions
diff --git a/src/content/tils/2020/08/12/filename-timestamp.adoc b/src/content/tils/2020/08/12/filename-timestamp.adoc index 7495fc9..ed7dee8 100644 --- a/src/content/tils/2020/08/12/filename-timestamp.adoc +++ b/src/content/tils/2020/08/12/filename-timestamp.adoc @@ -1,44 +1,30 @@ ---- - -title: Simple filename timestamp - -date: 2020-08-12 - -updated_at: - -layout: post - -lang: en - -ref: simple-filename-timestamp - -eu_categories: shell - ---- += Simple filename timestamp When writing Jekyll posts or creating log files with dates on them, I usually -struggle with finding a direct way of accomplishing that. There's a simple +struggle with finding a direct way of accomplishing that. There's a simple solution: `date -I`. -```shell +[source,shell] +---- ./my-program.sh > my-program.$(date -I).log cp post-template.md _posts/$(date -I)-post-slug.md -``` +---- -Using this built-in GNU/Linux tool allows you to `touch $(date -I).md` to readily -create a `2020-08-12.md` file. +Using this built-in GNU/Linux tool allows you to `touch $(date -I).md` to +readily create a `2020-08-12.md` file. I always had to read `man date` or search the web over and over, and after doing this repeatedly it became clear that both `date -I` and `date -Is` (`s` here stands for seconds) are the thing that I'm looking for 95% of the time: -```shell +[source,shell] +---- # inside my-program.sh echo "Program started at $(date -Is)" # output is: # Program started at 2020-08-12T09:04:58-03:00 -``` +---- Both date formats are hierarchical, having the bigger time intervals to the -left. This means that you can easily sort them (and even tab-complete them) with -no extra effort or tool required. +left. This means that you can easily sort them (and even tab-complete them) +with no extra effort or tool required. diff --git a/src/content/tils/2020/08/13/code-jekyll.adoc b/src/content/tils/2020/08/13/code-jekyll.adoc index 6566928..6bd90b0 100644 --- a/src/content/tils/2020/08/13/code-jekyll.adoc +++ b/src/content/tils/2020/08/13/code-jekyll.adoc @@ -1,33 +1,35 @@ ---- -title: Anchor headers and code lines in Jekyll -date: 2020-08-13 -layout: post -lang: en -ref: anchor-headers-and-code-lines-in-jekyll ---- -The default Jekyll toolbox ([Jekyll][0], [kramdown][1] and [rouge][2]) doesn't -provide with a configuration option to add anchors to headers and code blocks. - -[0]: https://jekyllrb.com/ -[1]: https://kramdown.gettalong.org/ -[2]: http://rouge.jneen.net/ += Anchor headers and code lines in Jekyll -The best way I found of doing this is by creating a simple Jekyll plugin, more -specifically, a [Jekyll hook][3]. These allow you to jump in to the Jekyll build -and add a processing stage before of after Jekyll performs something. +:empty: +:jekyll: https://jekyllrb.com/ +:kramdown: https://kramdown.gettalong.org/ +:rouge: https://rouge.jneen.net/ +:jekyll-hook: https://jekyllrb.com/docs/plugins/hooks/ + +The default Jekyll toolbox ({jekyll}[Jekyll], {kramdown}[kramdown] and +{rouge}[rouge]) doesn't provide with a configuration option to add anchors to +headers and code blocks. -[3]: https://jekyllrb.com/docs/plugins/hooks/ +The best way I found of doing this is by creating a simple Jekyll plugin, more +specifically, a {jekyll-hook}[Jekyll hook]. These allow you to jump in to the +Jekyll build and add a processing stage before of after Jekyll performs +something. All you have to do is add the code to `_plugins/my-jekyll-plugin-code.rb`, and Jekyll knows to pick it up and call your code on the appropriate time. -## Anchor on headers +== Anchor on headers + +:jemoji: https://github.com/jekyll/jemoji +:jekyll-mentions: https://github.com/jekyll/jekyll-mentions +:html-regex: https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 Since I wanted to add anchors to headers in all documents, this Jekyll hook works on `:documents` after they have been transformed into HTML, the `:post_render` phase: -```ruby +[source,ruby] +---- Jekyll::Hooks.register :documents, :post_render do |doc| if doc.output_ext == ".html" doc.output = @@ -37,30 +39,30 @@ Jekyll::Hooks.register :documents, :post_render do |doc| ) end end -``` - -I've derived my implementations from two "official"[^official] hooks, -[jemoji][4] and [jekyll-mentions][5]. +---- -[4]: https://github.com/jekyll/jemoji -[5]: https://github.com/jekyll/jekyll-mentions -[^official]: I don't know how official they are, I just assumed it because they - live in the same organization inside GitHub that Jekyll does. +I've derived my implementations from two +"official"{empty}footnote:official[ + I don't know how official they are, I just assumed it because they live in the + same organization inside GitHub that Jekyll does. +] hooks, {jemoji}[jemoji] and {jekyll-mentions}[jekyll-mentions]. All I did was to wrap the header tag inside an `<a>`, and set the `href` of that -`<a>` to the existing id of the header. Before the hook the HTML looks like: +`<a>` to the existing id of the header. Before the hook the HTML looks like: -```html +[source,html] +---- ...some unmodified text... <h2 id="my-header"> My header </h2> ...more unmodified text... -``` +---- And after the hook should turn that into: -```html +[source,html] +---- ...some unmodified text... <a href="#my-header"> <h2 id="my-header"> @@ -68,20 +70,18 @@ And after the hook should turn that into: </h2> </a> ...more unmodified text... -``` +---- The used regexp tries to match only h1-h6 tags, and keep the rest of the HTML -attributes untouched, since this isn't a general HTML parser, but the generated HTML -is somewhat under your control. Use at your own risk because -[you shouldn't parse HTML with regexps][6]. Also I used this strategy in my -environment, where no other plugins are installed. I haven't considered how this -approach may conflict with other Jekyll plugins. - -[6]: https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 +attributes untouched, since this isn't a general HTML parser, but the generated +HTML is somewhat under your control. Use at your own risk because +{html-regex}[you shouldn't parse HTML with regexps]. Also I used this strategy +in my environment, where no other plugins are installed. I haven't considered +how this approach may conflict with other Jekyll plugins. In the new anchor tag you can add your custom CSS class to style it as you wish. -## Anchor on code blocks +== Anchor on code blocks Adding anchors to code blocks needs a little bit of extra work, because line numbers themselves don't have preexisting ids, so we need to generate them @@ -90,7 +90,8 @@ without duplications between multiple code blocks in the same page. Similarly, this Jekyll hook also works on `:documents` in the `:post_render` phase: -```ruby +[source,ruby] +---- PREFIX = '<pre class="lineno">' POSTFIX = '</pre>' Jekyll::Hooks.register :documents, :post_render do |doc| @@ -111,25 +112,27 @@ Jekyll::Hooks.register :documents, :post_render do |doc| end end end -``` +---- This solution assumes the default Jekyll toolbox with code line numbers turned on in `_config.yml`: -```yaml +[source,yaml] +---- kramdown: syntax_highlighter_opts: span: line_numbers: false block: line_numbers: true -``` +---- The anchors go from B1-L1 to BN-LN, using the `code_block_counter` to track -which code block we're in and don't duplicate anchor ids. Before the hook the +which code block we're in and don't duplicate anchor ids. Before the hook the HTML looks like: -```html +[source,html] +---- ...some unmodified text... <pre class="lineno">1 2 @@ -138,11 +141,12 @@ HTML looks like: 5 </pre> ...more unmodified text... -``` +---- And after the hook should turn that into: -```html +[source,html] +---- ...some unmodified text... <pre class="lineno"><a id="B1-L1" href="#B1-L1">1</a> <a id="B1-L2" href="#B1-L2">2</a> @@ -150,6 +154,6 @@ And after the hook should turn that into: <a id="B1-L4" href="#B1-L4">4</a> <a id="B1-L5" href="#B1-L5">5</a></pre> ...more unmodified text... -``` +---- Happy writing :) diff --git a/src/content/tils/2020/08/14/browse-git.adoc b/src/content/tils/2020/08/14/browse-git.adoc index d06f0c1..556288c 100644 --- a/src/content/tils/2020/08/14/browse-git.adoc +++ b/src/content/tils/2020/08/14/browse-git.adoc @@ -1,28 +1,15 @@ ---- - -title: Browse a git repository at a specific commit - -date: 2020-08-14 - -layout: post - -lang: en - -ref: browse-a-git-repository-at-a-specific-commit - -eu_categories: git - ---- += Browse a git repository at a specific commit I commonly use tools like `git log` together with `git show` when inspecting past changes in a repository: -```shell +[source,shell] +---- git log # search for a the commit I'm looking for git show <my-commit> # see the diff for the commit -``` +---- But I also wanted to not only be able to look at the diff of a specific commit, but to browse the whole repository at that specific commit. @@ -30,55 +17,59 @@ but to browse the whole repository at that specific commit. I used to accomplish it the "brute force" way: clone the whole repository in another folder and checkout the commit there: -```shell +[source,shell] +---- git clone <original-repo> /tmp/tmp-repo-clone cd /tmp-repo-clone git checkout <my-commit> -``` +---- But git itself allows we to specific the directory of the checkout by using the -`--work-tree` global git flag. This is what `man git` says about it: +`--work-tree` global git flag. This is what `man git` says about it: -```txt +[source,txt] +---- --work-tree=<path> Set the path to the working tree. It can be an absolute path or a path relative to the current working directory. This can also be controlled by setting the GIT_WORK_TREE environment variable and the core.worktree configuration variable (see core.worktree in git-config(1) for a more detailed discussion). -``` +---- -So it allows us to set the desired path of the working tree. So if we want to +So it allows us to set the desired path of the working tree. So if we want to copy the contents of the current working tree into `copy/`: -```shell +[source,shell] +---- mkdir copy git --work-tree=copy/ checkout . -``` +---- -After that `copy/` will contain a replica of the code in HEAD. But to checkout a -specific, we need some extra parameters: +After that `copy/` will contain a replica of the code in HEAD. But to checkout +a specific, we need some extra parameters: -```shell +[source,shell] +---- git --work-tree=<dir> checkout <my-commit> -- . -``` +---- There's an extra `-- .` at the end, which initially looks like we're sending -Morse signals to git, but we're actually saying to `git-checkout` which -sub directory of `<my-commit>` we want to look at. Which means we can do -something like: +Morse signals to git, but we're actually saying to `git-checkout` which sub +directory of `<my-commit>` we want to look at. Which means we can do something +like: -```shell +[source,shell] +---- git --work-tree=<dir> checkout <my-commit> -- src/ -``` +---- And with that `<dir>` will only contain what was inside `src/` at `<commit>`. After any of those checkouts, you have to `git reset .` to reset your current staging area back to what it was before the checkout. +== References -## References - -1. [GIT: Checkout to a specific folder][0] (StackOverflow) +:so-link: https://stackoverflow.com/a/16493707 -[0]: https://stackoverflow.com/a/16493707 +. {so-link}[GIT: Checkout to a specific folder] (StackOverflow) diff --git a/src/content/tils/2020/08/16/git-search.adoc b/src/content/tils/2020/08/16/git-search.adoc index f3ae6f0..5ad0eae 100644 --- a/src/content/tils/2020/08/16/git-search.adoc +++ b/src/content/tils/2020/08/16/git-search.adoc @@ -1,59 +1,48 @@ ---- - -title: Search in git - -date: 2020-08-16 - -layout: post - -lang: en - -ref: search-in-git - -eu_categories: git - ---- += Search in git Here's a useful trio to know about to help you search things in git: -1. `git show <commit>` -2. `git log --grep='<regexp>'` -3. `git grep '<regexp>' [commit]` +. `git show <commit>` +. `git log --grep='<regexp>'` +. `git grep '<regexp>' [commit]` -## 1. `git show <commit>` +== 1. `git show <commit>` Show a specific commit and it's diff: -```shell +[source,shell] +---- git show # shows the latest commit git show <commit> # shows an specific <commit> git show v1.2 # shows commit tagged with v1.2 -``` +---- -## 2. `git log --grep='<regexp>'` +== 2. `git log --grep='<regexp>'` Search through the commit messages: -```shell +[source,shell] +---- git log --grep='refactor' -``` +---- -## 3. `git grep '<regexp>' [commit]` +== 3. `git grep '<regexp>' [commit]` + +:browse-article: link:../14/browse-git.html Search content in git history: -```shell +[source,shell] +---- git grep 'TODO' # search the repository for the "TODO" string git grep 'TODO' $(git rev-list --all) # search the whole history for "TODO" string -``` +---- And if you find an occurrence of the regexp in a specific commit and you want to -browse the repository in that point in time, you can -[use git checkout for that][0]. - -[0]: {% link _tils/2020-08-14-browse-a-git-repository-at-a-specific-commit.md %} +browse the repository in that point in time, you can {browse-article}[use git +checkout for that]. diff --git a/src/content/tils/2020/08/28/grep-online.adoc b/src/content/tils/2020/08/28/grep-online.adoc index 8b3b63f..cade066 100644 --- a/src/content/tils/2020/08/28/grep-online.adoc +++ b/src/content/tils/2020/08/28/grep-online.adoc @@ -1,31 +1,19 @@ ---- += Grep online repositories -title: Grep online repositories - -date: 2020-08-28 - -layout: post - -lang: en - -ref: grep-online-repositories - -eu_categories: git - ---- +:cgit: https://git.zx2c4.com/cgit/ I often find interesting source code repositories online that I want to grep for some pattern but I can't, because either: -- the repository is on [cgit][cgit] or a similar code repository that doesn't - allow search in files, or; -- the search function is really bad, and doesn't allow me to use regular expressions for searching patterns in the code. - -[cgit]: https://git.zx2c4.com/cgit/ +* the repository is on {cgit}[cgit] or a similar code repository that doesn't + allow search in files, or; +* the search function is really bad, and doesn't allow me to use regular + expressions for searching patterns in the code. Here's a simple script that allows you to overcome that problem easily: -```shell +[source,shell] +---- #!/usr/bin/env bash set -eu @@ -66,7 +54,7 @@ pushd "/tmp/git-search/${DIRNAME}" shift 3 || shift 2 # when "--" is missing git grep "${REGEX_PATTERN}" "${@}" -``` +---- It is a wrapper around `git grep` that downloads the repository when missing. Save in a file called `git-search`, make the file executable and add it to your @@ -74,33 +62,35 @@ path. Overview: -- *lines 1~2*: - - Bash shebang and the `set -eu` options to exit on error or undefined - variables. +* _lines 1~2_: ++ +Bash shebang and the `set -eu` options to exit on error or undefined +variables. -- *lines 4~30*: +* _lines 4~30_: ++ +Usage text to be printed when providing less arguments than expected. - Usage text to be printed when providing less arguments than expected. +* _line 33_: ++ +Extract the repository name from the URL, removing trailing slashes. -- *line 33*: +* _lines 34~37_: ++ +Download the repository when missing and go to the folder. - Extract the repository name from the URL, removing trailing slashes. +* _line 39_: ++ +Make the variable `$@` contain the rest of the unused arguments. -- *lines 34~37*: - - Download the repository when missing and go to the folder. - -- *line 39*: - - Make the variable `$@` contain the rest of the unused arguments. - -- *line 40*: - - Perform `git grep`, forwarding the remaining arguments from `$@`. +* _line 40_: ++ +Perform `git grep`, forwarding the remaining arguments from `$@`. Example output: -```shell + +[source,shell] +---- $ git search 'make get-git' https://git.zx2c4.com/cgit/ Clonage dans '/tmp/git-search/cgit'... remote: Enumerating objects: 542, done. @@ -116,12 +106,15 @@ README: $ make get-git $ git search 'make get-git' https://git.zx2c4.com/cgit/ /tmp/git-search/cgit ~/dev/libre/songbooks/docs README: $ make get-git -``` +---- -Subsequent greps on the same repository are faster because no download is needed. +Subsequent greps on the same repository are faster because no download is +needed. When no argument is provided, it prints the usage text: -```shell + +[source,shell] +---- $ git search Missing argument REGEX_PATTERN. @@ -136,4 +129,4 @@ Examples: Searching "make get-git" in cgit repository: git search 'make get-git' https://git.zx2c4.com/cgit/ git search 'make get-git' https://git.zx2c4.com/cgit/ -- $(git rev-list --all) -``` +---- |