jujutsu.nix
1 { config, pkgs, ... }: 2 let 3 inherit (pkgs) dusk-treefmt makeWrapper symlinkJoin; 4 5 treefmt = symlinkJoin { 6 name = "jujutsu-treefmt"; 7 paths = [ dusk-treefmt ]; 8 buildInputs = [ makeWrapper ]; 9 postBuild = '' 10 wrapProgram $out/bin/treefmt \ 11 --set NO_COLOR 1 \ 12 --set TREEFMT_VERBOSE 0 13 ''; 14 }; 15 in 16 { 17 config = { 18 home = { 19 file.".config/rustfmt/rustfmt.toml".text = '' 20 edition = "2024" 21 22 reorder_imports = true 23 imports_granularity = "Crate" 24 imports_layout = "HorizontalVertical" 25 max_width = 102 26 group_imports = "StdExternalCrate" 27 trailing_comma = "Vertical" 28 trailing_semicolon = true 29 ''; 30 31 packages = with pkgs; [ 32 jjui 33 radicle-node 34 ]; 35 }; 36 37 programs.jujutsu = { 38 enable = true; 39 40 settings = { 41 aliases = { 42 ai-describe = [ 43 "util" 44 "exec" 45 "--" 46 "${pkgs.dusk-ai-tools}/bin/ai-describe" 47 ]; 48 my-remotes = [ 49 "log" 50 "-r" 51 "my(upstreams)" 52 ]; 53 remotes = [ 54 "log" 55 "-r" 56 "upstreams" 57 ]; 58 sync-main = [ 59 "rebase" 60 "-s" 61 "roots(main@origin)..trunk-" 62 "-d" 63 "main" 64 "--skip-emptied" 65 ]; 66 update-trunk = [ 67 "rebase" 68 "-s" 69 "trunk" 70 "-d" 71 "main" 72 "-d" 73 "all:heads(my(upstreams))" 74 "--skip-emptied" 75 ]; 76 xl = [ 77 "log" 78 "-r" 79 "::mine() | ::remote_bookmarks()" 80 ]; 81 }; 82 83 fix.tools.treefmt = { 84 command = [ 85 "${treefmt}/bin/treefmt" 86 "--no-cache" 87 "$path" 88 "--stdin" 89 ]; 90 91 patterns = [ 92 "glob:'**/*.js'" 93 "glob:'**/*.jsx'" 94 "glob:'**/*.lua'" 95 "glob:'**/*.nix'" 96 "glob:'**/*.py'" 97 "glob:'**/*.rs'" 98 "glob:'**/*.sh'" 99 "glob:'**/*.toml'" 100 "glob:'**/*.ts'" 101 "glob:'**/*.tsx'" 102 ]; 103 }; 104 105 git = { 106 private-commits = "private | trunk"; 107 push-bookmark-prefix = "${config.dusk.accounts.github}/"; 108 }; 109 110 revset-aliases = { 111 upstreams = '' 112 tracked_remote_bookmarks() ~ ::main@origin 113 ''; 114 115 "clean(a)" = "a ~ conflicts()"; 116 "broken(a)" = "a & conflicts()"; 117 "my(a)" = "a & mine()"; 118 119 private = "description(glob:'wip:*') | description(glob:'private:*') | trunk::"; 120 trunk = ''bookmarks("trunk") & mine()''; 121 }; 122 123 snapshot.max-new-file-size = "10MiB"; 124 125 signing = { 126 behavior = "own"; 127 backend = "gpg"; 128 }; 129 130 template-aliases = { 131 "format_short_signature(signature)" = "signature.email()"; 132 "format_short_id(id)" = "id.shortest()"; 133 }; 134 135 user = { 136 inherit (config.dusk) name; 137 email = config.dusk.emails.primary; 138 }; 139 140 ui = { 141 default-command = [ "status" ]; 142 diff-editor = ":builtin"; 143 diff.format = "git"; 144 editor = "nvim"; 145 pager = "delta"; 146 }; 147 }; 148 }; 149 }; 150 }