# What a date can do By: Kor Dwarshuis & Henk van Cann Input: Drummond's external link versioning design in [Slack](https://wiki.trustoverip.org/display/HOME/Permalinks+to+the+ToIP+Glossary) { action items between curly brackets } *Mind you: this design is **not** about a full version of glossary at a certain commit / tag. That's a separate feature.* ## Video recording Explanation of the design in this [20 minute video](https://us02web.zoom.us/rec/share/FMiUKdPD5Lw28lRuCa589AxUNl1twRfFEMSh8jwhvwit2vITwPdNirG9SjHl88pl.AYnI1VthjYoxEwIQ) Passcode: ^1EMx6B2 ## For those who want to only quickly scan The text and diagram below is explained in the video above. ### Pre-conditions: - commit hashes are the way to go with date+time and curation in one go - Good governance of destination terminology repo: unbroken chain of commits - User rights well maintained - No Wiki-based source management of terms ### Situation: Each spec-up repo that use 1 or more xrefs has one or more related “xdoc”s mentioned in its specs.json ### Action: Create or update an xref ### Challenge: How to know which version of this externally referenced glossary was seen plus referenced by the author? ### Solution: Versioning using git and observing via GitHub and front-end spec-up generated glossary/dictionary in the specification. ### How to: So there are two ways to reference to a specific VERSION of a particular term in a particular xdoc: 1. We reference the latest commit hash of the whole external glossary at the time of the reference of one or more specific terms in this external glossary. {@Kor: is there really no way a directory can have a commit hash? ANSWER: only with the rarely used .keepgit placeholder file; see [explanation](https://chatgpt.com/share/9681cee5-acd6-4987-b079-2fd6bba5f1dd) } 2. We reference the latest commit hash of the referenced term at the time of the reference of this specific term in this external glossary. The commit hashes of 1 and 2 might be different but are one-on-one related. With commit hash of 1 you can find commit hash 2 and vice versa. {We have to test this; UPDATE: not relevant anymore, option 2 is the way to go} ### Steps: Save an xref -> commit hash source c#s -> date/time "dt" -> filter target repo with dt to get last commit hash destination c#d -> store commit hash c#d in specs.json ```mermaid flowchart TD %% Henk van Cann, Feb 15th 2024 A["create xref ⛓️"];B[IDE tool];C["lookup 👁️"];D["commit 💻"]; E["specs.json 🙈"]; F["specification with xref 👁️"]; G["lookup 👁️"]; H["config: latest/original 📝"] I["URL 📩"]; K["Term definition"]; L["lookup to compare 👁️"] M["Github DIFF in red&green"] subgraph one[Use case A: Save xref] A -.-> B & C & D B --> |"consistent"|E C & D --> |"versioned"|E E --> |generate| F end one -.-> G one -.-> H subgraph muliple[History and differences of ONE term] subgraph two[Use case B: Observe externally] H --> |choice|G H --> |choice|I G & I --> K end subgraph three[Use case C: Diff tool ONE term externally] L --> |create URL|M K --> |create Github request|L end two-->three end ``` ## Use case {ABC below}: action -> result ### A. Save xref In source management tool use Brian’s extension to consistently create an xref, {use the c#d look-up tool to be made}, save the file, stage & commit the change -> c#d in specs.json in xdoc structure {xdoc url} { {term}/{commit hash c#d?} {term}/{commit hash c#d1} {term}/{commit hash c#d?} } ### Real world example This is a fictional part of specs.json {ask Brian for this extension to his tool}: "external_specs": [ { "TG": "https://github.com/trustoverip/ctwg-main-glossary/tree/main/spec", "terms": [ { "name": "term1", "commit_hash": "77cad15" }, { "name": "term2", "commit_hash": "cd1892f" }, { "name": "term3", "commit_hash": "ced49a6" } ] } ], Term 1,2 and 3 have been used by authors in xrefs, the commit hashes are commits in the external glossary 'TG'. ## B. Observe version Choose ‘latest’ or ‘original’, if latest then {use the c#L look-up tool to be made} else get the c#d from specs.json. get info via URL {https to glossary}/{anchor to term}/{commit hash c#d} -> (pop-up of) glossary definition text Example:https://trustoverip.github.io/glossary/#term/282fa9 ### Real world example Observe commit b778be0024d4a0c2874e9aa882271fe38571220a of terms_and_definitions.md: https://github.com/trustoverip/ctwg-main-glossary/blob/b778be0024d4a0c2874e9aa882271fe38571220a/spec/terms_and_definitions.md Observe commit 2d52103467632d6afffa29dfdc6b8150a74d7334 of terms_and_definitions.md: https://github.com/trustoverip/ctwg-main-glossary/blob/2d52103467632d6afffa29dfdc6b8150a74d7334/spec/terms_and_definitions.md ## C. Diff version referenced and latest {Use the c#L look-up tool to be made} and get the c#d from specs.json {https to GitHub diff tool}/{url on xdoc repo to term}/{commit hash c#d}+{url on xdoc repo to term}/{commit hash c#L} -> red and green differences visible in GitHub userinterface. Example "diff": ![image](https://hackmd.io/_uploads/HJieZZfVC.png) ### Real world example Diff two commits. Now I can extract the commit hashes and say: https://github.com/trustoverip/ctwg-main-glossary/compare/b778be0024d4a0c2874e9aa882271fe38571220a..2d52103467632d6afffa29dfdc6b8150a74d7334 However, you have to Command-F a certain file e.g. `specs.json` in the list or scroll down. The following command will give the results for only the file `specs.json`. The github userinterface doesn't have this option (yet). So we're able to use this in an automated process. > git diff b778be0024d4a0c2874e9aa882271fe38571220a 2d52103467632d6afffa29dfdc6b8150a74d7334 -- specs.json If you find the web interface cumbersome for this purpose, consider using local tools like git or graphical interfaces like GitKraken, SourceTree, or GitHub Desktop. These tools can provide a more user-friendly way to view diffs for specific files; try this for example: ``` git diff b778be0024d4a0c2874e9aa882271fe38571220a 2d52103467632d6afffa29dfdc6b8150a74d7334 -- specs.json ```