Prevent clients from setting CommitId - #73

Merged
hahn-kev merged 3 commits into
sillsdev:mainfrom
hahn-kev:prevent-client-commit-id-5045124005170139736
Jun 12, 2026
Merged

Prevent clients from setting CommitId#73
hahn-kev merged 3 commits into
sillsdev:mainfrom
hahn-kev:prevent-client-commit-id-5045124005170139736

Conversation

@hahn-kev

@hahn-kevhahn-kev commented Jun 11, 2026

Copy link
Copy Markdown
Collaborator

This change implements issue #70 by preventing clients from setting the CommitId when adding changes. Commit IDs are now always generated internally to avoid potential synchronization issues where multiple clients might use the same ID with different timestamps.

Key changes:

  • DataModel.AddChange and AddChanges no longer accept a commitId.
  • IChange.CommitId property was removed.
  • ToChangeEntity was updated to accept the commitId explicitly.
  • Relevant tests were updated to declare variables correctly or remove obsolete tests.

PR created automatically by Jules for task 5045124005170139736 started by @hahn-kev

Summary by CodeRabbit

  • Refactor
    • Simplified the data model's change-addition API by removing the requirement to manually specify commit IDs. Commit identification is now generated and managed internally, reducing API complexity and streamlining integration.

- Removed commitId parameter from DataModel.AddChange and AddChanges
- Removed CommitId property from IChange interface and implementations
- Updated tests to match the new API
- Removed tests that relied on client-provided commitId
Co-authored-by: hahn-kev <4575355+hahn-kev@users.noreply.github.com>
@coderabbitai

coderabbitaiBot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1ff56eea-5160-4c9f-b22d-fdfd80c04e0f

📥 Commits

Reviewing files that changed from the base of the PR and between 31dc78b and 8c876ee.

📒 Files selected for processing (7)
  • src/SIL.Harmony.Tests/CommitTests.cs
  • src/SIL.Harmony.Tests/DataModelIntegrityTests.cs
  • src/SIL.Harmony.Tests/DataModelPerformanceTests.cs
  • src/SIL.Harmony.Tests/DataModelTestBase.cs
  • src/SIL.Harmony.Tests/PersistExtraDataTests.cs
  • src/SIL.Harmony/Changes/Change.cs
  • src/SIL.Harmony/DataModel.cs
💤 Files with no reviewable changes (2)
  • src/SIL.Harmony.Tests/DataModelIntegrityTests.cs
  • src/SIL.Harmony/Changes/Change.cs

📝 Walkthrough

Walkthrough

The PR removes CommitId from the IChange contract and refactors how commit identity is assigned. The DataModel API no longer accepts explicit commit IDs at call sites; instead, commits generate their own identity, and ChangeEntity objects receive the CommitId from the owning Commit object. Tests are updated to reflect the new construction patterns and obsolete commit-id-passing logic is removed.

Changes

CommitId Removal and Commit-ID Assignment Refactor

Layer / File(s)Summary
Remove CommitId from IChange contract
src/SIL.Harmony/Changes/Change.cs
IChange interface and Change<T> class no longer declare the CommitId property, eliminating the ability for individual changes to store or carry commit identity.
Refactor DataModel commit-creation API
src/SIL.Harmony/DataModel.cs
AddChange and AddChanges methods remove the commitId parameter; NewCommit no longer accepts explicit commit ID and instead relies on Commit object creation. ToChangeEntity now receives the owning commitId and assigns it directly to the change entity rather than reading from the change itself.
Update test commit and change-entity construction
src/SIL.Harmony.Tests/CommitTests.cs, src/SIL.Harmony.Tests/DataModelTestBase.cs
Test methods now build Commit objects using empty initializers and populate ChangeEntities via Add/AddRange methods with the generated Commit.Id, instead of inline collection initializers that relied on change.CommitId.
Test cleanup and property updates
src/SIL.Harmony.Tests/DataModelIntegrityTests.cs, src/SIL.Harmony.Tests/DataModelPerformanceTests.cs, src/SIL.Harmony.Tests/PersistExtraDataTests.cs
Remove obsolete test method CanAddTheSameCommitMultipleTimes, fix HybridDateTime formatting, and rename ExtraDataModel.CommitId to LastCommitId with corresponding updates to the Copy() method and test assertions.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • sillsdev/harmony#71: Adjusts EditChange.NewEntity's exception message to reference CommitId, which is now removed from the contract and affects how this message can be constructed.
  • sillsdev/harmony#43: Also modifies DataModel.AddChanges and commit/change-entity construction logic; overlaps with this PR's refactoring of commit-id assignment and ChangeEntity creation.

Suggested reviewers

  • myieye

Poem

🐰 No more CommitId in Change,
Commit now owns the range!
Tests adjust their dance,
IDs find their stance—
A cleaner contract, clear and strange.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 15.38% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe PR title 'Prevent clients from setting CommitId' directly and clearly describes the main change: removing the ability for clients to provide CommitId values when adding changes.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

…24005170139736
# Conflicts:
#	src/SIL.Harmony/DataModel.cs

@myieyemyieye left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, except:

  • I feel like we should hold onto the deleted test
  • It kind of looks like you were maybe considering totally removing the Commit constructor that accepts a Guid? If you used it, a bunch of your diffs could shrink, but that's just a question of code style.

Comment threadsrc/SIL.Harmony.Tests/DataModelIntegrityTests.cs
Comment threadsrc/SIL.Harmony.Tests/DataModelPerformanceTests.cs
Comment threadsrc/SIL.Harmony/DataModel.cs
@hahn-kev
hahn-kev merged commit bfb23a1 into sillsdev:mainJun 12, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@hahn-kev@myieye
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Prevent clients from setting CommitId - #73

