| 
1 | 1 | ---  | 
2 | 2 | title: The architecture of GitGitGadget  | 
3 | 3 | ---  | 
 | 4 | + | 
 | 5 | +The essence of GitGitGadget can be illustrated by this diagram  | 
 | 6 | + | 
 | 7 | +```graphviz  | 
 | 8 | +digraph GitGitGadgetFlow {  | 
 | 9 | +  rankdir="TB";  | 
 | 10 | +  splines=true;  | 
 | 11 | +  overlap=false;  | 
 | 12 | +  fontsize=10;  | 
 | 13 | +  sep="+4.5";  | 
 | 14 | +
  | 
 | 15 | +  node [fontname="Arial", shape=box, style="filled,rounded"];  | 
 | 16 | +  edge [fontname="Arial", fontsize=7];  | 
 | 17 | +
  | 
 | 18 | +  // Node styles  | 
 | 19 | +  user [label="user (Git contributor)", fillcolor="#7777ff"];  | 
 | 20 | +  pr_repo [label="pr-repo", fillcolor="#eaa666", penwidth=2];  | 
 | 21 | +
  | 
 | 22 | +  GitGitGadget [label="GitGitGadget", fillcolor="#ffffff"];  | 
 | 23 | +
  | 
 | 24 | +  user -> pr_repo [label=" opens PR"];  | 
 | 25 | +
  | 
 | 26 | +  pr_repo -> GitGitGadget [label="slash commands"];  | 
 | 27 | +
  | 
 | 28 | +  GitGitGadget -> mailing_list [label="sends patch series"];  | 
 | 29 | +}  | 
 | 30 | +```  | 
 | 31 | + | 
 | 32 | +Of course, when adding a couple of details, it gets quite a bit more complicated. For example, GitGitGadget needs write permissions on the `pr-repo`, to push the tagged patch series, and to store its state in Git notes. Most upstream projects do not like that, and therefore GitGitGadget works on a `pr-repo` which is a fork of an `upstream-repo`. However, a _read-only_ variant of GitGitGadget's GitHub App can be installed on the `upstream-repo`, in which case GitGitGadget _does_ handle PRs in the `upstream-repo` but the state and the tagged patch series still live in `pr-repo`.  | 
 | 33 | + | 
 | 34 | +For testing purposes, there can also be `test-repo`, another fork of `upstream-repo` (but only the owner of the `test-repo` is allowed to use GitGitGadget there).  | 
 | 35 | + | 
 | 36 | +GitGitGadget also needs access to the mailing list in the form of a [public-inbox](https://public-inbox.org/README.html) repository, to be able to mirror replies back to the PRs.  | 
 | 37 | + | 
 | 38 | + | 
 | 39 | +```graphviz  | 
 | 40 | +digraph GitGitGadgetFlow {  | 
 | 41 | +  layout="neato";  | 
 | 42 | +  rankdir="TB";  | 
 | 43 | +  splines=true;  | 
 | 44 | +  overlap=false;  | 
 | 45 | +  fontsize=10;  | 
 | 46 | +  sep="+4.5";  | 
 | 47 | +
  | 
 | 48 | +  node [fontname="Arial", shape=box, style="filled,rounded"];  | 
 | 49 | +  edge [fontname="Arial", fontsize=7];  | 
 | 50 | +
  | 
 | 51 | +  // Node styles  | 
 | 52 | +  user [label="user (Git contributor)", fillcolor="#7777ff"];  | 
 | 53 | +  upstream_repo [label="upstream-repo", fillcolor="#eaa666", penwidth=2];  | 
 | 54 | +  pr_repo [label="pr-repo", fillcolor="#eaa666", penwidth=2];  | 
 | 55 | +  test_repo [label="test-repo", fillcolor="#eaa666", penwidth=2];  | 
 | 56 | +
  | 
 | 57 | +  GitGitGadget [label="GitGitGadget", fillcolor="#ffffff"];  | 
 | 58 | +  gitgitgadget_github_app_repo [label="gitgitgadget-github-app-repo", fillcolor="#fb7", penwidth=2];  | 
 | 59 | +  azure_function [label="azure-function", fillcolor="#ffffff"];  | 
 | 60 | +  gitgitgadget_workflows_repo [label="gitgitgadget-workflows-repo", fillcolor="#fb7", penwidth=2];  | 
 | 61 | +  gitgitgadget_repo [label="gitgitgadget-repo", fillcolor="#fb7", penwidth=2];  | 
 | 62 | +  mailing_list [label="mailing-list"];  | 
 | 63 | +  mailing_list_repo [label="mailing-list-repo", fillcolor="#fb7", penwidth=2];  | 
 | 64 | +  mailing_list_repo_mirror [label="mailing-list-repo-mirror", fillcolor="#fb7", penwidth=2];  | 
 | 65 | +
  | 
 | 66 | +  user -> pr_repo;  | 
 | 67 | +  user -> upstream_repo;  | 
 | 68 | +  user -> test_repo [taillabel=" opens PR"];  | 
 | 69 | +
  | 
 | 70 | +  upstream_repo -> pr_repo [label="syncs branches"];  | 
 | 71 | +  pr_repo -> GitGitGadget [label="slash commands"];  | 
 | 72 | +  upstream_repo -> GitGitGadget [label="slash commands\n(App)"];  | 
 | 73 | +  test_repo -> GitGitGadget [label="slash commands\n(owner only)"];  | 
 | 74 | +
  | 
 | 75 | +  GitGitGadget -> mailing_list [label="sends patch series"];  | 
 | 76 | +  GitGitGadget -> gitgitgadget_workflows_repo [label="runs in"];  | 
 | 77 | +  gitgitgadget_workflows_repo -> gitgitgadget_repo [label="uses Actions"];  | 
 | 78 | +
  | 
 | 79 | +  pr_repo -> azure_function;  | 
 | 80 | +  upstream_repo -> azure_function [label="webhook"];  | 
 | 81 | +  test_repo -> azure_function [headlabel="webhook"];  | 
 | 82 | +  mailing_list_repo_mirror -> azure_function [headlabel="\nwebhook"];  | 
 | 83 | +
  | 
 | 84 | +  gitgitgadget_github_app_repo -> azure_function [label="deploys to"];  | 
 | 85 | +  azure_function -> GitGitGadget [label="triggers"];  | 
 | 86 | +
  | 
 | 87 | +  mailing_list -> mailing_list_repo [label="public-inbox"];  | 
 | 88 | +  mailing_list_repo -> mailing_list_repo_mirror [label="syncs to"];  | 
 | 89 | +
  | 
 | 90 | +  mailing_list_repo_mirror -> pr_repo [label="mirrors\nreplies"];  | 
 | 91 | +  mailing_list_repo_mirror -> upstream_repo;  | 
 | 92 | +  mailing_list_repo_mirror -> test_repo;  | 
 | 93 | +}  | 
 | 94 | +```  | 
 | 95 | + | 
4 | 96 | # How does GitGitGadget process user comments on PRs?  | 
5 | 97 | 
 
  | 
6 | 98 | GitGitGadget is implemented as a GitHub App (with the very imaginative name ["GitGitGadget"](https://github.com/apps/gitgitgadget)), which means that a webhook is called on certain events, such as new PR comments on PRs (e.g. `issue_comment`).  | 
 | 
0 commit comments