heyquilt 0.3.107 → 0.3.108
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/RELEASES.md +4 -0
- package/package.json +1 -1
- package/src/session.js +26 -1
package/RELEASES.md
CHANGED
|
@@ -11,6 +11,10 @@ Format: `## <version> — <YYYY-MM-DD>`, an optional one-line summary, then bull
|
|
|
11
11
|
Lead each bullet with a short bold phrase. Inline `code` and **bold** are rendered;
|
|
12
12
|
nothing else is.
|
|
13
13
|
|
|
14
|
+
## 0.3.108 — 2026-10-19
|
|
15
|
+
|
|
16
|
+
- **A git reset over a held file isn't taken as your change.** Moving your branch to a commit from elsewhere (a release made in another clone, say) with `git reset` leaves your files as they were. For a file someone else held, Quilt then measured your copy from the new commit, so it looked as if you had taken that commit's change out: a merge appeared under your name, and the change was briefly removed when they let go. Your copy is now measured from the commit it came from, so nothing is recorded, and the commit's change comes in once they let go.
|
|
17
|
+
|
|
14
18
|
## 0.3.107 — 2026-10-19
|
|
15
19
|
|
|
16
20
|
- **Your cloud AI's sessions stay listed.** Settings → Your AI shows the sessions your cloud AI is in while its machine sleeps and after Quilt's servers restart, instead of "In no session yet". A session nobody named shows as your folder's name, as the rest of the app shows it.
|
package/package.json
CHANGED
package/src/session.js
CHANGED
|
@@ -2892,7 +2892,7 @@ export class Session extends EventEmitter {
|
|
|
2892
2892
|
if (changed.length && this.followsRelay && this.branchLive()) {
|
|
2893
2893
|
const atHead = await filesAt(this.root, head.sha, changed)
|
|
2894
2894
|
const has = () => atHead && changed.every((rel) => this.sharedKey(rel) === (atHead.get(rel) ?? undefined))
|
|
2895
|
-
if (atHead && !atHead.failed && (has() || await this.relayHasPull(head.sha, has))) old = atHead
|
|
2895
|
+
if (atHead && !atHead.failed && (has() || await this.relayHasPull(head.sha, has))) old = this.pulledBases(changed, old, atHead)
|
|
2896
2896
|
}
|
|
2897
2897
|
if (old.failed) this.log(`⚠️ git could not read ${old.failed} file${old.failed === 1 ? '' : 's'} at the old commit; merged without a base, so where they differ the newer version stays`)
|
|
2898
2898
|
// A file git made the person resolve (stash pop, rebase) holds their merge of the commits and the
|
|
@@ -2927,6 +2927,31 @@ export class Session extends EventEmitter {
|
|
|
2927
2927
|
}
|
|
2928
2928
|
}
|
|
2929
2929
|
|
|
2930
|
+
/**
|
|
2931
|
+
* The base of each pulled path once the relay is at the pulled commit (planSettle): the file at that commit,
|
|
2932
|
+
* so the pull's change isn't shared again on top of the relay's. Not for a file the session doesn't have at
|
|
2933
|
+
* that commit (the relay holds GitHub's change while someone holds the file) whose disk doesn't have the
|
|
2934
|
+
* pull's change either (git moved the branch and left the file, as `git reset` does): measured from the
|
|
2935
|
+
* commit, the disk would look like it took the pull's change away. That one is measured from the old commit.
|
|
2936
|
+
*/
|
|
2937
|
+
pulledBases (rels, old, atHead) {
|
|
2938
|
+
const out = new Map(atHead)
|
|
2939
|
+
out.failed = 0
|
|
2940
|
+
const text = (k) => typeof k === 'string' && !k.startsWith('bin:')
|
|
2941
|
+
for (const rel of rels) {
|
|
2942
|
+
const pulled = atHead.get(rel) ?? undefined
|
|
2943
|
+
const was = old.get(rel) ?? undefined
|
|
2944
|
+
if (pulled === was || this.sharedKey(rel) === pulled) continue
|
|
2945
|
+
const disk = this.readDisk(rel)
|
|
2946
|
+
const ours = disk && !disk.skip && !disk.tooLarge ? disk.key : null
|
|
2947
|
+
if (ours === pulled) continue
|
|
2948
|
+
// The disk has the pull's change when combining the pull into it changes nothing.
|
|
2949
|
+
const hasPull = text(ours) && text(was) && text(pulled) && (() => { const m = merge3(was, ours, pulled); return !m.conflicts.length && m.text === ours })()
|
|
2950
|
+
if (!hasPull) out.set(rel, old.get(rel))
|
|
2951
|
+
}
|
|
2952
|
+
return out
|
|
2953
|
+
}
|
|
2954
|
+
|
|
2930
2955
|
onDisk (rel) {
|
|
2931
2956
|
try { fs.lstatSync(path.join(this.root, ...rel.split('/'))); return true } catch { return false }
|
|
2932
2957
|
}
|