Merged
hahn-kev merged 3 commits into
sillsdev:mainfrom
hahn-kev:prevent-client-commit-id-5045124005170139736
Jun 12, 2026
Merged

Prevent clients from setting CommitId#73
hahn-kev merged 3 commits into
sillsdev:mainfrom
hahn-kev:prevent-client-commit-id-5045124005170139736

Conversation

@hahn-kev

@hahn-kevhahn-kev commented Jun 11, 2026

Copy link
Copy Markdown
Collaborator

This change implements issue #70 by preventing clients from setting the CommitId when adding changes. Commit IDs are now always generated internally to avoid potential synchronization issues where multiple clients might use the same ID with different timestamps.

Key changes:

  • DataModel.AddChange and AddChanges no longer accept a commitId.
  • IChange.CommitId property was removed.
  • ToChangeEntity was updated to accept the commitId explicitly.
  • Relevant tests were updated to declare variables correctly or remove obsolete tests.

PR created automatically by Jules for task 5045124005170139736 started by @hahn-kev

Summary by CodeRabbit

  • Refactor
    • Simplified the data model's change-addition API by removing the requirement to manually specify commit IDs. Commit identification is now generated and managed internally, reducing API complexity and streamlining integration.

- Removed commitId parameter from DataModel.AddChange and AddChanges
- Removed CommitId property from IChange interface and implementations
- Updated tests to match the new API
- Removed tests that relied on client-provided commitId
Co-authored-by: hahn-kev <4575355+hahn-kev@users.noreply.github.com>
@coderabbitai

coderabbitaiBot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1ff56eea-5160-4c9f-b22d-fdfd80c04e0f

📥 Commits

Reviewing files that changed from the base of the PR and between 31dc78b and 8c876ee.

📒 Files selected for processing (7)
  • src/SIL.Harmony.Tests/CommitTests.cs
  • src/SIL.Harmony.Tests/DataModelIntegrityTests.cs
  • src/SIL.Harmony.Tests/DataModelPerformanceTests.cs
  • src/SIL.Harmony.Tests/DataModelTestBase.cs
  • src/SIL.Harmony.Tests/PersistExtraDataTests.cs
  • src/SIL.Harmony/Changes/Change.cs
  • src/SIL.Harmony/DataModel.cs
💤 Files with no reviewable changes (2)
  • src/SIL.Harmony.Tests/DataModelIntegrityTests.cs
  • src/SIL.Harmony/Changes/Change.cs

📝 Walkthrough

Walkthrough

The PR removes CommitId from the IChange contract and refactors how commit identity is assigned. The DataModel API no longer accepts explicit commit IDs at call sites; instead, commits generate their own identity, and ChangeEntity objects receive the CommitId from the owning Commit object. Tests are updated to reflect the new construction patterns and obsolete commit-id-passing logic is removed.

Changes

CommitId Removal and Commit-ID Assignment Refactor

Layer / File(s)Summary
Remove CommitId from IChange contract
src/SIL.Harmony/Changes/Change.cs
IChange interface and Change<T> class no longer declare the CommitId property, eliminating the ability for individual changes to store or carry commit identity.
Refactor DataModel commit-creation API
src/SIL.Harmony/DataModel.cs
AddChange and AddChanges methods remove the commitId parameter; NewCommit no longer accepts explicit commit ID and instead relies on Commit object creation. ToChangeEntity now receives the owning commitId and assigns it directly to the change entity rather than reading from the change itself.
Update test commit and change-entity construction
src/SIL.Harmony.Tests/CommitTests.cs, src/SIL.Harmony.Tests/DataModelTestBase.cs
Test methods now build Commit objects using empty initializers and populate ChangeEntities via Add/AddRange methods with the generated Commit.Id, instead of inline collection initializers that relied on change.CommitId.
Test cleanup and property updates
src/SIL.Harmony.Tests/DataModelIntegrityTests.cs, src/SIL.Harmony.Tests/DataModelPerformanceTests.cs, src/SIL.Harmony.Tests/PersistExtraDataTests.cs
Remove obsolete test method CanAddTheSameCommitMultipleTimes, fix HybridDateTime formatting, and rename ExtraDataModel.CommitId to LastCommitId with corresponding updates to the Copy() method and test assertions.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • sillsdev/harmony#71: Adjusts EditChange.NewEntity's exception message to reference CommitId, which is now removed from the contract and affects how this message can be constructed.
  • sillsdev/harmony#43: Also modifies DataModel.AddChanges and commit/change-entity construction logic; overlaps with this PR's refactoring of commit-id assignment and ChangeEntity creation.

Suggested reviewers

  • myieye

Poem

🐰 No more CommitId in Change,
Commit now owns the range!
Tests adjust their dance,
IDs find their stance—
A cleaner contract, clear and strange.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 15.38% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe PR title 'Prevent clients from setting CommitId' directly and clearly describes the main change: removing the ability for clients to provide CommitId values when adding changes.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

…24005170139736
# Conflicts:
#	src/SIL.Harmony/DataModel.cs

@myieyemyieye left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, except:

  • I feel like we should hold onto the deleted test
  • It kind of looks like you were maybe considering totally removing the Commit constructor that accepts a Guid? If you used it, a bunch of your diffs could shrink, but that's just a question of code style.

Comment threadsrc/SIL.Harmony.Tests/DataModelIntegrityTests.cs
Comment threadsrc/SIL.Harmony.Tests/DataModelPerformanceTests.cs
Comment threadsrc/SIL.Harmony/DataModel.cs
@hahn-kev
hahn-kev merged commit bfb23a1 into sillsdev:mainJun 12, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@hahn-kev@myieye
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Prevent clients from setting CommitId - #73

