wtg-cli 0.3.0__tar.gz → 0.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/Cargo.lock +52 -69
  2. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/Cargo.toml +4 -5
  3. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/PKG-INFO +14 -2
  4. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/README.md +7 -0
  5. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/README.md +7 -0
  6. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/backend/combined_backend.rs +4 -0
  7. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/backend/github_backend.rs +6 -2
  8. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/backend/mod.rs +9 -0
  9. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/error.rs +23 -1
  10. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/git.rs +2 -4
  11. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/github.rs +158 -55
  12. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/notice.rs +16 -0
  13. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/output.rs +76 -35
  14. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/resolution.rs +21 -5
  15. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/tests/integration.rs +57 -0
  16. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/tests/offline.rs +1 -1
  17. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg-python/src/lib.rs +2 -2
  18. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/pyproject.toml +11 -3
  19. wtg_cli-0.3.2/rust-toolchain.toml +4 -0
  20. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/LICENSE +0 -0
  21. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/Cargo.toml +0 -0
  22. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/backend/git_backend.rs +0 -0
  23. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/changelog.rs +0 -0
  24. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/cli.rs +0 -0
  25. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/constants.rs +0 -0
  26. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/help.rs +0 -0
  27. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/lib.rs +0 -0
  28. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/main.rs +0 -0
  29. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/parse_input.rs +0 -0
  30. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/release_filter.rs +0 -0
  31. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/remote.rs +0 -0
  32. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/src/semver.rs +0 -0
  33. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/tests/common/mod.rs +0 -0
  34. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/tests/fixtures/test-repo.zip +0 -0
  35. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/tests/snapshots/integration__integration_identify_file.snap +0 -0
  36. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/tests/snapshots/integration__integration_identify_recent_commit.snap +0 -0
  37. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg/tests/snapshots/integration__integration_identify_tag.snap +0 -0
  38. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/crates/wtg-python/Cargo.toml +0 -0
  39. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/src/wtg_cli/__init__.py +0 -0
  40. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/src/wtg_cli/__main__.py +0 -0
  41. {wtg_cli-0.3.0 → wtg_cli-0.3.2}/src/wtg_cli/cli.py +0 -0
@@ -104,13 +104,13 @@ checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457"
104
104
 
105
105
  [[package]]
106
106
  name = "async-trait"
107
- version = "0.1.89"
107
+ version = "0.1.92"
108
108
  source = "registry+https://github.com/rust-lang/crates.io-index"
109
- checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
109
+ checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667"
110
110
  dependencies = [
111
111
  "proc-macro2",
112
112
  "quote",
113
- "syn",
113
+ "syn 3.0.9",
114
114
  ]
115
115
 
116
116
  [[package]]
@@ -287,7 +287,7 @@ dependencies = [
287
287
  "heck",
288
288
  "proc-macro2",
289
289
  "quote",
290
- "syn",
290
+ "syn 2.0.113",
291
291
  ]
292
292
 
293
293
  [[package]]
@@ -457,7 +457,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
457
457
  dependencies = [
458
458
  "proc-macro2",
459
459
  "quote",
460
- "syn",
460
+ "syn 2.0.113",
461
461
  ]
462
462
 
463
463
  [[package]]
@@ -494,7 +494,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a"
494
494
  dependencies = [
495
495
  "proc-macro2",
496
496
  "quote",
497
- "syn",
497
+ "syn 2.0.113",
498
498
  ]
499
499
 
500
500
  [[package]]
@@ -515,7 +515,7 @@ dependencies = [
515
515
  "convert_case",
516
516
  "proc-macro2",
517
517
  "quote",
518
- "syn",
518
+ "syn 2.0.113",
519
519
  ]
520
520
 
521
521
  [[package]]
@@ -559,7 +559,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
559
559
  dependencies = [
560
560
  "proc-macro2",
561
561
  "quote",
562
- "syn",
562
+ "syn 2.0.113",
563
563
  ]
564
564
 
565
565
  [[package]]
@@ -785,7 +785,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
785
785
  dependencies = [
786
786
  "proc-macro2",
787
787
  "quote",
788
- "syn",
788
+ "syn 2.0.113",
789
789
  ]
790
790
 
791
791
  [[package]]
@@ -1170,15 +1170,6 @@ dependencies = [
1170
1170
  "hashbrown",
1171
1171
  ]
1172
1172
 
