Cursor Agent and rmcrackan
f472334f09
fix(config): replace Settings.json atomically instead of truncating it
...
File.WriteAllText truncates the destination before writing, so an interrupted
write leaves a half-written or empty Settings.json, and the in-process lock added
in the previous commit cannot help a reader in another process - the GUI and the
CLI share this file.
Route every write through Dinah.Core.IO.AtomicFileWriter, which writes a sibling
temp file, flushes to disk and renames it over the destination. Validate the temp
file parses as json before the swap, the same way JsonFilePersister<T> already
saves AccountsSettings.json, so a bad payload leaves the existing file untouched.
Co-authored-by: rmcrackan <rmcrackan@gmail.com >
2026-08-17 02:23:17 +00:00
Cursor Agent and rmcrackan
d0cf459450
fix(config): serialize PersistentDictionary cache and file access
...
Configuration.Instance is a process-wide singleton read and written from the UI
thread, BackgroundWorker callbacks and download workers at the same time, but
PersistentDictionary guarded only its file writes. Its two Dictionary caches were
touched without synchronization, so concurrent inserts eventually corrupted them
and threw "Operations that change non-concurrent collections must have exclusive
access" (issue #1959 , reported from MainVM.UpdateCountsBw_Completed reading
AutoDownloadEpisodes while a second GetCounts pass ran).
Reads on the file were unguarded too: Exists/GetJObject could observe a partially
written Settings.json, and readFile responds to empty contents by rewriting the
file, so a reader racing a writer could scramble the settings on disk.
Take one lock across each operation's cache and file access, and keep logging
outside it by having writeFile report whether it rewrote the file.
Co-authored-by: rmcrackan <rmcrackan@gmail.com >
2026-08-17 01:58:54 +00:00
Cursor Agent and rmcrackan
a5b1df0d29
Centralize best-effort file deletion in FileUtility
...
Co-authored-by: rmcrackan <rmcrackan@gmail.com >
2026-08-12 18:55:42 +00:00
Robert McRackan
065118cf6c
Fail fast on invalid Settings.json enums and broken Serilog structure: reject unknown enum values at startup with clear errors, accept case-insensitive names, migrate ZipFile sinks, and validate Serilog shape without blocking hand-edited custom sinks
2026-08-07 11:10:43 -04:00
Robert McRackan
5f4a75aade
Detect identity decrypt failures by exception type
2026-08-01 11:25:56 -04:00
Robert McRackan
20150cc4ed
update dependencies
2026-07-25 22:03:23 -04:00
Robert McRackan
b5485f77bf
update dependencies
2026-07-25 20:08:11 -04:00
rmcrackan
0499bbae7e
Merge pull request #1803 from Jo-Be-Co/1762_filter
...
1762 add filter() to list properties
2026-05-14 11:29:26 -04:00
Jo-Be-Co
c2c7b04acd
minor fixes and comment corrections
2026-05-14 02:12:25 +02:00
Jo-Be-Co
a21bb8174d
#1762 introduce CommonFormatters.TryGetLiteral
2026-05-14 02:04:26 +02:00
rmcrackan
50fde66a4c
#1804 - Fix Windows folder picker crash on custom paths. Normalize stored paths before opening the OS folder dialog (\\?\ / UNC handling, existence check) in shared FolderPickerInitialPath, use it from WinForms and Avalonia folder pickers, and retry once if the dialog still throws. Adds small FileManager tests.
2026-05-12 08:55:12 -04:00
Jo-Be-Co
4ffcbeb1db
Fix typos
2026-05-10 00:37:02 +02:00
Jo-Be-Co
7ef10b1e7d
#1762 add unique() and count() to list properties
2026-05-09 21:15:24 +02:00
Jo-Be-Co
0a644695d8
#1762 extract comparison to separate reusable class
2026-05-09 00:59:35 +02:00
MBucari
505c614210
Code Cleanup
...
Remove unused parameters
Remove unnecessary casts
Make fields readonly
Order modifiers
Format document
Sort usings
Remove unnecessary nullable directive
Apply namespace preferences (file-level)
2026-05-04 21:10:28 -06:00
Michael Bucari-Tovo
df531de255
Update Avalonia to v12
...
Avalonia 12 uses compiled bindings by default. Converted all remaining reflection bindings into compiled bindings,
Fixed binding errors
2026-05-04 21:08:26 -06:00
rmcrackan
274cbf37ca
Merge pull request #1755 from Jo-Be-Co/Conditional-output-on-format-templates
...
#1754 Conditional output on format templates
2026-04-20 21:59:02 -04:00
Jo-Be-Co
417e654799
#1754 Conditional output on format templates
2026-04-20 23:15:54 +02:00
Jo-Be-Co
fa64be7ad0
fixed typoo ;-)
2026-04-20 22:41:34 +02:00
Jo-Be-Co
e3508b2998
rebased and small fixes
2026-04-20 22:06:40 +02:00
Jo-Be-Co
30809fb38d
fixed quoting errors in format-strings
2026-04-20 21:38:45 +02:00
Jo-Be-Co
c1e9911ade
Small fixes on auto checks
2026-04-20 18:43:33 +02:00
Jo-Be-Co
962a5055b2
Fixed PR comments
2026-04-20 18:07:17 +02:00
Jo-Be-Co
dc353aa7e5
Merge branch 'master' into bifunctions
2026-04-17 08:50:53 +02:00
Jo-Be-Co
d5258b7e64
fixed merge collision
2026-04-17 08:46:52 +02:00
Jo-Be-Co
c72e5a3568
fixed matching of first property
2026-04-14 02:48:03 +02:00
Jo-Be-Co
c1b8cc894a
add mathematical symbols
2026-04-14 00:41:22 +02:00
Jo-Be-Co
56c15d3108
add checks on lists
2026-04-14 00:38:41 +02:00
Jo-Be-Co
810ea90770
introduce cmp tag as check with two operands
2026-04-14 00:30:34 +02:00
Jo-Be-Co
a010da5251
#1714 Convert the evaluation of the 'is' tag into two-parameter logic
2026-04-13 01:39:16 +02:00
Jo-Be-Co
b4f48cb54c
Extend <language> and <locale> tags to allow different outputs like ISO-codes or names in different languages
2026-04-10 09:43:11 +02:00
Jo-Be-Co
fc92c633e1
No made up format for minutes as .NET already knows how to format them.
...
User documentation needs to follow.
2026-03-26 03:12:24 +01:00
Jo-Be-Co
3c71cb10b2
some minor fixes
2026-03-26 03:10:43 +01:00
Jo-Be-Co
6b26280aa8
Get formats for properties in given form to the formatters by no unescaping them in advance.
2026-03-25 14:23:03 +01:00
Jo-Be-Co
14d8bb2205
As stated in the "Naming Templates" documentation, support custom formatters on numbers.
...
Only trim spaces on tags where they are disruptive.
2026-03-25 02:34:32 +01:00
Jo-Be-Co
6d2b0b952d
- Inspect exception on regexp timeout
...
- special tests for checks with whitespace
- Escaping allows whitespace at the edges
2026-03-24 00:18:40 +01:00
Jo-Be-Co
fb277cff81
Faulty regex patterns will throw InvalidOperationException during evaluation.
2026-03-23 15:29:32 +01:00
Jo-Be-Co
dbd5af8ab0
QS second part:
...
Made Evaluate() more resilient.
Added tests to CommonFormatters.
2026-03-22 22:22:02 +01:00
Jo-Be-Co
02b9b4fa1c
QS updates:
...
- fixed documentation
- regexp-checks running with timeout and culture-invariant matching
- changed check-building in ConditionalTagCollection to use NonNull parameters. So no warnings occure.
- add tests for <!is ...> and escaped chars
2026-03-22 19:18:55 +01:00
Jo-Be-Co
7ecd571364
Corrections to documentation and comments.
2026-03-22 13:55:28 +01:00
Jo-Be-Co
32f3e6a886
Introduces the slice() format directive
2026-03-22 13:55:27 +01:00
Jo-Be-Co
e477c29890
New tags <minutes>, <tag> and <if abridged->...<-if abridged>
2026-03-22 13:55:27 +01:00
Jo-Be-Co
a8621699c1
Add numerical checks for conditional tag.
...
- numbers are compared with their value
- strings are compared by checking the length
- Collections are evaluated on cheking their size
2026-03-22 13:55:27 +01:00
Jo-Be-Co
cd9a070784
Allow two step formatting to get checkable values and not only single stringa
...
Introduce <is-> Tag. Like <has-> but with additional check on content.
Retrieve objects instead of string for conditions
Pass undefined formats as null instead of empty strings
2026-03-22 13:55:26 +01:00
Jo-Be-Co
d8ce7cc9b0
Formats are now escapable and the evaluation of HasValue has been transformed into a configuration parameter.
2026-03-22 13:55:26 +01:00
Jo-Be-Co
1d6d4ff9ac
GetTagExpression uses Dictionary for capture names from Regexes
2026-03-22 13:55:26 +01:00
Jo-Be-Co
db3a810f47
Regular Expressions with capture names on coments
2026-03-22 13:55:26 +01:00
Jo-Be-Co
812e0c3b60
Format details on fields specified in format. Introduce by colon.
...
Use dictionaries for field access and sorting.
Added sorting to series lists.
2026-03-22 13:55:25 +01:00
Jo-Be-Co
d161bdfaeb
Introduce culture parameter for formatting.
2026-03-22 13:55:24 +01:00
Jo-Be-Co
a6aa14c7f8
Collect formatters into CommonFormatters
2026-03-22 13:55:24 +01:00