Merged
hahn-kev merged 3 commits into
sillsdev:mainfrom
hahn-kev:prevent-client-commit-id-5045124005170139736
Jun 12, 2026
Merged

Prevent clients from setting CommitId#73
hahn-kev merged 3 commits into
sillsdev:mainfrom
hahn-kev:prevent-client-commit-id-5045124005170139736

Conversation

@hahn-kev

@hahn-kevhahn-kev commented Jun 11, 2026

Copy link
Copy Markdown
Collaborator

This change implements issue #70 by preventing clients from setting the CommitId when adding changes. Commit IDs are now always generated internally to avoid potential synchronization issues where multiple clients might use the same ID with different timestamps.

Key changes:

  • DataModel.AddChange and AddChanges no longer accept a commitId.
  • IChange.CommitId property was removed.
  • ToChangeEntity was updated to accept the commitId explicitly.
  • Relevant tests were updated to declare variables correctly or remove obsolete tests.

PR created automatically by Jules for task 5045124005170139736 started by @hahn-kev

Summary by CodeRabbit

  • Refactor
    • Simplified the data model's change-addition API by removing the requirement to manually specify commit IDs. Commit identification is now generated and managed internally, reducing API complexity and streamlining integration.

- Removed commitId parameter from DataModel.AddChange and AddChanges
- Removed CommitId property from IChange interface and implementations
- Updated tests to match the new API
- Removed tests that relied on client-provided commitId
Co-authored-by: hahn-kev <4575355+hahn-kev@users.noreply.github.com>
@coderabbitai

coderabbitaiBot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1ff56eea-5160-4c9f-b22d-fdfd80c04e0f

📥 Commits

Reviewing files that changed from the base of the PR and between 31dc78b and 8c876ee.

📒 Files selected for processing (7)
  • src/SIL.Harmony.Tests/CommitTests.cs
  • src/SIL.Harmony.Tests/DataModelIntegrityTests.cs
  • src/SIL.Harmony.Tests/DataModelPerformanceTests.cs
  • src/SIL.Harmony.Tests/DataModelTestBase.cs
  • src/SIL.Harmony.Tests/PersistExtraDataTests.cs
  • src/SIL.Harmony/Changes/Change.cs
  • src/SIL.Harmony/DataModel.cs
💤 Files with no reviewable changes (2)
  • src/SIL.Harmony.Tests/DataModelIntegrityTests.cs
  • src/SIL.Harmony/Changes/Change.cs

📝 Walkthrough

Walkthrough

The PR removes CommitId from the IChange contract and refactors how commit identity is assigned. The DataModel API no longer accepts explicit commit IDs at call sites; instead, commits generate their own identity, and ChangeEntity objects receive the CommitId from the owning Commit object. Tests are updated to reflect the new construction patterns and obsolete commit-id-passing logic is removed.

Changes

CommitId Removal and Commit-ID Assignment Refactor

Layer / File(s)Summary
Remove CommitId from IChange contract
src/SIL.Harmony/Changes/Change.cs
IChange interface and Change<T> class no longer declare the CommitId property, eliminating the ability for individual changes to store or carry commit identity.
Refactor DataModel commit-creation API
src/SIL.Harmony/DataModel.cs
AddChange and AddChanges methods remove the commitId parameter; NewCommit no longer accepts explicit commit ID and instead relies on Commit object creation. ToChangeEntity now receives the owning commitId and assigns it directly to the change entity rather than reading from the change itself.
Update test commit and change-entity construction
src/SIL.Harmony.Tests/CommitTests.cs, src/SIL.Harmony.Tests/DataModelTestBase.cs
Test methods now build Commit objects using empty initializers and populate ChangeEntities via Add/AddRange methods with the generated Commit.Id, instead of inline collection initializers that relied on change.CommitId.
Test cleanup and property updates
src/SIL.Harmony.Tests/DataModelIntegrityTests.cs, src/SIL.Harmony.Tests/DataModelPerformanceTests.cs, src/SIL.Harmony.Tests/PersistExtraDataTests.cs
Remove obsolete test method CanAddTheSameCommitMultipleTimes, fix HybridDateTime formatting, and rename ExtraDataModel.CommitId to LastCommitId with corresponding updates to the Copy() method and test assertions.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • sillsdev/harmony#71: Adjusts EditChange.NewEntity's exception message to reference CommitId, which is now removed from the contract and affects how this message can be constructed.
  • sillsdev/harmony#43: Also modifies DataModel.AddChanges and commit/change-entity construction logic; overlaps with this PR's refactoring of commit-id assignment and ChangeEntity creation.

Suggested reviewers

  • myieye

Poem

🐰 No more CommitId in Change,
Commit now owns the range!
Tests adjust their dance,
IDs find their stance—
A cleaner contract, clear and strange.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 15.38% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe PR title 'Prevent clients from setting CommitId' directly and clearly describes the main change: removing the ability for clients to provide CommitId values when adding changes.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

…24005170139736
# Conflicts:
#	src/SIL.Harmony/DataModel.cs

@myieyemyieye left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, except:

  • I feel like we should hold onto the deleted test
  • It kind of looks like you were maybe considering totally removing the Commit constructor that accepts a Guid? If you used it, a bunch of your diffs could shrink, but that's just a question of code style.

Comment threadsrc/SIL.Harmony.Tests/DataModelIntegrityTests.cs
Comment threadsrc/SIL.Harmony.Tests/DataModelPerformanceTests.cs
Comment threadsrc/SIL.Harmony/DataModel.cs
@hahn-kev
hahn-kev merged commit bfb23a1 into sillsdev:mainJun 12, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@hahn-kev@myieye
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Prevent clients from setting CommitId - #73

