The GitButler version control client, backed by Git, powered by Tauri/Rust/Svelte
This report summarizes scanner evidence for gitbutlerapp/gitbutler, a Rust project with 21,895 GitHub stars. SynthScan examined 747,702 lines of code across 2935 source files, recording 1245 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 2.1 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 1133 finding(s).
Are imports declared and package/API names verified? 30 finding(s).
Are wrappers, guards, and repeated structures necessary? 282 finding(s).
Which changes need focused human review? 1245 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1245 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Cargo.toml | 1 | [workspace] | COMMENT |
| LOW | Cargo.toml | 21 | "crates/but-feedback", # 📄It's very small and very special, but documented and well-enough tested. | COMMENT |
| LOW | Cargo.toml | 61 | # 👉lacks top-level docs and docs. | COMMENT |
| LOW | Cargo.toml | 81 | "crates/but-transaction", # 📄TBD | COMMENT |
| LOW | Cargo.toml | 101 | ## | COMMENT |
| LOW | deny.toml | 1 | # This template contains all of the possible sections and their default values | COMMENT |
| LOW | deny.toml | 21 | # `target_family = "unix"` configuration, that only having windows targets in | COMMENT |
| LOW | deny.toml | 41 | #exclude = [] | COMMENT |
| LOW | deny.toml | 61 | COMMENT | |
| LOW | deny.toml | 121 | ] | COMMENT |
| LOW | deny.toml | 161 | # This section is considered when running `cargo deny check bans`. | COMMENT |
| LOW | deny.toml | 181 | # on a crate-by-crate basis if desired. | COMMENT |
| LOW | deny.toml | 201 | #crate = "reqwest" | COMMENT |
| LOW | deny.toml | 221 | skip = [ | COMMENT |
| LOW | crates/but-secret/src/secret.rs | 1 | //! This module contains facilities to handle the persistence of secrets. | COMMENT |
| LOW | crates/gitbutler-repo/tests/repo/create_wd_tree.rs | 21 | /// These tests exercise the truth table that we use to update the HEAD | COMMENT |
| LOW | crates/gitbutler-repo/src/commands.rs | 121 | /// `FileInfo` stores valid text in `content` with no `mime_type`. Binary files either have no | COMMENT |
| LOW | crates/gitbutler-repo/src/commands.rs | 181 | COMMENT | |
| LOW | crates/but-testsupport/src/in_memory_meta.rs | 221 | branches: vec![stack_segment_from_partial_name(stack_name)], | COMMENT |
| LOW | crates/but-testsupport/src/in_memory_meta.rs | 241 | // .collect(), | COMMENT |
| LOW | crates/but-transaction/src/lib.rs | 41 | /// Note this isn't fully ACID compliant database transactions but rather a "best effort" version | COMMENT |
| LOW | crates/but-transaction/src/lib.rs | 61 | /// # Commit mapping | COMMENT |
| LOW | crates/gitbutler-watcher/src/handler.rs | 21 | COMMENT | |
| LOW | …ut-rebase/tests/rebase/graph_rebase/graph_workspace.rs | 1 | //! Snapshot tests for the [`GraphWorkspace`] projection, covering the | COMMENT |
| LOW | crates/but-rebase/src/lib.rs | 41 | /// Squashes an existing commit into the one in the first `Pick` or `Merge` RebaseStep that precedes it. | COMMENT |
| LOW | crates/but-rebase/src/lib.rs | 121 | } | COMMENT |
| LOW | crates/but-rebase/src/lib.rs | 161 | } | COMMENT |
| LOW | crates/but-rebase/src/cherry_pick.rs | 1 | /// How to perform a cherry-pick. | COMMENT |
| LOW | …es/but-rebase/src/graph_rebase/merge_commit_changes.rs | 21 | /// parents. | COMMENT |
| LOW | …es/but-rebase/src/graph_rebase/merge_commit_changes.rs | 101 | // As described in the module-level documentation, we stop | COMMENT |
| LOW | …es/but-rebase/src/graph_rebase/merge_commit_changes.rs | 201 | /// First-parent metadata for a selected commit. This is subsequently used to | COMMENT |
| LOW | …es/but-rebase/src/graph_rebase/merge_commit_changes.rs | 221 | } | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/branch_stacks.rs | 21 | workspace::is_workspace_commit, | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/mod.rs | 41 | pub mod workspace; | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/mod.rs | 61 | /// Controls whether the resulting commit is signed. | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/mod.rs | 201 | /// an object asserts that the reciever has a selectable pick step in the | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/mod.rs | 261 | /// The HEAD of the `repo` the editor was created for. | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/mod.rs | 541 | _ => bail!("Reference target in rebase result is not a commit"), | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/cherry_pick.rs | 41 | /// The shas of the commits that we were trying to cherry pick from. | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/cherry_pick.rs | 61 | WithRenames, | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/cherry_pick.rs | 81 | /// When cherry-picking a commit onto two or more commits, we first find the | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/cherry_pick.rs | 101 | /// | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/cherry_pick.rs | 261 | }) | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/cherry_pick.rs | 281 | /// `ontos` | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/workspace.rs | 61 | COMMENT | |
| LOW | crates/but-rebase/src/graph_rebase/workspace.rs | 81 | /// consequence of how the editor's step graph is built, *not* of the rebase | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/workspace.rs | 101 | /// upstream, commits are still classified by their own branches' remotes. | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/testing.rs | 701 | ├───╯ | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/testing.rs | 841 | fn three_way_fork_with_a_shared_target() { | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/mutate.rs | 21 | /// | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/mutate.rs | 401 | /// | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/mutate.rs | 641 | /// `nodes_to_connect` - Optional set of selector to connect instead of the parents/children determined. | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/mutate.rs | 781 | /// The segment is described by its delimiter: First (parent-most) and last (child-most) node. | COMMENT |
| LOW | crates/but-rebase/src/graph_rebase/materialize.rs | 41 | COMMENT | |
| LOW | crates/gitbutler-operating-modes/src/lib.rs | 81 | /// The ref of the vbranch which owns this commit. | COMMENT |
| LOW | crates/but-oplog/src/lib.rs | 1 | //! The operations log, short: Oplog, is a sequence of restore points, which each restore point implemented as snapshots | COMMENT |
| LOW | crates/but-oplog/src/lib.rs | 21 | //! attach metadata about the operation that created them. | COMMENT |
| LOW | crates/but-oplog/src/lib.rs | 41 | //! or leave no trace of ever running. | COMMENT |
| LOW | crates/but-debugging/src/lib.rs | 1 | //! But Debugging contains utilities that aid in debugging gitbutler. | COMMENT |
| LOW | crates/but-workspace/tests/workspace/graph.rs | 1 | //! Snapshot tests for [`detailed_graph_workspace`], mirroring the permutations | COMMENT |
| 807 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | crates/but-workspace/src/branch/mod.rs | 170 | //! ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | crates/but-workspace/src/branch/mod.rs | 172 | //! ├────────────────────────────────────────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | crates/but-workspace/src/branch/mod.rs | 174 | //! └────────────────────────────────────────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | crates/but-workspace/src/branch/mod.rs | 224 | //! │ e │ │ ├──────┴─────┐ ├──────┴─────┐ | COMMENT |
| MEDIUM⚡ | crates/but-workspace/src/branch/mod.rs | 227 | //! │ A │ TMB◀─────┘ └─┘◀── feat └─────▶TMB └─┘◀──S:feat TMB └─┘◀──S:feat | COMMENT |
| MEDIUM⚡ | crates/but-workspace/src/branch/mod.rs | 232 | //! │ │ └─┘───────────┘ WMB───────────┘ WMB───────────┘ | COMMENT |
| MEDIUM⚡ | crates/but-workspace/src/branch/mod.rs | 259 | //! │ e │ | COMMENT |
| MEDIUM⚡ | crates/but-workspace/src/branch/mod.rs | 262 | //! │ │ └──┘ └──┘ parent | COMMENT |
| MEDIUM⚡ | crates/but-workspace/src/branch/mod.rs | 263 | //! │ I │ │ │ | COMMENT |
| MEDIUM⚡ | crates/but-workspace/src/branch/mod.rs | 265 | //! │ i │ ┌─┐ ┌─┐ ┌─┐ ┌─ S:feat/1 | COMMENT |
| MEDIUM⚡ | crates/but-workspace/src/branch/mod.rs | 266 | //! │ t │ H:S:main H:S:main────▶└─┘ S:main ────▶└─┘◀── S:feat S:main ──▶└─┘◀┴─ B:feat S:ma | COMMENT |
| MEDIUM⚡ | crates/but-workspace/src/branch/mod.rs | 269 | //! └───┘ Need ws/1 for metadata: - Need ws/1 for metadata: | COMMENT |
| MEDIUM⚡ | crates/but-workspace/src/branch/mod.rs | 271 | //! - Stack name changed to | COMMENT |
| MEDIUM | crates/but-workspace/src/branch/mod.rs | 185 | //! │ h │ │ │ ┌──────┴─────┐ │ ┌──── | COMMENT |
| MEDIUM | crates/but-workspace/src/branch/mod.rs | 193 | //! │ │ WMB───────────┘ WMB───────────┘ WMB───────────┘ | COMMENT |
| MEDIUM | crates/but-workspace/src/branch/mod.rs | 205 | //! │ a │ ┌──────┴─────┐ | COMMENT |
| MEDIUM | crates/but-workspace/src/branch/mod.rs | 213 | //! └───┘ └─┘───────────┘ WMB───────────┘ └─┘───────────┘ | COMMENT |
| MEDIUM | crates/but-workspace/src/branch/mod.rs | 287 | //! │ │ └─┘───────┘ └─┘───────┘ └─┘─────── | COMMENT |
| MEDIUM | crates/but-workspace/src/branch/mod.rs | 307 | //! │ h │ │ ┌─────┴────┐ │ │ | COMMENT |
| MEDIUM | crates/but-workspace/src/branch/mod.rs | 315 | //! │ S │ └─┘────────┘ WMB─────────┘ └─┘────────┘ | COMMENT |
| MEDIUM | crates/but-workspace/src/branch/mod.rs | 372 | //! │ e │ ┌──────┼──────┐ │ A ││ B ││ C │ | COMMENT |
| MEDIUM | crates/but-workspace/src/branch/mod.rs | 383 | //! └───┘ WMB───────┘ all commits at once. | COMMENT |
| MEDIUM | crates/but-workspace/src/branch/mod.rs | 391 | //! │ n │ ┌──────┼──────┐ main┐ | COMMENT |
| MEDIUM | crates/but-workspace/src/branch/mod.rs | 403 | //! └───┘ └1┘───────┘ Problem is that lanes wouldn't have | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 138 | //! ┌────────────────────┐ | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 140 | //! └────────────────────┘ | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 143 | //! ┌────────────────────────┐ | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 150 | //! └────────────────────────┘ | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 163 | //! ┌───────────────────┐ | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 165 | //! └───────────────────┘ | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 166 | //! │ ┌────────────────────┐ | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 168 | //! │ └────────────────────┘ | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 170 | //! │ ┌─────────┴─────────┐ | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 173 | //! │ ┌───────────────┐ │ | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 175 | //! │ └───────────────┘ ┌───────────────┐ | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 177 | //! │ ▼ └───────────────┘ | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 178 | //! │ ┌───────────────┐ │ | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 180 | //! │ └───────────────┘ │ | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 182 | //! │ └─────────┬─────────┘ | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 185 | //! │ ┌────────┐ | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 187 | //! └─────────────────▶│ ------ │ | COMMENT |
| MEDIUM⚡ | crates/but-graph/src/lib.rs | 189 | //! └────────┘ | COMMENT |
| MEDIUM | crates/but/skill/references/examples.md | 196 | # ──────── | COMMENT |
| MEDIUM | crates/but/skill/references/examples.md | 339 | # ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/but/src/tui/editor.rs | 20 | // ── Hard wrap utility for commit messages ─────────────────────────────────── | COMMENT |
| MEDIUM | crates/but/src/tui/editor.rs | 70 | // ── Colour palette (inspired by the screenshot) ────────────────────────────── | COMMENT |
| MEDIUM | crates/but/src/tui/editor.rs | 88 | // ── Editor mode ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/but/src/tui/editor.rs | 97 | // ── Menu definitions ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | crates/but/src/tui/editor.rs | 155 | // ── Help overlay ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | crates/but/src/tui/editor.rs | 162 | // ── About overlay ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | crates/but/src/tui/editor.rs | 169 | // ── Editor state ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/but/src/tui/editor.rs | 233 | // ── Cursor helpers ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/but/src/tui/editor.rs | 261 | // ── Edit operations ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/but/src/tui/editor.rs | 310 | // ── Menu action dispatch ───────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/but/src/tui/editor.rs | 335 | // ── Input handling ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/but/src/tui/editor.rs | 377 | // ── Ctrl shortcuts ──────────────────────────────── | COMMENT |
| MEDIUM | crates/but/src/tui/editor.rs | 385 | // ── Navigation ──────────────────────────────────── | COMMENT |
| MEDIUM | crates/but/src/tui/editor.rs | 454 | // ── Text editing ────────────────────────────────── | COMMENT |
| MEDIUM | crates/but/src/tui/editor.rs | 650 | // ── Dropdown rect calculation ──────────────────────────────────────── | COMMENT |
| MEDIUM | crates/but/src/tui/editor.rs | 669 | // ── Rendering ──────────────────────────────────────────────────────────────── | COMMENT |
| 22 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/ui-svelte/tests/test-utils.ts | 143 | export async function waitForTextContentWithIdle( | CODE |
| LOW | packages/ui-svelte/tests/test-utils.ts | 334 | export async function waitForScrollHeightIncrease( | CODE |
| LOW | packages/ui-svelte/tests/test-utils.ts | 466 | export async function waitForScrollHeightChange( | CODE |
| LOW | packages/ui-svelte/tests/HardWrapPlugin.spec.ts | 26 | async function waitForParagraphCountGreaterThan( | CODE |
| LOW | packages/ui-svelte/tests/HardWrapPlugin.spec.ts | 154 | initialText: "```javascript\nfunction veryLongFunctionNameThatExceedsMax() {}\n```", | CODE |
| LOW | packages/ui-svelte/src/lib/utils/timeAgo.ts | 145 | function getSecondsUntilTimestampUpdate(seconds: number): number { | CODE |
| LOW | packages/ui-svelte/src/lib/utils/diffParsing.ts | 551 | function computeBaseInlineWordDiff( | CODE |
| LOW | packages/ui-svelte/src/lib/utils/tooltipPosition.ts | 56 | function calculateHorizontalAlignment( | CODE |
| LOW | packages/ui-svelte/src/lib/utils/tooltipPosition.ts | 81 | function autoDetectHorizontalAlignment(measurements: MeasurementCache): { | CODE |
| LOW | packages/ui-svelte/src/lib/utils/tooltipPosition.ts | 107 | function calculateVerticalPosition( | CODE |
| LOW | packages/ui-svelte/src/lib/focus/domUtils.ts | 25 | export function findNearestSuitableAncestor(element: HTMLElement): { | CODE |
| LOW | packages/ui-svelte/src/lib/focus/shortcutUtils.ts | 11 | export function generateTwoLetterShortcut(used: Map<string, unknown>): string | undefined { | CODE |
| LOW | …ckages/ui-svelte/src/lib/components/VirtualList.svelte | 693 | async function handleItemsRemovedOrReplaced(): Promise<void> { | CODE |
| LOW | …ckages/ui-svelte/src/lib/components/VirtualList.svelte | 733 | function compensateScrollForResize(index: number, oldHeight: number): void { | CODE |
| LOW | packages/ui-svelte/src/lib/richText/linewrap.ts | 122 | function isLogicalParagraphBoundary(para: ParagraphNode, previousIndent: string): boolean { | CODE |
| LOW | packages/ui-svelte/src/lib/richText/linewrap.ts | 158 | function combineLogicalParagraphText( | CODE |
| LOW | packages/ui-svelte/src/lib/richText/linewrap.ts | 207 | function updateParagraphsWithWrappedLines( | CODE |
| LOW | …ui-svelte/src/lib/richText/plugins/IndentPlugin.svelte | 17 | function normalizeNonSimpleTextNode( | CODE |
| LOW | …s/ui-svelte/src/lib/richText/plugins/InlineCode.svelte | 18 | function inlineCodeTextNodeTransform(node: TextNode): void { | CODE |
| LOW | …svelte/src/lib/richText/plugins/HardWrapPlugin.test.ts | 666 | function inlineCodeTextNodeTransform(node: TextNode): void { | CODE |
| LOW | packages/ui-svelte/src/lib/richText/node/mention.ts | 148 | function getTextSurroundingMention(text: string, start: number, end: number): [string, string] { | CODE |
| LOW | packages/ui-svelte/src/lib/richText/node/emoji.ts | 193 | export function findAndReplaceShortCodeEmoji(node: TextNode): TextNode | undefined { | CODE |
| LOW | packages/shared/src/lib/persisted.ts | 50 | function setAndPersist(value: T, set: (value: T) => void) { | CODE |
| LOW | packages/shared/src/lib/persisted.ts | 129 | function setAndPersist(value: T, set: (value: T) => void) { | CODE |
| LOW | packages/shared/src/lib/contributors.ts | 14 | async function getUsersWithAvatarsFromMails(userEmails: string[]) { | CODE |
| LOW | packages/shared/src/lib/contributors.ts | 38 | async function getAvatarsForContributors(contributors: UserMaybe[]) { | CODE |
| LOW⚡ | packages/shared/src/lib/contributors.ts | 50 | export async function getContributorsWithAvatars(branch: Branch) { | CODE |
| LOW⚡ | packages/shared/src/lib/contributors.ts | 54 | export async function getPatchContributorsWithAvatars(patch: PatchCommit) { | CODE |
| LOW⚡ | packages/shared/src/lib/contributors.ts | 58 | export async function getPatchApproversWithAvatars(patch: PatchCommit) { | CODE |
| LOW⚡ | packages/shared/src/lib/contributors.ts | 62 | export async function getPatchApproversAllWithAvatars(patch: PatchCommit) { | CODE |
| LOW⚡ | packages/shared/src/lib/contributors.ts | 66 | export async function getPatchRejectorsWithAvatars(patch: PatchCommit) { | CODE |
| LOW⚡ | packages/shared/src/lib/contributors.ts | 70 | export async function getPatchRejectorsAllWithAvatars(patch: PatchCommit) { | CODE |
| LOW⚡ | packages/shared/src/lib/contributors.ts | 74 | export async function getPatchViewersWithAvatars(patch: PatchCommit) { | CODE |
| LOW⚡ | packages/shared/src/lib/contributors.ts | 78 | export async function getPatchReviewersAllWithAvatars(patch: PatchCommit) { | CODE |
| LOW⚡ | packages/shared/src/lib/contributors.ts | 83 | export async function getPatchViewersAllWithAvatars(patch: PatchCommit) { | CODE |
| LOW | …shared/src/lib/organizations/projectsPreview.svelte.ts | 53 | export function getRecentlyInteractedProjects(inView?: InView): Reactive<LoadableProject[]> { | CODE |
| LOW | …shared/src/lib/organizations/projectsPreview.svelte.ts | 68 | export function getRecentlyPushedProjects(inView?: InView): Reactive<LoadableProject[]> { | CODE |
| LOW | …shared/src/lib/organizations/projectsPreview.svelte.ts | 98 | export function getFeedIdentityForRepositoryId( | CODE |
| LOW | packages/shared/src/lib/settings/types.ts | 21 | export function apiToNotificationSettings( | CODE |
| LOW | packages/shared/src/lib/settings/types.ts | 59 | export function notificationSettingsToApi( | CODE |
| LOW | …rc/lib/settings/notificationSetttingsPreview.svelte.ts | 8 | export function getNotificationSettingsInterest( | CODE |
| LOW | …ages/shared/src/lib/chat/chatChannelsPreview.svelte.ts | 33 | export function getChatChannelParticipants( | CODE |
| LOW | packages/shared/src/lib/chat/types.ts | 76 | export function apiToChatMessageInReplyTo( | CODE |
| LOW | packages/shared/src/lib/chat/types.ts | 239 | export function toApiCreateChatMessageParams( | CODE |
| LOW | packages/shared/src/lib/chat/types.ts | 282 | export function toApiPatchChatMessageParams( | CODE |
| LOW | packages/shared/src/lib/patchEvents/types.ts | 310 | export function createPatchEventChannelKey( | CODE |
| LOW | packages/shared/src/lib/branches/utils.ts | 37 | export function getMultipleContributorNames(contributors: UserMaybe[]): string { | CODE |
| LOW | …ages/shared/src/lib/branches/branchesPreview.svelte.ts | 18 | export function getBranchReviewsForRepository( | CODE |
| LOW | packages/but-mcp-app/src/WorkspaceApp.tsx | 95 | function graphStatusFromPushStatus(status: PushStatus | undefined): GraphStatus { | CODE |
| LOW | packages/but-mcp-app/src/WorkspaceApp.tsx | 165 | function workspaceViewFromToolResult(result: ToolResult): WorkspaceView | null { | CODE |
| LOW | e2e/playwright/tests/unifiedDiffView.spec.ts | 98 | async function seedRemoteFileAndCloneFresh( | CODE |
| LOW | e2e/playwright/tests/startTheApp.spec.ts | 17 | async function addProjectAndOpenWorkspace( | CODE |
| LOW | e2e/playwright/tests/prAssociation.spec.ts | 125 | async function storeFakeGitHubEnterprisePat(page: Page, server: FakeGitHubServer) { | CODE |
| LOW | e2e/playwright/tests/moveCommitToNewStack.spec.ts | 11 | async function applyTwoIndependentStacks(gitbutler: GitButler, page: Page) { | CODE |
| LOW | e2e/playwright/tests/forge.spec.ts | 34 | async function openWorkspaceWithMockedPr( | CODE |
| LOW | e2e/playwright/tests/forge.spec.ts | 124 | async function openGithubPrWithChecksRoute( | CODE |
| LOW | e2e/playwright/tests/projectOffboarding.spec.ts | 5 | async function openProjectSettingsAndDelete(page: import("@playwright/test").Page) { | CODE |
| LOW | e2e/playwright/tests/branches.spec.ts | 38 | async function applyBranchFromBranchesView(page: Page, branchName: string) { | CODE |
| LOW | e2e/playwright/tests/branches.spec.ts | 63 | async function openProjectWithFakeGitHub( | CODE |
| LOW | e2e/playwright/tests/branches.spec.ts | 75 | async function applyReviewFromBranchesView(page: Page, title: string) { | CODE |
| 140 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | crates/but-rebase/src/graph_rebase/branch_stacks.rs | 298 | let Some(target_ref) = self.workspace.graph.project_meta.target_ref.as_ref() else { | CODE |
| CRITICAL | …src/command/legacy/status/tui/copy_selection_picker.rs | 79 | let path = hunk.hunks.head.hunk.path.to_str_lossy().into_owned(); | CODE |
| CRITICAL | crates/but/src/command/legacy/status/tui/details.rs | 1327 | hunk.hunks.head.hunk.path.clone(), | CODE |
| CRITICAL | crates/but/src/command/legacy/status/tui/app/mod.rs | 1864 | hunk.hunks.head.hunk.path.as_ref(), | CODE |
| CRITICAL | crates/but/src/command/legacy/status/tui/app/mod.rs | 1951 | .map(|hunk| hunk.hunks.head.hunk.path.as_bstr()), | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/but-workspace/src/commit/move_changes.rs | 63 | // Step 1: Get the source commit and its tree | COMMENT |
| LOW | …workspace/src/branch/integrate_branch_upstream/plan.rs | 117 | // Step 1: Find all the local commits associated with a change ID. | COMMENT |
| LOW | …workspace/src/branch/integrate_branch_upstream/plan.rs | 139 | // Step 2: Figure out which upstream-commits to squash into which local commits. | COMMENT |
| LOW | …workspace/src/branch/integrate_branch_upstream/plan.rs | 165 | // Step 3: Return the steps in the right order. | COMMENT |
| LOW | …workspace/src/branch/integrate_branch_upstream/plan.rs | 358 | // Step 1: We interpret the integration steps and transform them into graph steps disconnected from their parents. | COMMENT |
| LOW | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 129 | // Step 1: We prepare the steps before building. | COMMENT |
| LOW | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 158 | // Step 2: We determine which children and parents to disconnect from the segment above. | COMMENT |
| LOW⚡ | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 209 | // Step 3: Disconnect the segment, isolating it so that we can freely manipulate it. | COMMENT |
| LOW⚡ | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 217 | // Step 4: Based on the prepared steps, we rebuild the chain. | COMMENT |
| LOW⚡ | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 220 | // Step 5: Once we have our new chain, we reconnect it to the original children and parents. | COMMENT |
| LOW | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 274 | // Step 1: We create the editor, which maps every segment in the graph - | COMMENT |
| LOW | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 285 | // Step 2: We traverse the editor graph and determine the divergence between the local and remote branch. | COMMENT |
| LOW | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 296 | // Step 3: We determine the integration state of all the relevant commits, to know which are editable | COMMENT |
| LOW | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 341 | // Step 4: Build the initial set of integration steps. | COMMENT |
| LOW | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 358 | // Step 5: Build the return payload, including the integration steps recommended | COMMENT |
| LOW | crates/but/src/command/legacy/pull/mod.rs | 352 | // Step 1: Check upstream data | COMMENT |
| LOW | crates/but/src/command/legacy/pull/mod.rs | 451 | // Step 2: Dry-run integration and derive statuses from the preview, like the desktop app. | COMMENT |
| LOW | crates/but/src/command/legacy/pull/mod.rs | 516 | // Step 3: Actually perform the integration | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/but-workspace/src/commit/move_changes.rs | 63 | // Step 1: Get the source commit and its tree | COMMENT |
| LOW | …workspace/src/branch/integrate_branch_upstream/plan.rs | 117 | // Step 1: Find all the local commits associated with a change ID. | COMMENT |
| LOW | …workspace/src/branch/integrate_branch_upstream/plan.rs | 139 | // Step 2: Figure out which upstream-commits to squash into which local commits. | COMMENT |
| LOW | …workspace/src/branch/integrate_branch_upstream/plan.rs | 165 | // Step 3: Return the steps in the right order. | COMMENT |
| LOW | …workspace/src/branch/integrate_branch_upstream/plan.rs | 358 | // Step 1: We interpret the integration steps and transform them into graph steps disconnected from their parents. | COMMENT |
| LOW | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 129 | // Step 1: We prepare the steps before building. | COMMENT |
| LOW | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 158 | // Step 2: We determine which children and parents to disconnect from the segment above. | COMMENT |
| LOW⚡ | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 209 | // Step 3: Disconnect the segment, isolating it so that we can freely manipulate it. | COMMENT |
| LOW⚡ | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 217 | // Step 4: Based on the prepared steps, we rebuild the chain. | COMMENT |
| LOW⚡ | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 220 | // Step 5: Once we have our new chain, we reconnect it to the original children and parents. | COMMENT |
| LOW | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 274 | // Step 1: We create the editor, which maps every segment in the graph - | COMMENT |
| LOW | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 285 | // Step 2: We traverse the editor graph and determine the divergence between the local and remote branch. | COMMENT |
| LOW | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 296 | // Step 3: We determine the integration state of all the relevant commits, to know which are editable | COMMENT |
| LOW | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 341 | // Step 4: Build the initial set of integration steps. | COMMENT |
| LOW | …-workspace/src/branch/integrate_branch_upstream/mod.rs | 358 | // Step 5: Build the return payload, including the integration steps recommended | COMMENT |
| LOW | crates/but/src/command/legacy/pull/mod.rs | 352 | // Step 1: Check upstream data | COMMENT |
| LOW | crates/but/src/command/legacy/pull/mod.rs | 451 | // Step 2: Dry-run integration and derive statuses from the preview, like the desktop app. | COMMENT |
| LOW | crates/but/src/command/legacy/pull/mod.rs | 516 | // Step 3: Actually perform the integration | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …scripts/project-with-remote-branches__add-submodule.sh | 7 | # Create a simple repository to use as a submodule | COMMENT |
| MEDIUM | e2e/playwright/scripts/create-postcommit-fail-marker.sh | 2 | # Create a marker file to trigger post-commit failure | COMMENT |
| MEDIUM | e2e/playwright/scripts/create-allowed-file.sh | 2 | # Create a file with allowed content | COMMENT |
| MEDIUM | e2e/playwright/scripts/project-with-commit-hooks.sh | 21 | # Create a commit-msg hook that modifies the message | COMMENT |
| MEDIUM | e2e/playwright/scripts/project-with-commit-hooks.sh | 43 | # Create a pre-commit hook that checks for forbidden content | COMMENT |
| MEDIUM | e2e/playwright/scripts/project-with-commit-hooks.sh | 66 | # Create a post-commit hook that can be triggered to fail | COMMENT |
| MEDIUM | e2e/playwright/scripts/create-forbidden-file.sh | 2 | # Create a file with forbidden content | COMMENT |
| MEDIUM | …-with-remote-branches__commit-file-into-remote-base.sh | 10 | # Create a new branch in the remote project, add a file, and commit it. | COMMENT |
| MEDIUM | …t/scripts/project-in-single-branch-apply-transition.sh | 45 | # Create a managed workspace whose metadata will become stale after the direct checkout below. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/but/tests/but/command/commit.rs | 3837 | env.but("commit --empty -m 'placeholder'") | CODE |
| LOW | crates/but/tests/but/command/commit.rs | 3902 | env.but("commit --empty -b B -m 'placeholder'") | CODE |
| LOW | crates/but/src/tui/text.rs | 137 | assert_eq!(truncate_text("lorem ipsum", 5), "lore…"); | CODE |
| LOW | crates/but/src/args/config.rs | 27 | /// but config user set name "John Doe" | COMMENT |
| LOW | crates/but/src/args/config.rs | 342 | /// but config user set name "John Doe" | COMMENT |
| LOW | crates/but/src/args/mod.rs | 808 | /// but config user set name "John Doe" | COMMENT |
| LOW | crates/but-bitbucket/src/client/checks_tests.rs | 65 | BitbucketClient::new("user@example.com", &Sensitive("test-token".to_string())).unwrap(); | CODE |
| LOW | …ages/ui-svelte/src/stories/utils/Sticky.stories.svelte | 49 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut | CODE |
| LOW | …ages/ui-svelte/src/stories/utils/Sticky.stories.svelte | 49 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut | CODE |
| LOW | …ages/ui-svelte/src/stories/utils/Sticky.stories.svelte | 75 | Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci | CODE |
| LOW | …ages/ui-svelte/src/stories/utils/Sticky.stories.svelte | 75 | Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci | CODE |
| LOW | …ages/ui-svelte/src/stories/utils/Sticky.stories.svelte | 118 | <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> | CODE |
| LOW | …ages/ui-svelte/src/stories/utils/Sticky.stories.svelte | 118 | <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> | CODE |
| LOW | …i-svelte/src/stories/components/Textbox.stories.svelte | 60 | let emailValue = $state("user@example.com"); | CODE |
| LOW | …i-svelte/src/stories/components/Textbox.stories.svelte | 395 | placeholder="user@example.com" | CODE |
| LOW | …i-svelte/src/stories/components/Textbox.stories.svelte | 479 | placeholder="user@example.com" | CODE |
| LOW | …i-svelte/src/stories/components/Textbox.stories.svelte | 527 | placeholder="user@example.com" | CODE |
| LOW | …i-svelte/src/stories/components/Textbox.stories.svelte | 544 | placeholder="user@example.com" | CODE |
| LOW | e2e/playwright/tests/prAssociation.spec.ts | 129 | data: { host: server.apiBaseUrl, accessToken: "fake-token" }, | CODE |
| LOW⚡ | e2e/playwright/tests/reviewStackingDescription.spec.ts | 1321 | data: { host: server.apiBaseUrl, accessToken: "fake-token" }, | CODE |
| LOW | e2e/playwright/src/forge.ts | 198 | { data: { host: server.apiBaseUrl, accessToken: "fake-token" } }, | CODE |
| LOW | apps/desktop/src/lib/ai/service.test.ts | 111 | constructor(private response = "lorem ipsum") {} | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | crates/but-forge/src/review.rs | 153 | // TODO: implement | COMMENT |
| LOW⚡ | crates/but-forge/src/review.rs | 158 | // TODO: implement | COMMENT |
| LOW⚡ | crates/but-forge/src/review.rs | 163 | // TODO: implement | COMMENT |
| LOW⚡ | crates/but-forge/src/review.rs | 168 | // TODO: implement | COMMENT |
| LOW⚡ | crates/but-forge/src/review.rs | 173 | // TODO: implement | COMMENT |
| LOW⚡ | crates/but-forge/src/review.rs | 178 | // TODO: implement | COMMENT |
| LOW | crates/but-api/src/json.rs | 505 | // TODO: implement this. How to get description and what not? | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …top/src/lib/dragging/dropHandlers/branchDropHandler.ts | 24 | print(): string { | CODE |
| HIGH | …top/src/lib/dragging/dropHandlers/branchDropHandler.ts | 66 | print(): string { | CODE |
| HIGH | …top/src/lib/dragging/dropHandlers/branchDropHandler.ts | 101 | print(): string { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | crates/but-graph/tests/graph/init/with_workspace.rs | 3257 | // It's worth noting that we avoid double-listing remote commits that are also | COMMENT |
| LOW | crates/but-db/src/transaction.rs | 43 | /// Don't forget to call [commit()](Transaction::commit()) to actually persist the result. | COMMENT |
| LOW | crates/but-db/src/transaction.rs | 62 | /// Don't forget to call [commit()](Transaction::commit()) to actually persist the result. | COMMENT |
| LOW | crates/but-db/src/transaction.rs | 79 | /// Don't forget to call [commit()](Transaction::commit()) to actually persist the result. | COMMENT |
| LOW | crates/but-db/src/transaction.rs | 101 | /// Don't forget to call [commit()](Transaction::commit()) to actually persist the result. | COMMENT |
| LOW | crates/but-db/src/transaction.rs | 118 | /// Don't forget to call [commit()](Transaction::commit()) to actually persist the result. | COMMENT |
| LOW | crates/but-db/src/transaction.rs | 140 | /// Don't forget to call [commit()](Transaction::commit()) to actually persist the result. | COMMENT |
| LOW | crates/but-db/src/transaction.rs | 157 | /// Don't forget to call [commit()](Transaction::commit()) to actually persist the result. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | crates/but/src/id/mod.rs | 117 | /// utilize. The purpose is to not cause a shortening of an ID to invalidate a longer form of | COMMENT |
| MEDIUM | crates/but-installer/src/shell.rs | 123 | // Check for PATH setup with more robust detection | COMMENT |
| MEDIUM | crates/but-hunk-dependency/src/lib.rs | 81 | //! Essentially, perform the same algorithm as with simple `Branches`, but operate on a merge commit instead, simulating | COMMENT |
| LOW | scripts/add-but-symlink-to-deb.sh | 10 | # manager can't track the symlink, so it's better for everyone to just add it | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ignore-vercel.sh | 23 | # Check if we're in a git repository | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | e2e/playwright/src/fakeGithub.ts | 282 | async function handleRequest( | CODE |