Created Tests
This commit is contained in:
parent
b6d8d4c52f
commit
0ee1846c72
462
.vscode/.json
vendored
462
.vscode/.json
vendored
@ -1,312 +1,154 @@
|
||||
[
|
||||
{
|
||||
"id": "403675d4-631e-40bb-900e-fae36d9c9cdd",
|
||||
"deviceAssetId": "449501900719.jpg",
|
||||
"ownerId": "fc9fd5a1-d1b3-4080-a21c-daf9b1c24593",
|
||||
"deviceId": "Library Import",
|
||||
"type": "IMAGE",
|
||||
"originalPath": "/var/snap/immich-distribution/pictures/71/449501900719.jpg",
|
||||
"previewPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/40/36/403675d4-631e-40bb-900e-fae36d9c9cdd-preview.jpeg",
|
||||
"fileCreatedAt": "2016-12-02T02:34:23-07:00",
|
||||
"fileModifiedAt": "2016-12-02T02:34:22-07:00",
|
||||
"isFavorite": false,
|
||||
"duration": null,
|
||||
"thumbnailPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/40/36/403675d4-631e-40bb-900e-fae36d9c9cdd-thumbnail.webp",
|
||||
"encodedVideoPath": "",
|
||||
"checksum": "\\x28b46dbf4864b92f18800815cf8145c38d037e92",
|
||||
"isVisible": true,
|
||||
"livePhotoVideoId": null,
|
||||
"updatedAt": "2024-04-25T13:13:20.074314-07:00",
|
||||
"createdAt": "2024-04-25T10:14:24.253144-07:00",
|
||||
"isArchived": false,
|
||||
"originalFileName": "449501900719.jpg",
|
||||
"sidecarPath": null,
|
||||
"isReadOnly": true,
|
||||
"thumbhash": "\\xe5a9090d8257787870788886886877776870760aa9",
|
||||
"isOffline": false,
|
||||
"libraryId": "af11ab7c-0782-4b7a-ba8e-fe68cf9a718d",
|
||||
"isExternal": true,
|
||||
"deletedAt": null,
|
||||
"localDateTime": "2016-12-01T19:34:23-07:00",
|
||||
"stackId": null
|
||||
},
|
||||
{
|
||||
"id": "11ceb05f-8c94-46cd-9a7e-1c06be5a18b8",
|
||||
"deviceAssetId": "015516300831.jpg",
|
||||
"ownerId": "fc9fd5a1-d1b3-4080-a21c-daf9b1c24593",
|
||||
"deviceId": "Library Import",
|
||||
"type": "IMAGE",
|
||||
"originalPath": "/var/snap/immich-distribution/pictures/83/015516300831.jpg",
|
||||
"previewPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/11/ce/11ceb05f-8c94-46cd-9a7e-1c06be5a18b8-preview.jpeg",
|
||||
"fileCreatedAt": "2014-05-03T14:44:20-07:00",
|
||||
"fileModifiedAt": "2014-11-17T11:18:58-07:00",
|
||||
"isFavorite": false,
|
||||
"duration": null,
|
||||
"thumbnailPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/11/ce/11ceb05f-8c94-46cd-9a7e-1c06be5a18b8-thumbnail.webp",
|
||||
"encodedVideoPath": "",
|
||||
"checksum": "\\x5b976715bab319b3bdc69d5f337701a062494e0b",
|
||||
"isVisible": true,
|
||||
"livePhotoVideoId": null,
|
||||
"updatedAt": "2024-04-25T13:07:55.048725-07:00",
|
||||
"createdAt": "2024-04-25T10:14:12.923101-07:00",
|
||||
"isArchived": false,
|
||||
"originalFileName": "015516300831.jpg",
|
||||
"sidecarPath": null,
|
||||
"isReadOnly": true,
|
||||
"thumbhash": "\\x5a08120c00771777f87778979877597fbef365",
|
||||
"isOffline": false,
|
||||
"libraryId": "af11ab7c-0782-4b7a-ba8e-fe68cf9a718d",
|
||||
"isExternal": true,
|
||||
"deletedAt": null,
|
||||
"localDateTime": "2014-05-03T14:44:20-07:00",
|
||||
"stackId": null
|
||||
},
|
||||
{
|
||||
"id": "e8e94a75-2b0c-48f6-b26a-76f5cbe46233",
|
||||
"deviceAssetId": "985177500821.jpg",
|
||||
"ownerId": "fc9fd5a1-d1b3-4080-a21c-daf9b1c24593",
|
||||
"deviceId": "Library Import",
|
||||
"type": "IMAGE",
|
||||
"originalPath": "/var/snap/immich-distribution/pictures/82/985177500821.jpg",
|
||||
"previewPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/e8/e9/e8e94a75-2b0c-48f6-b26a-76f5cbe46233-preview.jpeg",
|
||||
"fileCreatedAt": "2004-04-28T20:31:40-07:00",
|
||||
"fileModifiedAt": "2018-05-16T21:41:26.093-07:00",
|
||||
"isFavorite": false,
|
||||
"duration": null,
|
||||
"thumbnailPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/e8/e9/e8e94a75-2b0c-48f6-b26a-76f5cbe46233-thumbnail.webp",
|
||||
"encodedVideoPath": "",
|
||||
"checksum": "\\x176b222fa88bc72aaf81031f3b7f73644b178de4",
|
||||
"isVisible": true,
|
||||
"livePhotoVideoId": null,
|
||||
"updatedAt": "2024-04-25T13:07:55.667409-07:00",
|
||||
"createdAt": "2024-04-25T10:14:12.945414-07:00",
|
||||
"isArchived": false,
|
||||
"originalFileName": "985177500821.jpg",
|
||||
"sidecarPath": null,
|
||||
"isReadOnly": true,
|
||||
"thumbhash": "\\xdf07121d0687868f87378788887877887780670789",
|
||||
"isOffline": false,
|
||||
"libraryId": "af11ab7c-0782-4b7a-ba8e-fe68cf9a718d",
|
||||
"isExternal": true,
|
||||
"deletedAt": null,
|
||||
"localDateTime": "2004-04-28T20:31:40-07:00",
|
||||
"stackId": null
|
||||
},
|
||||
{
|
||||
"id": "4091bebd-4c26-4d30-bd3a-f2160a54b451",
|
||||
"deviceAssetId": "956694610829.jpg",
|
||||
"ownerId": "fc9fd5a1-d1b3-4080-a21c-daf9b1c24593",
|
||||
"deviceId": "Library Import",
|
||||
"type": "IMAGE",
|
||||
"originalPath": "/var/snap/immich-distribution/pictures/82/956694610829.jpg",
|
||||
"previewPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/40/91/4091bebd-4c26-4d30-bd3a-f2160a54b451-preview.jpeg",
|
||||
"fileCreatedAt": "2010-07-05T09:10:13.2-07:00",
|
||||
"fileModifiedAt": "2010-07-05T08:10:12-07:00",
|
||||
"isFavorite": false,
|
||||
"duration": null,
|
||||
"thumbnailPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/40/91/4091bebd-4c26-4d30-bd3a-f2160a54b451-thumbnail.webp",
|
||||
"encodedVideoPath": "",
|
||||
"checksum": "\\xc2eb5667d6da5ead1be71c51064ea293ad413ea6",
|
||||
"isVisible": true,
|
||||
"livePhotoVideoId": null,
|
||||
"updatedAt": "2024-04-25T13:07:56.364375-07:00",
|
||||
"createdAt": "2024-04-25T10:14:12.976197-07:00",
|
||||
"isArchived": false,
|
||||
"originalFileName": "956694610829.jpg",
|
||||
"sidecarPath": null,
|
||||
"isReadOnly": true,
|
||||
"thumbhash": "\\x12080a0d82668886808887867877877867807906b7",
|
||||
"isOffline": false,
|
||||
"libraryId": "af11ab7c-0782-4b7a-ba8e-fe68cf9a718d",
|
||||
"isExternal": true,
|
||||
"deletedAt": null,
|
||||
"localDateTime": "2010-07-05T09:10:13.2-07:00",
|
||||
"stackId": null
|
||||
},
|
||||
{
|
||||
"id": "c7bf1944-9f71-4808-8ff9-b0f972e907b0",
|
||||
"deviceAssetId": "948800300821.jpg",
|
||||
"ownerId": "fc9fd5a1-d1b3-4080-a21c-daf9b1c24593",
|
||||
"deviceId": "Library Import",
|
||||
"type": "IMAGE",
|
||||
"originalPath": "/var/snap/immich-distribution/pictures/82/948800300821.jpg",
|
||||
"previewPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/c7/bf/c7bf1944-9f71-4808-8ff9-b0f972e907b0-preview.jpeg",
|
||||
"fileCreatedAt": "2009-10-09T05:35:00.2-07:00",
|
||||
"fileModifiedAt": "2009-10-09T04:35:00-07:00",
|
||||
"isFavorite": false,
|
||||
"duration": null,
|
||||
"thumbnailPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/c7/bf/c7bf1944-9f71-4808-8ff9-b0f972e907b0-thumbnail.webp",
|
||||
"encodedVideoPath": "",
|
||||
"checksum": "\\x3c5c87ab7e442d1f7a0f2a12678c1d6be00dbc7b",
|
||||
"isVisible": true,
|
||||
"livePhotoVideoId": null,
|
||||
"updatedAt": "2024-04-25T13:07:56.553262-07:00",
|
||||
"createdAt": "2024-04-25T10:14:12.982686-07:00",
|
||||
"isArchived": false,
|
||||
"originalFileName": "948800300821.jpg",
|
||||
"sidecarPath": null,
|
||||
"isReadOnly": true,
|
||||
"thumbhash": "\\x103806258e02bd47937779a478997768fd3bcb9fa4",
|
||||
"isOffline": false,
|
||||
"libraryId": "af11ab7c-0782-4b7a-ba8e-fe68cf9a718d",
|
||||
"isExternal": true,
|
||||
"deletedAt": null,
|
||||
"localDateTime": "2009-10-09T05:35:00.2-07:00",
|
||||
"stackId": null
|
||||
},
|
||||
{
|
||||
"id": "4f5ea703-47e9-48c6-9366-0cc10630dac2",
|
||||
"deviceAssetId": "898525300821.jpg",
|
||||
"ownerId": "fc9fd5a1-d1b3-4080-a21c-daf9b1c24593",
|
||||
"deviceId": "Library Import",
|
||||
"type": "IMAGE",
|
||||
"originalPath": "/var/snap/immich-distribution/pictures/82/898525300821.jpg",
|
||||
"previewPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/4f/5e/4f5ea703-47e9-48c6-9366-0cc10630dac2-preview.jpeg",
|
||||
"fileCreatedAt": "2020-12-25T08:35:04.92-07:00",
|
||||
"fileModifiedAt": "2020-12-25T08:35:04-07:00",
|
||||
"isFavorite": false,
|
||||
"duration": null,
|
||||
"thumbnailPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/4f/5e/4f5ea703-47e9-48c6-9366-0cc10630dac2-thumbnail.webp",
|
||||
"encodedVideoPath": "",
|
||||
"checksum": "\\xf706263e450c9a26feaeba2dd14fe0fd8f22e623",
|
||||
"isVisible": true,
|
||||
"livePhotoVideoId": null,
|
||||
"updatedAt": "2024-04-25T13:07:58.530848-07:00",
|
||||
"createdAt": "2024-04-25T10:14:13.048275-07:00",
|
||||
"isArchived": false,
|
||||
"originalFileName": "898525300821.jpg",
|
||||
"sidecarPath": null,
|
||||
"isReadOnly": true,
|
||||
"thumbhash": "\\x5518060d8208976849959a99687678687f8dae48f6",
|
||||
"isOffline": false,
|
||||
"libraryId": "af11ab7c-0782-4b7a-ba8e-fe68cf9a718d",
|
||||
"isExternal": true,
|
||||
"deletedAt": null,
|
||||
"localDateTime": "2020-12-25T01:35:04.92-07:00",
|
||||
"stackId": null
|
||||
},
|
||||
{
|
||||
"id": "86c813ad-2a1c-489f-8fc2-0b76a21889c0",
|
||||
"deviceAssetId": "864710800829.jpg",
|
||||
"ownerId": "fc9fd5a1-d1b3-4080-a21c-daf9b1c24593",
|
||||
"deviceId": "Library Import",
|
||||
"type": "IMAGE",
|
||||
"originalPath": "/var/snap/immich-distribution/pictures/82/864710800829.jpg",
|
||||
"previewPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/86/c8/86c813ad-2a1c-489f-8fc2-0b76a21889c0-preview.jpeg",
|
||||
"fileCreatedAt": "2004-04-28T20:00:46-07:00",
|
||||
"fileModifiedAt": "2004-04-28T19:00:46-07:00",
|
||||
"isFavorite": false,
|
||||
"duration": null,
|
||||
"thumbnailPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/86/c8/86c813ad-2a1c-489f-8fc2-0b76a21889c0-thumbnail.webp",
|
||||
"encodedVideoPath": "",
|
||||
"checksum": "\\x9061edbf75f11526cef2c832ba339267509eaec4",
|
||||
"isVisible": true,
|
||||
"livePhotoVideoId": null,
|
||||
"updatedAt": "2024-04-25T13:07:59.171233-07:00",
|
||||
"createdAt": "2024-04-25T10:14:13.078169-07:00",
|
||||
"isArchived": false,
|
||||
"originalFileName": "864710800829.jpg",
|
||||
"sidecarPath": null,
|
||||
"isReadOnly": true,
|
||||
"thumbhash": "\\x140812250674874f87777669788778887a93a0470a",
|
||||
"isOffline": false,
|
||||
"libraryId": "af11ab7c-0782-4b7a-ba8e-fe68cf9a718d",
|
||||
"isExternal": true,
|
||||
"deletedAt": null,
|
||||
"localDateTime": "2004-04-28T20:00:46-07:00",
|
||||
"stackId": null
|
||||
},
|
||||
{
|
||||
"id": "b65121d8-4a74-4f27-9d6f-c582ffc444dc",
|
||||
"deviceAssetId": "862274900829.jpg",
|
||||
"ownerId": "fc9fd5a1-d1b3-4080-a21c-daf9b1c24593",
|
||||
"deviceId": "Library Import",
|
||||
"type": "IMAGE",
|
||||
"originalPath": "/var/snap/immich-distribution/pictures/82/862274900829.jpg",
|
||||
"previewPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/b6/51/b65121d8-4a74-4f27-9d6f-c582ffc444dc-preview.jpeg",
|
||||
"fileCreatedAt": "2018-08-17T22:50:55.15-07:00",
|
||||
"fileModifiedAt": "2022-11-03T20:25:09.161-07:00",
|
||||
"isFavorite": false,
|
||||
"duration": null,
|
||||
"thumbnailPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/b6/51/b65121d8-4a74-4f27-9d6f-c582ffc444dc-thumbnail.webp",
|
||||
"encodedVideoPath": "",
|
||||
"checksum": "\\xd4f623e97acd727868fe0e191c170e449d4456a5",
|
||||
"isVisible": true,
|
||||
"livePhotoVideoId": null,
|
||||
"updatedAt": "2024-04-25T13:07:59.640678-07:00",
|
||||
"createdAt": "2024-04-25T10:14:13.087927-07:00",
|
||||
"isArchived": false,
|
||||
"originalFileName": "862274900829.jpg",
|
||||
"sidecarPath": null,
|
||||
"isReadOnly": true,
|
||||
"thumbhash": "\\x99180a0d045977a077687887777678876a806b0867",
|
||||
"isOffline": false,
|
||||
"libraryId": "af11ab7c-0782-4b7a-ba8e-fe68cf9a718d",
|
||||
"isExternal": true,
|
||||
"deletedAt": null,
|
||||
"localDateTime": "2018-08-17T15:50:55.15-07:00",
|
||||
"stackId": null
|
||||
},
|
||||
{
|
||||
"id": "09fa281c-b828-47f6-8fbb-a5856edb63b5",
|
||||
"deviceAssetId": "840656100829.jpg",
|
||||
"ownerId": "fc9fd5a1-d1b3-4080-a21c-daf9b1c24593",
|
||||
"deviceId": "Library Import",
|
||||
"type": "IMAGE",
|
||||
"originalPath": "/var/snap/immich-distribution/pictures/82/840656100829.jpg",
|
||||
"previewPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/09/fa/09fa281c-b828-47f6-8fbb-a5856edb63b5-preview.jpeg",
|
||||
"fileCreatedAt": "2019-05-30T14:56:36.82-07:00",
|
||||
"fileModifiedAt": "2019-05-30T14:56:36-07:00",
|
||||
"isFavorite": false,
|
||||
"duration": null,
|
||||
"thumbnailPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/09/fa/09fa281c-b828-47f6-8fbb-a5856edb63b5-thumbnail.webp",
|
||||
"encodedVideoPath": "",
|
||||
"checksum": "\\xd215606441cefcc295130262bad9fed96d9ac40e",
|
||||
"isVisible": true,
|
||||
"livePhotoVideoId": null,
|
||||
"updatedAt": "2024-04-25T13:08:00.211274-07:00",
|
||||
"createdAt": "2024-04-25T10:14:13.104556-07:00",
|
||||
"isArchived": false,
|
||||
"originalFileName": "840656100829.jpg",
|
||||
"sidecarPath": null,
|
||||
"isReadOnly": true,
|
||||
"thumbhash": "\\xd6070a0d826f62873c788799993a7777137f679058",
|
||||
"isOffline": false,
|
||||
"libraryId": "af11ab7c-0782-4b7a-ba8e-fe68cf9a718d",
|
||||
"isExternal": true,
|
||||
"deletedAt": null,
|
||||
"localDateTime": "2019-05-30T07:56:36.82-07:00",
|
||||
"stackId": null
|
||||
},
|
||||
{
|
||||
"id": "8c239624-2bea-479d-b7fa-9f2cd5ebc9b7",
|
||||
"deviceAssetId": "812813100821.jpg",
|
||||
"ownerId": "fc9fd5a1-d1b3-4080-a21c-daf9b1c24593",
|
||||
"deviceId": "Library Import",
|
||||
"type": "IMAGE",
|
||||
"originalPath": "/var/snap/immich-distribution/pictures/82/812813100821.jpg",
|
||||
"previewPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/8c/23/8c239624-2bea-479d-b7fa-9f2cd5ebc9b7-preview.jpeg",
|
||||
"fileCreatedAt": "2021-08-28T16:29:07.65-07:00",
|
||||
"fileModifiedAt": "2021-08-28T16:29:08-07:00",
|
||||
"isFavorite": false,
|
||||
"duration": null,
|
||||
"thumbnailPath": "/var/snap/immich-distribution/common/upload/thumbs/fc9fd5a1-d1b3-4080-a21c-daf9b1c24593/8c/23/8c239624-2bea-479d-b7fa-9f2cd5ebc9b7-thumbnail.webp",
|
||||
"encodedVideoPath": "",
|
||||
"checksum": "\\x25a9ffe84298f0e3e7151aaf2eb339908574c035",
|
||||
"isVisible": true,
|
||||
"livePhotoVideoId": null,
|
||||
"updatedAt": "2024-04-25T13:08:00.918411-07:00",
|
||||
"createdAt": "2024-04-25T10:14:13.134038-07:00",
|
||||
"isArchived": false,
|
||||
"originalFileName": "812813100821.jpg",
|
||||
"sidecarPath": null,
|
||||
"isReadOnly": true,
|
||||
"thumbhash": "\\x21080e0d825878767f9678bf7747799612c3b0308a",
|
||||
"isOffline": false,
|
||||
"libraryId": "af11ab7c-0782-4b7a-ba8e-fe68cf9a718d",
|
||||
"isExternal": true,
|
||||
"deletedAt": null,
|
||||
"localDateTime": "2021-08-28T09:29:07.65-07:00",
|
||||
"stackId": null
|
||||
}
|
||||
{
|
||||
"EndLine": 116,
|
||||
"FirstLine": "private Tuple\u003Cstring, Test[], JsonElement[], List\u003CFileInfo\u003E\u003E GetExtractResult(string reportFullPath, DateTime dateTime)",
|
||||
"FirstUsedLine": 87,
|
||||
"Name": "GetExtractResult",
|
||||
"ParameterCount": 2,
|
||||
"StartLine": 107
|
||||
},
|
||||
{
|
||||
"EndLine": 478,
|
||||
"FirstLine": "private void WriteFiles(string reportFullPath, DateTime dateTime)",
|
||||
"FirstUsedLine": 112,
|
||||
"Name": "WriteFiles",
|
||||
"ParameterCount": 2,
|
||||
"StartLine": 467
|
||||
},
|
||||
{
|
||||
"EndLine": 195,
|
||||
"FirstLine": "private static ReadOnlyCollection\u003CRecord\u003E GetKeyValuePairs(ReadOnlyDictionary\u003Cint, WorkItem\u003E keyValuePairs, WorkItem workItem, List\u003Cbool\u003E nests)",
|
||||
"FirstUsedLine": 132,
|
||||
"Name": "GetKeyValuePairs",
|
||||
"ParameterCount": 3,
|
||||
"StartLine": 159
|
||||
},
|
||||
{
|
||||
"EndLine": 158,
|
||||
"FirstLine": "private static int? GetIdFromUrlIfChild(Relation relation)",
|
||||
"FirstUsedLine": 173,
|
||||
"Name": "GetIdFromUrlIfChild",
|
||||
"ParameterCount": 1,
|
||||
"StartLine": 143
|
||||
},
|
||||
{
|
||||
"EndLine": 271,
|
||||
"FirstLine": "private static void AppendLines(List\u003Cchar\u003E spaces, List\u003Cstring\u003E lines, Record record, bool condensed, bool sprintOnly)",
|
||||
"FirstUsedLine": 199,
|
||||
"Name": "AppendLines",
|
||||
"ParameterCount": 5,
|
||||
"StartLine": 257
|
||||
},
|
||||
{
|
||||
"EndLine": 246,
|
||||
"FirstLine": "private static void AppendLines(string url, List\u003Cchar\u003E spaces, List\u003Cstring\u003E lines, ReadOnlyCollection\u003CRecord\u003E records, string workItemType)",
|
||||
"FirstUsedLine": 217,
|
||||
"Name": "AppendLines",
|
||||
"ParameterCount": 5,
|
||||
"StartLine": 199
|
||||
},
|
||||
{
|
||||
"EndLine": 198,
|
||||
"FirstLine": "private static string GetClosed(WorkItem workItem) =\u003E",
|
||||
"FirstUsedLine": 250,
|
||||
"Name": "GetClosed",
|
||||
"ParameterCount": 1,
|
||||
"StartLine": 196
|
||||
},
|
||||
{
|
||||
"EndLine": 256,
|
||||
"FirstLine": "private static string GetLine(List\u003Cchar\u003E spaces, WorkItem workItem, Record record, bool condensed, bool sprintOnly)",
|
||||
"FirstUsedLine": 265,
|
||||
"Name": "GetLine",
|
||||
"ParameterCount": 5,
|
||||
"StartLine": 247
|
||||
},
|
||||
{
|
||||
"EndLine": 435,
|
||||
"FirstLine": "private static void WriteFiles(string destinationDirectory, ReadOnlyCollection\u003Cstring\u003E lines, ReadOnlyCollection\u003CWorkItem\u003E workItems, string fileName)",
|
||||
"FirstUsedLine": 272,
|
||||
"Name": "WriteFiles",
|
||||
"ParameterCount": 4,
|
||||
"StartLine": 417
|
||||
},
|
||||
{
|
||||
"EndLine": 445,
|
||||
"FirstLine": "private static ReadOnlyDictionary\u003Cint, Record\u003E GetWorkItems(ReadOnlyCollection\u003CWorkItem\u003E workItems)",
|
||||
"FirstUsedLine": 277,
|
||||
"Name": "GetWorkItems",
|
||||
"ParameterCount": 1,
|
||||
"StartLine": 436
|
||||
},
|
||||
{
|
||||
"EndLine": 457,
|
||||
"FirstLine": "private static void WriteFileStructure(string destinationDirectory, ReadOnlyDictionary\u003Cint, Record\u003E keyValuePairs)",
|
||||
"FirstUsedLine": 278,
|
||||
"Name": "WriteFileStructure",
|
||||
"ParameterCount": 2,
|
||||
"StartLine": 446
|
||||
},
|
||||
{
|
||||
"EndLine": 466,
|
||||
"FirstLine": "private static void WriteFiles(string destinationDirectory, ReadOnlyCollection\u003CRecord\u003E records, string fileName)",
|
||||
"FirstUsedLine": 284,
|
||||
"Name": "WriteFiles",
|
||||
"ParameterCount": 3,
|
||||
"StartLine": 458
|
||||
},
|
||||
{
|
||||
"EndLine": 335,
|
||||
"FirstLine": "private static void WriteFiles(FileConnectorConfiguration fileConnectorConfiguration, string url, ReadOnlyCollection\u003Cstring\u003E workItemTypes, ReadOnlyCollection\u003CWorkItem\u003E workItems)",
|
||||
"FirstUsedLine": 292,
|
||||
"Name": "WriteFiles",
|
||||
"ParameterCount": 4,
|
||||
"StartLine": 272
|
||||
},
|
||||
{
|
||||
"EndLine": 346,
|
||||
"FirstLine": "private static void FilterChildren(ReadOnlyCollection\u003Cstring\u003E workItemTypes, Record record, List\u003CWorkItem\u003E results)",
|
||||
"FirstUsedLine": 343,
|
||||
"Name": "FilterChildren",
|
||||
"ParameterCount": 3,
|
||||
"StartLine": 336
|
||||
},
|
||||
{
|
||||
"EndLine": 389,
|
||||
"FirstLine": "private static ReadOnlyCollection\u003Cstring\u003E GetChildrenDirectories(ReadOnlyDictionary\u003Cint, Record\u003E keyValuePairs, List\u003Cbool\u003E nests, string parentDirectory, Record record)",
|
||||
"FirstUsedLine": 384,
|
||||
"Name": "GetChildrenDirectories",
|
||||
"ParameterCount": 4,
|
||||
"StartLine": 365
|
||||
},
|
||||
{
|
||||
"EndLine": 142,
|
||||
"FirstLine": "private static ReadOnlyDictionary\u003Cint, Record\u003E GetKeyValuePairs(ReadOnlyDictionary\u003Cint, WorkItem\u003E keyValuePairs)",
|
||||
"FirstUsedLine": 442,
|
||||
"Name": "GetKeyValuePairs",
|
||||
"ParameterCount": 1,
|
||||
"StartLine": 117
|
||||
},
|
||||
{
|
||||
"EndLine": 416,
|
||||
"FirstLine": "private static ReadOnlyCollection\u003Cstring\u003E GetDirectories(string destinationDirectory, ReadOnlyDictionary\u003Cint, Record\u003E keyValuePairs)",
|
||||
"FirstUsedLine": 448,
|
||||
"Name": "GetDirectories",
|
||||
"ParameterCount": 2,
|
||||
"StartLine": 390
|
||||
},
|
||||
{
|
||||
"EndLine": 353,
|
||||
"FirstLine": "private static ReadOnlyCollection\u003CWorkItem\u003E FilterChildren(ReadOnlyCollection\u003Cstring\u003E workItemTypes, Record record)",
|
||||
"FirstUsedLine": 506,
|
||||
"Name": "FilterChildren",
|
||||
"ParameterCount": 2,
|
||||
"StartLine": 347
|
||||
},
|
||||
{
|
||||
"EndLine": 364,
|
||||
"FirstLine": "private static int GetState(WorkItem workItem) =\u003E",
|
||||
"FirstUsedLine": 628,
|
||||
"Name": "GetState",
|
||||
"ParameterCount": 1,
|
||||
"StartLine": 354
|
||||
}
|
||||
]
|
12
.vscode/launch.json
vendored
12
.vscode/launch.json
vendored
@ -19,7 +19,17 @@
|
||||
"https://oi-metrology-viewer-prod.mes.infineon.com/json/work-items.json?v=2024-10-07-10-09&_=1728336047608",
|
||||
"Epic|Feature|User Story",
|
||||
"https://tfs.intra.infineon.com/tfs/FactoryIntegration/ART%20SPS/_workitems/edit/",
|
||||
"L:/DevOps/Mesa_FI/File-Folder-Helper/.vscode/helper/tfs"
|
||||
"L:/DevOps/Mesa_FI/File-Folder-Helper/.vscode/helper/tfs",
|
||||
"s",
|
||||
"X",
|
||||
"T:/MESAFIBACKLOG/06_SourceCode/MESAFIBACKLOG",
|
||||
"Day-Helper-2024-01-08",
|
||||
"T:/MESAFIBACKLOG/06_SourceCode/MESAFIBACKLOG/Adaptation/FileHandlers/Markdown",
|
||||
"s",
|
||||
"X",
|
||||
"L:/DevOps/Mesa_FI/File-Folder-Helper",
|
||||
"Day-Helper-2024-01-08",
|
||||
"L:/DevOps/Mesa_FI/File-Folder-Helper/ADO2024/PI3"
|
||||
],
|
||||
"cwd": "${workspaceFolder}",
|
||||
"console": "integratedTerminal",
|
||||
|
7
.vscode/tasks.json
vendored
7
.vscode/tasks.json
vendored
@ -132,11 +132,16 @@
|
||||
"type": "shell",
|
||||
"command": "L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net8.0/win-x64/publish/File-Folder-Helper.exe",
|
||||
"args": [
|
||||
"s",
|
||||
"X",
|
||||
"T:/MESAFIBACKLOG/06_SourceCode/MESAFIBACKLOG",
|
||||
"Day-Helper-2024-01-08",
|
||||
"T:/MESAFIBACKLOG/06_SourceCode/MESAFIBACKLOG/Adaptation/FileHandlers/Markdown",
|
||||
"s",
|
||||
"X",
|
||||
"L:/DevOps/Mesa_FI/File-Folder-Helper",
|
||||
"Day-Helper-2024-01-08",
|
||||
"L:/DevOps/Mesa_FI/File-Folder-Helper/Helpers"
|
||||
"L:/DevOps/Mesa_FI/File-Folder-Helper/ADO2024/PI3"
|
||||
],
|
||||
"problemMatcher": []
|
||||
},
|
||||
|
@ -1,5 +1,7 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace File_Folder_Helper.ADO2024.PI1;
|
||||
@ -7,11 +9,18 @@ namespace File_Folder_Helper.ADO2024.PI1;
|
||||
internal static partial class Helper20240108
|
||||
{
|
||||
|
||||
private record Method(string Name,
|
||||
private record Method(int EndLine,
|
||||
string FirstLine,
|
||||
int FirstUsedLine,
|
||||
string Name,
|
||||
int ParameterCount,
|
||||
int StartLine,
|
||||
int EndLine,
|
||||
int FirstUsedLine);
|
||||
int StartLine);
|
||||
|
||||
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||
[JsonSerializable(typeof(Method[]))]
|
||||
private partial class MethodCollectionCommonSourceGenerationContext : JsonSerializerContext
|
||||
{
|
||||
}
|
||||
|
||||
[GeneratedRegex(@"(?<method>[A-Z]{1}[A-Za-z_0-9]*)\(")]
|
||||
private static partial Regex CSharpMethodName();
|
||||
@ -40,7 +49,7 @@ internal static partial class Helper20240108
|
||||
for (int j = i - 1; j > -1; j--)
|
||||
{
|
||||
line = lines[j].Trim();
|
||||
if (!line.StartsWith('[') && !line.StartsWith("/// "))
|
||||
if (!line.StartsWith('[') && !line.StartsWith('#') && !line.StartsWith("/// "))
|
||||
break;
|
||||
result--;
|
||||
}
|
||||
@ -155,7 +164,9 @@ internal static partial class Helper20240108
|
||||
string line;
|
||||
string? name;
|
||||
int startLine;
|
||||
Method method;
|
||||
string search;
|
||||
string firstLine;
|
||||
string innerLine;
|
||||
string searchNot;
|
||||
string searchWrap;
|
||||
@ -186,12 +197,18 @@ internal static partial class Helper20240108
|
||||
startLine = GetStartLine(lines, i);
|
||||
searchConstructor = $"{name.ToLower()} = new(";
|
||||
parameterCount = GetParameterCount(line, search);
|
||||
isLinq = lines[i + 1].Trim() != "{";
|
||||
if (!lines[startLine].StartsWith("#pragma"))
|
||||
firstLine = lines[startLine].Trim();
|
||||
else
|
||||
firstLine = lines[startLine + 1].Trim();
|
||||
isLinq = !lines[i + 1].StartsWith("#pragma") && lines[i + 1].Trim() != "{";
|
||||
if (isLinq)
|
||||
blocks++;
|
||||
for (int j = i + 1; j < lines.Length; j++)
|
||||
{
|
||||
innerLine = lines[j].Trim();
|
||||
if (innerLine.StartsWith("#pragma"))
|
||||
continue;
|
||||
if (isLinq && string.IsNullOrEmpty(innerLine))
|
||||
{
|
||||
if (line.EndsWith(';'))
|
||||
@ -218,7 +235,8 @@ internal static partial class Helper20240108
|
||||
}
|
||||
if (j > lines.Length - 2)
|
||||
throw new Exception();
|
||||
results.Add(new(name, parameterCount, startLine, endLine, firstUsedLine.Value));
|
||||
method = new(endLine, firstLine, firstUsedLine.Value, name, parameterCount, startLine);
|
||||
results.Add(method);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -230,6 +248,8 @@ internal static partial class Helper20240108
|
||||
{
|
||||
bool result;
|
||||
List<string> results = [];
|
||||
if (methods.Count == 0)
|
||||
File.WriteAllText(".vscode/.json", JsonSerializer.Serialize(methods.ToArray(), MethodCollectionCommonSourceGenerationContext.Default.MethodArray));
|
||||
ReadOnlyCollection<int> methodLines = GetMethodLines(methods);
|
||||
int minMethodLines = methodLines.Min();
|
||||
for (int i = 0; i < minMethodLines; i++)
|
||||
|
@ -7,48 +7,40 @@ namespace File_Folder_Helper.ADO2024.PI3;
|
||||
internal static partial class Helper20240911
|
||||
{
|
||||
|
||||
public record Attribute([property: JsonPropertyName("isLocked")] bool IsLocked,
|
||||
[property: JsonPropertyName("name")] string Name);
|
||||
private record Attribute([property: JsonPropertyName("isLocked")] bool IsLocked,
|
||||
[property: JsonPropertyName("name")] string Name);
|
||||
|
||||
public record Relation([property: JsonPropertyName("rel")] string Type,
|
||||
[property: JsonPropertyName("url")] string URL,
|
||||
[property: JsonPropertyName("attributes")] Attribute Attributes);
|
||||
private record Relation([property: JsonPropertyName("rel")] string Type,
|
||||
[property: JsonPropertyName("url")] string URL,
|
||||
[property: JsonPropertyName("attributes")] Attribute Attributes);
|
||||
|
||||
public record Record(WorkItem WorkItem, WorkItem? Parent, ReadOnlyCollection<Record> Children);
|
||||
|
||||
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||
[JsonSerializable(typeof(Record[]))]
|
||||
internal partial class RecordCollectionCommonSourceGenerationContext : JsonSerializerContext
|
||||
{
|
||||
}
|
||||
|
||||
public record WorkItem(string AreaPath,
|
||||
string? AssignedTo,
|
||||
int? BusinessValue,
|
||||
DateTime ChangedDate,
|
||||
DateTime? ClosedDate,
|
||||
int CommentCount,
|
||||
DateTime CreatedDate,
|
||||
string Description,
|
||||
float? Effort,
|
||||
int Id,
|
||||
string IterationPath,
|
||||
int? Parent,
|
||||
int? Priority,
|
||||
Relation[] Relations,
|
||||
string? Requester,
|
||||
DateTime? ResolvedDate,
|
||||
int Revision,
|
||||
int? RiskReductionMinusOpportunityEnablement,
|
||||
DateTime? StartDate,
|
||||
string State,
|
||||
string Tags,
|
||||
DateTime? TargetDate,
|
||||
float? TimeCriticality,
|
||||
string Title,
|
||||
string? Violation,
|
||||
float? WeightedShortestJobFirst,
|
||||
string WorkItemType)
|
||||
private record WorkItem(string AreaPath,
|
||||
string? AssignedTo,
|
||||
int? BusinessValue,
|
||||
DateTime ChangedDate,
|
||||
DateTime? ClosedDate,
|
||||
int CommentCount,
|
||||
DateTime CreatedDate,
|
||||
string Description,
|
||||
float? Effort,
|
||||
int Id,
|
||||
string IterationPath,
|
||||
int? Parent,
|
||||
int? Priority,
|
||||
Relation[] Relations,
|
||||
string? Requester,
|
||||
DateTime? ResolvedDate,
|
||||
int Revision,
|
||||
int? RiskReductionMinusOpportunityEnablement,
|
||||
DateTime? StartDate,
|
||||
string State,
|
||||
string Tags,
|
||||
DateTime? TargetDate,
|
||||
float? TimeCriticality,
|
||||
string Title,
|
||||
string? Violation,
|
||||
float? WeightedShortestJobFirst,
|
||||
string WorkItemType)
|
||||
{
|
||||
|
||||
public override string ToString() => $"{Id} - {WorkItemType} - {Title}";
|
||||
@ -86,7 +78,17 @@ internal static partial class Helper20240911
|
||||
|
||||
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||
[JsonSerializable(typeof(WorkItem[]))]
|
||||
internal partial class WorkItemSourceGenerationContext : JsonSerializerContext
|
||||
private partial class WorkItemSourceGenerationContext : JsonSerializerContext
|
||||
{
|
||||
}
|
||||
|
||||
private record Record(WorkItem WorkItem,
|
||||
WorkItem? Parent,
|
||||
ReadOnlyCollection<Record> Children);
|
||||
|
||||
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||
[JsonSerializable(typeof(Record[]))]
|
||||
private partial class RecordCollectionCommonSourceGenerationContext : JsonSerializerContext
|
||||
{
|
||||
}
|
||||
|
||||
@ -110,6 +112,7 @@ internal static partial class Helper20240911
|
||||
{
|
||||
List<Record> results = [];
|
||||
int? childId;
|
||||
Record record;
|
||||
nests.Add(true);
|
||||
WorkItem? childWorkItem;
|
||||
WorkItem? parentWorkItem;
|
||||
@ -128,16 +131,17 @@ internal static partial class Helper20240911
|
||||
collection.Add(childWorkItem);
|
||||
}
|
||||
collection = (from l in collection orderby l.State != "Closed", l.Id select l).ToList();
|
||||
foreach (WorkItem item in collection)
|
||||
foreach (WorkItem w in collection)
|
||||
{
|
||||
if (nests.Count > 99)
|
||||
break;
|
||||
if (item.Parent is null)
|
||||
if (w.Parent is null)
|
||||
parentWorkItem = null;
|
||||
else
|
||||
_ = keyValuePairs.TryGetValue(item.Parent.Value, out parentWorkItem);
|
||||
records = GetKeyValuePairs(keyValuePairs, item, nests);
|
||||
results.Add(new(item, parentWorkItem, records));
|
||||
_ = keyValuePairs.TryGetValue(w.Parent.Value, out parentWorkItem);
|
||||
records = GetKeyValuePairs(keyValuePairs, w, nests);
|
||||
record = new(w, parentWorkItem, records);
|
||||
results.Add(record);
|
||||
}
|
||||
}
|
||||
return new(results);
|
||||
@ -219,90 +223,46 @@ internal static partial class Helper20240911
|
||||
return result;
|
||||
}
|
||||
|
||||
private static ReadOnlyCollection<WorkItem> GetWorkItemsNotMatching(string tags, ReadOnlyCollection<WorkItem> workItems)
|
||||
{
|
||||
List<WorkItem> results = [];
|
||||
string[] segments;
|
||||
string[] parentTags = tags.Split(';');
|
||||
foreach (WorkItem workItem in workItems)
|
||||
{
|
||||
segments = tags.Split(';');
|
||||
if (segments.Length > 0 && parentTags.Any(l => segments.Contains(l)))
|
||||
continue;
|
||||
results.Add(workItem);
|
||||
}
|
||||
return new(results);
|
||||
}
|
||||
|
||||
private static ReadOnlyCollection<WorkItem> GetWorkItemsNotMatching(int? priority, ReadOnlyCollection<WorkItem> workItems)
|
||||
{
|
||||
List<WorkItem> results = [];
|
||||
foreach (WorkItem workItem in workItems)
|
||||
{
|
||||
if (workItem.Priority == priority)
|
||||
continue;
|
||||
results.Add(workItem);
|
||||
}
|
||||
return new(results);
|
||||
}
|
||||
|
||||
private static int GetState(WorkItem workItem) =>
|
||||
workItem.State switch
|
||||
{
|
||||
"New" => 1,
|
||||
"Active" => 2,
|
||||
"Resolved" => 3,
|
||||
"Closed" => 4,
|
||||
"Removed" => 5,
|
||||
_ => 8
|
||||
};
|
||||
|
||||
private static ReadOnlyCollection<WorkItem> GetWorkItemsNotMatching(Record record, ReadOnlyCollection<WorkItem> workItems)
|
||||
{
|
||||
List<WorkItem> results = [];
|
||||
int check;
|
||||
int state = GetState(record.WorkItem);
|
||||
List<KeyValuePair<int, WorkItem>> collection = [];
|
||||
foreach (WorkItem workItem in workItems)
|
||||
{
|
||||
check = GetState(workItem);
|
||||
if (check == state)
|
||||
continue;
|
||||
collection.Add(new(check, workItem));
|
||||
}
|
||||
foreach (KeyValuePair<int, WorkItem> keyValuePair in collection.OrderByDescending(l => l.Key))
|
||||
results.Add(keyValuePair.Value);
|
||||
return new(results);
|
||||
}
|
||||
|
||||
private static ReadOnlyCollection<string> GetChildrenDirectories(ReadOnlyDictionary<int, Record> keyValuePairs, List<bool> nests, string parentDirectory, ReadOnlyCollection<Record> children)
|
||||
private static ReadOnlyCollection<string> GetChildrenDirectories(ReadOnlyDictionary<int, Record> keyValuePairs, List<bool> nests, string parentDirectory, Record record)
|
||||
{
|
||||
List<string> results = [];
|
||||
nests.Add(true);
|
||||
string directory;
|
||||
Record? childRecord;
|
||||
ReadOnlyCollection<string> childrenDirectories;
|
||||
foreach (Record record in children)
|
||||
foreach (Record r in record.Children)
|
||||
{
|
||||
// if (record.WorkItem.Id == 110730)
|
||||
// continue;
|
||||
// if (record.WorkItem.Id == 110732)
|
||||
// continue;
|
||||
directory = Path.Combine(parentDirectory, $"{record.WorkItem.WorkItemType[..1]}-{record.WorkItem.Id}-{record.WorkItem.Title.Trim()[..1]}");
|
||||
directory = Path.Combine(parentDirectory, $"{r.WorkItem.WorkItemType[..1]}-{r.WorkItem.Id}-{r.WorkItem.Title.Trim()[..1]}");
|
||||
results.Add(directory);
|
||||
if (!keyValuePairs.TryGetValue(record.WorkItem.Id, out childRecord))
|
||||
if (!keyValuePairs.TryGetValue(r.WorkItem.Id, out childRecord))
|
||||
continue;
|
||||
if (nests.Count > 99)
|
||||
break;
|
||||
childrenDirectories = GetChildrenDirectories(keyValuePairs, nests, directory, childRecord.Children);
|
||||
childrenDirectories = GetChildrenDirectories(keyValuePairs, nests, directory, childRecord);
|
||||
results.AddRange(childrenDirectories);
|
||||
}
|
||||
return new(results);
|
||||
}
|
||||
|
||||
private static void FilterChildren(ReadOnlyCollection<string> workItemTypes, Record record, List<WorkItem> results)
|
||||
{
|
||||
foreach (Record r in record.Children)
|
||||
{
|
||||
if (!workItemTypes.Contains(r.WorkItem.WorkItemType))
|
||||
continue;
|
||||
results.Add(r.WorkItem);
|
||||
FilterChildren(workItemTypes, r, results);
|
||||
}
|
||||
}
|
||||
|
||||
private static ReadOnlyDictionary<int, Record> GetKeyValuePairs(ReadOnlyDictionary<int, WorkItem> keyValuePairs)
|
||||
{
|
||||
Dictionary<int, Record> results = [];
|
||||
Record record;
|
||||
List<bool> nests = [];
|
||||
WorkItem? parentWorkItem;
|
||||
ReadOnlyCollection<Record> records;
|
||||
@ -316,12 +276,13 @@ internal static partial class Helper20240911
|
||||
try
|
||||
{
|
||||
records = GetKeyValuePairs(keyValuePairs, keyValuePair.Value, nests);
|
||||
results.Add(keyValuePair.Key, new(keyValuePair.Value, parentWorkItem, records));
|
||||
record = new(keyValuePair.Value, parentWorkItem, records);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
results.Add(keyValuePair.Key, new(keyValuePair.Value, parentWorkItem, new([])));
|
||||
record = new(keyValuePair.Value, parentWorkItem, new([]));
|
||||
}
|
||||
results.Add(keyValuePair.Key, record);
|
||||
}
|
||||
return new(results);
|
||||
}
|
||||
@ -347,40 +308,30 @@ internal static partial class Helper20240911
|
||||
// continue;
|
||||
nests.Clear();
|
||||
directory = Path.Combine(ticksDirectory, $"{record.WorkItem.WorkItemType[..1]}-{record.WorkItem.Id}-{record.WorkItem.Title.Trim()[..1]}");
|
||||
childrenDirectories = GetChildrenDirectories(keyValuePairs, nests, directory, record.Children);
|
||||
childrenDirectories = GetChildrenDirectories(keyValuePairs, nests, directory, record);
|
||||
results.AddRange(childrenDirectories);
|
||||
}
|
||||
return new(results.Distinct().ToArray());
|
||||
}
|
||||
|
||||
private static ReadOnlyCollection<WorkItem> FilterChildren(Record record, ReadOnlyCollection<string> workItemTypes)
|
||||
private static int GetState(WorkItem workItem) =>
|
||||
workItem.State switch
|
||||
{
|
||||
"New" => 1,
|
||||
"Active" => 2,
|
||||
"Resolved" => 3,
|
||||
"Closed" => 4,
|
||||
"Removed" => 5,
|
||||
_ => 8
|
||||
};
|
||||
|
||||
private static ReadOnlyCollection<WorkItem> FilterChildren(ReadOnlyCollection<string> workItemTypes, Record record)
|
||||
{
|
||||
List<WorkItem> results = [];
|
||||
WorkItem workItem;
|
||||
foreach (Record child in record.Children)
|
||||
{
|
||||
workItem = child.WorkItem;
|
||||
if (!workItemTypes.Contains(workItem.WorkItemType))
|
||||
continue;
|
||||
results.Add(workItem);
|
||||
}
|
||||
FilterChildren(workItemTypes, record, results);
|
||||
return new(results);
|
||||
}
|
||||
|
||||
private static string? GetMaxIterationPath(ReadOnlyCollection<WorkItem> workItems)
|
||||
{
|
||||
string? result;
|
||||
List<string> results = [];
|
||||
foreach (WorkItem workItem in workItems)
|
||||
{
|
||||
if (results.Contains(workItem.IterationPath))
|
||||
continue;
|
||||
results.Add(workItem.IterationPath);
|
||||
}
|
||||
result = results.Count == 0 ? null : results.Max();
|
||||
return result;
|
||||
}
|
||||
|
||||
private static ReadOnlyDictionary<int, Record> GetWorkItems(ILogger<Worker> logger, string developmentURL, string productionURL)
|
||||
{
|
||||
ReadOnlyDictionary<int, Record> results;
|
||||
@ -393,15 +344,18 @@ internal static partial class Helper20240911
|
||||
logger.LogWarning("{StatusCode} for {url}", httpResponseMessage.Result.StatusCode, developmentURL);
|
||||
Task<string> developmentJSON = httpResponseMessage.Result.Content.ReadAsStringAsync();
|
||||
developmentJSON.Wait();
|
||||
httpResponseMessage = httpClient.GetAsync(productionURL);
|
||||
httpResponseMessage.Wait();
|
||||
if (!httpResponseMessage.Result.IsSuccessStatusCode)
|
||||
logger.LogWarning("{StatusCode} for {url}", httpResponseMessage.Result.StatusCode, productionURL);
|
||||
Task<string> productionJSON = httpResponseMessage.Result.Content.ReadAsStringAsync();
|
||||
productionJSON.Wait();
|
||||
if (developmentJSON.Result != developmentJSON.Result)
|
||||
logger.LogWarning("developmentJSON doesn't match developmentJSON");
|
||||
WorkItem[]? workItems = JsonSerializer.Deserialize(productionJSON.Result, WorkItemSourceGenerationContext.Default.WorkItemArray);
|
||||
if (!string.IsNullOrEmpty(productionURL))
|
||||
{
|
||||
httpResponseMessage = httpClient.GetAsync(productionURL);
|
||||
httpResponseMessage.Wait();
|
||||
if (!httpResponseMessage.Result.IsSuccessStatusCode)
|
||||
logger.LogWarning("{StatusCode} for {url}", httpResponseMessage.Result.StatusCode, productionURL);
|
||||
Task<string> productionJSON = httpResponseMessage.Result.Content.ReadAsStringAsync();
|
||||
productionJSON.Wait();
|
||||
if (productionJSON.Result != developmentJSON.Result)
|
||||
logger.LogWarning("productionJSON doesn't match developmentJSON");
|
||||
}
|
||||
WorkItem[]? workItems = JsonSerializer.Deserialize(developmentJSON.Result, WorkItemSourceGenerationContext.Default.WorkItemArray);
|
||||
if (workItems is null)
|
||||
logger.LogWarning("workItems is null");
|
||||
else
|
||||
@ -453,6 +407,108 @@ internal static partial class Helper20240911
|
||||
File.WriteAllText(jsonFile, json);
|
||||
}
|
||||
|
||||
private static ReadOnlyCollection<WorkItem> GetWorkItemsNotMatching122514(Record record, ReadOnlyCollection<WorkItem> workItems)
|
||||
{
|
||||
List<WorkItem> results = [];
|
||||
string[] segments;
|
||||
string[] parentTags = record.WorkItem.Tags.Split(';').Select(l => l.Trim()).ToArray();
|
||||
foreach (WorkItem workItem in workItems)
|
||||
{
|
||||
segments = string.IsNullOrEmpty(workItem.Tags) ? [] : workItem.Tags.Split(';').Select(l => l.Trim()).ToArray();
|
||||
if (segments.Length > 0 && parentTags.Any(l => segments.Contains(l)))
|
||||
continue;
|
||||
results.Add(workItem);
|
||||
}
|
||||
return new(results);
|
||||
}
|
||||
|
||||
private static ReadOnlyCollection<WorkItem> GetWorkItemsNotMatching126169(Record record, ReadOnlyCollection<WorkItem> workItems)
|
||||
{
|
||||
List<WorkItem> results = [];
|
||||
foreach (WorkItem workItem in workItems)
|
||||
{
|
||||
if (record.WorkItem.Priority is null)
|
||||
{
|
||||
results.Add(record.WorkItem);
|
||||
break;
|
||||
}
|
||||
if (workItem.Priority == record.WorkItem.Priority.Value)
|
||||
continue;
|
||||
results.Add(workItem);
|
||||
}
|
||||
return new(results);
|
||||
}
|
||||
|
||||
private static ReadOnlyCollection<WorkItem> GetWorkItemsNotMatching123066(Record record, ReadOnlyCollection<WorkItem> workItems)
|
||||
{
|
||||
List<WorkItem> results = [];
|
||||
int check;
|
||||
int state = GetState(record.WorkItem);
|
||||
List<KeyValuePair<int, WorkItem>> collection = [];
|
||||
foreach (WorkItem workItem in workItems)
|
||||
{
|
||||
if (workItem.State is "Removed")
|
||||
continue;
|
||||
check = GetState(workItem);
|
||||
if (check == state)
|
||||
continue;
|
||||
collection.Add(new(check, workItem));
|
||||
}
|
||||
if (collection.Count > 0)
|
||||
{
|
||||
KeyValuePair<int, WorkItem>[] notNewState = (from l in collection where l.Value.State != "New" select l).ToArray();
|
||||
if (notNewState.Length == 0 && record.WorkItem.State is "New" or "Active")
|
||||
collection.Clear();
|
||||
else if (notNewState.Length > 0)
|
||||
{
|
||||
int minimum = notNewState.Min(l => l.Key);
|
||||
if (minimum == state)
|
||||
collection.Clear();
|
||||
else if (minimum == 1 && record.WorkItem.State == "New")
|
||||
collection.Clear();
|
||||
else if (notNewState.Length > 0 && record.WorkItem.State == "Active")
|
||||
collection.Clear();
|
||||
}
|
||||
}
|
||||
foreach (KeyValuePair<int, WorkItem> keyValuePair in collection.OrderByDescending(l => l.Key))
|
||||
results.Add(keyValuePair.Value);
|
||||
return new(results);
|
||||
}
|
||||
|
||||
private static ReadOnlyCollection<WorkItem> GetWorkItemsNotMatching123067(Record record, ReadOnlyCollection<WorkItem> workItems)
|
||||
{
|
||||
List<WorkItem> results = [];
|
||||
int check;
|
||||
int state = GetState(record.WorkItem);
|
||||
List<KeyValuePair<int, WorkItem>> collection = [];
|
||||
foreach (WorkItem workItem in workItems)
|
||||
{
|
||||
if (record.WorkItem.State is "Removed" or "Resolved" or "Closed")
|
||||
continue;
|
||||
check = GetState(workItem);
|
||||
if (check == state)
|
||||
continue;
|
||||
collection.Add(new(check, workItem));
|
||||
}
|
||||
foreach (KeyValuePair<int, WorkItem> keyValuePair in collection.OrderByDescending(l => l.Key))
|
||||
results.Add(keyValuePair.Value);
|
||||
return new(results);
|
||||
}
|
||||
|
||||
private static string? GetMaxIterationPath122508(ReadOnlyCollection<WorkItem> workItems)
|
||||
{
|
||||
string? result;
|
||||
List<string> results = [];
|
||||
foreach (WorkItem workItem in workItems)
|
||||
{
|
||||
if (results.Contains(workItem.IterationPath))
|
||||
continue;
|
||||
results.Add(workItem.IterationPath);
|
||||
}
|
||||
result = results.Count == 0 ? null : results.Max();
|
||||
return result;
|
||||
}
|
||||
|
||||
private static ReadOnlyCollection<WorkItem> FeatureCheckIterationPath122508(string url, List<string> lines, ReadOnlyCollection<string> workItemTypes, ReadOnlyCollection<Record> records, string workItemType)
|
||||
{
|
||||
List<WorkItem> results = [];
|
||||
@ -462,14 +518,16 @@ internal static partial class Helper20240911
|
||||
ReadOnlyCollection<WorkItem> childrenWorkItems;
|
||||
foreach (Record record in records)
|
||||
{
|
||||
if (record.WorkItem.State is "Removed")
|
||||
continue;
|
||||
if (record.WorkItem.WorkItemType != workItemType)
|
||||
continue;
|
||||
collection.Clear();
|
||||
violations.Clear();
|
||||
if (record.Children.Count == 0)
|
||||
continue;
|
||||
childrenWorkItems = FilterChildren(record, workItemTypes);
|
||||
maxIterationPath = GetMaxIterationPath(childrenWorkItems);
|
||||
childrenWorkItems = FilterChildren(workItemTypes, record);
|
||||
maxIterationPath = GetMaxIterationPath122508(childrenWorkItems);
|
||||
if (string.IsNullOrEmpty(maxIterationPath) || record.WorkItem.IterationPath == maxIterationPath)
|
||||
continue;
|
||||
collection.Add($"## {record.WorkItem.AssignedTo} - {record.WorkItem.Id} - {record.WorkItem.Title}");
|
||||
@ -478,7 +536,7 @@ internal static partial class Helper20240911
|
||||
collection.Add($"- [ ] {record.WorkItem.Id} => {record.WorkItem.IterationPath} != {maxIterationPath}");
|
||||
collection.Add(string.Empty);
|
||||
lines.AddRange(collection);
|
||||
results.Add(WorkItem.Get(record.WorkItem, $"IterationPath:<a target='_blank' href='{url}{record.WorkItem.Id}'>{record.WorkItem.Id}</a>;{record.WorkItem.IterationPath} != {maxIterationPath}"));
|
||||
results.Add(WorkItem.Get(record.WorkItem, $"IterationPath:<a target='_blank' href=' {url}{record.WorkItem.Id} '>{record.WorkItem.Id}</a>;{record.WorkItem.IterationPath} != {maxIterationPath}"));
|
||||
}
|
||||
return new(results);
|
||||
}
|
||||
@ -492,6 +550,8 @@ internal static partial class Helper20240911
|
||||
ReadOnlyCollection<WorkItem> workItemsNotMatching;
|
||||
foreach (Record record in records)
|
||||
{
|
||||
if (record.WorkItem.State is "Removed")
|
||||
continue;
|
||||
if (record.WorkItem.WorkItemType != workItemType)
|
||||
continue;
|
||||
collection.Clear();
|
||||
@ -502,8 +562,8 @@ internal static partial class Helper20240911
|
||||
workItemsNotMatching = new([record.WorkItem]);
|
||||
else
|
||||
{
|
||||
childrenWorkItems = FilterChildren(record, workItemTypes);
|
||||
workItemsNotMatching = GetWorkItemsNotMatching(record.WorkItem.Tags, childrenWorkItems);
|
||||
childrenWorkItems = FilterChildren(workItemTypes, record);
|
||||
workItemsNotMatching = GetWorkItemsNotMatching122514(record, childrenWorkItems);
|
||||
if (!string.IsNullOrEmpty(record.WorkItem.Tags) && workItemsNotMatching.Count == 0)
|
||||
continue;
|
||||
}
|
||||
@ -516,7 +576,7 @@ internal static partial class Helper20240911
|
||||
lines.AddRange(collection);
|
||||
violations.Add($"Tag:{record.WorkItem.Tags};");
|
||||
foreach (WorkItem workItem in workItemsNotMatching)
|
||||
violations.Add($"<a target='_blank' href='{url}{workItem.Id}'>{workItem.Id}</a>:{workItem.Tags};");
|
||||
violations.Add($"<a target='_blank' href=' {url}{workItem.Id} '>{workItem.Id}</a>:{workItem.Tags};");
|
||||
results.Add(WorkItem.Get(record.WorkItem, string.Join(' ', violations)));
|
||||
}
|
||||
return new(results);
|
||||
@ -531,14 +591,16 @@ internal static partial class Helper20240911
|
||||
ReadOnlyCollection<WorkItem> workItemsNotMatching;
|
||||
foreach (Record record in records)
|
||||
{
|
||||
if (record.WorkItem.State is "Removed")
|
||||
continue;
|
||||
if (record.WorkItem.WorkItemType != workItemType)
|
||||
continue;
|
||||
collection.Clear();
|
||||
violations.Clear();
|
||||
if (record.Children.Count == 0)
|
||||
continue;
|
||||
childrenWorkItems = FilterChildren(record, workItemTypes);
|
||||
workItemsNotMatching = GetWorkItemsNotMatching(record.WorkItem.Priority, childrenWorkItems);
|
||||
childrenWorkItems = FilterChildren(workItemTypes, record);
|
||||
workItemsNotMatching = GetWorkItemsNotMatching126169(record, childrenWorkItems);
|
||||
if (workItemsNotMatching.Count == 0)
|
||||
continue;
|
||||
collection.Add($"## {record.WorkItem.AssignedTo} - {record.WorkItem.Id} - {record.WorkItem.Title}");
|
||||
@ -550,7 +612,7 @@ internal static partial class Helper20240911
|
||||
lines.AddRange(collection);
|
||||
violations.Add($"Priority:{record.WorkItem.Priority};");
|
||||
foreach (WorkItem workItem in workItemsNotMatching)
|
||||
violations.Add($"<a target='_blank' href='{url}{workItem.Id}'>{workItem.Id}</a>:{workItem.Priority};");
|
||||
violations.Add($"<a target='_blank' href=' {url}{workItem.Id} '>{workItem.Id}</a>:{workItem.Priority};");
|
||||
results.Add(WorkItem.Get(record.WorkItem, string.Join(' ', violations)));
|
||||
}
|
||||
return new(results);
|
||||
@ -565,16 +627,16 @@ internal static partial class Helper20240911
|
||||
ReadOnlyCollection<WorkItem> workItemsNotMatching;
|
||||
foreach (Record record in records)
|
||||
{
|
||||
if (record.WorkItem.State is "Removed")
|
||||
continue;
|
||||
if (record.WorkItem.WorkItemType != workItemType)
|
||||
continue;
|
||||
collection.Clear();
|
||||
violations.Clear();
|
||||
if (record.WorkItem.State == "New")
|
||||
continue;
|
||||
if (record.Children.Count == 0)
|
||||
continue;
|
||||
childrenWorkItems = FilterChildren(record, workItemTypes);
|
||||
workItemsNotMatching = GetWorkItemsNotMatching(record, childrenWorkItems);
|
||||
childrenWorkItems = FilterChildren(workItemTypes, record);
|
||||
workItemsNotMatching = GetWorkItemsNotMatching123066(record, childrenWorkItems);
|
||||
if (workItemsNotMatching.Count == 0)
|
||||
continue;
|
||||
collection.Add($"## {record.WorkItem.AssignedTo} - {record.WorkItem.Id} - {record.WorkItem.Title}");
|
||||
@ -586,7 +648,7 @@ internal static partial class Helper20240911
|
||||
lines.AddRange(collection);
|
||||
violations.Add($"State:{record.WorkItem.State};");
|
||||
foreach (WorkItem workItem in workItemsNotMatching)
|
||||
violations.Add($"<a target='_blank' href='{url}{workItem.Id}'>{workItem.Id}</a>:{workItem.State};");
|
||||
violations.Add($"<a target='_blank' href=' {url}{workItem.Id} '>{workItem.Id}</a>:{workItem.State};");
|
||||
results.Add(WorkItem.Get(record.WorkItem, string.Join(' ', violations)));
|
||||
}
|
||||
return new(results);
|
||||
@ -601,14 +663,16 @@ internal static partial class Helper20240911
|
||||
ReadOnlyCollection<WorkItem> workItemsNotMatching;
|
||||
foreach (Record record in records)
|
||||
{
|
||||
if (record.WorkItem.State is "Removed" or "New" or "Active")
|
||||
continue;
|
||||
if (record.WorkItem.WorkItemType != workItemType)
|
||||
continue;
|
||||
collection.Clear();
|
||||
violations.Clear();
|
||||
if (record.Children.Count == 0)
|
||||
continue;
|
||||
childrenWorkItems = FilterChildren(record, workItemTypes);
|
||||
workItemsNotMatching = GetWorkItemsNotMatching(record, childrenWorkItems);
|
||||
childrenWorkItems = FilterChildren(workItemTypes, record);
|
||||
workItemsNotMatching = GetWorkItemsNotMatching123067(record, childrenWorkItems);
|
||||
if (workItemsNotMatching.Count == 0)
|
||||
continue;
|
||||
collection.Add($"## {record.WorkItem.AssignedTo} - {record.WorkItem.Id} - {record.WorkItem.Title}");
|
||||
@ -620,7 +684,7 @@ internal static partial class Helper20240911
|
||||
lines.AddRange(collection);
|
||||
violations.Add($"State:{record.WorkItem.State};");
|
||||
foreach (WorkItem workItem in workItemsNotMatching)
|
||||
violations.Add($"<a target='_blank' href='{url}{workItem.Id}'>{workItem.Id}</a>:{workItem.State};");
|
||||
violations.Add($"<a target='_blank' href=' {url}{workItem.Id} '>{workItem.Id}</a>:{workItem.State};");
|
||||
results.Add(WorkItem.Get(record.WorkItem, string.Join(' ', violations)));
|
||||
}
|
||||
return new(results);
|
||||
|
@ -15,13 +15,13 @@
|
||||
<ItemGroup>
|
||||
<PackageReference Include="CommonMark.NET" Version="0.15.1" />
|
||||
<PackageReference Include="DiscUtils.Iso9660" Version="0.16.13" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.1" />
|
||||
<PackageReference Include="Microsoft.TeamFoundationServer.Client" Version="19.225.1" />
|
||||
<PackageReference Include="runtime.win-x64.Microsoft.DotNet.ILCompiler" Version="8.0.8" />
|
||||
<PackageReference Include="System.Text.Json" Version="8.0.4" />
|
||||
<PackageReference Include="runtime.win-x64.Microsoft.DotNet.ILCompiler" Version="8.0.10" />
|
||||
<PackageReference Include="System.Text.Json" Version="8.0.5" />
|
||||
<PackageReference Include="TextCopy" Version="6.2.1" />
|
||||
<PackageReference Include="WindowsShortcutFactory" Version="1.2.0" />
|
||||
<PackageReference Include="YamlDotNet" Version="16.1.2" />
|
||||
<PackageReference Include="YamlDotNet" Version="16.1.3" />
|
||||
</ItemGroup>
|
||||
</Project>
|
Loading…
x
Reference in New Issue
Block a user