Merged
hahn-kev merged 3 commits into
sillsdev:mainfrom
hahn-kev:prevent-client-commit-id-5045124005170139736
Jun 12, 2026
Merged

Prevent clients from setting CommitId#73
hahn-kev merged 3 commits into
sillsdev:mainfrom
hahn-kev:prevent-client-commit-id-5045124005170139736

Conversation

@hahn-kev

@hahn-kevhahn-kev commented Jun 11, 2026

Copy link
Copy Markdown
Collaborator

This change implements issue #70 by preventing clients from setting the CommitId when adding changes. Commit IDs are now always generated internally to avoid potential synchronization issues where multiple clients might use the same ID with different timestamps.

Key changes:

  • DataModel.AddChange and AddChanges no longer accept a commitId.
  • IChange.CommitId property was removed.
  • ToChangeEntity was updated to accept the commitId explicitly.
  • Relevant tests were updated to declare variables correctly or remove obsolete tests.

PR created automatically by Jules for task 5045124005170139736 started by @hahn-kev

Summary by CodeRabbit

  • Refactor
    • Simplified the data model's change-addition API by removing the requirement to manually specify commit IDs. Commit identification is now generated and managed internally, reducing API complexity and streamlining integration.

- Removed commitId parameter from DataModel.AddChange and AddChanges
- Removed CommitId property from IChange interface and implementations
- Updated tests to match the new API
- Removed tests that relied on client-provided commitId
Co-authored-by: hahn-kev <4575355+hahn-kev@users.noreply.github.com>
@coderabbitai

coderabbitaiBot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1ff56eea-5160-4c9f-b22d-fdfd80c04e0f

📥 Commits

Reviewing files that changed from the base of the PR and between 31dc78b and 8c876ee.

📒 Files selected for processing (7)
  • src/SIL.Harmony.Tests/CommitTests.cs
  • src/SIL.Harmony.Tests/DataModelIntegrityTests.cs
  • src/SIL.Harmony.Tests/DataModelPerformanceTests.cs
  • src/SIL.Harmony.Tests/DataModelTestBase.cs
  • src/SIL.Harmony.Tests/PersistExtraDataTests.cs
  • src/SIL.Harmony/Changes/Change.cs
  • src/SIL.Harmony/DataModel.cs
💤 Files with no reviewable changes (2)
  • src/SIL.Harmony.Tests/DataModelIntegrityTests.cs
  • src/SIL.Harmony/Changes/Change.cs

📝 Walkthrough

Walkthrough

The PR removes CommitId from the IChange contract and refactors how commit identity is assigned. The DataModel API no longer accepts explicit commit IDs at call sites; instead, commits generate their own identity, and ChangeEntity objects receive the CommitId from the owning Commit object. Tests are updated to reflect the new construction patterns and obsolete commit-id-passing logic is removed.

Changes

CommitId Removal and Commit-ID Assignment Refactor

Layer / File(s)Summary
Remove CommitId from IChange contract
src/SIL.Harmony/Changes/Change.cs
IChange interface and Change<T> class no longer declare the CommitId property, eliminating the ability for individual changes to store or carry commit identity.
Refactor DataModel commit-creation API
src/SIL.Harmony/DataModel.cs
AddChange and AddChanges methods remove the commitId parameter; NewCommit no longer accepts explicit commit ID and instead relies on Commit object creation. ToChangeEntity now receives the owning commitId and assigns it directly to the change entity rather than reading from the change itself.
Update test commit and change-entity construction
src/SIL.Harmony.Tests/CommitTests.cs, src/SIL.Harmony.Tests/DataModelTestBase.cs
Test methods now build Commit objects using empty initializers and populate ChangeEntities via Add/AddRange methods with the generated Commit.Id, instead of inline collection initializers that relied on change.CommitId.
Test cleanup and property updates
src/SIL.Harmony.Tests/DataModelIntegrityTests.cs, src/SIL.Harmony.Tests/DataModelPerformanceTests.cs, src/SIL.Harmony.Tests/PersistExtraDataTests.cs
Remove obsolete test method CanAddTheSameCommitMultipleTimes, fix HybridDateTime formatting, and rename ExtraDataModel.CommitId to LastCommitId with corresponding updates to the Copy() method and test assertions.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • sillsdev/harmony#71: Adjusts EditChange.NewEntity's exception message to reference CommitId, which is now removed from the contract and affects how this message can be constructed.
  • sillsdev/harmony#43: Also modifies DataModel.AddChanges and commit/change-entity construction logic; overlaps with this PR's refactoring of commit-id assignment and ChangeEntity creation.

Suggested reviewers

  • myieye

Poem

🐰 No more CommitId in Change,
Commit now owns the range!
Tests adjust their dance,
IDs find their stance—
A cleaner contract, clear and strange.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 15.38% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe PR title 'Prevent clients from setting CommitId' directly and clearly describes the main change: removing the ability for clients to provide CommitId values when adding changes.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

…24005170139736
# Conflicts:
#	src/SIL.Harmony/DataModel.cs

@myieyemyieye left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, except:

  • I feel like we should hold onto the deleted test
  • It kind of looks like you were maybe considering totally removing the Commit constructor that accepts a Guid? If you used it, a bunch of your diffs could shrink, but that's just a question of code style.

Comment threadsrc/SIL.Harmony.Tests/DataModelIntegrityTests.cs
Comment threadsrc/SIL.Harmony.Tests/DataModelPerformanceTests.cs
Comment threadsrc/SIL.Harmony/DataModel.cs
@hahn-kev
hahn-kev merged commit bfb23a1 into sillsdev:mainJun 12, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@hahn-kev@myieye
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Prevent clients from setting CommitId - #73

