mirror of
https://github.com/stablyai/orca.git
synced 2026-10-02 00:02:05 +00:00
* Add mobile image-diff previews via shared data-URI builder - Extracts a `buildImageDataUri` helper (src/shared/image-data-uri.ts) shared by the desktop ImageViewer and mobile, so both trim whitespace-wrapped base64 and skip non-previewable mimes (e.g. application/pdf) the same way. - Adds mobile-diff-image-preview.ts to render binary git.diff results (add/modify/ delete) as images instead of falling back to "Binary preview unavailable". - Extracts resolveMobileFileTabDoc to consolidate the session file-tab loading logic (diff/image/html/text) out of the route file for testability. * Fix stale binary image fallback for empty modified diffs and relay reads - mobileDiffImageDataUri now distinguishes a true deletion (modified side absent) from a modify whose binary bytes arrived empty (relay/size-cap cases), returning null instead of the stale pre-change image - readWorkingDiffFile passes the file path to bufferToBlob so relay working-tree reads can detect previewable image extensions instead of always reporting empty binary content - add mobile-file-tab-doc.test.ts covering diff/image/binary/text resolution paths * Regenerate skill bundle manifest for 1.4.144-rc.2 Co-authored-by: Orca <help@stably.ai> * fix(review): trim comments to AGENTS.md's one/two-line why-only rule Comments in mobile-diff-image-preview.ts and mobile-file-tab-doc.ts ran 3-6 lines and narrated mechanism instead of stating only the non-obvious reason, per AGENTS.md's "Code Comments: Document the Why, Briefly" rule. Co-authored-by: Orca <help@stably.ai> * Distinguish read failures from true deletions in binary diff results - Working-tree stat/readFile errors and relay reads previously collapsed onto the same empty-content signal as a genuine deletion, letting previewers fall back to stale original bytes on a failed read. - Add modifiedDeleted/missing flags through status.ts, git-handler-ops, and git-working-file-read so only proven deletions trigger the original-bytes fallback; failed reads now return null. - Tighten buildImageDataUri to accept only image/* mimes instead of special-casing application/pdf. * fix(relay): expect missing:false on index blob maxBuffer overflow readBlobAtIndex now returns a missing flag so staged deletions are distinct from size-capped binary reads; update the overflow test. * Allow opening deleted files to show pre-delete text or image diffs Deleted files can now be opened to view their pre-delete content via git.diff (including images via modifiedDeleted). Only unresolved conflicts remain unopenable. Centralizes the canOpen rule in canOpenMobileGitStatusEntry() to keep opener guards consistent across the mobile source control UI. --------- Co-authored-by: Orca <help@stably.ai>
51 lines
1.9 KiB
TypeScript
51 lines
1.9 KiB
TypeScript
import { describe, expect, it, vi } from 'vitest'
|
|
import { readBlobAtIndex, readBlobAtOid, type GitBufferExec } from './git-handler-ops'
|
|
|
|
describe('git blob readers', () => {
|
|
it('normalizes Windows separators before reading OID blobs', async () => {
|
|
const gitBuffer = vi.fn<GitBufferExec>().mockResolvedValue(Buffer.from('head-content'))
|
|
|
|
const result = await readBlobAtOid(gitBuffer, '/repo', 'HEAD', 'src\\file.ts')
|
|
|
|
expect(gitBuffer).toHaveBeenCalledWith(
|
|
['show', '--end-of-options', 'HEAD:src/file.ts'],
|
|
'/repo'
|
|
)
|
|
expect(result.content).toBe('head-content')
|
|
})
|
|
|
|
it('marks OID blobs that overflow maxBuffer as binary', async () => {
|
|
const gitBuffer = vi
|
|
.fn<GitBufferExec>()
|
|
.mockRejectedValue(
|
|
Object.assign(new Error('stdout maxBuffer length exceeded'), { code: 'ENOBUFS' })
|
|
)
|
|
|
|
const result = await readBlobAtOid(gitBuffer, '/repo', 'HEAD', 'large.log')
|
|
|
|
expect(result).toEqual({ content: '', isBinary: true })
|
|
})
|
|
|
|
it('normalizes Windows separators before reading index blobs', async () => {
|
|
const gitBuffer = vi.fn<GitBufferExec>().mockResolvedValue(Buffer.from('index-content'))
|
|
|
|
const result = await readBlobAtIndex(gitBuffer, '/repo', 'src\\file.ts')
|
|
|
|
expect(gitBuffer).toHaveBeenCalledWith(['show', '--end-of-options', ':src/file.ts'], '/repo')
|
|
expect(result.content).toBe('index-content')
|
|
})
|
|
|
|
it('marks index blobs that overflow maxBuffer as binary', async () => {
|
|
const gitBuffer = vi
|
|
.fn<GitBufferExec>()
|
|
.mockRejectedValue(
|
|
Object.assign(new Error('git stdout exceeded maxBuffer.'), { code: 'ENOBUFS' })
|
|
)
|
|
|
|
const result = await readBlobAtIndex(gitBuffer, '/repo', 'large.log')
|
|
|
|
// Why: overflow is size-capped content, not a staged deletion (missing: false).
|
|
expect(result).toEqual({ content: '', isBinary: true, missing: false })
|
|
})
|
|
})
|