1173
- [[package]]
1174
- name = "indoc"
1175
- version = "2.0.7"
1176
- source = "registry+https://github.com/rust-lang/crates.io-index"
1177
- checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
1178
- dependencies = [
1179
- "rustversion",
1180
- ]
1181
-
1182
1173
  [[package]]
1183
1174
  name = "inout"
1184
1175
  version = "0.1.4"
@@ -1243,7 +1234,7 @@ checksum = "e0c84ee7f197eca9a86c6fd6cb771e55eb991632f15f2bc3ca6ec838929e6e78"
1243
1234
  dependencies = [
1244
1235
  "proc-macro2",
1245
1236
  "quote",
1246
- "syn",
1237
+ "syn 2.0.113",
1247
1238
  ]
1248
1239
 
1249
1240
  [[package]]
@@ -1424,15 +1415,6 @@ version = "2.7.6"
1424
1415
  source = "registry+https://github.com/rust-lang/crates.io-index"
1425
1416
  checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
1426
1417
 
1427
- [[package]]
1428
- name = "memoffset"
1429
- version = "0.9.1"
1430
- source = "registry+https://github.com/rust-lang/crates.io-index"
1431
- checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
1432
- dependencies = [
1433
- "autocfg",
1434
- ]
1435
-
1436
1418
  [[package]]
1437
1419
  name = "miniz_oxide"
1438
1420
  version = "0.8.9"
@@ -1694,7 +1676,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861"
1694
1676
  dependencies = [
1695
1677
  "proc-macro2",
1696
1678
  "quote",
1697
- "syn",
1679
+ "syn 2.0.113",
1698
1680
  ]
1699
1681
 
1700
1682
  [[package]]