Merged
hahn-kev merged 3 commits into
sillsdev:mainfrom
hahn-kev:prevent-client-commit-id-5045124005170139736
Jun 12, 2026
Merged

Prevent clients from setting CommitId#73
hahn-kev merged 3 commits into
sillsdev:mainfrom
hahn-kev:prevent-client-commit-id-5045124005170139736

Conversation

@hahn-kev

@hahn-kevhahn-kev commented Jun 11, 2026

Copy link
Copy Markdown
Collaborator

This change implements issue #70 by preventing clients from setting the CommitId when adding changes. Commit IDs are now always generated internally to avoid potential synchronization issues where multiple clients might use the same ID with different timestamps.

Key changes:

  • DataModel.AddChange and AddChanges no longer accept a commitId.
  • IChange.CommitId property was removed.
  • ToChangeEntity was updated to accept the commitId explicitly.
  • Relevant tests were updated to declare variables correctly or remove obsolete tests.

PR created automatically by Jules for task 5045124005170139736 started by @hahn-kev

Summary by CodeRabbit

  • Refactor
    • Simplified the data model's change-addition API by removing the requirement to manually specify commit IDs. Commit identification is now generated and managed internally, reducing API complexity and streamlining integration.

- Removed commitId parameter from DataModel.AddChange and AddChanges
- Removed CommitId property from IChange interface and implementations
- Updated tests to match the new API
- Removed tests that relied on client-provided commitId
Co-authored-by: hahn-kev <4575355+hahn-kev@users.noreply.github.com>
@coderabbitai

coderabbitaiBot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1ff56eea-5160-4c9f-b22d-fdfd80c04e0f

📥 Commits

Reviewing files that changed from the base of the PR and between 31dc78b and 8c876ee.

📒 Files selected for processing (7)
  • src/SIL.Harmony.Tests/CommitTests.cs
  • src/SIL.Harmony.Tests/DataModelIntegrityTests.cs
  • src/SIL.Harmony.Tests/DataModelPerformanceTests.cs
  • src/SIL.Harmony.Tests/DataModelTestBase.cs
  • src/SIL.Harmony.Tests/PersistExtraDataTests.cs
  • src/SIL.Harmony/Changes/Change.cs
  • src/SIL.Harmony/DataModel.cs
💤 Files with no reviewable changes (2)
  • src/SIL.Harmony.Tests/DataModelIntegrityTests.cs
  • src/SIL.Harmony/Changes/Change.cs

📝 Walkthrough

Walkthrough

The PR removes CommitId from the IChange contract and refactors how commit identity is assigned. The DataModel API no longer accepts explicit commit IDs at call sites; instead, commits generate their own identity, and ChangeEntity objects receive the CommitId from the owning Commit object. Tests are updated to reflect the new construction patterns and obsolete commit-id-passing logic is removed.

Changes

CommitId Removal and Commit-ID Assignment Refactor

Layer / File(s)Summary
Remove CommitId from IChange contract
src/SIL.Harmony/Changes/Change.cs
IChange interface and Change<T> class no longer declare the CommitId property, eliminating the ability for individual changes to store or carry commit identity.
Refactor DataModel commit-creation API
src/SIL.Harmony/DataModel.cs
AddChange and AddChanges methods remove the commitId parameter; NewCommit no longer accepts explicit commit ID and instead relies on Commit object creation. ToChangeEntity now receives the owning commitId and assigns it directly to the change entity rather than reading from the change itself.
Update test commit and change-entity construction
src/SIL.Harmony.Tests/CommitTests.cs, src/SIL.Harmony.Tests/DataModelTestBase.cs
Test methods now build Commit objects using empty initializers and populate ChangeEntities via Add/AddRange methods with the generated Commit.Id, instead of inline collection initializers that relied on change.CommitId.
Test cleanup and property updates
src/SIL.Harmony.Tests/DataModelIntegrityTests.cs, src/SIL.Harmony.Tests/DataModelPerformanceTests.cs, src/SIL.Harmony.Tests/PersistExtraDataTests.cs
Remove obsolete test method CanAddTheSameCommitMultipleTimes, fix HybridDateTime formatting, and rename ExtraDataModel.CommitId to LastCommitId with corresponding updates to the Copy() method and test assertions.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • sillsdev/harmony#71: Adjusts EditChange.NewEntity's exception message to reference CommitId, which is now removed from the contract and affects how this message can be constructed.
  • sillsdev/harmony#43: Also modifies DataModel.AddChanges and commit/change-entity construction logic; overlaps with this PR's refactoring of commit-id assignment and ChangeEntity creation.

Suggested reviewers

  • myieye

Poem

🐰 No more CommitId in Change,
Commit now owns the range!
Tests adjust their dance,
IDs find their stance—
A cleaner contract, clear and strange.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 15.38% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe PR title 'Prevent clients from setting CommitId' directly and clearly describes the main change: removing the ability for clients to provide CommitId values when adding changes.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

…24005170139736
# Conflicts:
#	src/SIL.Harmony/DataModel.cs

@myieyemyieye left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, except:

  • I feel like we should hold onto the deleted test
  • It kind of looks like you were maybe considering totally removing the Commit constructor that accepts a Guid? If you used it, a bunch of your diffs could shrink, but that's just a question of code style.

Comment threadsrc/SIL.Harmony.Tests/DataModelIntegrityTests.cs
Comment threadsrc/SIL.Harmony.Tests/DataModelPerformanceTests.cs
Comment threadsrc/SIL.Harmony/DataModel.cs
@hahn-kev
hahn-kev merged commit bfb23a1 into sillsdev:mainJun 12, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@hahn-kev@myieye
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Prevent clients from setting CommitId - #73

