Repository navigation
ADFA-365 - Project build Test for empty project and compose project - #9
Merged
Merged
Conversation
jatezzz
pushed a commit
that referenced
this pull request
Jun 22, 2026
ADFA-365 - Project build Test for empty project and compose project
jatezzz
added a commit
that referenced
this pull request
Jul 17, 2026
Fan-out, adapter, and plugin-API fixes from the ProjectSearchExtension review: - Guard plugin results against null elements (mapNotNull) and wrap the collection block in a logging try/catch so a bad element no longer kills the whole fan-out silently. (#1) - buildRows buffers each section's rows and emits the header only when a group exists, skipping blank titles -- no more orphan/blank headers suppressing the empty state. (#2) - Move the fan-out to lifecycleScope so a slow plugin can't pin a destroyed Activity/ViewModel or post to a dead Activity. (#3) - Keep the search progress indicator up when the built-in search is empty but plugins are enabled, so a plugin-only match doesn't flash a terminal "no results" state. (#4) - SearchListAdapter is now a ListAdapter + DiffUtil reused across emissions; the two-phase publish diffs instead of reallocating, preserving scroll and already-run highlights. (#5) - Collapse the adapter constructors to one clicks ctor plus a thin map convenience ctor; drop the dead keys param and nullable-value scrub. (#6) - Replace the blocking .get(10s) with a non-blocking withTimeoutOrNull + await so no commonPool worker is tied up. (#7) - Trim pipe-split filter tokens at the source (endsWith(" kt") matched nothing in built-in search too); align ProjectSearchExtension KDoc with actual behavior and drop the non-ASCII em-dash. (#9, #10)
jatezzz
added a commit
that referenced
this pull request
Jul 20, 2026
Fan-out, adapter, and plugin-API fixes from the ProjectSearchExtension review: - Guard plugin results against null elements (mapNotNull) and wrap the collection block in a logging try/catch so a bad element no longer kills the whole fan-out silently. (#1) - buildRows buffers each section's rows and emits the header only when a group exists, skipping blank titles -- no more orphan/blank headers suppressing the empty state. (#2) - Move the fan-out to lifecycleScope so a slow plugin can't pin a destroyed Activity/ViewModel or post to a dead Activity. (#3) - Keep the search progress indicator up when the built-in search is empty but plugins are enabled, so a plugin-only match doesn't flash a terminal "no results" state. (#4) - SearchListAdapter is now a ListAdapter + DiffUtil reused across emissions; the two-phase publish diffs instead of reallocating, preserving scroll and already-run highlights. (#5) - Collapse the adapter constructors to one clicks ctor plus a thin map convenience ctor; drop the dead keys param and nullable-value scrub. (#6) - Replace the blocking .get(10s) with a non-blocking withTimeoutOrNull + await so no commonPool worker is tied up. (#7) - Trim pipe-split filter tokens at the source (endsWith(" kt") matched nothing in built-in search too); align ProjectSearchExtension KDoc with actual behavior and drop the non-ASCII em-dash. (#9, #10)
jatezzz
added a commit
that referenced
this pull request
Jul 20, 2026
…#1528) * feat(search): add ProjectSearchExtension API for plugin result sections Fan out to enabled plugins after built-in search and render their sections. * style: apply spotless formatting to search extension files * fix(search): address review findings on plugin search extension - Bound plugin search fan-out with a 10s timeout and drop results from superseded searches via a generation counter in EditorViewModel - Guard against Java plugins completing their future with null - Flatten SearchListAdapter's nested RecyclerView into Row.Match rows so match rows recycle instead of inflating all at once - Narrow catch(Throwable) to catch(Exception) per REVIEW.md - Document plugin-api search contract types; coordinates are 0-based, end-exclusive - Marshal plugin crash recording to the UI thread and drop the unread searchResults flow. * fix(search): address review feedback on search results list - Make the group row's LinearLayout the layout root so the click listener on binding.root receives taps (the clickable child was consuming them) and drop the redundant RelativeLayout wrapper - Log highlight failures via SLF4J and keep the plain-text preview instead of overwriting the line with the matched text - Skip files with empty match lists to avoid dangling group headers - Hide the decorative file icon from accessibility services * fix(search): address code-review findings on plugin search Fan-out, adapter, and plugin-API fixes from the ProjectSearchExtension review: - Guard plugin results against null elements (mapNotNull) and wrap the collection block in a logging try/catch so a bad element no longer kills the whole fan-out silently. (#1) - buildRows buffers each section's rows and emits the header only when a group exists, skipping blank titles -- no more orphan/blank headers suppressing the empty state. (#2) - Move the fan-out to lifecycleScope so a slow plugin can't pin a destroyed Activity/ViewModel or post to a dead Activity. (#3) - Keep the search progress indicator up when the built-in search is empty but plugins are enabled, so a plugin-only match doesn't flash a terminal "no results" state. (#4) - SearchListAdapter is now a ListAdapter + DiffUtil reused across emissions; the two-phase publish diffs instead of reallocating, preserving scroll and already-run highlights. (#5) - Collapse the adapter constructors to one clicks ctor plus a thin map convenience ctor; drop the dead keys param and nullable-value scrub. (#6) - Replace the blocking .get(10s) with a non-blocking withTimeoutOrNull + await so no commonPool worker is tied up. (#7) - Trim pipe-split filter tokens at the source (endsWith(" kt") matched nothing in built-in search too); align ProjectSearchExtension KDoc with actual behavior and drop the non-ASCII em-dash. (#9, #10) * style(search): expand when branches to block form for ktlint Spotless ratchets from origin/stage; stage was reformatted after this branch diverged, so CI flagged the single-expression when branches in onUpdateWadbConnectionStatus and the multi-line FileOpResult.Success branch. Expand them to ktlint's canonical block form so the file is fully canonical and passes under any ratchet base. * fix: reported violations for spotless
fryanpan
added a commit
that referenced
this pull request
Sep 5, 2026
absorbEchoesLocked treated a held ChangedFiles.Unknown as "every file is already held" and skipped the granularity margin for all of them. After an external Gradle build untrusted the baseline (pending = Unknown) and a rebuild started, a .kt saved 0.5 s into the rebuild on a 1 s-mtime filesystem stamped a whole second before the start, was absorbed, and onBaselineReset dropped it - the edit was never built. An Unknown held set names no file, so nothing proves an arrival is an echo; only an enumerated held set keeps the exact cutoff. New test pins the Unknown case; a second new test pins the margin's upper bound (an 8_000 stamp against a 10_000 start absorbs), which with the existing 9_000 case fixes the constant at 2 s. Adversarial review 2026-09-04, finding #9 on 60d5a27ca. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XkGof8cLt23LkxZ8MKzin2
fryanpan
added a commit
that referenced
this pull request
Sep 6, 2026
absorbEchoesLocked treated a held ChangedFiles.Unknown as "every file is already held" and skipped the granularity margin for all of them. After an external Gradle build untrusted the baseline (pending = Unknown) and a rebuild started, a .kt saved 0.5 s into the rebuild on a 1 s-mtime filesystem stamped a whole second before the start, was absorbed, and onBaselineReset dropped it - the edit was never built. An Unknown held set names no file, so nothing proves an arrival is an echo; only an enumerated held set keeps the exact cutoff. New test pins the Unknown case; a second new test pins the margin's upper bound (an 8_000 stamp against a 10_000 start absorbs), which with the existing 9_000 case fixes the constant at 2 s. Adversarial review 2026-09-04, finding #9 on 60d5a27ca. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XkGof8cLt23LkxZ8MKzin2
fryanpan
added a commit
that referenced
this pull request
Sep 6, 2026
absorbEchoesLocked treated a held ChangedFiles.Unknown as "every file is already held" and skipped the granularity margin for all of them. After an external Gradle build untrusted the baseline (pending = Unknown) and a rebuild started, a .kt saved 0.5 s into the rebuild on a 1 s-mtime filesystem stamped a whole second before the start, was absorbed, and onBaselineReset dropped it - the edit was never built. An Unknown held set names no file, so nothing proves an arrival is an echo; only an enumerated held set keeps the exact cutoff. New test pins the Unknown case; a second new test pins the margin's upper bound (an 8_000 stamp against a 10_000 start absorbs), which with the existing 9_000 case fixes the constant at 2 s. Adversarial review 2026-09-04, finding #9 on 60d5a27ca. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XkGof8cLt23LkxZ8MKzin2
fryanpan
added a commit
that referenced
this pull request
Sep 8, 2026
absorbEchoesLocked treated a held ChangedFiles.Unknown as "every file is already held" and skipped the granularity margin for all of them. After an external Gradle build untrusted the baseline (pending = Unknown) and a rebuild started, a .kt saved 0.5 s into the rebuild on a 1 s-mtime filesystem stamped a whole second before the start, was absorbed, and onBaselineReset dropped it - the edit was never built. An Unknown held set names no file, so nothing proves an arrival is an echo; only an enumerated held set keeps the exact cutoff. New test pins the Unknown case; a second new test pins the margin's upper bound (an 8_000 stamp against a 10_000 start absorbs), which with the existing 9_000 case fixes the constant at 2 s. Adversarial review 2026-09-04, finding #9 on 60d5a27ca. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XkGof8cLt23LkxZ8MKzin2
fryanpan
added a commit
that referenced
this pull request
Sep 14, 2026
absorbEchoesLocked treated a held ChangedFiles.Unknown as "every file is already held" and skipped the granularity margin for all of them. After an external Gradle build untrusted the baseline (pending = Unknown) and a rebuild started, a .kt saved 0.5 s into the rebuild on a 1 s-mtime filesystem stamped a whole second before the start, was absorbed, and onBaselineReset dropped it - the edit was never built. An Unknown held set names no file, so nothing proves an arrival is an echo; only an enumerated held set keeps the exact cutoff. New test pins the Unknown case; a second new test pins the margin's upper bound (an 8_000 stamp against a 10_000 start absorbs), which with the existing 9_000 case fixes the constant at 2 s. Adversarial review 2026-09-04, finding #9 on 60d5a27ca. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XkGof8cLt23LkxZ8MKzin2
fryanpan
added a commit
that referenced
this pull request
Sep 16, 2026
absorbEchoesLocked treated a held ChangedFiles.Unknown as "every file is already held" and skipped the granularity margin for all of them. After an external Gradle build untrusted the baseline (pending = Unknown) and a rebuild started, a .kt saved 0.5 s into the rebuild on a 1 s-mtime filesystem stamped a whole second before the start, was absorbed, and onBaselineReset dropped it - the edit was never built. An Unknown held set names no file, so nothing proves an arrival is an echo; only an enumerated held set keeps the exact cutoff. New test pins the Unknown case; a second new test pins the margin's upper bound (an 8_000 stamp against a 10_000 start absorbs), which with the existing 9_000 case fixes the constant at 2 s. Adversarial review 2026-09-04, finding #9 on 60d5a27ca. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XkGof8cLt23LkxZ8MKzin2
fryanpan
added a commit
that referenced
this pull request
Sep 20, 2026
absorbEchoesLocked treated a held ChangedFiles.Unknown as "every file is already held" and skipped the granularity margin for all of them. After an external Gradle build untrusted the baseline (pending = Unknown) and a rebuild started, a .kt saved 0.5 s into the rebuild on a 1 s-mtime filesystem stamped a whole second before the start, was absorbed, and onBaselineReset dropped it - the edit was never built. An Unknown held set names no file, so nothing proves an arrival is an echo; only an enumerated held set keeps the exact cutoff. New test pins the Unknown case; a second new test pins the margin's upper bound (an 8_000 stamp against a 10_000 start absorbs), which with the existing 9_000 case fixes the constant at 2 s. Adversarial review 2026-09-04, finding #9 on 60d5a27ca. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XkGof8cLt23LkxZ8MKzin2
fryanpan
added a commit
that referenced
this pull request
Sep 25, 2026
absorbEchoesLocked treated a held ChangedFiles.Unknown as "every file is already held" and skipped the granularity margin for all of them. After an external Gradle build untrusted the baseline (pending = Unknown) and a rebuild started, a .kt saved 0.5 s into the rebuild on a 1 s-mtime filesystem stamped a whole second before the start, was absorbed, and onBaselineReset dropped it - the edit was never built. An Unknown held set names no file, so nothing proves an arrival is an echo; only an enumerated held set keeps the exact cutoff. New test pins the Unknown case; a second new test pins the margin's upper bound (an 8_000 stamp against a 10_000 start absorbs), which with the existing 9_000 case fixes the constant at 2 s. Adversarial review 2026-09-04, finding #9 on 60d5a27ca. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XkGof8cLt23LkxZ8MKzin2
fryanpan
added a commit
that referenced
this pull request
Oct 1, 2026
absorbEchoesLocked treated a held ChangedFiles.Unknown as "every file is already held" and skipped the granularity margin for all of them. After an external Gradle build untrusted the baseline (pending = Unknown) and a rebuild started, a .kt saved 0.5 s into the rebuild on a 1 s-mtime filesystem stamped a whole second before the start, was absorbed, and onBaselineReset dropped it - the edit was never built. An Unknown held set names no file, so nothing proves an arrival is an echo; only an enumerated held set keeps the exact cutoff. New test pins the Unknown case; a second new test pins the margin's upper bound (an 8_000 stamp against a 10_000 start absorbs), which with the existing 9_000 case fixes the constant at 2 s. Adversarial review 2026-09-04, finding #9 on 60d5a27ca. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XkGof8cLt23LkxZ8MKzin2
fryanpan
added a commit
that referenced
this pull request
Oct 2, 2026
* ADFA-4128: qb 06/12 core-deploy — Core slice 2: reload-vs-restart policy, the binder deploy channel, stage-cost telemetry Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Kj9YeCDHGp9DU8LPtfWJ7W * ADFA-4128: qb 06 review fixes — binder-death handling, reconnect atomicity, deploy teardown - Swallowed linkToDeath failure -> a binder dead at connect is reported as an instant death and never registered, so deploys fail fast as NotConnected instead of timing out with the freezer hold kept on a dead package (tests: "a binder that is dead at connect is not left registered", "a dead binder's stale connect retry does not clobber a live registration"). - Non-atomic connect watch/registration -> registration and death watch are one @synchronized step, and death delivery shares the lock, so the watched binder and the registered target can never disagree and a death cannot slip between link and registration (test: "a death delivered while connect is registering still clears the target"; wiring: "a reconnect moves the watch, and firing it clears the registration"). - Restart payload retained with hot-swap metadata -> a confirmed restart deploy clears the retained set instead of retaining it, so a reconnect catch-up can never hot-swap over the live restart-sensitive component and falls back to the forced rebuild (test: "a confirmed restart deploy clears the retained payload instead of retaining it"). - endSession leaving an in-flight deploy to time out -> endSession routes through onDisconnected, whose Disconnected report answers the waiter deterministically (test: "ending the session answers a deploy awaiting its verdict as Disconnected"). - Adjacent minor: disconnect() now unlinks the death watch, so no stale recipient outlives a graceful disconnect (test: "a graceful disconnect unlinks the death watch"). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Kj9YeCDHGp9DU8LPtfWJ7W * ADFA-4128 (6/11): address CodeRabbit review - F1718-2 stop advertising an E2eTimeline.parse that does not exist - F1718-6 stop the metrics helper swallowing fatals and cancellation - F1718-7 drop the dead telemetry.report import from LiveReloadOrchestratorTest - F1718-8 cover queueMillis in the HostSpans per-field test Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FstXxJ5cwWPcvmhZ9vJgJ7 * ADFA-4128 (6/11): drop the disconnect binder method and its tests The runtime only ever disconnected by process death, which ProxyAppConnections.onDisconnected already handles; the AIDL method went in the qb-04 followup. Asked for in review on #1718. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Xsc7AMGBVyEMfrwpZX87iC * ADFA-4128: qb-06 review fixes - latching union on failed builds, t3 before retention, broad binder catch, doc corrections Akash's 08-31 review of #1718, all seven items: - LiveReloadOrchestrator: the failed-build merge goes through unionPendingLocked, so an Unknown batch collapsing over a mid-build invalidating edit latches the Gradle verdict instead of erasing it. Test pins the collapse (verified red: the manifest edit rode the fast daemon path). - PayloadDeployer: t3 is read before the retention copy (hot swap) and the retention clear (restart), keeping post-deploy bookkeeping out of the timed save-to-live span. Ordering tests verified red against the old order at both sites. - DeployChannel: the payload send rethrows CancellationException and degrades any other exception to DeployResult.Failed, mirroring notifyBuildStatus's binder rationale; escape would also dodge the not-connected escalation. Test verified red. - deploy/README: table gains ProxyAppPriorityHold and RetainedPayloadStore. - ComponentInfo: header rewritten to the declares-one-always-restarts rule; supertypes marked carried-but-unread. - ClassHeader: KDoc aligned with the README's "currently unused". - E2eTimelineRecorder: false class-header-parse claim dropped. quickbuild:core tests green (both flavors). Also: plain-language pass over the comments added by these fixes Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01STCsdMzx9daNBcqMN424Ci * ADFA-4128: 0902 review round on quickbuild:core deploy/reload Non-blocking items from Akash's 2 September round; the PR itself is approved. - Two sibling docs still stated a "restart closure" rule the policy does not implement. Both now say what DeployPolicy does - a declared restart-sensitive component restarts every code-bearing deploy - and the stale-helpers notice says which deploys can still reach it. #1718 (comment) - An ask is no longer reported as AWAITS_DEPLOY without checking that a deploy is actually still coming. Every path that declines to start a build leaves the work queued, so this changes no outcome today; it stops a future early return from dropping the tap silently instead. #1718 (comment) - installPriorityHold releases the hold it replaces, which is what its KDoc already promised. #1718 (comment) - Dropped an unused import ktlint's substring match cannot see. #1718 (comment) - RetainedPayloadStore's KDoc claims the last deploy's own parts rather than a cumulative set, which is what retain writes. #1718 (comment) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017o3nPrBbGi2XYkMUGavG2A * ADFA-4128: absorb a mid-rebuild save only when its mtime proves it predates the rebuild A filesystem that truncates mtimes to whole seconds can stamp a save made just after a proxy app rebuild started with an mtime just before it. The echo split then folded it into the absorbed set and onBaselineReset dropped it: the edit never built and nothing said so. An mtime on a whole-second boundary is now taken as truncated and must predate the rebuild start by 2 s (the FAT step) to absorb. A flat margin on every mtime would instead strand a genuinely pre-start save on every filesystem, because the watcher's debounce (150 ms quiet, 1 s cap) puts such a save's mtime within a second of the start; four of the existing F4 echo tests go red under it. A file the rebuild already holds keeps the exact cutoff, since its arrival is the echo the split exists to absorb. Review thread: #1718 (comment) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XkGof8cLt23LkxZ8MKzin2 * ADFA-4128: ping the proxy app before calling a restart-deploy timeout an outdated runtime awaitDisconnect only watched the connection registry, which clears when linkToDeath fires. A loaded device can deliver that notification after the 5 s disconnect wait, and the deployer then reported a current runtime that had exited as one that "predates restart support" and forced a multi-minute Gradle rebuild. On timeout the channel now pings the registered binder. A ping is a transaction, so it fails as soon as the process is gone; the channel then clears the registry as the late notification would and reports the runtime gone, and the restart path proceeds to relaunch. A runtime that still answers keeps the outdated-runtime verdict. Review thread: #1718 (comment) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XkGof8cLt23LkxZ8MKzin2 * ADFA-4128: apply the mtime margin when the rebuild holds Unknown absorbEchoesLocked treated a held ChangedFiles.Unknown as "every file is already held" and skipped the granularity margin for all of them. After an external Gradle build untrusted the baseline (pending = Unknown) and a rebuild started, a .kt saved 0.5 s into the rebuild on a 1 s-mtime filesystem stamped a whole second before the start, was absorbed, and onBaselineReset dropped it - the edit was never built. An Unknown held set names no file, so nothing proves an arrival is an echo; only an enumerated held set keeps the exact cutoff. New test pins the Unknown case; a second new test pins the margin's upper bound (an 8_000 stamp against a 10_000 start absorbs), which with the existing 9_000 case fixes the constant at 2 s. Adversarial review 2026-09-04, finding #9 on 60d5a27ca. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XkGof8cLt23LkxZ8MKzin2 * ADFA-4128: invalidate the retained payload when its directory cannot be deleted retain() and clear() discarded deleteRecursively's result, so a partial delete could leave a readable meta.json behind - contradicting this store's own "replaced wholesale by every retain" contract. Both now go through a private purge() that empties meta.json before the recursive delete and returns the delete's result. The order is the load-bearing part: unlinking a name needs write permission on the directory, rewriting a file's bytes needs it only on the file, so a truncated meta.json still fails load() closed in the case where the delete cannot proceed at all. load() keys off the metadata alone, so once that is unreadable the rest of the tree is inert. retain() checks the result into its existing catch; clear() warns when parts survive. Not propagated to callers: both are post-deploy bookkeeping on the success path, with the payload already live in the app. Failing a build for a retention housekeeping error would turn a cheaper-recovery optimisation into a build failure, and the documented fallback - the catch-up rebuild - still happens. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XkGof8cLt23LkxZ8MKzin2 * ADFA-4128: record the retained set's invalidation where a read-only dir cannot swallow it purge() emptied meta.json inside a runCatching and then returned the delete's result, so a store whose metadata write AND recursive delete both failed left meta.json intact and readable. load() parsed it and handed a superseded baseline's bytes to a reconnect re-send - the one thing this store exists not to do. Emptying the metadata and unlinking it need different permissions, which is why the class treated them as independent, but a read-only meta.json under a read-only directory refuses both at once. The invalidation is now recorded beside the directory when neither half took, and load() refuses a set carrying that marker. The marker needs only the parent, which retain() must be able to write anyway to rename its staging dir into place, and it is cleared as soon as a purge removes the set. Without the fix the new test reports: value of: load() expected: null but was : RetainedPayload(generation=1, metadataJson={"gen":1}, ...) Also corrects the purge() KDoc, which claimed a failed delete always leaves the set unreadable (board task t-jwpRC46uvGrH). It now states the one case that is still only logged - a store whose whole tree has gone read-only, where there is nowhere left to record anything - and clear()'s warning no longer asserts an invalidation it cannot guarantee. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XkGof8cLt23LkxZ8MKzin2 --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.