@@ -1810,35 +1792,32 @@ dependencies = [
1810
1792
 
1811
1793
  [[package]]
1812
1794
  name = "pyo3"
1813
- version = "0.27.1"
1795
+ version = "0.30.1"
1814
1796
  source = "registry+https://github.com/rust-lang/crates.io-index"
1815
- checksum = "37a6df7eab65fc7bee654a421404947e10a0f7085b6951bf2ea395f4659fb0cf"
1797
+ checksum = "229ca13b8a15bb0d1487b81ab975bfcd97513416499a8312011b6036e42e0de4"
1816
1798
  dependencies = [
1817
- "indoc",
1818
1799
  "libc",
1819
- "memoffset",
1820
1800
  "once_cell",
1821
1801
  "portable-atomic",
1822
1802
  "pyo3-build-config",
1823
1803
  "pyo3-ffi",
1824
1804
  "pyo3-macros",
1825
- "unindent",
1826
1805
  ]
1827
1806
 
1828
1807
  [[package]]
1829
1808
  name = "pyo3-build-config"
1830
- version = "0.27.1"
1809
+ version = "0.30.1"
1831
1810
  source = "registry+https://github.com/rust-lang/crates.io-index"
1832
- checksum = "f77d387774f6f6eec64a004eac0ed525aab7fa1966d94b42f743797b3e395afb"
1811
+ checksum = "70130e2b6dd1ee589a8788026a429561ca5c40fa7a2fa7914c2282eddae24700"
1833
1812
  dependencies = [
1834
1813
  "target-lexicon",
1835
1814
  ]
1836
1815
 
1837
1816
  [[package]]
1838
1817
  name = "pyo3-ffi"
1839
- version = "0.27.1"
1818
+ version = "0.30.1"
1840
1819
  source = "registry+https://github.com/rust-lang/crates.io-index"
1841
- checksum = "2dd13844a4242793e02df3e2ec093f540d948299a6a77ea9ce7afd8623f542be"
1820
+ checksum = "5e7ff73c555c286d212d4ce7e5fbda845a973c4f61bd5f160f5f2c3c2a04d1c4"
1842
1821
  dependencies = [
1843
1822
  "libc",
1844
1823
  "pyo3-build-config",
@@ -1846,27 +1825,26 @@ dependencies = [
1846
1825
 
1847
1826
  [[package]]
1848
1827
  name = "pyo3-macros"
1849
- version = "0.27.1"
1828
+ version = "0.30.1"
1850
1829
  source = "registry+https://github.com/rust-lang/crates.io-index"
1851
- checksum = "eaf8f9f1108270b90d3676b8679586385430e5c0bb78bb5f043f95499c821a71"
1830
+ checksum = "c46d2e5862c7bb8207e3b639f713dda3c499933444784154c11d013c5a691b60"
1852
1831
  dependencies = [
1853
1832
  "proc-macro2",
1854
1833
  "pyo3-macros-backend",
1855
1834
  "quote",
1856
- "syn",
1835
+ "syn 3.0.9",
1857
1836
  ]
1858
1837
 
1859
1838
  [[package]]
1860
1839
  name = "pyo3-macros-backend"
1861
- version = "0.27.1"
1840
+ version = "0.30.1"
1862
1841
  source = "registry+https://github.com/rust-lang/crates.io-index"
1863
- checksum = "70a3b2274450ba5288bc9b8c1b69ff569d1d61189d4bff38f8d22e03d17f932b"
1842
+ checksum = "38b89f066f2ae72a2aef52d1537ca2fcd104440ebfadee06e97aa90738a25b9b"
1864
1843
  dependencies = [
1865
1844
  "heck",
1866
1845
  "proc-macro2",
1867
- "pyo3-build-config",
1868
1846
  "quote",
1869
- "syn",
1847
+ "syn 3.0.9",
1870
1848
  ]
1871
1849
 
1872
1850
  [[package]]
@@ -2038,7 +2016,7 @@ dependencies = [
2038
2016
  "regex",
2039
2017
  "relative-path",
2040
2018
  "rustc_version",
2041
- "syn",
2019
+ "syn 2.0.113",
2042
2020
  "unicode-ident",
2043
2021
  ]
2044
2022
 
@@ -2221,7 +2199,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
2221
2199
  dependencies = [
2222
2200
  "proc-macro2",
2223
2201
  "quote",
2224
- "syn",
2202
+ "syn 2.0.113",
2225
2203
  ]
2226
2204
 
2227
2205
  [[package]]
@@ -2396,7 +2374,7 @@ dependencies = [
2396
2374
  "heck",
2397
2375
  "proc-macro2",
2398
2376
  "quote",
2399
- "syn",
2377
+ "syn 2.0.113",
2400
2378
  ]
2401
2379
 
2402
2380
  [[package]]
@@ -2455,7 +2433,7 @@ dependencies = [
2455
2433
  "heck",
2456
2434
  "proc-macro2",
2457
2435
  "quote",
2458
- "syn",
2436
+ "syn 2.0.113",
2459
2437
  ]
2460
2438
 
2461
2439
  [[package]]
@@ -2475,6 +2453,17 @@ dependencies = [
2475
2453
  "unicode-ident",
2476
2454
  ]
2477
2455
 
2456
+ [[package]]
2457
+ name = "syn"
2458
+ version = "3.0.9"
2459
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2460
+ checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b"
2461
+ dependencies = [
2462
+ "proc-macro2",
2463
+ "quote",
2464
+ "unicode-ident",
2465
+ ]
2466
+
2478
2467
  [[package]]
2479
2468
  name = "sync_wrapper"
2480
2469
  version = "1.0.2"
@@ -2489,7 +2478,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
2489
2478
  dependencies = [
2490
2479
  "proc-macro2",
2491
2480
  "quote",
2492
- "syn",
2481
+ "syn 2.0.113",
2493
2482
  ]
2494
2483
 
2495
2484
  [[package]]
@@ -2538,7 +2527,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
2538
2527
  dependencies = [
2539
2528
  "proc-macro2",
2540
2529
  "quote",
2541
- "syn",
2530
+ "syn 2.0.113",
2542
2531
  ]
2543
2532
 
2544
2533
  [[package]]
@@ -2604,7 +2593,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5"
2604
2593
  dependencies = [
2605
2594
  "proc-macro2",
2606
2595
  "quote",
2607
- "syn",
2596
+ "syn 2.0.113",
2608
2597
  ]
2609
2598
 
2610
2599
  [[package]]
@@ -2728,7 +2717,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
2728
2717
  dependencies = [
2729
2718
  "proc-macro2",
2730
2719
  "quote",
2731
- "syn",
2720
+ "syn 2.0.113",
2732
2721
  ]
2733
2722
 
2734
2723
  [[package]]
@@ -2776,12 +2765,6 @@ version = "0.2.2"
2776
2765
  source = "registry+https://github.com/rust-lang/crates.io-index"
2777
2766
  checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
2778
2767
 
2779
- [[package]]
2780
- name = "unindent"
2781
- version = "0.2.4"
2782
- source = "registry+https://github.com/rust-lang/crates.io-index"
2783
- checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
2784
-
2785
2768
  [[package]]
2786
2769
  name = "unsafe-libyaml"
2787
2770
  version = "0.2.11"
@@ -2886,7 +2869,7 @@ dependencies = [
2886
2869
  "bumpalo",
2887
2870
  "proc-macro2",
2888
2871
  "quote",
2889
- "syn",
2872
+ "syn 2.0.113",
2890
2873
  "wasm-bindgen-shared",
2891
2874
  ]
2892
2875
 
@@ -2953,7 +2936,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
2953
2936
  dependencies = [
2954
2937
  "proc-macro2",
2955
2938
  "quote",
2956
- "syn",
2939
+ "syn 2.0.113",
2957
2940
  ]
2958
2941
 
2959
2942
  [[package]]
@@ -2964,7 +2947,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
2964
2947
  dependencies = [
2965
2948
  "proc-macro2",
2966
2949
  "quote",
2967
- "syn",
2950
+ "syn 2.0.113",
2968
2951
  ]
2969
2952
 
2970
2953
  [[package]]
@@ -3179,7 +3162,7 @@ checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9"
3179
3162
 
3180
3163
  [[package]]
3181
3164
  name = "wtg-cli"
3182
- version = "0.3.0"
3165
+ version = "0.3.2"
3183
3166
  dependencies = [
3184
3167
  "async-trait",
3185
3168
  "base64",
@@ -3207,7 +3190,7 @@ dependencies = [
3207
3190
 
3208
3191
  [[package]]
3209
3192
  name = "wtg-python"
3210
- version = "0.3.0"
3193
+ version = "0.3.2"
3211
3194
  dependencies = [
3212
3195
  "pyo3",
3213
3196
  "wtg-cli",
@@ -3232,7 +3215,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
3232
3215
  dependencies = [
3233
3216
  "proc-macro2",
3234
3217
  "quote",
3235
- "syn",
3218
+ "syn 2.0.113",
3236
3219
  "synstructure",
3237
3220
  ]
3238
3221
 
@@ -3253,7 +3236,7 @@ checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a"
3253
3236
  dependencies = [
3254
3237
  "proc-macro2",
3255
3238
  "quote",
3256
- "syn",
3239
+ "syn 2.0.113",
3257
3240
  ]
3258
3241
 
3259
3242
  [[package]]
@@ -3273,7 +3256,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
3273
3256
  dependencies = [
3274
3257
  "proc-macro2",
3275
3258
  "quote",
3276
- "syn",
3259
+ "syn 2.0.113",
3277
3260
  "synstructure",
3278
3261
  ]
3279
3262
 
@@ -3294,7 +3277,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
3294
3277
  dependencies = [
3295
3278
  "proc-macro2",
3296
3279
  "quote",
3297
- "syn",
3280
+ "syn 2.0.113",
3298
3281
  ]
3299
3282
 
3300
3283
  [[package]]
@@ -3327,7 +3310,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
3327
3310
  dependencies = [
3328
3311
  "proc-macro2",
3329
3312
  "quote",
3330
- "syn",
3313
+ "syn 2.0.113",
3331
3314
  ]
3332
3315
 
3333
3316
  [[package]]
@@ -1,10 +1,9 @@
1
1
  [workspace]
2
2
  resolver = "2"
3
- members = ["crates/wtg-python"]
4
- default-members = ["crates/wtg"]
3
+ members = ["crates/wtg", "crates/wtg-python"]
5
4
 
6
5
  [workspace.package]
7
- version = "0.3.0"
6
+ version = "0.3.2"
8
7
  edition = "2024"
9
8
  description = "A snarky but helpful CLI tool to identify git commits, issues, PRs and file changes, and tell you which release they shipped in"
10
9
  authors = ["Mike Perlov"]
@@ -47,12 +46,12 @@ serde = { version = "1.0", features = ["derive"] }
47
46
  serde_yaml = "0.9"
48
47
  dirs = "6.0"
49
48
  chrono = "0.4"
50
- pyo3 = { version = "0.27", features = ["extension-module"] }
49
+ pyo3 = { version = "0.30.1", features = ["extension-module"] }
51
50
  regex = "1.12"
52
51
  percent-encoding = "2.3"
53
52
  url = "2.5"
54
53
  strum = { version = "0.27.2", features = ["derive", "strum_macros"] }
55
- async-trait = "0.1"
54
+ async-trait = "0.1.92"
56
55
  log = "0.4"
57
56
  env_logger = "0.11"
58
57
 
@@ -1,7 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wtg-cli
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Classifier: Programming Language :: Python :: 3
5
+ Classifier: Programming Language :: Python :: 3.11
6
+ Classifier: Programming Language :: Python :: 3.12
7
+ Classifier: Programming Language :: Python :: 3.13
8
+ Classifier: Programming Language :: Python :: 3.14
9
+ Classifier: Programming Language :: Python :: 3.15
5
10
  Classifier: Programming Language :: Rust
6
11
  Classifier: License :: OSI Approved :: MIT License
7
12
  Classifier: Operating System :: OS Independent
@@ -10,7 +15,7 @@ License-File: LICENSE
10
15
  Summary: What The Git CLI – snarky Git history sleuth packaged for Python
11
16
  Author: Mike Perlov
12
17
  License: MIT
13
- Requires-Python: >=3.9
18
+ Requires-Python: >=3.11
14
19
  Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
15
20
 
16
21
  # What The Git (wtg) 🔍
@@ -177,3 +182,10 @@ MIT
177
182
 
178
183
  Found a bug? Want to add a snarky message? PRs welcome! Just make sure to keep the snark levels high and the code quality higher.
179
184
 
185
+ <details>
186
+ <summary>Python package compatibility</summary>
187
+
188
+ Python 3.11–3.15 is supported. Prebuilt CPython 3.11–3.15 wheels are available for macOS ARM64, Linux x86_64, and Windows x86_64. Other installations build from source and require a Rust toolchain.
189
+
190
+ </details>
191
+
@@ -161,3 +161,10 @@ MIT
161
161
  ## Contributing
162
162
 
163
163
  Found a bug? Want to add a snarky message? PRs welcome! Just make sure to keep the snark levels high and the code quality higher.
164
+
165
+ <details>
166
+ <summary>Python package compatibility</summary>
167
+
168
+ Python 3.11–3.15 is supported. Prebuilt CPython 3.11–3.15 wheels are available for macOS ARM64, Linux x86_64, and Windows x86_64. Other installations build from source and require a Rust toolchain.
169
+
170
+ </details>
@@ -161,3 +161,10 @@ MIT
161
161
  ## Contributing
162
162
 
163
163
  Found a bug? Want to add a snarky message? PRs welcome! Just make sure to keep the snark levels high and the code quality higher.
164
+
165
+ <details>
166
+ <summary>Python package compatibility</summary>
167
+
168
+ Python 3.11–3.15 is supported. Prebuilt CPython 3.11–3.15 wheels are available for macOS ARM64, Linux x86_64, and Windows x86_64. Other installations build from source and require a Rust toolchain.
169
+
170
+ </details>
@@ -250,6 +250,10 @@ impl CombinedBackend {
250
250
 
251
251
  #[async_trait]
252
252
  impl Backend for CombinedBackend {
253
+ fn emit_notice(&self, notice: Notice) {
254
+ self.emit(notice);
255
+ }
256
+
253
257
  async fn backend_for_pr(&self, pr: &PullRequestInfo) -> Option<Box<dyn Backend>> {
254
258
  let pr_repo = pr.repo_info.as_ref()?;
255
259
  let our_repo = self.github.repo_info();
@@ -13,7 +13,7 @@ use crate::changelog;
13
13
  use crate::error::{WtgError, WtgResult};
14
14
  use crate::git::{CommitInfo, TagInfo, looks_like_commit_hash};
15
15
  use crate::github::{ExtendedIssueInfo, GhRepoInfo, GitHubClient, PullRequestInfo};
16
- use crate::notice::NoticeCallback;
16
+ use crate::notice::{Notice, NoticeCallback};
17
17
  use crate::parse_input::{ParsedQuery, Query};
18
18
  use crate::release_filter::ReleaseFilter;
19
19
 
@@ -122,6 +122,10 @@ impl GitHubBackend {
122
122
 
123
123
  #[async_trait]
124
124
  impl Backend for GitHubBackend {
125
+ fn emit_notice(&self, notice: Notice) {
126
+ self.client.emit(notice);
127
+ }
128
+
125
129
  async fn backend_for_pr(&self, pr: &PullRequestInfo) -> Option<Box<dyn Backend>> {
126
130
  let pr_repo = pr.repo_info.as_ref()?;
127
131
 
@@ -220,7 +224,7 @@ impl Backend for GitHubBackend {
220
224
  .filter(|r| r.created_at.is_some_and(|d| d < current.created_at))
221
225
  .collect();
222
226
 
223
- candidates.sort_by(|a, b| b.created_at.cmp(&a.created_at));
227
+ candidates.sort_by_key(|release| std::cmp::Reverse(release.created_at));
224
228
 
225
229
  if let Some(prev) = candidates.first() {
226
230
  return self.find_tag(&prev.tag_name).await.map(Some);
@@ -33,6 +33,14 @@ use crate::remote::{RemoteHost, RemoteInfo};
33
33
  /// return `WtgError::Unsupported` for operations not available.
34
34
  #[async_trait]
35
35
  pub trait Backend: Send + Sync {
36
+ // ============================================
37
+ // Notice emission (default: no-op)
38
+ // ============================================
39
+
40
+ /// Emit a notice to the registered callback.
41
+ /// Used by resolution code to surface warnings to the user.
42
+ fn emit_notice(&self, _notice: Notice) {}
43
+
36
44
  // ============================================
37
45
  // Cross-project support (default: not supported)
38
46
  // ============================================
@@ -227,6 +235,7 @@ pub fn resolve_backend_with_notices(
227
235
  } else {
228
236
  // Can't access git locally, use pure API (soft notice)
229
237
  notice_cb(Notice::ApiOnly);
238
+ github.set_notice_callback(notice_cb);
230
239
  Ok(Box::new(github))
231
240
  }
232
241
  } else {
@@ -16,6 +16,7 @@ pub enum WtgError {
16
16
  GhConnectionLost,
17
17
  GhRateLimit(OctoError),
18
18
  GhSaml(OctoError),
19
+ GhBadCredentials(OctoError),
19
20
  GitHub(OctoError),
20
21
  MultipleMatches(Vec<String>),
21
22
  Io(std::io::Error),
@@ -142,6 +143,26 @@ impl fmt::Display for WtgError {
142
143
  "Try authenticating your GITHUB_TOKEN with SAML first!".red()
143
144
  )
144
145
  }
146
+ Self::GhBadCredentials(_) => {
147
+ writeln!(
148
+ f,
149
+ "{}",
150
+ "🔑 Nope! GitHub doesn't recognize that token."
151
+ .yellow()
152
+ .bold()
153
+ )?;
154
+ writeln!(f)?;
155
+ writeln!(
156
+ f,
157
+ " {}",
158
+ "Expired? Revoked? Typo? It happens to the best of us. 🤷".yellow()
159
+ )?;
160
+ writeln!(
161
+ f,
162
+ " {}",
163
+ "Check your GITHUB_TOKEN and try again!".yellow()
164
+ )
165
+ }
145
166
  Self::GitHub(e) => write!(f, "GitHub error: {e}"),
146
167
  Self::MultipleMatches(types) => {
147
168
  writeln!(f, "{}", "💥 OH MY, YOU BLEW ME UP!".red().bold())?;
@@ -273,11 +294,12 @@ impl From<OctoError> for WtgError {
273
294
  fn from(err: OctoError) -> Self {
274
295
  if let OctoError::GitHub { ref source, .. } = err {
275
296
  match source.status_code {
297
+ StatusCode::UNAUTHORIZED => return Self::GhBadCredentials(err),
276
298
  StatusCode::TOO_MANY_REQUESTS => return Self::GhRateLimit(err),
277
299
  StatusCode::FORBIDDEN => {
278
300
  let msg_lower = source.message.to_ascii_lowercase();
279
301
 
280
- if msg_lower.to_ascii_lowercase().contains("saml") {
302
+ if msg_lower.contains("saml") {
281
303
  return Self::GhSaml(err);
282
304
  }
283
305
 
@@ -249,8 +249,7 @@ impl GitRepo {
249
249
  fn collect_remotes(repo: &Repository) -> Vec<RemoteInfo> {
250
250
  let remote_names: Vec<String> = repo
251
251
  .remotes()
252
- .map(|names| names.iter().flatten().map(str::to_string).collect())
253
- .unwrap_or_default();
252
+ .map_or_default(|names| names.iter().flatten().map(str::to_string).collect());
254
253
 
255
254
  remote_names
256
255
  .into_iter()
@@ -733,8 +732,7 @@ impl GitRepo {
733
732
  self.with_repo(|repo| {
734
733
  Oid::from_str(commit_hash)
735
734
  .and_then(|oid| repo.find_commit(oid))
736
- .map(|c| c.time().seconds())
737
- .unwrap_or(0)
735
+ .map_or(0, |c| c.time().seconds())
738
736
  })
739
737
  }
740
738