Merged
hahn-kev merged 3 commits into
sillsdev:mainfrom
hahn-kev:prevent-client-commit-id-5045124005170139736
Jun 12, 2026
Merged

Prevent clients from setting CommitId#73
hahn-kev merged 3 commits into
sillsdev:mainfrom
hahn-kev:prevent-client-commit-id-5045124005170139736

Conversation

@hahn-kev

@hahn-kevhahn-kev commented Jun 11, 2026

Copy link
Copy Markdown
Collaborator

This change implements issue #70 by preventing clients from setting the CommitId when adding changes. Commit IDs are now always generated internally to avoid potential synchronization issues where multiple clients might use the same ID with different timestamps.

Key changes:

  • DataModel.AddChange and AddChanges no longer accept a commitId.
  • IChange.CommitId property was removed.
  • ToChangeEntity was updated to accept the commitId explicitly.
  • Relevant tests were updated to declare variables correctly or remove obsolete tests.

PR created automatically by Jules for task 5045124005170139736 started by @hahn-kev

Summary by CodeRabbit

  • Refactor
    • Simplified the data model's change-addition API by removing the requirement to manually specify commit IDs. Commit identification is now generated and managed internally, reducing API complexity and streamlining integration.

- Removed commitId parameter from DataModel.AddChange and AddChanges
- Removed CommitId property from IChange interface and implementations
- Updated tests to match the new API
- Removed tests that relied on client-provided commitId
Co-authored-by: hahn-kev <4575355+hahn-kev@users.noreply.github.com>
@coderabbitai

coderabbitaiBot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1ff56eea-5160-4c9f-b22d-fdfd80c04e0f

📥 Commits

Reviewing files that changed from the base of the PR and between 31dc78b and 8c876ee.

📒 Files selected for processing (7)
  • src/SIL.Harmony.Tests/CommitTests.cs
  • src/SIL.Harmony.Tests/DataModelIntegrityTests.cs
  • src/SIL.Harmony.Tests/DataModelPerformanceTests.cs
  • src/SIL.Harmony.Tests/DataModelTestBase.cs
  • src/SIL.Harmony.Tests/PersistExtraDataTests.cs
  • src/SIL.Harmony/Changes/Change.cs
  • src/SIL.Harmony/DataModel.cs
💤 Files with no reviewable changes (2)
  • src/SIL.Harmony.Tests/DataModelIntegrityTests.cs
  • src/SIL.Harmony/Changes/Change.cs

📝 Walkthrough

Walkthrough

The PR removes CommitId from the IChange contract and refactors how commit identity is assigned. The DataModel API no longer accepts explicit commit IDs at call sites; instead, commits generate their own identity, and ChangeEntity objects receive the CommitId from the owning Commit object. Tests are updated to reflect the new construction patterns and obsolete commit-id-passing logic is removed.

Changes

CommitId Removal and Commit-ID Assignment Refactor

Layer / File(s)Summary
Remove CommitId from IChange contract
src/SIL.Harmony/Changes/Change.cs
IChange interface and Change<T> class no longer declare the CommitId property, eliminating the ability for individual changes to store or carry commit identity.
Refactor DataModel commit-creation API
src/SIL.Harmony/DataModel.cs
AddChange and AddChanges methods remove the commitId parameter; NewCommit no longer accepts explicit commit ID and instead relies on Commit object creation. ToChangeEntity now receives the owning commitId and assigns it directly to the change entity rather than reading from the change itself.
Update test commit and change-entity construction
src/SIL.Harmony.Tests/CommitTests.cs, src/SIL.Harmony.Tests/DataModelTestBase.cs
Test methods now build Commit objects using empty initializers and populate ChangeEntities via Add/AddRange methods with the generated Commit.Id, instead of inline collection initializers that relied on change.CommitId.
Test cleanup and property updates
src/SIL.Harmony.Tests/DataModelIntegrityTests.cs, src/SIL.Harmony.Tests/DataModelPerformanceTests.cs, src/SIL.Harmony.Tests/PersistExtraDataTests.cs
Remove obsolete test method CanAddTheSameCommitMultipleTimes, fix HybridDateTime formatting, and rename ExtraDataModel.CommitId to LastCommitId with corresponding updates to the Copy() method and test assertions.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • sillsdev/harmony#71: Adjusts EditChange.NewEntity's exception message to reference CommitId, which is now removed from the contract and affects how this message can be constructed.
  • sillsdev/harmony#43: Also modifies DataModel.AddChanges and commit/change-entity construction logic; overlaps with this PR's refactoring of commit-id assignment and ChangeEntity creation.

Suggested reviewers

  • myieye

Poem

🐰 No more CommitId in Change,
Commit now owns the range!
Tests adjust their dance,
IDs find their stance—
A cleaner contract, clear and strange.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 15.38% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe PR title 'Prevent clients from setting CommitId' directly and clearly describes the main change: removing the ability for clients to provide CommitId values when adding changes.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

…24005170139736
# Conflicts:
#	src/SIL.Harmony/DataModel.cs

@myieyemyieye left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, except:

  • I feel like we should hold onto the deleted test
  • It kind of looks like you were maybe considering totally removing the Commit constructor that accepts a Guid? If you used it, a bunch of your diffs could shrink, but that's just a question of code style.

Comment threadsrc/SIL.Harmony.Tests/DataModelIntegrityTests.cs
Comment threadsrc/SIL.Harmony.Tests/DataModelPerformanceTests.cs
Comment threadsrc/SIL.Harmony/DataModel.cs
@hahn-kev
hahn-kev merged commit bfb23a1 into sillsdev:mainJun 12, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@hahn-kev@myieye
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Prevent clients from setting CommitId - #73

