#set text(lang: "sl") #set page("a4", margin: 5mm) #import "@preview/fletcher:0.5.8" as fletcher: diagram, node, edge #import fletcher.shapes: house, chevron, pill, hexagon #let commit-color = green #let tag-color = orange #let branch-color = purple #let thin = 0.5pt; #let thindotted = (thickness: thin, dash: "dotted"); #let thindashed = (thickness: thin, dash: "dashed"); #let commit-node(coord, hash, ..args) = node(coord, raw(hash), shape: pill, fill: commit-color.lighten(50%), stroke: thin, ..args) #let commit-object(coord, hash, name, ..args) = node(coord, align(left, [#text(size: 8pt, gray.darken(50%), raw(hash))\ #name]), corner-radius: 7pt, fill: commit-color.lighten(50%), stroke: none, ..args) #let tree-object(coord, hash, ..args) = commit-object(coord, hash, [tree], width: 2cm, fill: blue.lighten(50%), ..args) #let file-object(coord, hash, name, ..args) = commit-object(coord, hash, name, width: 2cm, fill: gray.lighten(50%), ..args) #diagram(debug: 1, node-stroke: 2pt, edge-stroke: 1pt, { let store = (0.6, 6.7) let (co1, co2) = { let x = 0.2 let y = store.at(1) ((x, y+0.5), (x, y+1)) } let (tree1, tree2) = { let x = 1.2 ((x, co1.at(1)), (x, co2.at(1))) } let (f1, f2, f3) = { let x = 2.2; let y = store.at(1) ((x, y), (x, y + 0.5), (x, y + 1)) } let (A, B, C, D, E, F, G) = ((2, 6), (2, 5), (2, 4), (2, 3), (2, 2), (2, 1), (2, 0)) let (B1, B2) = ((3, 4.5), (3, 3.5)) let (E1, E2, E3) = ((3, 1.5), (3, 0.5), (3, -0.5)) let (Br1, Br2) = ((F.at(0)-0.5, F.at(1)), (E2.at(0)-0.5, E2.at(1))) let (T1, T2) = ((E.at(0)-0.5, E.at(1)), (B.at(0)-0.5, B.at(1))) let refs = (3.5, store.at(1)) let tags = (0.5, 3) let commit = (3.8, 2.5) let branches = (0.5, 0) let stage =(3.7, 0) let mc = (2.5, D.at(1)-0.5) node(store, [Content addressable object store], stroke: none, width: 4cm) commit-object(co1, "e264a1", [second commit]) commit-object(co2, "16f29", [first commit], width: 2.8cm) tree-object(tree1, "16f29") tree-object(tree2, "16f29") file-object(f1, "16f29", [`new content`]) file-object(f2, "16f29", [`unchanged`]) file-object(f3, "16f29", [`first content`]) edge(tree1, f2, [`bar.txt`], "->", label-angle: auto) edge(tree1, f1, [`foo.txt`], "->", label-angle: auto) edge(tree2, f2, [`bar.txt`], "->", label-angle: auto) edge(tree2, f3, [`foo.txt`], "->", label-angle: auto) edge(co2, tree2, "->") edge(co1, tree1, "->") node(store, stroke: thin, enclose:(co1, f3, f1)) commit-node(A, "A 16f299") commit-node(B, "B 16f299") commit-node(C, "C 16f299") commit-node(D, "D 16f299") commit-node(E, "E 16f299") commit-node(F, "F 16f299") // merge commit node(mc, [Merge commit\ #text(size: 8pt)[commit with two parents]], stroke: thin, corner-radius: 10pt) // merged branch commit-node(B1, "B1 16f299") commit-node(B2, "B2 16f299") // unmerged branch commit-node(E1, "E1 16f299") commit-node(E2, "E2 16f299") commit-node(E3, "E3 16f299", fill: none, stroke: thindashed) // branches node(Br1, [main], shape: hexagon, stroke: branch-color) node(Br2, [hotfix], shape: hexagon, stroke: branch-color) // tags node(T1, [v-1.0], shape: chevron, stroke: tag-color) node(T2, [v-1.1], shape: chevron, stroke: tag-color) // refs node(refs, stroke: thin, inset:5pt, snap: false, enclose: (refs, (refs.at(0)+1, refs.at(1)+1)), align(left, [ *References* (`.git/refs`)\ *Tags* (`.git/refs/tags`)\ `tag-1`: `8dd6d4b...`\ *Branches* (`.git/refs/heads`) \ `main`: `8dd6d4b...`\ `feature-1`: `8dd6d4b...`\ `hotfix`: `8dd6d4b...` ]) ) node(branches, [#text(branch-color.darken(20%))[*BRANCH*]\ #text[reference that moves along when commiting canges]], stroke: thin, corner-radius: 10pt, inset: 5pt, width: 4cm) /*, enclose: ( (branches.at(0)-0.5, branches.at(1)), (branches.at(0)+1, branches.at(1))))*/ node(tags, [#text(tag-color)[*TAG*]\ reference that don't move], stroke: thin, corner-radius: 10pt, inset: 5pt, width: 4cm)/*, enclose: ((tags.at(0)-0.5, tags.at(1)), (tags.at(0)+1, tags.at(1))))*/ node(stage, [*Staging area*\ #text(size: 8pt)[filesystem snapshot that will be commited in the next commit]], stroke: thindashed, corner-radius: 10pt, width: 3cm) node(commit, [ #text(commit-color)[*COMMIT*]\ snapshot of filesystem tree in object store\ #rect[ ``` tree 65c47fee... parent 16f299... author MV ") edge(C, B, "->") edge(D, C, "->") edge(E, D, "->") edge(F, E, "->") // merged branch edge(B1, B, "->", layer: 1, label: [parent of], label-angle: auto) edge(B2, B1, "->") edge(D, B2, "->") // unmerged branch edge(E1, E, "->") edge(E2, E1, "->") edge(E3, E2, "->", stroke: (dash: "dashed")) // refs edge(Br1, F) edge(Br2, E2) edge(T1, E) edge(T2, B) edge(Br1, branches, stroke: thindotted) edge(Br2, branches, stroke: thindotted) edge(T1, tags, stroke: thindotted) edge(T2, tags, stroke: thindotted) edge(commit, E, stroke: thindotted) edge(stage, E3, stroke: thindotted) edge((-0.5, A.at(1)), (-0.5, G.at(1)), "->", label: [time], label-side: left, label-angle: 90deg) edge(mc, D, stroke: thindotted) } )