Merged
hahn-kev merged 3 commits into
sillsdev:mainfrom
hahn-kev:prevent-client-commit-id-5045124005170139736
Jun 12, 2026
Merged

Prevent clients from setting CommitId#73
hahn-kev merged 3 commits into
sillsdev:mainfrom
hahn-kev:prevent-client-commit-id-5045124005170139736

Conversation

@hahn-kev

@hahn-kevhahn-kev commented Jun 11, 2026

Copy link
Copy Markdown
Collaborator

This change implements issue #70 by preventing clients from setting the CommitId when adding changes. Commit IDs are now always generated internally to avoid potential synchronization issues where multiple clients might use the same ID with different timestamps.

Key changes:

  • DataModel.AddChange and AddChanges no longer accept a commitId.
  • IChange.CommitId property was removed.
  • ToChangeEntity was updated to accept the commitId explicitly.
  • Relevant tests were updated to declare variables correctly or remove obsolete tests.

PR created automatically by Jules for task 5045124005170139736 started by @hahn-kev

Summary by CodeRabbit

  • Refactor
    • Simplified the data model's change-addition API by removing the requirement to manually specify commit IDs. Commit identification is now generated and managed internally, reducing API complexity and streamlining integration.

- Removed commitId parameter from DataModel.AddChange and AddChanges
- Removed CommitId property from IChange interface and implementations
- Updated tests to match the new API
- Removed tests that relied on client-provided commitId
Co-authored-by: hahn-kev <4575355+hahn-kev@users.noreply.github.com>
@coderabbitai

coderabbitaiBot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1ff56eea-5160-4c9f-b22d-fdfd80c04e0f

📥 Commits

Reviewing files that changed from the base of the PR and between 31dc78b and 8c876ee.

📒 Files selected for processing (7)
  • src/SIL.Harmony.Tests/CommitTests.cs
  • src/SIL.Harmony.Tests/DataModelIntegrityTests.cs
  • src/SIL.Harmony.Tests/DataModelPerformanceTests.cs
  • src/SIL.Harmony.Tests/DataModelTestBase.cs
  • src/SIL.Harmony.Tests/PersistExtraDataTests.cs
  • src/SIL.Harmony/Changes/Change.cs
  • src/SIL.Harmony/DataModel.cs
💤 Files with no reviewable changes (2)
  • src/SIL.Harmony.Tests/DataModelIntegrityTests.cs
  • src/SIL.Harmony/Changes/Change.cs

📝 Walkthrough

Walkthrough

The PR removes CommitId from the IChange contract and refactors how commit identity is assigned. The DataModel API no longer accepts explicit commit IDs at call sites; instead, commits generate their own identity, and ChangeEntity objects receive the CommitId from the owning Commit object. Tests are updated to reflect the new construction patterns and obsolete commit-id-passing logic is removed.

Changes

CommitId Removal and Commit-ID Assignment Refactor

Layer / File(s)Summary
Remove CommitId from IChange contract
src/SIL.Harmony/Changes/Change.cs
IChange interface and Change<T> class no longer declare the CommitId property, eliminating the ability for individual changes to store or carry commit identity.
Refactor DataModel commit-creation API
src/SIL.Harmony/DataModel.cs
AddChange and AddChanges methods remove the commitId parameter; NewCommit no longer accepts explicit commit ID and instead relies on Commit object creation. ToChangeEntity now receives the owning commitId and assigns it directly to the change entity rather than reading from the change itself.
Update test commit and change-entity construction
src/SIL.Harmony.Tests/CommitTests.cs, src/SIL.Harmony.Tests/DataModelTestBase.cs
Test methods now build Commit objects using empty initializers and populate ChangeEntities via Add/AddRange methods with the generated Commit.Id, instead of inline collection initializers that relied on change.CommitId.
Test cleanup and property updates
src/SIL.Harmony.Tests/DataModelIntegrityTests.cs, src/SIL.Harmony.Tests/DataModelPerformanceTests.cs, src/SIL.Harmony.Tests/PersistExtraDataTests.cs
Remove obsolete test method CanAddTheSameCommitMultipleTimes, fix HybridDateTime formatting, and rename ExtraDataModel.CommitId to LastCommitId with corresponding updates to the Copy() method and test assertions.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • sillsdev/harmony#71: Adjusts EditChange.NewEntity's exception message to reference CommitId, which is now removed from the contract and affects how this message can be constructed.
  • sillsdev/harmony#43: Also modifies DataModel.AddChanges and commit/change-entity construction logic; overlaps with this PR's refactoring of commit-id assignment and ChangeEntity creation.

Suggested reviewers

  • myieye

Poem

🐰 No more CommitId in Change,
Commit now owns the range!
Tests adjust their dance,
IDs find their stance—
A cleaner contract, clear and strange.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 15.38% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe PR title 'Prevent clients from setting CommitId' directly and clearly describes the main change: removing the ability for clients to provide CommitId values when adding changes.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

…24005170139736
# Conflicts:
#	src/SIL.Harmony/DataModel.cs

@myieyemyieye left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, except:

  • I feel like we should hold onto the deleted test
  • It kind of looks like you were maybe considering totally removing the Commit constructor that accepts a Guid? If you used it, a bunch of your diffs could shrink, but that's just a question of code style.

Comment threadsrc/SIL.Harmony.Tests/DataModelIntegrityTests.cs
Comment threadsrc/SIL.Harmony.Tests/DataModelPerformanceTests.cs
Comment threadsrc/SIL.Harmony/DataModel.cs
@hahn-kev
hahn-kev merged commit bfb23a1 into sillsdev:mainJun 12, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@hahn-kev@myieye
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Prevent clients from setting CommitId - #73

Merged
hahn-kev merged 3 commits into
sillsdev:mainfrom
hahn-kev:prevent-client-commit-id-5045124005170139736
Jun 12, 2026
Merged

Prevent clients from setting CommitId#73
hahn-kev merged 3 commits into
sillsdev:mainfrom
hahn-kev:prevent-client-commit-id-5045124005170139736

Conversation

@hahn-kev

@hahn-kevhahn-kev commented Jun 11, 2026

Copy link
Copy Markdown
Collaborator

This change implements issue #70 by preventing clients from setting the CommitId when adding changes. Commit IDs are now always generated internally to avoid potential synchronization issues where multiple clients might use the same ID with different timestamps.

Key changes:

  • DataModel.AddChange and AddChanges no longer accept a commitId.
  • IChange.CommitId property was removed.
  • ToChangeEntity was updated to accept the commitId explicitly.
  • Relevant tests were updated to declare variables correctly or remove obsolete tests.

PR created automatically by Jules for task 5045124005170139736 started by @hahn-kev

Summary by CodeRabbit

  • Refactor
    • Simplified the data model's change-addition API by removing the requirement to manually specify commit IDs. Commit identification is now generated and managed internally, reducing API complexity and streamlining integration.

- Removed commitId parameter from DataModel.AddChange and AddChanges
- Removed CommitId property from IChange interface and implementations
- Updated tests to match the new API
- Removed tests that relied on client-provided commitId
Co-authored-by: hahn-kev <4575355+hahn-kev@users.noreply.github.com>
@coderabbitai

coderabbitaiBot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1ff56eea-5160-4c9f-b22d-fdfd80c04e0f

📥 Commits

Reviewing files that changed from the base of the PR and between 31dc78b and 8c876ee.

📒 Files selected for processing (7)
  • src/SIL.Harmony.Tests/CommitTests.cs
  • src/SIL.Harmony.Tests/DataModelIntegrityTests.cs
  • src/SIL.Harmony.Tests/DataModelPerformanceTests.cs
  • src/SIL.Harmony.Tests/DataModelTestBase.cs
  • src/SIL.Harmony.Tests/PersistExtraDataTests.cs
  • src/SIL.Harmony/Changes/Change.cs
  • src/SIL.Harmony/DataModel.cs
💤 Files with no reviewable changes (2)
  • src/SIL.Harmony.Tests/DataModelIntegrityTests.cs
  • src/SIL.Harmony/Changes/Change.cs

📝 Walkthrough

Walkthrough

The PR removes CommitId from the IChange contract and refactors how commit identity is assigned. The DataModel API no longer accepts explicit commit IDs at call sites; instead, commits generate their own identity, and ChangeEntity objects receive the CommitId from the owning Commit object. Tests are updated to reflect the new construction patterns and obsolete commit-id-passing logic is removed.

Changes

CommitId Removal and Commit-ID Assignment Refactor

Layer / File(s)Summary
Remove CommitId from IChange contract
src/SIL.Harmony/Changes/Change.cs
IChange interface and Change<T> class no longer declare the CommitId property, eliminating the ability for individual changes to store or carry commit identity.
Refactor DataModel commit-creation API
src/SIL.Harmony/DataModel.cs
AddChange and AddChanges methods remove the commitId parameter; NewCommit no longer accepts explicit commit ID and instead relies on Commit object creation. ToChangeEntity now receives the owning commitId and assigns it directly to the change entity rather than reading from the change itself.
Update test commit and change-entity construction
src/SIL.Harmony.Tests/CommitTests.cs, src/SIL.Harmony.Tests/DataModelTestBase.cs
Test methods now build Commit objects using empty initializers and populate ChangeEntities via Add/AddRange methods with the generated Commit.Id, instead of inline collection initializers that relied on change.CommitId.
Test cleanup and property updates
src/SIL.Harmony.Tests/DataModelIntegrityTests.cs, src/SIL.Harmony.Tests/DataModelPerformanceTests.cs, src/SIL.Harmony.Tests/PersistExtraDataTests.cs
Remove obsolete test method CanAddTheSameCommitMultipleTimes, fix HybridDateTime formatting, and rename ExtraDataModel.CommitId to LastCommitId with corresponding updates to the Copy() method and test assertions.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • sillsdev/harmony#71: Adjusts EditChange.NewEntity's exception message to reference CommitId, which is now removed from the contract and affects how this message can be constructed.
  • sillsdev/harmony#43: Also modifies DataModel.AddChanges and commit/change-entity construction logic; overlaps with this PR's refactoring of commit-id assignment and ChangeEntity creation.

Suggested reviewers

  • myieye

Poem

🐰 No more CommitId in Change,
Commit now owns the range!
Tests adjust their dance,
IDs find their stance—
A cleaner contract, clear and strange.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 15.38% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe PR title 'Prevent clients from setting CommitId' directly and clearly describes the main change: removing the ability for clients to provide CommitId values when adding changes.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

…24005170139736
# Conflicts:
#	src/SIL.Harmony/DataModel.cs

@myieyemyieye left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, except:

  • I feel like we should hold onto the deleted test
  • It kind of looks like you were maybe considering totally removing the Commit constructor that accepts a Guid? If you used it, a bunch of your diffs could shrink, but that's just a question of code style.

Comment threadsrc/SIL.Harmony.Tests/DataModelIntegrityTests.cs
Comment threadsrc/SIL.Harmony.Tests/DataModelPerformanceTests.cs
Comment threadsrc/SIL.Harmony/DataModel.cs
@hahn-kev
hahn-kev merged commit bfb23a1 into sillsdev:mainJun 12, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@hahn-kev@myieye