From 4e11d6cd3ba9d7026a158d06075c4c7869af5481 Mon Sep 17 00:00:00 2001 From: David Maas Date: Tue, 28 May 2024 17:52:34 -0500 Subject: [PATCH 01/17] Remove unused solution platforms The x64 platform didn't actually build most of Bonsai, it's an artifact of fb65c18a1960059fb0d913c4233b41fb9208fbfc when Bonsai64 was added (before becoming the default and leading to Bonsai32.) The "Mixed Platforms" platform is something Visual Studio used to automatically add to solutions when multiple projects had conflicting platforms. Technically Mixed Platforms was the default before, but Any CPU was equivalent and makes more sense in the context of Bonsai. --- Bonsai.sln | 204 ----------------------------------------------------- 1 file changed, 204 deletions(-) diff --git a/Bonsai.sln b/Bonsai.sln index befac605..05a70e84 100644 --- a/Bonsai.sln +++ b/Bonsai.sln @@ -75,337 +75,133 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - Debug|Mixed Platforms = Debug|Mixed Platforms - Debug|x64 = Debug|x64 Release|Any CPU = Release|Any CPU - Release|Mixed Platforms = Release|Mixed Platforms - Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F44C66DD-913A-4DF0-B617-F8C458533C50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F44C66DD-913A-4DF0-B617-F8C458533C50}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F44C66DD-913A-4DF0-B617-F8C458533C50}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {F44C66DD-913A-4DF0-B617-F8C458533C50}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {F44C66DD-913A-4DF0-B617-F8C458533C50}.Debug|x64.ActiveCfg = Debug|Any CPU {F44C66DD-913A-4DF0-B617-F8C458533C50}.Release|Any CPU.ActiveCfg = Release|Any CPU {F44C66DD-913A-4DF0-B617-F8C458533C50}.Release|Any CPU.Build.0 = Release|Any CPU - {F44C66DD-913A-4DF0-B617-F8C458533C50}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {F44C66DD-913A-4DF0-B617-F8C458533C50}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {F44C66DD-913A-4DF0-B617-F8C458533C50}.Release|x64.ActiveCfg = Release|Any CPU {C7FDC11D-066A-4B2B-9A52-27A5E793BEFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C7FDC11D-066A-4B2B-9A52-27A5E793BEFB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C7FDC11D-066A-4B2B-9A52-27A5E793BEFB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {C7FDC11D-066A-4B2B-9A52-27A5E793BEFB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {C7FDC11D-066A-4B2B-9A52-27A5E793BEFB}.Debug|x64.ActiveCfg = Debug|Any CPU {C7FDC11D-066A-4B2B-9A52-27A5E793BEFB}.Release|Any CPU.ActiveCfg = Release|Any CPU {C7FDC11D-066A-4B2B-9A52-27A5E793BEFB}.Release|Any CPU.Build.0 = Release|Any CPU - {C7FDC11D-066A-4B2B-9A52-27A5E793BEFB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {C7FDC11D-066A-4B2B-9A52-27A5E793BEFB}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {C7FDC11D-066A-4B2B-9A52-27A5E793BEFB}.Release|x64.ActiveCfg = Release|Any CPU {AA001CB8-FB7C-4D4A-8710-47363CA39016}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AA001CB8-FB7C-4D4A-8710-47363CA39016}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AA001CB8-FB7C-4D4A-8710-47363CA39016}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {AA001CB8-FB7C-4D4A-8710-47363CA39016}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {AA001CB8-FB7C-4D4A-8710-47363CA39016}.Debug|x64.ActiveCfg = Debug|Any CPU - {AA001CB8-FB7C-4D4A-8710-47363CA39016}.Debug|x64.Build.0 = Debug|Any CPU {AA001CB8-FB7C-4D4A-8710-47363CA39016}.Release|Any CPU.ActiveCfg = Release|Any CPU {AA001CB8-FB7C-4D4A-8710-47363CA39016}.Release|Any CPU.Build.0 = Release|Any CPU - {AA001CB8-FB7C-4D4A-8710-47363CA39016}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {AA001CB8-FB7C-4D4A-8710-47363CA39016}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {AA001CB8-FB7C-4D4A-8710-47363CA39016}.Release|x64.ActiveCfg = Release|Any CPU - {AA001CB8-FB7C-4D4A-8710-47363CA39016}.Release|x64.Build.0 = Release|Any CPU {C226E461-6A82-49A7-9CAF-0CF872A1C91B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C226E461-6A82-49A7-9CAF-0CF872A1C91B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C226E461-6A82-49A7-9CAF-0CF872A1C91B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {C226E461-6A82-49A7-9CAF-0CF872A1C91B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {C226E461-6A82-49A7-9CAF-0CF872A1C91B}.Debug|x64.ActiveCfg = Debug|Any CPU {C226E461-6A82-49A7-9CAF-0CF872A1C91B}.Release|Any CPU.ActiveCfg = Release|Any CPU {C226E461-6A82-49A7-9CAF-0CF872A1C91B}.Release|Any CPU.Build.0 = Release|Any CPU - {C226E461-6A82-49A7-9CAF-0CF872A1C91B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {C226E461-6A82-49A7-9CAF-0CF872A1C91B}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {C226E461-6A82-49A7-9CAF-0CF872A1C91B}.Release|x64.ActiveCfg = Release|Any CPU {765D928A-B147-46FF-8A59-BDE73F88A844}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {765D928A-B147-46FF-8A59-BDE73F88A844}.Debug|Any CPU.Build.0 = Debug|Any CPU - {765D928A-B147-46FF-8A59-BDE73F88A844}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {765D928A-B147-46FF-8A59-BDE73F88A844}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {765D928A-B147-46FF-8A59-BDE73F88A844}.Debug|x64.ActiveCfg = Debug|Any CPU {765D928A-B147-46FF-8A59-BDE73F88A844}.Release|Any CPU.ActiveCfg = Release|Any CPU {765D928A-B147-46FF-8A59-BDE73F88A844}.Release|Any CPU.Build.0 = Release|Any CPU - {765D928A-B147-46FF-8A59-BDE73F88A844}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {765D928A-B147-46FF-8A59-BDE73F88A844}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {765D928A-B147-46FF-8A59-BDE73F88A844}.Release|x64.ActiveCfg = Release|Any CPU {E4D03BA3-54A2-4FF8-9DC6-52BA4CC14FED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E4D03BA3-54A2-4FF8-9DC6-52BA4CC14FED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E4D03BA3-54A2-4FF8-9DC6-52BA4CC14FED}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {E4D03BA3-54A2-4FF8-9DC6-52BA4CC14FED}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {E4D03BA3-54A2-4FF8-9DC6-52BA4CC14FED}.Debug|x64.ActiveCfg = Debug|Any CPU {E4D03BA3-54A2-4FF8-9DC6-52BA4CC14FED}.Release|Any CPU.ActiveCfg = Release|Any CPU {E4D03BA3-54A2-4FF8-9DC6-52BA4CC14FED}.Release|Any CPU.Build.0 = Release|Any CPU - {E4D03BA3-54A2-4FF8-9DC6-52BA4CC14FED}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {E4D03BA3-54A2-4FF8-9DC6-52BA4CC14FED}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {E4D03BA3-54A2-4FF8-9DC6-52BA4CC14FED}.Release|x64.ActiveCfg = Release|Any CPU {0004026F-D014-451D-859F-93DCEC59B2A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0004026F-D014-451D-859F-93DCEC59B2A2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0004026F-D014-451D-859F-93DCEC59B2A2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {0004026F-D014-451D-859F-93DCEC59B2A2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {0004026F-D014-451D-859F-93DCEC59B2A2}.Debug|x64.ActiveCfg = Debug|Any CPU {0004026F-D014-451D-859F-93DCEC59B2A2}.Release|Any CPU.ActiveCfg = Release|Any CPU {0004026F-D014-451D-859F-93DCEC59B2A2}.Release|Any CPU.Build.0 = Release|Any CPU - {0004026F-D014-451D-859F-93DCEC59B2A2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {0004026F-D014-451D-859F-93DCEC59B2A2}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {0004026F-D014-451D-859F-93DCEC59B2A2}.Release|x64.ActiveCfg = Release|Any CPU {B783D74F-CB2D-4419-B438-266CD15774FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B783D74F-CB2D-4419-B438-266CD15774FB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B783D74F-CB2D-4419-B438-266CD15774FB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {B783D74F-CB2D-4419-B438-266CD15774FB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {B783D74F-CB2D-4419-B438-266CD15774FB}.Debug|x64.ActiveCfg = Debug|Any CPU {B783D74F-CB2D-4419-B438-266CD15774FB}.Release|Any CPU.ActiveCfg = Release|Any CPU {B783D74F-CB2D-4419-B438-266CD15774FB}.Release|Any CPU.Build.0 = Release|Any CPU - {B783D74F-CB2D-4419-B438-266CD15774FB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {B783D74F-CB2D-4419-B438-266CD15774FB}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {B783D74F-CB2D-4419-B438-266CD15774FB}.Release|x64.ActiveCfg = Release|Any CPU {A341A5A1-45A6-4B35-9AB1-FE42C622F738}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A341A5A1-45A6-4B35-9AB1-FE42C622F738}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A341A5A1-45A6-4B35-9AB1-FE42C622F738}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {A341A5A1-45A6-4B35-9AB1-FE42C622F738}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {A341A5A1-45A6-4B35-9AB1-FE42C622F738}.Debug|x64.ActiveCfg = Debug|Any CPU {A341A5A1-45A6-4B35-9AB1-FE42C622F738}.Release|Any CPU.ActiveCfg = Release|Any CPU {A341A5A1-45A6-4B35-9AB1-FE42C622F738}.Release|Any CPU.Build.0 = Release|Any CPU - {A341A5A1-45A6-4B35-9AB1-FE42C622F738}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {A341A5A1-45A6-4B35-9AB1-FE42C622F738}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {A341A5A1-45A6-4B35-9AB1-FE42C622F738}.Release|x64.ActiveCfg = Release|Any CPU {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|x64.ActiveCfg = Debug|Any CPU - {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Debug|x64.Build.0 = Debug|Any CPU {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|Any CPU.ActiveCfg = Release|Any CPU {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|Any CPU.Build.0 = Release|Any CPU - {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|x64.ActiveCfg = Release|Any CPU - {6DAA7012-22BF-4E0B-A7DB-B7A8B2A95F0A}.Release|x64.Build.0 = Release|Any CPU {B9456E54-9249-4178-951A-166A6F54A206}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B9456E54-9249-4178-951A-166A6F54A206}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B9456E54-9249-4178-951A-166A6F54A206}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {B9456E54-9249-4178-951A-166A6F54A206}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {B9456E54-9249-4178-951A-166A6F54A206}.Debug|x64.ActiveCfg = Debug|Any CPU - {B9456E54-9249-4178-951A-166A6F54A206}.Debug|x64.Build.0 = Debug|Any CPU {B9456E54-9249-4178-951A-166A6F54A206}.Release|Any CPU.ActiveCfg = Release|Any CPU {B9456E54-9249-4178-951A-166A6F54A206}.Release|Any CPU.Build.0 = Release|Any CPU - {B9456E54-9249-4178-951A-166A6F54A206}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {B9456E54-9249-4178-951A-166A6F54A206}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {B9456E54-9249-4178-951A-166A6F54A206}.Release|x64.ActiveCfg = Release|Any CPU - {B9456E54-9249-4178-951A-166A6F54A206}.Release|x64.Build.0 = Release|Any CPU {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|x64.ActiveCfg = Debug|Any CPU - {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Debug|x64.Build.0 = Debug|Any CPU {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|Any CPU.ActiveCfg = Release|Any CPU {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|Any CPU.Build.0 = Release|Any CPU - {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|x64.ActiveCfg = Release|Any CPU - {D487E501-77E3-4A1C-943E-F4F2534E3BC8}.Release|x64.Build.0 = Release|Any CPU {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|x64.ActiveCfg = Debug|Any CPU - {18A71178-6045-49A6-810B-1F5E50DD621F}.Debug|x64.Build.0 = Debug|Any CPU {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|Any CPU.ActiveCfg = Release|Any CPU {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|Any CPU.Build.0 = Release|Any CPU - {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|x64.ActiveCfg = Release|Any CPU - {18A71178-6045-49A6-810B-1F5E50DD621F}.Release|x64.Build.0 = Release|Any CPU {156452CC-3847-4706-AC65-4FA3BECA88EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {156452CC-3847-4706-AC65-4FA3BECA88EF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {156452CC-3847-4706-AC65-4FA3BECA88EF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {156452CC-3847-4706-AC65-4FA3BECA88EF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {156452CC-3847-4706-AC65-4FA3BECA88EF}.Debug|x64.ActiveCfg = Debug|Any CPU {156452CC-3847-4706-AC65-4FA3BECA88EF}.Release|Any CPU.ActiveCfg = Release|Any CPU {156452CC-3847-4706-AC65-4FA3BECA88EF}.Release|Any CPU.Build.0 = Release|Any CPU - {156452CC-3847-4706-AC65-4FA3BECA88EF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {156452CC-3847-4706-AC65-4FA3BECA88EF}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {156452CC-3847-4706-AC65-4FA3BECA88EF}.Release|x64.ActiveCfg = Release|Any CPU {BFAFD84F-6D1A-4D98-B91D-BBFCEA0FACF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BFAFD84F-6D1A-4D98-B91D-BBFCEA0FACF9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BFAFD84F-6D1A-4D98-B91D-BBFCEA0FACF9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {BFAFD84F-6D1A-4D98-B91D-BBFCEA0FACF9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {BFAFD84F-6D1A-4D98-B91D-BBFCEA0FACF9}.Debug|x64.ActiveCfg = Debug|Any CPU {BFAFD84F-6D1A-4D98-B91D-BBFCEA0FACF9}.Release|Any CPU.ActiveCfg = Release|Any CPU {BFAFD84F-6D1A-4D98-B91D-BBFCEA0FACF9}.Release|Any CPU.Build.0 = Release|Any CPU - {BFAFD84F-6D1A-4D98-B91D-BBFCEA0FACF9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {BFAFD84F-6D1A-4D98-B91D-BBFCEA0FACF9}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {BFAFD84F-6D1A-4D98-B91D-BBFCEA0FACF9}.Release|x64.ActiveCfg = Release|Any CPU {6CD26D96-DAEB-4C46-AC34-1F673413C9E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6CD26D96-DAEB-4C46-AC34-1F673413C9E5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6CD26D96-DAEB-4C46-AC34-1F673413C9E5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {6CD26D96-DAEB-4C46-AC34-1F673413C9E5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {6CD26D96-DAEB-4C46-AC34-1F673413C9E5}.Debug|x64.ActiveCfg = Debug|Any CPU {6CD26D96-DAEB-4C46-AC34-1F673413C9E5}.Release|Any CPU.ActiveCfg = Release|Any CPU {6CD26D96-DAEB-4C46-AC34-1F673413C9E5}.Release|Any CPU.Build.0 = Release|Any CPU - {6CD26D96-DAEB-4C46-AC34-1F673413C9E5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {6CD26D96-DAEB-4C46-AC34-1F673413C9E5}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {6CD26D96-DAEB-4C46-AC34-1F673413C9E5}.Release|x64.ActiveCfg = Release|Any CPU {9C5BE065-0175-4C6F-A3A3-44F78CA7370E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9C5BE065-0175-4C6F-A3A3-44F78CA7370E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9C5BE065-0175-4C6F-A3A3-44F78CA7370E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {9C5BE065-0175-4C6F-A3A3-44F78CA7370E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {9C5BE065-0175-4C6F-A3A3-44F78CA7370E}.Debug|x64.ActiveCfg = Debug|Any CPU {9C5BE065-0175-4C6F-A3A3-44F78CA7370E}.Release|Any CPU.ActiveCfg = Release|Any CPU {9C5BE065-0175-4C6F-A3A3-44F78CA7370E}.Release|Any CPU.Build.0 = Release|Any CPU - {9C5BE065-0175-4C6F-A3A3-44F78CA7370E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {9C5BE065-0175-4C6F-A3A3-44F78CA7370E}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {9C5BE065-0175-4C6F-A3A3-44F78CA7370E}.Release|x64.ActiveCfg = Release|Any CPU {8005E3ED-424B-4CF8-94CF-9A4F6EED32B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8005E3ED-424B-4CF8-94CF-9A4F6EED32B5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8005E3ED-424B-4CF8-94CF-9A4F6EED32B5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {8005E3ED-424B-4CF8-94CF-9A4F6EED32B5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {8005E3ED-424B-4CF8-94CF-9A4F6EED32B5}.Debug|x64.ActiveCfg = Debug|Any CPU {8005E3ED-424B-4CF8-94CF-9A4F6EED32B5}.Release|Any CPU.ActiveCfg = Release|Any CPU {8005E3ED-424B-4CF8-94CF-9A4F6EED32B5}.Release|Any CPU.Build.0 = Release|Any CPU - {8005E3ED-424B-4CF8-94CF-9A4F6EED32B5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {8005E3ED-424B-4CF8-94CF-9A4F6EED32B5}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {8005E3ED-424B-4CF8-94CF-9A4F6EED32B5}.Release|x64.ActiveCfg = Release|Any CPU {2DB4F295-AB4C-4642-BEB4-16E9D751B16A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2DB4F295-AB4C-4642-BEB4-16E9D751B16A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2DB4F295-AB4C-4642-BEB4-16E9D751B16A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {2DB4F295-AB4C-4642-BEB4-16E9D751B16A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {2DB4F295-AB4C-4642-BEB4-16E9D751B16A}.Debug|x64.ActiveCfg = Debug|Any CPU {2DB4F295-AB4C-4642-BEB4-16E9D751B16A}.Release|Any CPU.ActiveCfg = Release|Any CPU {2DB4F295-AB4C-4642-BEB4-16E9D751B16A}.Release|Any CPU.Build.0 = Release|Any CPU - {2DB4F295-AB4C-4642-BEB4-16E9D751B16A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {2DB4F295-AB4C-4642-BEB4-16E9D751B16A}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {2DB4F295-AB4C-4642-BEB4-16E9D751B16A}.Release|x64.ActiveCfg = Release|Any CPU {73701CE6-B60F-4137-B277-EADCCD5AD1C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {73701CE6-B60F-4137-B277-EADCCD5AD1C3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {73701CE6-B60F-4137-B277-EADCCD5AD1C3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {73701CE6-B60F-4137-B277-EADCCD5AD1C3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {73701CE6-B60F-4137-B277-EADCCD5AD1C3}.Debug|x64.ActiveCfg = Debug|Any CPU {73701CE6-B60F-4137-B277-EADCCD5AD1C3}.Release|Any CPU.ActiveCfg = Release|Any CPU {73701CE6-B60F-4137-B277-EADCCD5AD1C3}.Release|Any CPU.Build.0 = Release|Any CPU - {73701CE6-B60F-4137-B277-EADCCD5AD1C3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {73701CE6-B60F-4137-B277-EADCCD5AD1C3}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {73701CE6-B60F-4137-B277-EADCCD5AD1C3}.Release|x64.ActiveCfg = Release|Any CPU {577B477B-44C4-4A85-B96A-3401AADC838B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {577B477B-44C4-4A85-B96A-3401AADC838B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {577B477B-44C4-4A85-B96A-3401AADC838B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {577B477B-44C4-4A85-B96A-3401AADC838B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {577B477B-44C4-4A85-B96A-3401AADC838B}.Debug|x64.ActiveCfg = Debug|Any CPU {577B477B-44C4-4A85-B96A-3401AADC838B}.Release|Any CPU.ActiveCfg = Release|Any CPU {577B477B-44C4-4A85-B96A-3401AADC838B}.Release|Any CPU.Build.0 = Release|Any CPU - {577B477B-44C4-4A85-B96A-3401AADC838B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {577B477B-44C4-4A85-B96A-3401AADC838B}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {577B477B-44C4-4A85-B96A-3401AADC838B}.Release|x64.ActiveCfg = Release|Any CPU {4FFCE61A-E4D7-4DDA-A276-4807E8F74635}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4FFCE61A-E4D7-4DDA-A276-4807E8F74635}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4FFCE61A-E4D7-4DDA-A276-4807E8F74635}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {4FFCE61A-E4D7-4DDA-A276-4807E8F74635}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {4FFCE61A-E4D7-4DDA-A276-4807E8F74635}.Debug|x64.ActiveCfg = Debug|Any CPU {4FFCE61A-E4D7-4DDA-A276-4807E8F74635}.Release|Any CPU.ActiveCfg = Release|Any CPU {4FFCE61A-E4D7-4DDA-A276-4807E8F74635}.Release|Any CPU.Build.0 = Release|Any CPU - {4FFCE61A-E4D7-4DDA-A276-4807E8F74635}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {4FFCE61A-E4D7-4DDA-A276-4807E8F74635}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {4FFCE61A-E4D7-4DDA-A276-4807E8F74635}.Release|x64.ActiveCfg = Release|Any CPU {8794CB93-EB69-4B98-84F9-F50ABB350E14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8794CB93-EB69-4B98-84F9-F50ABB350E14}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8794CB93-EB69-4B98-84F9-F50ABB350E14}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {8794CB93-EB69-4B98-84F9-F50ABB350E14}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {8794CB93-EB69-4B98-84F9-F50ABB350E14}.Debug|x64.ActiveCfg = Debug|Any CPU - {8794CB93-EB69-4B98-84F9-F50ABB350E14}.Debug|x64.Build.0 = Debug|Any CPU {8794CB93-EB69-4B98-84F9-F50ABB350E14}.Release|Any CPU.ActiveCfg = Release|Any CPU {8794CB93-EB69-4B98-84F9-F50ABB350E14}.Release|Any CPU.Build.0 = Release|Any CPU - {8794CB93-EB69-4B98-84F9-F50ABB350E14}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {8794CB93-EB69-4B98-84F9-F50ABB350E14}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {8794CB93-EB69-4B98-84F9-F50ABB350E14}.Release|x64.ActiveCfg = Release|Any CPU - {8794CB93-EB69-4B98-84F9-F50ABB350E14}.Release|x64.Build.0 = Release|Any CPU {082F80A4-B096-45A3-ABB7-E8BFBF450CCD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {082F80A4-B096-45A3-ABB7-E8BFBF450CCD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {082F80A4-B096-45A3-ABB7-E8BFBF450CCD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {082F80A4-B096-45A3-ABB7-E8BFBF450CCD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {082F80A4-B096-45A3-ABB7-E8BFBF450CCD}.Debug|x64.ActiveCfg = Debug|Any CPU {082F80A4-B096-45A3-ABB7-E8BFBF450CCD}.Release|Any CPU.ActiveCfg = Release|Any CPU {082F80A4-B096-45A3-ABB7-E8BFBF450CCD}.Release|Any CPU.Build.0 = Release|Any CPU - {082F80A4-B096-45A3-ABB7-E8BFBF450CCD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {082F80A4-B096-45A3-ABB7-E8BFBF450CCD}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {082F80A4-B096-45A3-ABB7-E8BFBF450CCD}.Release|x64.ActiveCfg = Release|Any CPU {BAA06D47-70E5-43BB-ABB9-A72F14196E92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BAA06D47-70E5-43BB-ABB9-A72F14196E92}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BAA06D47-70E5-43BB-ABB9-A72F14196E92}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {BAA06D47-70E5-43BB-ABB9-A72F14196E92}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {BAA06D47-70E5-43BB-ABB9-A72F14196E92}.Debug|x64.ActiveCfg = Debug|Any CPU {BAA06D47-70E5-43BB-ABB9-A72F14196E92}.Release|Any CPU.ActiveCfg = Release|Any CPU {BAA06D47-70E5-43BB-ABB9-A72F14196E92}.Release|Any CPU.Build.0 = Release|Any CPU - {BAA06D47-70E5-43BB-ABB9-A72F14196E92}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {BAA06D47-70E5-43BB-ABB9-A72F14196E92}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {BAA06D47-70E5-43BB-ABB9-A72F14196E92}.Release|x64.ActiveCfg = Release|Any CPU {E1144727-1CFB-46A6-83B0-68592894D64C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E1144727-1CFB-46A6-83B0-68592894D64C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E1144727-1CFB-46A6-83B0-68592894D64C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {E1144727-1CFB-46A6-83B0-68592894D64C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {E1144727-1CFB-46A6-83B0-68592894D64C}.Debug|x64.ActiveCfg = Debug|Any CPU {E1144727-1CFB-46A6-83B0-68592894D64C}.Release|Any CPU.ActiveCfg = Release|Any CPU {E1144727-1CFB-46A6-83B0-68592894D64C}.Release|Any CPU.Build.0 = Release|Any CPU - {E1144727-1CFB-46A6-83B0-68592894D64C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {E1144727-1CFB-46A6-83B0-68592894D64C}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {E1144727-1CFB-46A6-83B0-68592894D64C}.Release|x64.ActiveCfg = Release|Any CPU {B75681B2-B881-4179-9F2A-ACB89CE513EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B75681B2-B881-4179-9F2A-ACB89CE513EE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B75681B2-B881-4179-9F2A-ACB89CE513EE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {B75681B2-B881-4179-9F2A-ACB89CE513EE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {B75681B2-B881-4179-9F2A-ACB89CE513EE}.Debug|x64.ActiveCfg = Debug|Any CPU {B75681B2-B881-4179-9F2A-ACB89CE513EE}.Release|Any CPU.ActiveCfg = Release|Any CPU {B75681B2-B881-4179-9F2A-ACB89CE513EE}.Release|Any CPU.Build.0 = Release|Any CPU - {B75681B2-B881-4179-9F2A-ACB89CE513EE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {B75681B2-B881-4179-9F2A-ACB89CE513EE}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {B75681B2-B881-4179-9F2A-ACB89CE513EE}.Release|x64.ActiveCfg = Release|Any CPU {4D325C30-E014-4151-BC69-064D9B272641}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4D325C30-E014-4151-BC69-064D9B272641}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4D325C30-E014-4151-BC69-064D9B272641}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {4D325C30-E014-4151-BC69-064D9B272641}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {4D325C30-E014-4151-BC69-064D9B272641}.Debug|x64.ActiveCfg = Debug|Any CPU {4D325C30-E014-4151-BC69-064D9B272641}.Release|Any CPU.ActiveCfg = Release|Any CPU {4D325C30-E014-4151-BC69-064D9B272641}.Release|Any CPU.Build.0 = Release|Any CPU - {4D325C30-E014-4151-BC69-064D9B272641}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {4D325C30-E014-4151-BC69-064D9B272641}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {4D325C30-E014-4151-BC69-064D9B272641}.Release|x64.ActiveCfg = Release|Any CPU {851B4D3C-D8BA-433E-B4E8-CBA186F10C0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {851B4D3C-D8BA-433E-B4E8-CBA186F10C0C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {851B4D3C-D8BA-433E-B4E8-CBA186F10C0C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {851B4D3C-D8BA-433E-B4E8-CBA186F10C0C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {851B4D3C-D8BA-433E-B4E8-CBA186F10C0C}.Debug|x64.ActiveCfg = Debug|Any CPU {851B4D3C-D8BA-433E-B4E8-CBA186F10C0C}.Release|Any CPU.ActiveCfg = Release|Any CPU {851B4D3C-D8BA-433E-B4E8-CBA186F10C0C}.Release|Any CPU.Build.0 = Release|Any CPU - {851B4D3C-D8BA-433E-B4E8-CBA186F10C0C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {851B4D3C-D8BA-433E-B4E8-CBA186F10C0C}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {851B4D3C-D8BA-433E-B4E8-CBA186F10C0C}.Release|x64.ActiveCfg = Release|Any CPU {EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Debug|x64.ActiveCfg = Debug|Any CPU - {EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Debug|x64.Build.0 = Debug|Any CPU {EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Release|Any CPU.ActiveCfg = Release|Any CPU {EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Release|Any CPU.Build.0 = Release|Any CPU - {EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Release|x64.ActiveCfg = Release|Any CPU - {EB2EC6F2-C34B-4C7B-A761-E12C853DABF9}.Release|x64.Build.0 = Release|Any CPU {FC54C35D-120F-49DC-9430-63447E550E39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FC54C35D-120F-49DC-9430-63447E550E39}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FC54C35D-120F-49DC-9430-63447E550E39}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {FC54C35D-120F-49DC-9430-63447E550E39}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {FC54C35D-120F-49DC-9430-63447E550E39}.Debug|x64.ActiveCfg = Debug|Any CPU {FC54C35D-120F-49DC-9430-63447E550E39}.Release|Any CPU.ActiveCfg = Release|Any CPU {FC54C35D-120F-49DC-9430-63447E550E39}.Release|Any CPU.Build.0 = Release|Any CPU - {FC54C35D-120F-49DC-9430-63447E550E39}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {FC54C35D-120F-49DC-9430-63447E550E39}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {FC54C35D-120F-49DC-9430-63447E550E39}.Release|x64.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 6c57d70c4d24de941241154c884e8fa85dfacb5e Mon Sep 17 00:00:00 2001 From: David Maas Date: Tue, 2 Jul 2024 20:10:30 -0500 Subject: [PATCH 02/17] Remove archaic csproj cruft The XML declarations are an artifact of the fact that Bonsai is old enough to have use the legacy csproj format. They aren't present the official .NET templates anymore and only serve as noise. The Microsoft.NET.Sdk.WindowsDesktop distinction no longer actually exists. (For modern projects you'd generally add a -windows suffix to the target framework instead, although in the case of Bonsai that wasn't actually necessary anywhere since we still target .NET Framework which is implicitly Windows-only.) https://learn.microsoft.com/en-us/dotnet/core/tools/sdk-errors/netsdk1137 --- Bonsai.Audio/Bonsai.Audio.csproj | 3 +-- Bonsai.Configuration/Bonsai.Configuration.csproj | 3 +-- Bonsai.Core/Bonsai.Core.csproj | 3 +-- Bonsai.Design.Visualizers/Bonsai.Design.Visualizers.csproj | 3 +-- Bonsai.Design/Bonsai.Design.csproj | 3 +-- Bonsai.Dsp.Design/Bonsai.Dsp.Design.csproj | 3 +-- Bonsai.Dsp/Bonsai.Dsp.csproj | 3 +-- Bonsai.Editor/Bonsai.Editor.csproj | 3 +-- Bonsai.NuGet.Design/Bonsai.NuGet.Design.csproj | 3 +-- Bonsai.NuGet/Bonsai.NuGet.csproj | 3 +-- Bonsai.Osc/Bonsai.Osc.csproj | 3 +-- Bonsai.Player/Bonsai.Player.csproj | 3 +-- .../Bonsai.Scripting.Expressions.Design.csproj | 3 +-- .../Bonsai.Scripting.Expressions.csproj | 3 +-- .../Bonsai.Scripting.IronPython.Design.csproj | 3 +-- Bonsai.Scripting.IronPython/Bonsai.Scripting.IronPython.csproj | 3 +-- Bonsai.Scripting/Bonsai.Scripting.csproj | 3 +-- Bonsai.Shaders.Design/Bonsai.Shaders.Design.csproj | 3 +-- Bonsai.Shaders.Rendering/Bonsai.Shaders.Rendering.csproj | 3 +-- Bonsai.Shaders/Bonsai.Shaders.csproj | 3 +-- Bonsai.StarterPack/Bonsai.StarterPack.csproj | 3 +-- Bonsai.System.Design/Bonsai.System.Design.csproj | 3 +-- Bonsai.System/Bonsai.System.csproj | 3 +-- Bonsai.Vision.Design/Bonsai.Vision.Design.csproj | 3 +-- Bonsai.Vision/Bonsai.Vision.csproj | 3 +-- Bonsai.Windows.Input/Bonsai.Windows.Input.csproj | 3 +-- Bonsai/Bonsai.csproj | 3 +-- Bonsai32/Bonsai32.csproj | 3 +-- 28 files changed, 28 insertions(+), 56 deletions(-) diff --git a/Bonsai.Audio/Bonsai.Audio.csproj b/Bonsai.Audio/Bonsai.Audio.csproj index ffef7418..927a6585 100644 --- a/Bonsai.Audio/Bonsai.Audio.csproj +++ b/Bonsai.Audio/Bonsai.Audio.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Audio Library Bonsai Audio Library containing modules for sound capture and playback. diff --git a/Bonsai.Configuration/Bonsai.Configuration.csproj b/Bonsai.Configuration/Bonsai.Configuration.csproj index 9e715778..5edf9c58 100644 --- a/Bonsai.Configuration/Bonsai.Configuration.csproj +++ b/Bonsai.Configuration/Bonsai.Configuration.csproj @@ -1,5 +1,4 @@ - - + false false diff --git a/Bonsai.Core/Bonsai.Core.csproj b/Bonsai.Core/Bonsai.Core.csproj index 3b27780a..fa0c6372 100644 --- a/Bonsai.Core/Bonsai.Core.csproj +++ b/Bonsai.Core/Bonsai.Core.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Core Library Bonsai Core Library containing base classes and workflow infrastructure. diff --git a/Bonsai.Design.Visualizers/Bonsai.Design.Visualizers.csproj b/Bonsai.Design.Visualizers/Bonsai.Design.Visualizers.csproj index 3f475027..a1dcd928 100644 --- a/Bonsai.Design.Visualizers/Bonsai.Design.Visualizers.csproj +++ b/Bonsai.Design.Visualizers/Bonsai.Design.Visualizers.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Visualizers Library Bonsai Visualizers Library containing base visualizer classes and editor infrastructure. diff --git a/Bonsai.Design/Bonsai.Design.csproj b/Bonsai.Design/Bonsai.Design.csproj index 09630814..7d3525fb 100644 --- a/Bonsai.Design/Bonsai.Design.csproj +++ b/Bonsai.Design/Bonsai.Design.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Design Library Bonsai Design Library containing base visualizer classes and editor infrastructure. diff --git a/Bonsai.Dsp.Design/Bonsai.Dsp.Design.csproj b/Bonsai.Dsp.Design/Bonsai.Dsp.Design.csproj index 33e12865..73663316 100644 --- a/Bonsai.Dsp.Design/Bonsai.Dsp.Design.csproj +++ b/Bonsai.Dsp.Design/Bonsai.Dsp.Design.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Dsp Design Library Bonsai Design Library containing visualizer and editor classes for signal processing data types. diff --git a/Bonsai.Dsp/Bonsai.Dsp.csproj b/Bonsai.Dsp/Bonsai.Dsp.csproj index 7c45008e..da664947 100644 --- a/Bonsai.Dsp/Bonsai.Dsp.csproj +++ b/Bonsai.Dsp/Bonsai.Dsp.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Dsp Library Bonsai Dsp Library containing reactive algorithms for digital signal processing. diff --git a/Bonsai.Editor/Bonsai.Editor.csproj b/Bonsai.Editor/Bonsai.Editor.csproj index 59b16a9d..38e5ffca 100644 --- a/Bonsai.Editor/Bonsai.Editor.csproj +++ b/Bonsai.Editor/Bonsai.Editor.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Editor An integrated development environment for the Bonsai visual programming language. diff --git a/Bonsai.NuGet.Design/Bonsai.NuGet.Design.csproj b/Bonsai.NuGet.Design/Bonsai.NuGet.Design.csproj index f27b5385..7eec6f75 100644 --- a/Bonsai.NuGet.Design/Bonsai.NuGet.Design.csproj +++ b/Bonsai.NuGet.Design/Bonsai.NuGet.Design.csproj @@ -1,5 +1,4 @@ - - + true false diff --git a/Bonsai.NuGet/Bonsai.NuGet.csproj b/Bonsai.NuGet/Bonsai.NuGet.csproj index acf9277d..34ee0acc 100644 --- a/Bonsai.NuGet/Bonsai.NuGet.csproj +++ b/Bonsai.NuGet/Bonsai.NuGet.csproj @@ -1,5 +1,4 @@ - - + false false diff --git a/Bonsai.Osc/Bonsai.Osc.csproj b/Bonsai.Osc/Bonsai.Osc.csproj index bf35c2c0..441ece5e 100644 --- a/Bonsai.Osc/Bonsai.Osc.csproj +++ b/Bonsai.Osc/Bonsai.Osc.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Osc Library Bonsai Osc Library containing reactive infrastructure to interface with devices using the Open Sound Control protocol. diff --git a/Bonsai.Player/Bonsai.Player.csproj b/Bonsai.Player/Bonsai.Player.csproj index 72c21db1..9fc374d7 100644 --- a/Bonsai.Player/Bonsai.Player.csproj +++ b/Bonsai.Player/Bonsai.Player.csproj @@ -1,5 +1,4 @@ - - + Exe Bonsai - Player diff --git a/Bonsai.Scripting.Expressions.Design/Bonsai.Scripting.Expressions.Design.csproj b/Bonsai.Scripting.Expressions.Design/Bonsai.Scripting.Expressions.Design.csproj index 44b99648..5b567c3f 100644 --- a/Bonsai.Scripting.Expressions.Design/Bonsai.Scripting.Expressions.Design.csproj +++ b/Bonsai.Scripting.Expressions.Design/Bonsai.Scripting.Expressions.Design.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Expression Scripting Design Library Bonsai Design Library containing editor classes for expression scripting in Bonsai. diff --git a/Bonsai.Scripting.Expressions/Bonsai.Scripting.Expressions.csproj b/Bonsai.Scripting.Expressions/Bonsai.Scripting.Expressions.csproj index 4a7a27d5..72c518c9 100644 --- a/Bonsai.Scripting.Expressions/Bonsai.Scripting.Expressions.csproj +++ b/Bonsai.Scripting.Expressions/Bonsai.Scripting.Expressions.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Expression Scripting Library Bonsai Scripting Library containing expression scripting infrastructure for Bonsai. diff --git a/Bonsai.Scripting.IronPython.Design/Bonsai.Scripting.IronPython.Design.csproj b/Bonsai.Scripting.IronPython.Design/Bonsai.Scripting.IronPython.Design.csproj index 1afe3e76..88c345e1 100644 --- a/Bonsai.Scripting.IronPython.Design/Bonsai.Scripting.IronPython.Design.csproj +++ b/Bonsai.Scripting.IronPython.Design/Bonsai.Scripting.IronPython.Design.csproj @@ -1,5 +1,4 @@ - - + Bonsai - IronPython Scripting Design Library Bonsai Design Library containing editor classes for IronPython scripting in Bonsai. diff --git a/Bonsai.Scripting.IronPython/Bonsai.Scripting.IronPython.csproj b/Bonsai.Scripting.IronPython/Bonsai.Scripting.IronPython.csproj index f039e497..586a6706 100644 --- a/Bonsai.Scripting.IronPython/Bonsai.Scripting.IronPython.csproj +++ b/Bonsai.Scripting.IronPython/Bonsai.Scripting.IronPython.csproj @@ -1,5 +1,4 @@ - - + Bonsai - IronPython Scripting Library Bonsai Scripting Library containing IronPython scripting infrastructure for Bonsai. diff --git a/Bonsai.Scripting/Bonsai.Scripting.csproj b/Bonsai.Scripting/Bonsai.Scripting.csproj index 61d7d164..0cb86184 100644 --- a/Bonsai.Scripting/Bonsai.Scripting.csproj +++ b/Bonsai.Scripting/Bonsai.Scripting.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Scripting Library Bonsai Scripting Library containing scripting infrastructure for Bonsai. diff --git a/Bonsai.Shaders.Design/Bonsai.Shaders.Design.csproj b/Bonsai.Shaders.Design/Bonsai.Shaders.Design.csproj index bcc328ae..eeef98c3 100644 --- a/Bonsai.Shaders.Design/Bonsai.Shaders.Design.csproj +++ b/Bonsai.Shaders.Design/Bonsai.Shaders.Design.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Shaders Design Library Bonsai Design Library containing editor classes for shader configuration. diff --git a/Bonsai.Shaders.Rendering/Bonsai.Shaders.Rendering.csproj b/Bonsai.Shaders.Rendering/Bonsai.Shaders.Rendering.csproj index 63d7d530..237c9417 100644 --- a/Bonsai.Shaders.Rendering/Bonsai.Shaders.Rendering.csproj +++ b/Bonsai.Shaders.Rendering/Bonsai.Shaders.Rendering.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Shaders Rendering Library Bonsai Shaders Rendering Library containing modules for rendering complex 3D scenes. diff --git a/Bonsai.Shaders/Bonsai.Shaders.csproj b/Bonsai.Shaders/Bonsai.Shaders.csproj index 245c0b99..1ec69034 100644 --- a/Bonsai.Shaders/Bonsai.Shaders.csproj +++ b/Bonsai.Shaders/Bonsai.Shaders.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Shaders Library Bonsai Shaders Library containing modules for dynamic control of shader primitives. diff --git a/Bonsai.StarterPack/Bonsai.StarterPack.csproj b/Bonsai.StarterPack/Bonsai.StarterPack.csproj index 4ddf1bf5..c3f4b232 100644 --- a/Bonsai.StarterPack/Bonsai.StarterPack.csproj +++ b/Bonsai.StarterPack/Bonsai.StarterPack.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Starter Pack The Bonsai Starter Pack includes everything you need to build your own data processing workflows. diff --git a/Bonsai.System.Design/Bonsai.System.Design.csproj b/Bonsai.System.Design/Bonsai.System.Design.csproj index 8050f371..59c34fa5 100644 --- a/Bonsai.System.Design/Bonsai.System.Design.csproj +++ b/Bonsai.System.Design/Bonsai.System.Design.csproj @@ -1,5 +1,4 @@ - - + Bonsai - System Design Library Bonsai Design Library containing editor classes for IO and other system configurations. diff --git a/Bonsai.System/Bonsai.System.csproj b/Bonsai.System/Bonsai.System.csproj index 3df586c3..4d14bac2 100644 --- a/Bonsai.System/Bonsai.System.csproj +++ b/Bonsai.System/Bonsai.System.csproj @@ -1,5 +1,4 @@ - - + Bonsai - System Library Bonsai System Library containing reactive infrastructure to interface with the underlying operating system. diff --git a/Bonsai.Vision.Design/Bonsai.Vision.Design.csproj b/Bonsai.Vision.Design/Bonsai.Vision.Design.csproj index 0366827e..650c4a10 100644 --- a/Bonsai.Vision.Design/Bonsai.Vision.Design.csproj +++ b/Bonsai.Vision.Design/Bonsai.Vision.Design.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Vision Design Library Bonsai Design Library containing visualizer and editor classes for image processing types. diff --git a/Bonsai.Vision/Bonsai.Vision.csproj b/Bonsai.Vision/Bonsai.Vision.csproj index b3c37b98..15706662 100644 --- a/Bonsai.Vision/Bonsai.Vision.csproj +++ b/Bonsai.Vision/Bonsai.Vision.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Vision Library Bonsai Vision Library containing reactive algorithms for computer vision and image processing. diff --git a/Bonsai.Windows.Input/Bonsai.Windows.Input.csproj b/Bonsai.Windows.Input/Bonsai.Windows.Input.csproj index b1111d0d..c35d9157 100644 --- a/Bonsai.Windows.Input/Bonsai.Windows.Input.csproj +++ b/Bonsai.Windows.Input/Bonsai.Windows.Input.csproj @@ -1,5 +1,4 @@ - - + Bonsai - Windows Input Library Bonsai Windows Library containing reactive interfaces to the standard operating system input devices. diff --git a/Bonsai/Bonsai.csproj b/Bonsai/Bonsai.csproj index a31db899..800d78eb 100644 --- a/Bonsai/Bonsai.csproj +++ b/Bonsai/Bonsai.csproj @@ -1,5 +1,4 @@ - - + Bonsai A visual programming language for data stream processing built on top of Rx for .NET. diff --git a/Bonsai32/Bonsai32.csproj b/Bonsai32/Bonsai32.csproj index dcd85827..4de31870 100644 --- a/Bonsai32/Bonsai32.csproj +++ b/Bonsai32/Bonsai32.csproj @@ -1,5 +1,4 @@ - - + Bonsai32 The x86 bootstrapper for the Bonsai environment. From 664cb4e3af91080cb347af4013b4f01487f834ca Mon Sep 17 00:00:00 2001 From: David Maas Date: Tue, 28 May 2024 18:19:39 -0500 Subject: [PATCH 03/17] Move Directory.Build.* files into their own folder This is being done in preparation for having auxiliary files for organization purposes. The csproj-specific files pattern is intended to avoid issues when projects of multiple types share the same repo. This isn't strictly necessary in the case of Bonsai, but I did it out of habit. This also adds a dummy Directory.Build.rsp (another lesser-used ambient MSBuild configuration mechanism) to avoid searching for one outside of the repo. --- Directory.Build.props | 22 +++------------------- Directory.Build.rsp | 1 + Directory.Build.targets | 9 +++------ tooling/Common.csproj.props | 19 +++++++++++++++++++ tooling/Common.csproj.targets | 6 ++++++ tooling/Common.props | 7 +++++++ tooling/Common.targets | 2 ++ 7 files changed, 41 insertions(+), 25 deletions(-) create mode 100644 Directory.Build.rsp create mode 100644 tooling/Common.csproj.props create mode 100644 tooling/Common.csproj.targets create mode 100644 tooling/Common.props create mode 100644 tooling/Common.targets diff --git a/Directory.Build.props b/Directory.Build.props index caa3e568..c02a48a5 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,20 +1,4 @@ - - - - Bonsai Foundation - Copyright © Bonsai Foundation CIC and Contributors 2011-2024 - https://bonsai-rx.org - https://bonsai-rx.org/license - https://bonsai-rx.org/assets/images/bonsai.png - ..\bin\$(Configuration) - true - true - true - snupkg - https://github.com/bonsai-rx/bonsai.git - git - - 9.0 - strict - + + + \ No newline at end of file diff --git a/Directory.Build.rsp b/Directory.Build.rsp new file mode 100644 index 00000000..17ab7c1d --- /dev/null +++ b/Directory.Build.rsp @@ -0,0 +1 @@ +# This file intentionally left blank. \ No newline at end of file diff --git a/Directory.Build.targets b/Directory.Build.targets index c62d5f14..a7826fdc 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,7 +1,4 @@ - - - - $([System.DateTime]::UtcNow.Subtract($([System.DateTime]::Parse(2011/12/12))).Days) - $(VersionPrefix).$(DaysFromFirstRevision) - + + + \ No newline at end of file diff --git a/tooling/Common.csproj.props b/tooling/Common.csproj.props new file mode 100644 index 00000000..f170bf84 --- /dev/null +++ b/tooling/Common.csproj.props @@ -0,0 +1,19 @@ + + + Bonsai Foundation + Copyright © Bonsai Foundation CIC and Contributors 2011-2024 + https://bonsai-rx.org + https://bonsai-rx.org/license + https://bonsai-rx.org/assets/images/bonsai.png + ..\bin\$(Configuration) + true + true + true + snupkg + https://github.com/bonsai-rx/bonsai.git + git + + 9.0 + strict + + \ No newline at end of file diff --git a/tooling/Common.csproj.targets b/tooling/Common.csproj.targets new file mode 100644 index 00000000..8ef0e682 --- /dev/null +++ b/tooling/Common.csproj.targets @@ -0,0 +1,6 @@ + + + $([System.DateTime]::UtcNow.Subtract($([System.DateTime]::Parse(2011/12/12))).Days) + $(VersionPrefix).$(DaysFromFirstRevision) + + \ No newline at end of file diff --git a/tooling/Common.props b/tooling/Common.props new file mode 100644 index 00000000..c9f687f8 --- /dev/null +++ b/tooling/Common.props @@ -0,0 +1,7 @@ + + + + Debug + AnyCPU + + \ No newline at end of file diff --git a/tooling/Common.targets b/tooling/Common.targets new file mode 100644 index 00000000..c1df2220 --- /dev/null +++ b/tooling/Common.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file From 1ea09c930be2e0db081309d99c3ccb5abc5c4f8c Mon Sep 17 00:00:00 2001 From: David Maas Date: Thu, 30 May 2024 15:24:52 -0500 Subject: [PATCH 04/17] Fix/suppress NuGet pack warnings --- Bonsai.StarterPack/Bonsai.StarterPack.csproj | 7 +++++++ tooling/Common.csproj.props | 3 +++ 2 files changed, 10 insertions(+) diff --git a/Bonsai.StarterPack/Bonsai.StarterPack.csproj b/Bonsai.StarterPack/Bonsai.StarterPack.csproj index c3f4b232..f977386b 100644 --- a/Bonsai.StarterPack/Bonsai.StarterPack.csproj +++ b/Bonsai.StarterPack/Bonsai.StarterPack.csproj @@ -5,8 +5,15 @@ Bonsai Rx Starter Pack false false + false net462 2.8.1 + + + $(NoWarn);NU5128 diff --git a/tooling/Common.csproj.props b/tooling/Common.csproj.props index f170bf84..8b4105bd 100644 --- a/tooling/Common.csproj.props +++ b/tooling/Common.csproj.props @@ -15,5 +15,8 @@ 9.0 strict + + + $(NoWarn);NU5125;NU5048 \ No newline at end of file From 2acd19892948c43362f423c962bc8bfcb0608d7f Mon Sep 17 00:00:00 2001 From: David Maas Date: Thu, 30 May 2024 15:27:56 -0500 Subject: [PATCH 05/17] Fix Bonsai32.csproj incorrectly overwriting portions of Bonsai.csproj's output Most of the side-effects of this mistake were not externally observable, but they can (and did) result in extremely confusingly broken builds. --- Bonsai32/Bonsai32.csproj | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Bonsai32/Bonsai32.csproj b/Bonsai32/Bonsai32.csproj index 4de31870..ed9e68fb 100644 --- a/Bonsai32/Bonsai32.csproj +++ b/Bonsai32/Bonsai32.csproj @@ -13,8 +13,16 @@ ..\Bonsai\bin\$(Configuration)\ ..\Bonsai.Editor\Bonsai.ico App.manifest + + + false + true - + \ No newline at end of file From 2e43547ee1379afbe617a1d5607bdf2961b1a063 Mon Sep 17 00:00:00 2001 From: David Maas Date: Thu, 30 May 2024 15:52:20 -0500 Subject: [PATCH 06/17] Enable building with the .NET SDK The .NET SDK uses MSBuild Core rather than MSBuild Framework. One difference between them is that the legacy Windows-centric resource embedding was completely dropped from Core. This updated resource embedding can be used with .NET Framework by using System.Resources.Extensions. (It only affects non-string resources like images, hence why only Bonsai.Design needs it.) ------------------------------------------------- The new reference to System.Runtime.CompilerServices.Unsafe in Bonsai32 is to work around a quirk of how NuGet resolves the dependency graph. There exists two paths to this package from the main Bonsai project (versions noted where important): 1) Bonsai -> Bonsai.Design -> System.Resources.Extensions -> System.Memory -> System.Runtime.CompilerServices.Unsafe/4.5.3 2) Bonsai -> System.Reflection.MetadataLoadContext->System.Collections.Immutable -> System.Runtime.CompilerServices.Unsafe/6.0.0 Path #2 is private to Bonsai, while Path #1 is not. Because Path #2 is private, it isn't even part of the restore graph of Bonsai32. As a result, Bonsai32 gets a transitive reference to S.R.CS.Unsafe 4.5.3 but Bonsai already has private reference to S.R.CS.Unsafe 6.0.0, resulting in a conflict. This eventually results in a MSB3277 warning and can result in a completely broken build (if it weren't for the recent change the prevented Bonsai32 from clobbering Bonsai's output.) --- Bonsai.Design/Bonsai.Design.csproj | 1 + Bonsai32/Bonsai32.csproj | 7 +++++++ tooling/Common.csproj.props | 3 +++ 3 files changed, 11 insertions(+) diff --git a/Bonsai.Design/Bonsai.Design.csproj b/Bonsai.Design/Bonsai.Design.csproj index 7d3525fb..e48fa101 100644 --- a/Bonsai.Design/Bonsai.Design.csproj +++ b/Bonsai.Design/Bonsai.Design.csproj @@ -9,6 +9,7 @@ + diff --git a/Bonsai32/Bonsai32.csproj b/Bonsai32/Bonsai32.csproj index ed9e68fb..9765fa10 100644 --- a/Bonsai32/Bonsai32.csproj +++ b/Bonsai32/Bonsai32.csproj @@ -24,5 +24,12 @@ + + + \ No newline at end of file diff --git a/tooling/Common.csproj.props b/tooling/Common.csproj.props index 8b4105bd..38fce036 100644 --- a/tooling/Common.csproj.props +++ b/tooling/Common.csproj.props @@ -18,5 +18,8 @@ $(NoWarn);NU5125;NU5048 + + + true \ No newline at end of file From e509661e53b044eacf642e5819c68e2a97f523f5 Mon Sep 17 00:00:00 2001 From: David Maas Date: Thu, 6 Jun 2024 11:58:21 -0500 Subject: [PATCH 07/17] Tidy up common C# properties and enable source link Source link is enabled by default in .NET 8, so this mostly just means removing things that were interfering with it and enforcing building with the .NET 8 SDK. Release automation will rely on Source Link being made default in .NET 8 and we're going to be moving to .NET 8 soon anyway, so no time like the present. --- .editorconfig | 4 ++-- global.json | 6 ++++++ tooling/Common.csproj.props | 24 +++++++++++++++++------- 3 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 global.json diff --git a/.editorconfig b/.editorconfig index 6cf87290..8d4baf41 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,8 +10,8 @@ indent_style = space [*.{csproj,vcxproj,vcxproj.filters,proj,projitems,shproj,wxs}] indent_size = 2 -# XML config files -[*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vstemplate,vsct}] +# Config files +[*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vstemplate,vsct,json}] indent_size = 2 # HTML / CSS files diff --git a/global.json b/global.json new file mode 100644 index 00000000..989a69ca --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "8.0.100", + "rollForward": "latestMinor" + } +} \ No newline at end of file diff --git a/tooling/Common.csproj.props b/tooling/Common.csproj.props index 38fce036..ce4b12fd 100644 --- a/tooling/Common.csproj.props +++ b/tooling/Common.csproj.props @@ -1,24 +1,34 @@ + + 9.0 + strict + true + + Bonsai Foundation Copyright © Bonsai Foundation CIC and Contributors 2011-2024 https://bonsai-rx.org https://bonsai-rx.org/license https://bonsai-rx.org/assets/images/bonsai.png + true ..\bin\$(Configuration) true - true - true - snupkg - https://github.com/bonsai-rx/bonsai.git - git + - 9.0 - strict + + + true + false + snupkg $(NoWarn);NU5125;NU5048 + + false + true + true From 69e1e46fbc10b07bcab1898587e9daeca26d5379 Mon Sep 17 00:00:00 2001 From: David Maas Date: Thu, 13 Jun 2024 20:25:27 -0500 Subject: [PATCH 08/17] Remove `Microsoft.VisualStudio.CoreUtility` from all `Bonsai.Templates` projects This reference is causing bogus warnings on build and isn't actually being used. I think this is an artifact from older versions of Visual Studio, the current VSIX project template doesn't include it. --- .../Bonsai.PackageTemplate/Bonsai.PackageTemplate.csproj | 3 --- .../Bonsai.SinkTemplate/Bonsai.SinkTemplate.csproj | 3 --- .../Bonsai.SourceTemplate/Bonsai.SourceTemplate.csproj | 3 --- .../Bonsai.TransformTemplate/Bonsai.TransformTemplate.csproj | 3 --- .../Bonsai.VisualizerTemplate/Bonsai.VisualizerTemplate.csproj | 3 --- .../Bonsai.WorkflowTemplate/Bonsai.WorkflowTemplate.csproj | 3 --- 6 files changed, 18 deletions(-) diff --git a/Bonsai.Templates/Bonsai.PackageTemplate/Bonsai.PackageTemplate.csproj b/Bonsai.Templates/Bonsai.PackageTemplate/Bonsai.PackageTemplate.csproj index 0e642e4d..0bf3de9f 100644 --- a/Bonsai.Templates/Bonsai.PackageTemplate/Bonsai.PackageTemplate.csproj +++ b/Bonsai.Templates/Bonsai.PackageTemplate/Bonsai.PackageTemplate.csproj @@ -47,9 +47,6 @@ 4 - - False - diff --git a/Bonsai.Templates/Bonsai.SinkTemplate/Bonsai.SinkTemplate.csproj b/Bonsai.Templates/Bonsai.SinkTemplate/Bonsai.SinkTemplate.csproj index 474ecf33..662a21d3 100644 --- a/Bonsai.Templates/Bonsai.SinkTemplate/Bonsai.SinkTemplate.csproj +++ b/Bonsai.Templates/Bonsai.SinkTemplate/Bonsai.SinkTemplate.csproj @@ -45,9 +45,6 @@ 4 - - False - diff --git a/Bonsai.Templates/Bonsai.SourceTemplate/Bonsai.SourceTemplate.csproj b/Bonsai.Templates/Bonsai.SourceTemplate/Bonsai.SourceTemplate.csproj index c63deb6e..9dfca43c 100644 --- a/Bonsai.Templates/Bonsai.SourceTemplate/Bonsai.SourceTemplate.csproj +++ b/Bonsai.Templates/Bonsai.SourceTemplate/Bonsai.SourceTemplate.csproj @@ -45,9 +45,6 @@ 4 - - False - diff --git a/Bonsai.Templates/Bonsai.TransformTemplate/Bonsai.TransformTemplate.csproj b/Bonsai.Templates/Bonsai.TransformTemplate/Bonsai.TransformTemplate.csproj index 2b43e944..3f53622e 100644 --- a/Bonsai.Templates/Bonsai.TransformTemplate/Bonsai.TransformTemplate.csproj +++ b/Bonsai.Templates/Bonsai.TransformTemplate/Bonsai.TransformTemplate.csproj @@ -45,9 +45,6 @@ 4 - - False - diff --git a/Bonsai.Templates/Bonsai.VisualizerTemplate/Bonsai.VisualizerTemplate.csproj b/Bonsai.Templates/Bonsai.VisualizerTemplate/Bonsai.VisualizerTemplate.csproj index fbcd875d..c2bdb3fd 100644 --- a/Bonsai.Templates/Bonsai.VisualizerTemplate/Bonsai.VisualizerTemplate.csproj +++ b/Bonsai.Templates/Bonsai.VisualizerTemplate/Bonsai.VisualizerTemplate.csproj @@ -45,9 +45,6 @@ 4 - - False - diff --git a/Bonsai.Templates/Bonsai.WorkflowTemplate/Bonsai.WorkflowTemplate.csproj b/Bonsai.Templates/Bonsai.WorkflowTemplate/Bonsai.WorkflowTemplate.csproj index 28d83c44..6e31d0fc 100644 --- a/Bonsai.Templates/Bonsai.WorkflowTemplate/Bonsai.WorkflowTemplate.csproj +++ b/Bonsai.Templates/Bonsai.WorkflowTemplate/Bonsai.WorkflowTemplate.csproj @@ -45,9 +45,6 @@ 4 - - False - From eff20b0e21d33a2a2773a18864881e720b9f581e Mon Sep 17 00:00:00 2001 From: David Maas Date: Fri, 14 Jun 2024 21:05:23 -0500 Subject: [PATCH 09/17] Migrate to building to central artifacts directory More info: https://learn.microsoft.com/en-us/dotnet/core/sdk/artifacts-output This also applies to the setup executables and VSIX projects even though they use legacy .NET SDK. --- .gitignore | 11 +++---- .../Bonsai.Setup.Bootstrapper.wixproj | 29 ++---------------- Bonsai.Setup/Bonsai.Setup.wixproj | 29 ++---------------- Bonsai.Setup/Development.wxs | 2 +- Bonsai.Setup/Runtime.wxs | 2 +- Bonsai/Bonsai.csproj | 2 +- Bonsai32/Bonsai32.csproj | 2 +- tooling/Common.csproj.props | 1 - tooling/Common.props | 30 +++++++++++++++++++ tooling/Common.targets | 22 ++++++++++++++ 10 files changed, 66 insertions(+), 64 deletions(-) diff --git a/.gitignore b/.gitignore index dac3576e..bc72129f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,7 @@ -bin -obj -packages +.vs/ +/artifacts/ +/packages/ Resources/*.ico *.Generated.cs -*.orig *.user -*.suo -*.exe -.vs +Bonsai.Setup.Bootstrapper/vc_redist.*.exe diff --git a/Bonsai.Setup.Bootstrapper/Bonsai.Setup.Bootstrapper.wixproj b/Bonsai.Setup.Bootstrapper/Bonsai.Setup.Bootstrapper.wixproj index fe4daa6e..0db1b171 100644 --- a/Bonsai.Setup.Bootstrapper/Bonsai.Setup.Bootstrapper.wixproj +++ b/Bonsai.Setup.Bootstrapper/Bonsai.Setup.Bootstrapper.wixproj @@ -1,5 +1,6 @@  + Debug @@ -13,24 +14,7 @@ $(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets - - - bin\$(Platform)\$(Configuration)\ - obj\$(Platform)\$(Configuration)\ - Debug - - - bin\$(Platform)\$(Configuration)\ - obj\$(Platform)\$(Configuration)\ - - - bin\$(Platform)\$(Configuration)\ - obj\$(Platform)\$(Configuration)\ - Debug - - - bin\$(Platform)\$(Configuration)\ - obj\$(Platform)\$(Configuration)\ + Debug @@ -77,12 +61,5 @@ - + \ No newline at end of file diff --git a/Bonsai.Setup/Bonsai.Setup.wixproj b/Bonsai.Setup/Bonsai.Setup.wixproj index 87e69ff6..7dd3eea8 100644 --- a/Bonsai.Setup/Bonsai.Setup.wixproj +++ b/Bonsai.Setup/Bonsai.Setup.wixproj @@ -1,5 +1,6 @@  + Debug @@ -13,24 +14,7 @@ $(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets - - - bin\$(Platform)\$(Configuration)\ - obj\$(Platform)\$(Configuration)\ - Debug - - - bin\$(Platform)\$(Configuration)\ - obj\$(Platform)\$(Configuration)\ - - - bin\$(Platform)\$(Configuration)\ - obj\$(Platform)\$(Configuration)\ - Debug - - - bin\$(Platform)\$(Configuration)\ - obj\$(Platform)\$(Configuration)\ + Debug @@ -63,12 +47,5 @@ - + \ No newline at end of file diff --git a/Bonsai.Setup/Development.wxs b/Bonsai.Setup/Development.wxs index fc46c052..7a68fd5f 100644 --- a/Bonsai.Setup/Development.wxs +++ b/Bonsai.Setup/Development.wxs @@ -2,7 +2,7 @@ - + diff --git a/Bonsai.Setup/Runtime.wxs b/Bonsai.Setup/Runtime.wxs index 57b6c9d9..be990eff 100644 --- a/Bonsai.Setup/Runtime.wxs +++ b/Bonsai.Setup/Runtime.wxs @@ -4,7 +4,7 @@ - + diff --git a/Bonsai/Bonsai.csproj b/Bonsai/Bonsai.csproj index 800d78eb..a967ad4f 100644 --- a/Bonsai/Bonsai.csproj +++ b/Bonsai/Bonsai.csproj @@ -76,7 +76,7 @@ diff --git a/Bonsai32/Bonsai32.csproj b/Bonsai32/Bonsai32.csproj index 9765fa10..7de2a5f8 100644 --- a/Bonsai32/Bonsai32.csproj +++ b/Bonsai32/Bonsai32.csproj @@ -10,7 +10,7 @@ x86 2.8.3 Exe - ..\Bonsai\bin\$(Configuration)\ + $(ArtifactsPath)\bin\Bonsai\$(Configuration.ToLowerInvariant())\ ..\Bonsai.Editor\Bonsai.ico App.manifest diff --git a/tooling/Common.csproj.props b/tooling/Common.csproj.props index ce4b12fd..9748770f 100644 --- a/tooling/Common.csproj.props +++ b/tooling/Common.csproj.props @@ -12,7 +12,6 @@ https://bonsai-rx.org/license https://bonsai-rx.org/assets/images/bonsai.png true - ..\bin\$(Configuration) true diff --git a/tooling/Common.props b/tooling/Common.props index c9f687f8..c9678bf9 100644 --- a/tooling/Common.props +++ b/tooling/Common.props @@ -4,4 +4,34 @@ Debug AnyCPU + + + + true + $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)../artifacts')) + + + $(ArtifactsPath)/wsl + + + + + <_ThisProjectOutputSubdirectory>$(MSBuildProjectName) + + + <_ThisProjectOutputSubdirectory Condition="'$(_ThisProjectOutputSubdirectory)' == 'Bonsai.Templates'">$(MSBuildProjectName)-vsix + + $(ArtifactsPath)/bin/ + $(BaseOutputPath)$(_ThisProjectOutputSubdirectory)/$(Configuration.ToLowerInvariant())-$(Platform.ToLowerInvariant())/ + $(OutputPath) + $(OutputPath) + + $(ArtifactsPath)/obj/$(_ThisProjectOutputSubdirectory)/ + $(BaseIntermediateOutputPath)$(Configuration.ToLowerInvariant())-$(Platform.ToLowerInvariant())/ + + $(ArtifactsPath)/package/$(Configuration.ToLowerInvariant()) + \ No newline at end of file diff --git a/tooling/Common.targets b/tooling/Common.targets index c1df2220..4bdf6cfb 100644 --- a/tooling/Common.targets +++ b/tooling/Common.targets @@ -1,2 +1,24 @@ + + + <_RelativeProjectPathFilePath>$(BaseIntermediateOutputPath)RelativeProjectPath.txt + <_ProjectPathRelativeToIntermediateDirectory>$([MSBuild]::MakeRelative($(BaseIntermediateOutputPath), $(MSBuildProjectFullPath))) + + + + + + + + + + + + + + + + + \ No newline at end of file From 2ff887f5be9041fcfad000c0035b2b126f09809c Mon Sep 17 00:00:00 2001 From: David Maas Date: Fri, 14 Jun 2024 21:06:45 -0500 Subject: [PATCH 10/17] Fix modern .NET variant of Bonsai.Templates pack warnings/errors Also add it to the main solution since it was orphaned and it'll be able to be built from it. --- Bonsai.Templates/Bonsai.Templates.csproj | 14 +++++++++++++- Bonsai.sln | 6 ++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Bonsai.Templates/Bonsai.Templates.csproj b/Bonsai.Templates/Bonsai.Templates.csproj index 2c99f72e..ec80e4e7 100644 --- a/Bonsai.Templates/Bonsai.Templates.csproj +++ b/Bonsai.Templates/Bonsai.Templates.csproj @@ -10,12 +10,24 @@ Bonsai Rx Package Environment Templates netstandard2.0 true - false content LICENSE icon.png + + + false + false + + + $(NoWarn);NU5110;NU5111 + + + $(NoWarn);NU5128 diff --git a/Bonsai.sln b/Bonsai.sln index 05a70e84..5da155d9 100644 --- a/Bonsai.sln +++ b/Bonsai.sln @@ -72,6 +72,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Directory.Build.targets = Directory.Build.targets EndProjectSection EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Templates", "Bonsai.Templates\Bonsai.Templates.csproj", "{FD09545E-4FB8-4730-B936-FE0BCF43E883}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -202,6 +204,10 @@ Global {FC54C35D-120F-49DC-9430-63447E550E39}.Debug|Any CPU.Build.0 = Debug|Any CPU {FC54C35D-120F-49DC-9430-63447E550E39}.Release|Any CPU.ActiveCfg = Release|Any CPU {FC54C35D-120F-49DC-9430-63447E550E39}.Release|Any CPU.Build.0 = Release|Any CPU + {FD09545E-4FB8-4730-B936-FE0BCF43E883}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FD09545E-4FB8-4730-B936-FE0BCF43E883}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FD09545E-4FB8-4730-B936-FE0BCF43E883}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FD09545E-4FB8-4730-B936-FE0BCF43E883}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 34229fb842b792a821c21acb78ef9bcecfe67752 Mon Sep 17 00:00:00 2001 From: David Maas Date: Mon, 17 Jun 2024 17:18:10 -0500 Subject: [PATCH 11/17] Update ILRepack The ancient version of ILRepack we were using was broken due to a bug in Mono.Cecil that caused it to crash when running in a modern .NET context. Even ignoring that, it chokes on modern resources embeddings. The package we were using hasn't been updated since early 2019. There is a fork that branched off in 2013 https://www.nuget.org/packages/ILRepack.Lib.MSBuild.Task but it doesn't work quite the same way (it tries to work automagically) and isn't a drop-in replacement. As such this change just invokes the executable from the official distribution of ILRepack. This change also makes it so that repacking is no longer done automatically during release builds. It'll be done explicitly by release automation. --- Bonsai/Bonsai.csproj | 101 +++++++++++++++++++----------- Bonsai/InternalizeExcludePatterns | 1 + 2 files changed, 66 insertions(+), 36 deletions(-) create mode 100644 Bonsai/InternalizeExcludePatterns diff --git a/Bonsai/Bonsai.csproj b/Bonsai/Bonsai.csproj index a967ad4f..146a7887 100644 --- a/Bonsai/Bonsai.csproj +++ b/Bonsai/Bonsai.csproj @@ -14,9 +14,9 @@ - + all - runtime; build; native; contentfiles; analyzers; buildtransitive + runtime; build; native; contentfiles; analyzers @@ -39,45 +39,74 @@ Resources.Designer.cs - + + + + + + + + + $(BaseOutputPath)$(ArtifactsPivots)-repacked\ + $(RepackedOutputPath)$(TargetFileName) + $([System.IO.Path]::ChangeExtension('$(RepackedOutputFilePath)', '.pdb')) + + + + + + + + + + - $(MSBuildThisFileDirectory)bin\$(Configuration)\$(TargetFramework) + <_IlRepackCommand> +"$(ILRepack)" +/verbose +/out:"$(RepackedOutputFilePath)" +/internalize:"$(MSBuildThisFileDirectory)InternalizeExcludePatterns" +"$(OutputPath)Bonsai.exe" +"$(OutputPath)System.Buffers.dll" +"$(OutputPath)System.Memory.dll" +"$(OutputPath)System.Numerics.Vectors.dll" +"$(OutputPath)System.Collections.Immutable.dll" +"$(OutputPath)System.Reflection.Metadata.dll" +"$(OutputPath)System.Reflection.MetadataLoadContext.dll" +"$(OutputPath)System.Runtime.CompilerServices.Unsafe.dll" +"$(OutputPath)Bonsai.Configuration.dll" +"$(OutputPath)Bonsai.NuGet.dll" +"$(OutputPath)Bonsai.NuGet.Design.dll" +"$(OutputPath)Newtonsoft.Json.dll" +"$(OutputPath)NuGet.Common.dll" +"$(OutputPath)NuGet.Configuration.dll" +"$(OutputPath)NuGet.Frameworks.dll" +"$(OutputPath)NuGet.Packaging.dll" +"$(OutputPath)NuGet.Protocol.dll" +"$(OutputPath)NuGet.Resolver.dll" +"$(OutputPath)NuGet.Versioning.dll" + + + + + + - - - - - - - - - - - - - - - - - - + + + + + - + + - - - - \ No newline at end of file diff --git a/Bonsai/InternalizeExcludePatterns b/Bonsai/InternalizeExcludePatterns new file mode 100644 index 00000000..19e1cbb2 --- /dev/null +++ b/Bonsai/InternalizeExcludePatterns @@ -0,0 +1 @@ +^Bonsai\.Configuration \ No newline at end of file From 80305a28ee7e3100ce723282019bce8be9f38a39 Mon Sep 17 00:00:00 2001 From: David Maas Date: Mon, 17 Jun 2024 17:41:29 -0500 Subject: [PATCH 12/17] Implement workaround for System.Resources.Extensions in the ILRepacked bootstrapper --- Bonsai.Setup/Runtime.wxs | 5 +-- Bonsai/Bonsai.csproj | 18 ++++++++--- Bonsai/Program.cs | 8 ++++- Bonsai/SystemResourcesExtensionsSupport.cs | 37 ++++++++++++++++++++++ 4 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 Bonsai/SystemResourcesExtensionsSupport.cs diff --git a/Bonsai.Setup/Runtime.wxs b/Bonsai.Setup/Runtime.wxs index be990eff..71b0271a 100644 --- a/Bonsai.Setup/Runtime.wxs +++ b/Bonsai.Setup/Runtime.wxs @@ -4,7 +4,8 @@ - + + @@ -21,7 +22,7 @@ INSTALL64 - + diff --git a/Bonsai/Bonsai.csproj b/Bonsai/Bonsai.csproj index 146a7887..a77fdd71 100644 --- a/Bonsai/Bonsai.csproj +++ b/Bonsai/Bonsai.csproj @@ -40,6 +40,20 @@ + + + + + + + + + + + + + + Enables support for System.Resources.Extensions when the bootstrapper is ILRepacked + /// + /// System.Resources.Extensions cannot be cleanly repacked because resources using modern resource embedding internally refer to it + /// using an explicit strong assembly name. As such the runtime will refuse to consider our own assembly a valid provider for it. + /// + /// In order to work around this, we embed it (and its dependencies) directly and load them in an assembly resolver instead. + /// + internal static class SystemResourcesExtensionsSupport + { + [Conditional("NETFRAMEWORK")] + internal static void Initialize() + { + AppDomain.CurrentDomain.AssemblyResolve += (_, args) => + { + var assemblyName = new AssemblyName(args.Name); + using var embeddedAssembly = typeof(SystemResourcesExtensionsSupport).Assembly.GetManifestResourceStream($"{nameof(Bonsai)}.{assemblyName.Name}.dll"); + + if (embeddedAssembly is null) + return null; + + var assemblyBytes = new byte[embeddedAssembly.Length]; + int readLength = embeddedAssembly.Read(assemblyBytes, 0, assemblyBytes.Length); + Debug.Assert(readLength == assemblyBytes.Length); + + var result = Assembly.Load(assemblyBytes); + Debug.WriteLine($"Redirecting '{args.Name}' to embedded '{result.FullName}'"); + return result; + }; + } + } +} From 1ea646b13c0a03829b92297297971616fe46de3c Mon Sep 17 00:00:00 2001 From: David Maas Date: Tue, 18 Jun 2024 00:41:13 -0500 Subject: [PATCH 13/17] Revamp CI infrastructure and implemented release automation This commit also comes with some major changes to how versioning of Bonsai and its components works: * All packages within Bonsai are versioned together now (packages with no changes skip version numbers instead of getting out of sync) * This means Bonsai.Shaders and friends are no longer using initial development (IE: 0.y.z) version numbers * It is now forbidden for projects to explicitly specify their versions (this is required for package diffing * The now-unnecessary revision octet of the file versions has been eliminated (RIP days since first commit Easter egg) * The origin and purpose of Bonsai binaries is now labeled clearly: Developer (local) builds, unstable CI builds, preview builds, and final release builds * The title of Bonsai's editor will be tagged as such for anything other than the final release builds --- .github/workflows/Bonsai.yml | 461 ++++++++++++++++++ .github/workflows/build.yml | 58 --- .github/workflows/bump-version.py | 48 ++ .github/workflows/compare-nuget-packages.py | 223 +++++++++ .github/workflows/configure-build.py | 107 ++++ .github/workflows/create-build-matrix.py | 55 +++ .github/workflows/create-portable-zip.py | 59 +++ .github/workflows/filter-release-packages.py | 50 ++ .github/workflows/gha.py | 134 +++++ .github/workflows/nuget.py | 62 +++ Bonsai.Audio/Bonsai.Audio.csproj | 1 - .../Bonsai.Configuration.csproj | 1 - Bonsai.Core.Tests/Bonsai.Core.Tests.csproj | 1 - Bonsai.Core/Bonsai.Core.csproj | 1 - .../Bonsai.Design.Visualizers.csproj | 1 - Bonsai.Design/Bonsai.Design.csproj | 1 - Bonsai.Dsp.Design/Bonsai.Dsp.Design.csproj | 1 - Bonsai.Dsp/Bonsai.Dsp.csproj | 1 - .../Bonsai.Editor.Tests.csproj | 1 - Bonsai.Editor/Bonsai.Editor.csproj | 1 - .../Bonsai.NuGet.Design.csproj | 1 - Bonsai.NuGet/Bonsai.NuGet.csproj | 1 - Bonsai.Osc/Bonsai.Osc.csproj | 1 - Bonsai.Player/Bonsai.Player.csproj | 1 - ...Bonsai.Scripting.Expressions.Design.csproj | 1 - .../Bonsai.Scripting.Expressions.csproj | 1 - .../Bonsai.Scripting.IronPython.Design.csproj | 1 - .../Bonsai.Scripting.IronPython.csproj | 1 - Bonsai.Scripting/Bonsai.Scripting.csproj | 1 - .../Bonsai.Setup.Bootstrapper.wixproj | 3 +- Bonsai.Setup.Bootstrapper/Bundle.wxs | 1 + .../Theme/RtfLargeTheme.xml | 2 +- .../Bonsai.Shaders.Design.csproj | 1 - .../Bonsai.Shaders.Rendering.csproj | 1 - Bonsai.Shaders/Bonsai.Shaders.csproj | 1 - Bonsai.StarterPack/Bonsai.StarterPack.csproj | 1 - .../Bonsai.System.Design.csproj | 1 - .../Bonsai.System.Tests.csproj | 1 - Bonsai.System/Bonsai.System.csproj | 1 - Bonsai.Templates/Bonsai.Templates.csproj | 1 - .../Bonsai.Templates/Bonsai.Templates.csproj | 3 + .../source.extension.vsixmanifest | 2 +- Bonsai.Tests.proj | 10 - .../Bonsai.Vision.Design.csproj | 1 - Bonsai.Vision/Bonsai.Vision.csproj | 1 - .../Bonsai.Windows.Input.csproj | 1 - Bonsai/Bonsai.csproj | 1 - Bonsai32/Bonsai32.csproj | 3 +- tooling/Common.csproj.props | 9 +- tooling/Common.csproj.targets | 6 - tooling/Common.targets | 2 +- tooling/Common.wixproj.props | 3 + tooling/CurrentVersion.props | 6 + tooling/Versioning.props | 62 +++ 54 files changed, 1287 insertions(+), 113 deletions(-) create mode 100644 .github/workflows/Bonsai.yml delete mode 100644 .github/workflows/build.yml create mode 100755 .github/workflows/bump-version.py create mode 100755 .github/workflows/compare-nuget-packages.py create mode 100755 .github/workflows/configure-build.py create mode 100755 .github/workflows/create-build-matrix.py create mode 100755 .github/workflows/create-portable-zip.py create mode 100755 .github/workflows/filter-release-packages.py create mode 100755 .github/workflows/gha.py create mode 100644 .github/workflows/nuget.py delete mode 100644 Bonsai.Tests.proj delete mode 100644 tooling/Common.csproj.targets create mode 100644 tooling/Common.wixproj.props create mode 100644 tooling/CurrentVersion.props create mode 100644 tooling/Versioning.props diff --git a/.github/workflows/Bonsai.yml b/.github/workflows/Bonsai.yml new file mode 100644 index 00000000..ec5a982a --- /dev/null +++ b/.github/workflows/Bonsai.yml @@ -0,0 +1,461 @@ +# ======================================================================================================================================================================= +# Bonsai CI Infrastructure +# ======================================================================================================================================================================= +# When updating this workflow, be mindful that the `latest` tag must also build successfully under this workflow in order to determine which packages have changed. +name: Bonsai +on: + push: + # This prevents tag pushes from triggering this workflow + branches: ['*'] + pull_request: + release: + types: [published] + workflow_dispatch: + inputs: + version: + description: "Version" + default: "" + will_publish_packages: + description: "Publish packages?" + default: "false" +env: + DOTNET_NOLOGO: true + DOTNET_CLI_TELEMETRY_OPTOUT: true + DOTNET_GENERATE_ASPNET_CERTIFICATE: false + ContinuousIntegrationBuild: true +jobs: + # ===================================================================================================================================================================== + # Determine build matrix + # ===================================================================================================================================================================== + # Some of the build matrix targets are conditional, and `jobs..if` is evaluated before `jobs..strategy.matrix` + # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idif + # As such we build the matrix programmatically in its own job and feed it into `build-and-test`. + create-build-matrix: + name: Create Build Matrix + runs-on: ubuntu-latest + outputs: + matrix: ${{steps.create-matrix.outputs.matrix}} + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: '3.11' + - name: Create build matrix + id: create-matrix + run: python .github/workflows/create-build-matrix.py + + # ===================================================================================================================================================================== + # Build, test, and package + # ===================================================================================================================================================================== + build-and-test: + needs: create-build-matrix + strategy: + fail-fast: false + matrix: ${{fromJSON(needs.create-build-matrix.outputs.matrix)}} + name: ${{matrix.platform.name}} ${{matrix.configuration}} + runs-on: ${{matrix.platform.os}} + env: + IsReferenceDummyBuild: ${{matrix.dummy-build}} + UseRepackForBootstrapperPackage: ${{matrix.collect-packages && !matrix.dummy-build}} + steps: + # ----------------------------------------------------------------------- Checkout + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{matrix.checkout-ref}} + + # ----------------------------------------------------------------------- Setup tools + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.x + + - name: Setup Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + # Legacy .NET command line tools are only used for building the installer + - name: Setup MSBuild command line + if: matrix.create-installer + uses: microsoft/setup-msbuild@v2 + - name: Setup NuGet command line + if: matrix.create-installer + uses: NuGet/setup-nuget@v2 + with: + nuget-version: 6.x + + # ----------------------------------------------------------------------- Configure build + - name: Configure build + run: python .github/workflows/configure-build.py + env: + github_event_name: ${{github.event_name}} + github_ref: ${{github.ref}} + github_run_number: ${{github.run_number}} + release_is_prerelease: ${{github.event.release.prerelease}} + release_version: ${{github.event.release.tag_name}} + workflow_dispatch_version: ${{github.event.inputs.version}} + workflow_dispatch_will_publish_packages: ${{github.event.inputs.will_publish_packages}} + + # ----------------------------------------------------------------------- Build + - name: Restore + run: dotnet restore Bonsai.sln + + - name: Build + run: dotnet build Bonsai.sln --no-restore --configuration ${{matrix.configuration}} + + # ----------------------------------------------------------------------- Repack bootstrapper + # This happens before pack since the bootstrapper package uses it + - name: Repack bootstrapper + if: matrix.create-installer || env.UseRepackForBootstrapperPackage == 'true' + run: dotnet build Bonsai --no-restore --configuration ${{matrix.configuration}} -t:Repack + + # ----------------------------------------------------------------------- Pack + # Since packages are core to Bonsai functionality we always pack them even if they won't be collected + - name: Pack + id: pack + run: dotnet pack Bonsai.sln --no-restore --no-build --configuration ${{matrix.configuration}} + + # ----------------------------------------------------------------------- Test + - name: Test + if: '!matrix.dummy-build' + run: dotnet test Bonsai.sln --no-restore --no-build --configuration ${{matrix.configuration}} --verbosity normal + + # ----------------------------------------------------------------------- Create portable zip + - name: Create portable zip + id: create-portable-zip + if: matrix.create-installer + run: python .github/workflows/create-portable-zip.py artifacts/Bonsai.zip ${{matrix.configuration}} + env: + NUGET_API_URL: ${{vars.NUGET_API_URL}} + # This should be kept in sync with publish-packages-nuget-org + IS_FULL_RELEASE: ${{github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.will_publish_packages == 'true' && github.event.inputs.version != '')}} + + # ----------------------------------------------------------------------- Build Visual Studio templates + - name: Build Visual Studio templates + if: matrix.create-installer + run: msbuild /nologo /maxCpuCount Bonsai.Templates/Bonsai.Templates.sln /p:Configuration=${{matrix.configuration}} /p:DeployExtension=false + + # ----------------------------------------------------------------------- Build setup + - name: Restore setup + if: matrix.create-installer + # Restoring the packages.config directly means we don't rely on the system-wide Wix install + run: | + nuget restore Bonsai.Setup/packages.config -SolutionDir . + nuget restore Bonsai.Setup.Bootstrapper/packages.config -SolutionDir . + + - name: Build Setup + id: create-installer + if: matrix.create-installer + run: msbuild /nologo /maxCpuCount Bonsai.Setup.sln /p:Configuration=${{matrix.configuration}} + + # ----------------------------------------------------------------------- Collect artifacts + - name: Collect NuGet packages + uses: actions/upload-artifact@v4 + if: matrix.collect-packages && steps.pack.outcome == 'success' && always() + with: + name: Packages${{matrix.artifacts-suffix}} + if-no-files-found: error + path: artifacts/package/${{matrix.configuration-lower}}/** + + - name: Collect portable zip + uses: actions/upload-artifact@v4 + if: steps.create-portable-zip.outcome == 'success' && always() + with: + name: PortableZip${{matrix.artifacts-suffix}} + if-no-files-found: error + path: artifacts/Bonsai.zip + + - name: Collect installer + uses: actions/upload-artifact@v4 + if: steps.create-installer.outcome == 'success' && always() + with: + name: Installer${{matrix.artifacts-suffix}} + if-no-files-found: error + path: artifacts/bin/Bonsai.Setup.Bootstrapper/${{matrix.configuration-lower}}-x86/** + + # ===================================================================================================================================================================== + # Determine which packages need to be published + # ===================================================================================================================================================================== + determine-changed-packages: + name: Detect changed packages + runs-on: ubuntu-latest + # We technically only need the dummy build jobs, but GitHub Actions lacks the ability to depend on specific jobs in a matrix + needs: build-and-test + if: github.event_name != 'pull_request' + steps: + # ----------------------------------------------------------------------- Checkout + - name: Checkout + uses: actions/checkout@v4 + + # ----------------------------------------------------------------------- Setup tools + - name: Setup Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + # ----------------------------------------------------------------------- Download packages for comparison + - name: Download packages for comparison + uses: actions/download-artifact@v4 + with: + pattern: Packages* + path: artifacts + + # ----------------------------------------------------------------------- Compare packages + - name: Compare packages + id: compare-packages + run: python .github/workflows/compare-nuget-packages.py artifacts/Packages-dummy-prev/ artifacts/Packages-dummy-next/ artifacts/Packages/ artifacts/ReleaseManifest + + # ----------------------------------------------------------------------- Collect release manifest + - name: Collect release manifest + uses: actions/upload-artifact@v4 + if: steps.compare-packages.outcome != 'skipped' && always() + with: + name: ReleaseManifest + if-no-files-found: error + path: artifacts/ReleaseManifest + + # ===================================================================================================================================================================== + # Publish to GitHub + # ===================================================================================================================================================================== + publish-github: + name: Publish to GitHub + runs-on: ubuntu-latest + permissions: + # Needed to attach files to releases + contents: write + # Needed to upload to GitHub Packages + packages: write + needs: [build-and-test, determine-changed-packages] + # Pushes always publish CI packages (configure-build.py will add the branch name to the version string for branches besides main) + # Published releases always publish packages + # A manual workflow only publishes packages if explicitly enabled + if: github.event_name == 'push' || github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.will_publish_packages == 'true') + steps: + # ----------------------------------------------------------------------- Checkout + - name: Checkout + uses: actions/checkout@v4 + with: + sparse-checkout: .github + sparse-checkout-cone-mode: false + + # ----------------------------------------------------------------------- Setup tools + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.x + + - name: Setup Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + # ----------------------------------------------------------------------- Download artifacts + - name: Download built packages + uses: actions/download-artifact@v4 + with: + name: Packages + path: Packages + + - name: Download release manifest + uses: actions/download-artifact@v4 + with: + name: ReleaseManifest + + - name: Download portable zip + uses: actions/download-artifact@v4 + if: github.event_name == 'release' + with: + name: PortableZip + + - name: Download installer + uses: actions/download-artifact@v4 + if: github.event_name == 'release' + with: + name: Installer + + # ----------------------------------------------------------------------- Filter NuGet packages + - name: Filter NuGet packages + run: python .github/workflows/filter-release-packages.py ReleaseManifest Packages + + # ----------------------------------------------------------------------- Upload release assets + - name: Upload release assets + if: github.event_name == 'release' + run: gh release upload ${{github.event.release.tag_name}} Bonsai.zip Bonsai-*.exe --clobber + env: + GH_TOKEN: ${{github.token}} + + # ----------------------------------------------------------------------- Push to GitHub Packages + - name: Push to GitHub Packages + run: dotnet nuget push "Packages/*.nupkg" --skip-duplicate --no-symbols --api-key ${{secrets.GITHUB_TOKEN}} --source https://nuget.pkg.github.com/${{github.repository_owner}} + env: + # This is a workaround for https://github.com/NuGet/Home/issues/9775 + DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER: 0 + + # ===================================================================================================================================================================== + # Publish NuGet Packages to NuGet.org + # ===================================================================================================================================================================== + publish-packages-nuget-org: + name: Publish to NuGet.org + runs-on: ubuntu-latest + environment: PublicRelease + needs: [build-and-test, determine-changed-packages] + # Release builds always publish packages to NuGet.org + # Workflow dispatch builds will only publish packages if enabled and an explicit version number is given + # This should be kept in sync with create-portable-zip + if: github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.will_publish_packages == 'true' && github.event.inputs.version != '') + steps: + # ----------------------------------------------------------------------- Checkout + - name: Checkout + uses: actions/checkout@v4 + with: + sparse-checkout: .github + sparse-checkout-cone-mode: false + + # ----------------------------------------------------------------------- Setup tools + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.x + + - name: Setup Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + # ----------------------------------------------------------------------- Download artifacts + - name: Download built packages + uses: actions/download-artifact@v4 + with: + name: Packages + path: Packages + + - name: Download release manifest + uses: actions/download-artifact@v4 + with: + name: ReleaseManifest + + # ----------------------------------------------------------------------- Filter NuGet packages + - name: Filter NuGet packages + run: python .github/workflows/filter-release-packages.py ReleaseManifest Packages + + # ----------------------------------------------------------------------- Push to NuGet.org + - name: Push to NuGet.org + run: dotnet nuget push "Packages/*.nupkg" --api-key ${{secrets.NUGET_API_KEY}} --source ${{vars.NUGET_API_URL}} + env: + # This is a workaround for https://github.com/NuGet/Home/issues/9775 + DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER: 0 + + # ----------------------------------------------------------------------- Dispatch docs repo update + # This might seem like an odd spot to do this, but we need access to the PublicRelease environment for our secrets and using it in two jobs means two approvals are needed + - name: Update version and submodule in ${{vars.DOCS_REPO}} + if: github.event_name == 'release' && github.event.release.prerelease == false + run: gh workflow run --repo "$DOCS_REPO" version-bump.yml --raw-field "project=$PROJECT" --raw-field "version=$VERSION" --raw-field "project-fork-url=$PROJECT_FORK_URL" + env: + GH_TOKEN: ${{secrets.DOCS_UPDATE_GH_TOKEN}} + DOCS_REPO: ${{vars.DOCS_REPO}} + PROJECT: bonsai + VERSION: ${{github.event.release.tag_name}} + PROJECT_FORK_URL: ${{github.server_url}}/${{github.repository}}.git + + # ===================================================================================================================================================================== + # Finish up release + # ===================================================================================================================================================================== + finish-up-release: + name: Finish up release + runs-on: ubuntu-latest + permissions: + # Needed to bump tags and version numbers + contents: write + # Needed to close milestones + issues: write + # It's important that this only happens when everything else happened successfully + # Otherwise it's possible for a partial release to occur and re-running the job wouldn't be possible due to the latest tag having already moved + # (This is also why this happens as its own job, it lets us ensure both publish paths happened successfully.) + needs: [publish-github, publish-packages-nuget-org] + # Only do finishing tasks when we're explicitly releasing + if: github.event_name == 'release' && github.event.release.prerelease == false + steps: + # ----------------------------------------------------------------------- Checkout + - name: Checkout + uses: actions/checkout@v4 + with: + ref: refs/heads/main + + # ----------------------------------------------------------------------- Update `latest` tag + - name: Update `latest` tag + run: git push --force origin ${{github.sha}}:refs/tags/latest + + # ----------------------------------------------------------------------- Verify the release happened from the main branch, otherwise skip the version bump + # Bumping the version number has to commit to some branch, but releases happen from tags rather than commits. Therefore we just commit to main + # However bumping the version on main would not be appropriate if we were releasing from another branch (such as a backport branch) or even a tag on a loose commit + # As such we skip bumping the version if we didn't release from the same revision as main. This is fine as bumping the version number is not a critical part of our workflow + # (This has the unintentional side-effect of skipping the version bump when PRs are merged during the workflow run, but we don't expect this to happen) + - name: Get the revision of the main branch + id: main-revision + run: python .github/workflows/gha.py set_output sha `git rev-parse refs/heads/main` + - name: Warn if it doesn't match the release + if: steps.main-revision.outputs.sha != github.sha + run: python .github/workflows/gha.py print_warning "The main branch is at ${{steps.main-revision.outputs.sha}} but the release was made from ${{github.sha}}, the version number will not be automatically bumped." + + # ----------------------------------------------------------------------- Bump version number + - name: Bump version number + if: steps.main-revision.outputs.sha == github.sha + run: | + python .github/workflows/bump-version.py + git add $version_file_path + env: + version_file_path: tooling/CurrentVersion.props + just_released_version: ${{github.event.release.tag_name}} + + # ----------------------------------------------------------------------- Commit and push changes + - name: Commit changes + if: steps.main-revision.outputs.sha == github.sha + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git commit -m "Bump to version \`$NEXT_VERSION\`" --allow-empty + + - name: Push changes + if: steps.main-revision.outputs.sha == github.sha + run: git push + + # ----------------------------------------------------------------------- Close milestone + - name: Close milestone + uses: actions/github-script@v7 + if: always() + continue-on-error: true + env: + MILESTONE_NAME: ${{github.event.release.tag_name}} + with: + user-agent: actions/github-script for ${{github.repository}} + script: | + const milestoneToClose = process.env.MILESTONE_NAME; + + response = await github.rest.issues.listMilestones({ + owner: context.repo.owner, + repo: context.repo.repo, + state: 'open', + per_page: 100, + }); + milestones = response.data; + + for (let milestone of milestones) { + if (milestone.title != milestoneToClose) { + continue; + } + + core.info(`Closing milestone '${milestoneToClose}' #${milestone.number}...`); + await github.rest.issues.updateMilestone({ + owner: context.repo.owner, + repo: context.repo.repo, + milestone_number: milestone.number, + state: 'closed', + }); + + return; + } + + core.warning(`Could not find any milestone associated with '${milestoneToClose}', the milestone for this release will not be closed.`); diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index d8d0c44c..00000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,58 +0,0 @@ -name: Build - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - workflow_dispatch: - branches: [ main ] - -jobs: - build: - name: Build Bootstrapper - runs-on: windows-latest - - steps: - - name: Checkout - uses: actions/checkout@v2.3.4 - - - name: Setup MSBuild - uses: microsoft/setup-msbuild@v1 - - - name: Setup VSTest - uses: darenm/Setup-VSTest@v1 - - - name: Setup NuGet - uses: NuGet/setup-nuget@v1.0.5 - - - name: Restore NuGet Packages - run: nuget restore Bonsai.sln - - - name: Build Bonsai - run: msbuild Bonsai.sln /t:Bonsai /p:Configuration=Release - - - name: Build Bonsai32 - run: msbuild Bonsai.sln /t:Bonsai32 /p:Configuration=Release - - - name: Build Tests - run: msbuild Bonsai.sln /t:Bonsai_Core_Tests /t:Bonsai_System_Tests /t:Bonsai_Editor_Tests /p:Configuration=Release - - - name: Run Tests - run: msbuild Bonsai.Tests.proj - - installer: - name: Build Installer - needs: build - if: github.event_name == 'workflow_dispatch' - runs-on: windows-latest - - steps: - - name: Build Templates - run: msbuild Bonsai.Templates/Bonsai.Templates.sln /p:Configuration=Release - - - name: Setup WiX - run: nuget restore Bonsai.Setup.sln - - - name: Build Installer - run: msbuild Bonsai.Setup.sln /p:Configuration=Release \ No newline at end of file diff --git a/.github/workflows/bump-version.py b/.github/workflows/bump-version.py new file mode 100755 index 00000000..8bc52f6c --- /dev/null +++ b/.github/workflows/bump-version.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +import os + +import gha +import nuget + +#================================================================================================== +# Get inputs +#================================================================================================== +def get_environment_variable(name): + ret = os.getenv(name) + + if ret is None or ret == '': + gha.print_error(f"Missing required parameter '{name}'") + return '' + + return ret + +version_file_path = get_environment_variable('version_file_path') +just_released_version = get_environment_variable('just_released_version').strip('v') + +if not nuget.is_valid_version(just_released_version): + gha.print_error('The specified just-released version is not a valid semver version.') + +gha.fail_if_errors() + +#================================================================================================== +# Bump version number +#================================================================================================== + +version = nuget.get_version_parts(just_released_version) +version.patch += 1 +version.prerelease = None +version.build_metadata = None + +print(f"Bumping to version {version}") + +with open(version_file_path, 'w') as f: + f.write("\n") + f.write("\n") + f.write(" \n") + f.write(f" {version}\n") + f.write(" \n") + f.write("") + +gha.set_environment_variable('NEXT_VERSION', str(version)) + +gha.fail_if_errors() diff --git a/.github/workflows/compare-nuget-packages.py b/.github/workflows/compare-nuget-packages.py new file mode 100755 index 00000000..47317f8c --- /dev/null +++ b/.github/workflows/compare-nuget-packages.py @@ -0,0 +1,223 @@ +#!/usr/bin/env python3 +import hashlib +import os +import sys + +from pathlib import Path +from zipfile import ZipFile, ZipInfo + +import gha +import nuget + +# Symbol packages will change even for changes that we don't care about because the deterministic hash embedded in the PDB +# is affected by the MVID of a package's dependencies. We don't want to release a new package when the only things that +# changed were external to the package, so we don't check them. +CHECK_SYMBOL_PACKAGES = False + +# The following packages will always release no matter what +always_release_packages = set([ + 'Bonsai', + 'Bonsai.Core', + 'Bonsai.Design', + 'Bonsai.Editor', + 'Bonsai.Player', +]) + +if len(sys.argv) != 5: + gha.print_error('Usage: compare-nuget-packages.py ') + sys.exit(1) +else: + previous_packages_path = Path(sys.argv[1]) + next_packages_path = Path(sys.argv[2]) + release_packages_path = Path(sys.argv[3]) + release_manifest_path = Path(sys.argv[4]) + +if not previous_packages_path.exists(): + gha.print_error(f"Previous packages path '{previous_packages_path}' does not exist.") +if not next_packages_path.exists(): + gha.print_error(f"Next packages path '{next_packages_path}' does not exist.") +if not release_packages_path.exists(): + gha.print_error(f"Release packages path '{previous_packages_path}' does not exist.") +if release_manifest_path.exists(): + gha.print_error(f"Release manifest '{release_manifest_path}' already exists.") +gha.fail_if_errors() + +def verbose_log(message: str): + gha.print_debug(message) + +def should_ignore(file: ZipInfo) -> bool: + # Ignore metadata files which change on every pack + if file.filename == '_rels/.rels': + return True + if file.filename.startswith('package/services/metadata/core-properties/') and file.filename.endswith('.psmdcp'): + return True + + # Don't care about explicit directories + if file.is_dir(): + return True + + return False + +def nuget_packages_are_equivalent(a_path: Path, b_path: Path, is_snupkg: bool = False) -> bool: + verbose_log(f"Comparing '{a_path}' and '{b_path}'") + + # One package exists and the other does not + if a_path.exists() != b_path.exists(): + verbose_log(f"Not equivalent: Only one package actually exists") + return False + + # The package doesn't exist at all, assume mistake unless we're checking the optional symbol packages + if not a_path.exists(): + if is_snupkg: + verbose_log("Equivalent: Neither package exists") + return True + raise FileNotFoundError(f"Neither package exists: '{a_path}' or '{b_path}'") + + # From this point on: Check everything and emit messages for debugging purposes + is_equivalent = True + + # Check if corresponding symbol packages are equivalent + if CHECK_SYMBOL_PACKAGES and not is_snupkg: + if not nuget_packages_are_equivalent(a_path.with_suffix(".snupkg"), b_path.with_suffix(".snupkg"), True): + verbose_log("Not equivalent: Symbol packages are not equivalent") + is_equivalent = False + else: + verbose_log("Symbol packages are equivalent") + + # Compare the contents of the packages + # NuGet package packing is unfortunately not fully deterministic so we cannot compare the packages directly + # https://github.com/NuGet/Home/issues/8601 + with ZipFile(a_path, 'r') as a_zip, ZipFile(b_path, 'r') as b_zip: + b_infos = { } + for b_info in b_zip.infolist(): + if should_ignore(b_info): + continue + assert b_info.filename not in b_infos + b_infos[b_info.filename] = b_info + + for a_info in a_zip.infolist(): + if should_ignore(a_info): + continue + + b_info = b_infos.pop(a_info.filename, None) + if b_info is None: + verbose_log(f"Not equivalent: '{a_info.filename}' exists in '{a_path}' but not in '{b_path}'") + is_equivalent = False + continue + + if a_info.CRC != b_info.CRC: + verbose_log(f"Not equivalent: CRCs of '{a_info.filename}' do not match between '{a_path}' and '{b_path}'") + is_equivalent = False + continue + + if a_info.file_size != b_info.file_size: + verbose_log(f"Not equivalent: File sizes of '{a_info.filename}' do not match between '{a_path}' and '{b_path}'") + is_equivalent = False + continue + + a_hash = hashlib.file_digest(a_zip.open(a_info), 'sha256').hexdigest() # type: ignore + b_hash = hashlib.file_digest(b_zip.open(b_info), 'sha256').hexdigest() # type: ignore + if a_hash != b_hash: + verbose_log(f"Not equivalent: SHA256 hashes of '{a_info.filename}' do not match between '{a_path}' and '{b_path}'") + is_equivalent = False + continue + + # Ensure every file in B was processed + if len(b_infos) > 0: + is_equivalent = False + verbose_log(f"Not equivalent: The following file(s) exist in '{a_path}' but not in '{b_path}'") + for filename in b_infos: + verbose_log(f" '{filename}'") + + return is_equivalent + +different_packages = [] +force_released_packages = [] +next_packages = set() +for file in os.listdir(next_packages_path): + if not file.endswith(".nupkg"): + continue + + # We don't tolerate build metadata here because the nuget_packages_are_equivalent call doesn't either + if not file.endswith(".99.99.99.nupkg"): + gha.print_error(f"Package '{file}' does not have a dummy version.") + + package_name = nuget.get_package_name(file) + next_packages.add(package_name) + + if not nuget_packages_are_equivalent(next_packages_path / file, previous_packages_path / file): + verbose_log(f"'{file}' differs") + different_packages.append(package_name) + elif package_name in always_release_packages: + force_released_packages.append(package_name) + +previous_packages = set() +for file in os.listdir(previous_packages_path): + if file.endswith(".nupkg"): + previous_packages.add(nuget.get_package_name(file)) + +release_packages = set() +for file in os.listdir(release_packages_path): + if file.endswith(".nupkg"): + release_packages.add(nuget.get_package_name(file)) + +with gha.JobSummary() as md: + def write_both(line: str = ''): + print(line) + md.write_line(line) + + print() + different_packages.sort() + md.write_line("# Packages with changes\n") + if len(different_packages) == 0: + print("There are no packages with any changes.") + md.write_line("*There are no packages with any changes.*") + else: + print("The following packages have changes:") + for package in different_packages: + print(f" {package}") + md.write_line(f"* {package}") + + if len(force_released_packages) > 0: + write_both() + write_both("The following packages are configured to release anyway despite not being changed:") + md.write_line() + force_released_packages.sort() + for package in force_released_packages: + print(f" {package}") + md.write_line(f"* {package}") + + different_packages += force_released_packages + different_packages.sort() + + # Ensure the next dummy reference and release package sets contain the same packages + def list_missing_peers(heading: str, md_heading: str, packages: set[str]) -> bool: + if len(packages) == 0: + return False + + print() + print(heading) + md.write_line(f"# {md_heading}") + md.write_line() + md.write_line(heading) + md.write_line() + for package in packages: + print(f" {package}") + md.write_line(f"* {package}") + return True + + list_missing_peers("The following packages are new for this release:", "New packages", next_packages - previous_packages) + list_missing_peers("The following packages were removed during this release:", "Removed packages", previous_packages - next_packages) + + if list_missing_peers("The following packages exist in the release package artifact, but not in the next dummy reference artifact:", "⚠ Missing reference packages", release_packages - next_packages): + gha.print_error("Some packages exist in the release package artifact, but not in the next dummy reference artifact.") + if list_missing_peers("The following packages exist in the next dummy reference artifact, but not in the release package artifact:", "⚠ Missing release packages", next_packages - release_packages): + gha.print_error("Some packages exist in the next dummy reference artifact, but not in the release package artifact.") + if list_missing_peers("The following packages are marked to always release but do not exist:", "⚠ Missing always-release packages", always_release_packages - release_packages): + gha.print_error("Some packages exist in the always-release list, but not in the release package artifact.") + +with open(release_manifest_path, 'x') as manifest: + for package in different_packages: + manifest.write(f"{package}\n") + +gha.fail_if_errors() diff --git a/.github/workflows/configure-build.py b/.github/workflows/configure-build.py new file mode 100755 index 00000000..b17bbbf4 --- /dev/null +++ b/.github/workflows/configure-build.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python3 +import os +import re +import sys + +import gha +import nuget + +#================================================================================================== +# Get inputs +#================================================================================================== +def get_environment_variable(name): + ret = os.getenv(name) + + if ret is None: + gha.print_error(f"Missing required parameter '{name}'") + + if ret == '': + return None + + return ret + +github_event_name = get_environment_variable('github_event_name') +assert(github_event_name is not None) +github_ref = get_environment_variable('github_ref') +assert(github_ref is not None) +github_run_number = get_environment_variable('github_run_number') +assert(github_run_number is not None) + +gha.fail_if_errors() + +#================================================================================================== +# Determine build settings +#================================================================================================== + +# For GitHub refs besides main, include the branch/tag name in the default version string +ref_part = '' +if github_ref != 'refs/heads/main': + ref = github_ref + + # Strip the ref prefix + branch_prefix = 'refs/heads/' + tag_prefix = 'refs/tags/' + if ref.startswith(branch_prefix): + ref = ref[len(branch_prefix):] + elif ref.startswith(tag_prefix): + ref = f'tag-{ref[len(tag_prefix):]}' + + # Replace illegal characters with dashes + ref = re.sub('[^0-9A-Za-z-]', '-', ref) + + # Make the ref part + ref_part = f'-{ref}' + +# Build the default version string +version = '' +version_suffix = f'{ref_part}-ci{github_run_number}' +is_for_release = False + +# Handle non-default version strings +# Make sure logic relating to is_for_release matches the publish-packages-nuget-org in the workflow +if github_event_name == 'release': + is_for_release = True + version = get_environment_variable('release_version') + if version is None: + gha.print_error('Release version was not specified!') + sys.exit(1) + + # Trim leading v off of version if present + version = version.strip('v') + + release_is_prerelease = get_environment_variable('release_is_prerelease') + if release_is_prerelease != 'true' and release_is_prerelease != 'false': + gha.print_error('Release prerelease status was invalid or unspecified!') + + # There are steps within the workflow which assume that the prerelease state of the release is correct, so we ensure it is + # We could implicitly detect things for those steps, but this situation probably indicates user error and handling it this way is easier + if nuget.is_preview_version(version) and release_is_prerelease != 'true': + gha.print_error(f"The version to be release '{version}' indicates a pre-release version, but the release is not marked as a pre-release!") + sys.exit(1) +elif github_event_name == 'workflow_dispatch': + workflow_dispatch_version = get_environment_variable('workflow_dispatch_version') + workflow_dispatch_will_publish_packages = get_environment_variable('workflow_dispatch_will_publish_packages') or 'false' + + if workflow_dispatch_version is not None: + version = workflow_dispatch_version + + if workflow_dispatch_will_publish_packages.lower() == 'true': + is_for_release = True + +# Validate the version number +if version != '' and not nuget.is_valid_version(version, forbid_build_metadata=True): + gha.print_error(f"'{version}' is not a valid semver version!") + +# If there are any errors at this point, make sure we exit with an error code +gha.fail_if_errors() + +#================================================================================================== +# Emit MSBuild properties +#================================================================================================== +print(f"Configuring build environment to build{' and release' if is_for_release else ''} version {version}") +gha.set_environment_variable('CiBuildVersion', version) +gha.set_environment_variable('CiBuildVersionSuffix', version_suffix) +gha.set_environment_variable('CiRunNumber', github_run_number) +gha.set_environment_variable('CiIsForRelease', str(is_for_release).lower()) + +gha.fail_if_errors() diff --git a/.github/workflows/create-build-matrix.py b/.github/workflows/create-build-matrix.py new file mode 100755 index 00000000..eacd2b98 --- /dev/null +++ b/.github/workflows/create-build-matrix.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +import json +import os + +import gha + +matrix = [ ] + +def add(name: str, runner_os: str, rid: str, configurations: list[str] = ['Debug', 'Release']): + platform = { + 'name': name, + 'os': runner_os, + 'rid': rid, + } + + ret = { } + for configuration in configurations: + job = { + 'platform': platform.copy(), + 'configuration': configuration, + 'configuration-lower': configuration.lower(), + 'job-title': f"{name} {configuration}", + 'artifacts-suffix': '', + } + matrix.append(job) + ret[configuration] = job + return ret + +windows = add('Windows x64', 'windows-latest', 'win-x64') +linux = add('Linux x64', 'ubuntu-latest', 'linux-x64') + +# Collect packages and create installer from Windows Release x64 +windows['Release']['collect-packages'] = True +windows['Release']['create-installer'] = True + +# Build dummy packages to determine which ones changed (not relevant for pull requests since we won't publish) +def add_dummy(name: str, artifacts_suffix: str): + dummy = add(name, 'ubuntu-latest', 'linux-x64', ['Release'])['Release'] + dummy['skip-tests'] = True + dummy['collect-packages'] = True + dummy['dummy-build'] = True + dummy['title'] = name # Don't include configuration in dummy target titles + dummy['artifacts-suffix'] = artifacts_suffix + return dummy + +if os.getenv('GITHUB_EVENT_NAME') != 'pull_request': + add_dummy('Previous Dummy', '-dummy-prev')['checkout-ref'] = 'refs/tags/latest' + add_dummy('Next Dummy', '-dummy-next') + +# Output +matrix_json = json.dumps({ "include": matrix }, indent=2) +print(matrix_json) +gha.set_output('matrix', matrix_json) + +gha.fail_if_errors() diff --git a/.github/workflows/create-portable-zip.py b/.github/workflows/create-portable-zip.py new file mode 100755 index 00000000..aeea468d --- /dev/null +++ b/.github/workflows/create-portable-zip.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +import os +import sys +import zipfile + +import gha + +if len(sys.argv) != 3: + gha.print_error('Usage: create-portable-zip.py ') + sys.exit(1) +else: + output_path = sys.argv[1] + configuration = sys.argv[2].lower() + +with zipfile.ZipFile(output_path, 'x', zipfile.ZIP_DEFLATED, compresslevel=9) as output: + output.mkdir('Extensions') + output.mkdir('Gallery') + + output.write(f'artifacts/bin/Bonsai/{configuration}-repacked/Bonsai.exe', 'Bonsai.exe') + output.write(f'artifacts/bin/Bonsai/{configuration}/Bonsai32.exe', 'Bonsai32.exe') + + nuget_config = [ + '', + '', + ' ', + ' ', + ' ', + ' ', + ] + + nuget_api_url = os.getenv('NUGET_API_URL') + if nuget_api_url is not None: + nuget_config.append(f' ') + + # Unstable builds of Bonsai will automatically reference the GitHub Packages feed + if os.getenv('IS_FULL_RELEASE') == 'false': + repo_owner = os.getenv('GITHUB_REPOSITORY_OWNER') or 'bonsai-rx' + nuget_config.append(f' ') + nuget_config.append(' ') + nuget_config.append(' ') + nuget_config.append(' ') + nuget_config.append(' ') + nuget_config.append(' ') + nuget_config.append(' ') + nuget_config.append(' ') + nuget_config.append(' ') + else: + nuget_config.append(' ') + + nuget_config.append('') + nuget_config.append('') + + output.writestr('NuGet.config', '\r\n'.join(nuget_config)) + +gha.fail_if_errors() diff --git a/.github/workflows/filter-release-packages.py b/.github/workflows/filter-release-packages.py new file mode 100755 index 00000000..f67fc5af --- /dev/null +++ b/.github/workflows/filter-release-packages.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 +import os +import sys + +from pathlib import Path + +import gha +import nuget + +if len(sys.argv) != 3: + gha.print_error('Usage: filter-release-packages.py ') + sys.exit(1) +else: + release_manifest_path = Path(sys.argv[1]) + packages_path = Path(sys.argv[2]) + +if not release_manifest_path.exists(): + gha.print_error(f"Release manifest '{release_manifest_path}' does not exist.") +if not packages_path.exists(): + gha.print_error(f"Packages path '{packages_path}' does not exist.") +gha.fail_if_errors() + +release_packages = set() +with open(release_manifest_path, 'r') as release_manifest: + for line in release_manifest.readlines(): + release_packages.add(line.strip()) + +# The workflow doesn't properly handle this scenario right now since it doesn't have to thanks to some packages being force-released +# In case it happens in the future though, we print an explicit error rather than letting it fail in a confusing way +if len(release_packages) == 0: + gha.print_error("No packages are listed in the release manifest. Everything will be filtered.") + +file_names = os.listdir(packages_path) +file_names.sort() +for file_name in file_names: + extension = Path(file_name).suffix.lower() + if extension != '.nupkg' and extension != '.snupkg': + continue + + package_name = nuget.get_package_name(file_name) + if package_name in release_packages: + if extension != '.snupkg': + print(f"✅ '{package_name}'") + continue + + if extension != '.snupkg': + print(f"⬜ '{package_name}'") + os.unlink(packages_path / file_name) + +gha.fail_if_errors() diff --git a/.github/workflows/gha.py b/.github/workflows/gha.py new file mode 100755 index 00000000..6159d6f3 --- /dev/null +++ b/.github/workflows/gha.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python3 +# GitHub Actions Utility Functions +# https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions +import io +import os +import sys + +errors_were_printed = False + +def fail_if_errors(): + if errors_were_printed: + print("Exiting due to previous errors.") + sys.exit(1) + +def print_error(message): + global errors_were_printed + errors_were_printed = True + print(f"::error::{message}") + +def print_warning(message): + print(f"::warning::{message}") + +def print_notice(message): + print(f"::notice::{message}") + +def print_debug(message): + print(f"::debug::{message}") + +def github_file_command(command, message): + command = f"GITHUB_{command}" + command_file = os.getenv(command) + + if command_file is None: + print_error(f"Missing required GitHub environment variable '{command}'") + sys.exit(1) + + if not os.path.exists(command_file): + print_error(f"'{command}' points to non-existent file '{command_file}')") + sys.exit(1) + + with open(command_file, 'a') as command_file_handle: + command_file_handle.write(message) + command_file_handle.write('\n') + +def set_output(name, value): + if isinstance(value, bool): + value = "true" if value else "false" + github_file_command("OUTPUT", f"{name}< None: + if self.file is None: + return + + self.file.write(line) + self.file.write('\n') + + def __exit__(self, exc_type, exc_val, exc_tb) -> None: + if self.file is not None: + self.file.__exit__(exc_type, exc_val, exc_tb) + +if __name__ == "__main__": + args = sys.argv + + def pop_arg(): + global args + if len(args) == 0: + print_error("Bad command line, not enough arguments specified.") + sys.exit(1) + result = args[0] + args = args[1:] + return result + + def done_parsing(): + if len(args) > 0: + print_error("Bad command line, too many arguments specified.") + sys.exit(1) + + pop_arg() # Skip script name + command = pop_arg() + if command == "print_error": + message = pop_arg() + done_parsing() + print_error(message) + elif command == "print_warning": + message = pop_arg() + done_parsing() + print_warning(message) + elif command == "print_notice": + message = pop_arg() + done_parsing() + print_notice(message) + elif command == "set_output": + name = pop_arg() + value = pop_arg() + done_parsing() + set_output(name, value) + elif command == "set_environment_variable": + name = pop_arg() + value = pop_arg() + done_parsing() + set_environment_variable(name, value) + elif command == "add_path": + path = pop_arg() + done_parsing() + add_path(path) + else: + print_error(f"Unknown command '{command}'") + sys.exit(1) + + fail_if_errors() diff --git a/.github/workflows/nuget.py b/.github/workflows/nuget.py new file mode 100644 index 00000000..38b42531 --- /dev/null +++ b/.github/workflows/nuget.py @@ -0,0 +1,62 @@ +import re + +import gha + +package_version_regex = re.compile(r"(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)\.(?P0|[1-9]\d*)(?:-(?P(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?") + +package_file_name_regex = re.compile(r"^(?P.+?)\." + package_version_regex.pattern + r"\.s?nupkg$") +def get_package_name(file_name: str) -> str: + match = package_file_name_regex.match(file_name) + if match is None: + gha.print_warning(f"File name '{file_name}' does not match the expected format for a NuGet package.") + return file_name + return match.group('package_name') + +def is_valid_version(version: str, forbid_build_metadata: bool = False) -> bool: + match = package_version_regex.match(version) + if match is None: + return False + + if forbid_build_metadata and match.group('buildmetadata') is not None: + return False + + return True + +def is_preview_version(version: str) -> bool: + match = package_version_regex.match(version) + if match is None: + gha.print_error(f"Version '{version}' is not a legal semver version string!") + return True + + return match.group('prerelease') is not None + +class SemanticVersion: + major = 0 + minor = 0 + patch = 0 + prerelease: str | None = None + build_metadata: str | None = None + + def __str__(self): + ret = f"{self.major}.{self.minor}.{self.patch}" + + if self.prerelease is not None: + ret += f"-{self.prerelease}" + + if self.build_metadata is not None: + ret += f"+{self.build_metadata}" + + return ret + +def get_version_parts(version: str) -> SemanticVersion: + match = package_version_regex.match(version) + if match is None: + raise Exception("The specified version was invalid") + + ret = SemanticVersion() + ret.major = int(match.group('major')) + ret.minor = int(match.group('minor')) + ret.patch = int(match.group('patch')) + ret.prerelease = match.group('prerelease') + ret.build_metadata = match.group('buildmetadata') + return ret diff --git a/Bonsai.Audio/Bonsai.Audio.csproj b/Bonsai.Audio/Bonsai.Audio.csproj index 927a6585..4b9b5e6b 100644 --- a/Bonsai.Audio/Bonsai.Audio.csproj +++ b/Bonsai.Audio/Bonsai.Audio.csproj @@ -4,7 +4,6 @@ Bonsai Audio Library containing modules for sound capture and playback. Bonsai Rx Audio net462 - 2.8.0 diff --git a/Bonsai.Configuration/Bonsai.Configuration.csproj b/Bonsai.Configuration/Bonsai.Configuration.csproj index 5edf9c58..fcf3fee0 100644 --- a/Bonsai.Configuration/Bonsai.Configuration.csproj +++ b/Bonsai.Configuration/Bonsai.Configuration.csproj @@ -3,7 +3,6 @@ false false net472;netstandard2.0 - 2.8.3 diff --git a/Bonsai.Core.Tests/Bonsai.Core.Tests.csproj b/Bonsai.Core.Tests/Bonsai.Core.Tests.csproj index 10643275..bdf4b619 100644 --- a/Bonsai.Core.Tests/Bonsai.Core.Tests.csproj +++ b/Bonsai.Core.Tests/Bonsai.Core.Tests.csproj @@ -3,7 +3,6 @@ false false net462 - 2.8.1 diff --git a/Bonsai.Core/Bonsai.Core.csproj b/Bonsai.Core/Bonsai.Core.csproj index fa0c6372..8c6d4cd6 100644 --- a/Bonsai.Core/Bonsai.Core.csproj +++ b/Bonsai.Core/Bonsai.Core.csproj @@ -5,7 +5,6 @@ Bonsai Rx Reactive Extensions net462;netstandard2.0;net6.0 Bonsai - 2.8.2 diff --git a/Bonsai.Design.Visualizers/Bonsai.Design.Visualizers.csproj b/Bonsai.Design.Visualizers/Bonsai.Design.Visualizers.csproj index a1dcd928..c55e37a4 100644 --- a/Bonsai.Design.Visualizers/Bonsai.Design.Visualizers.csproj +++ b/Bonsai.Design.Visualizers/Bonsai.Design.Visualizers.csproj @@ -5,7 +5,6 @@ Bonsai Rx Visualizers true net462 - 2.8.0 diff --git a/Bonsai.Design/Bonsai.Design.csproj b/Bonsai.Design/Bonsai.Design.csproj index e48fa101..d5a5faa4 100644 --- a/Bonsai.Design/Bonsai.Design.csproj +++ b/Bonsai.Design/Bonsai.Design.csproj @@ -5,7 +5,6 @@ Bonsai Design Rx Reactive Extensions true net462 - 2.8.1 diff --git a/Bonsai.Dsp.Design/Bonsai.Dsp.Design.csproj b/Bonsai.Dsp.Design/Bonsai.Dsp.Design.csproj index 73663316..e8224c85 100644 --- a/Bonsai.Dsp.Design/Bonsai.Dsp.Design.csproj +++ b/Bonsai.Dsp.Design/Bonsai.Dsp.Design.csproj @@ -5,7 +5,6 @@ Bonsai Rx Dsp Visualizers true net462 - 2.8.0 diff --git a/Bonsai.Dsp/Bonsai.Dsp.csproj b/Bonsai.Dsp/Bonsai.Dsp.csproj index da664947..d2dd7653 100644 --- a/Bonsai.Dsp/Bonsai.Dsp.csproj +++ b/Bonsai.Dsp/Bonsai.Dsp.csproj @@ -5,7 +5,6 @@ Bonsai Rx Dsp Signal Processing true net462 - 2.8.1 diff --git a/Bonsai.Editor.Tests/Bonsai.Editor.Tests.csproj b/Bonsai.Editor.Tests/Bonsai.Editor.Tests.csproj index fa261f0c..1f6d3148 100644 --- a/Bonsai.Editor.Tests/Bonsai.Editor.Tests.csproj +++ b/Bonsai.Editor.Tests/Bonsai.Editor.Tests.csproj @@ -3,7 +3,6 @@ false false net472 - 2.8.2 diff --git a/Bonsai.Editor/Bonsai.Editor.csproj b/Bonsai.Editor/Bonsai.Editor.csproj index 38e5ffca..f93badbb 100644 --- a/Bonsai.Editor/Bonsai.Editor.csproj +++ b/Bonsai.Editor/Bonsai.Editor.csproj @@ -6,7 +6,6 @@ true false net472 - 2.8.2 diff --git a/Bonsai.NuGet.Design/Bonsai.NuGet.Design.csproj b/Bonsai.NuGet.Design/Bonsai.NuGet.Design.csproj index 7eec6f75..7c7b29f5 100644 --- a/Bonsai.NuGet.Design/Bonsai.NuGet.Design.csproj +++ b/Bonsai.NuGet.Design/Bonsai.NuGet.Design.csproj @@ -4,7 +4,6 @@ false false net472 - 2.8.1 diff --git a/Bonsai.NuGet/Bonsai.NuGet.csproj b/Bonsai.NuGet/Bonsai.NuGet.csproj index 34ee0acc..6aea615d 100644 --- a/Bonsai.NuGet/Bonsai.NuGet.csproj +++ b/Bonsai.NuGet/Bonsai.NuGet.csproj @@ -3,7 +3,6 @@ false false net472;netstandard2.0 - 2.8.1 diff --git a/Bonsai.Osc/Bonsai.Osc.csproj b/Bonsai.Osc/Bonsai.Osc.csproj index 441ece5e..d23e48db 100644 --- a/Bonsai.Osc/Bonsai.Osc.csproj +++ b/Bonsai.Osc/Bonsai.Osc.csproj @@ -4,7 +4,6 @@ Bonsai Osc Library containing reactive infrastructure to interface with devices using the Open Sound Control protocol. Bonsai Rx Osc net462 - 2.7.0 diff --git a/Bonsai.Player/Bonsai.Player.csproj b/Bonsai.Player/Bonsai.Player.csproj index 9fc374d7..7ce2e0d4 100644 --- a/Bonsai.Player/Bonsai.Player.csproj +++ b/Bonsai.Player/Bonsai.Player.csproj @@ -11,7 +11,6 @@ icon.png - 2.8.3 true diff --git a/Bonsai.Scripting.Expressions.Design/Bonsai.Scripting.Expressions.Design.csproj b/Bonsai.Scripting.Expressions.Design/Bonsai.Scripting.Expressions.Design.csproj index 5b567c3f..5618a2a9 100644 --- a/Bonsai.Scripting.Expressions.Design/Bonsai.Scripting.Expressions.Design.csproj +++ b/Bonsai.Scripting.Expressions.Design/Bonsai.Scripting.Expressions.Design.csproj @@ -5,7 +5,6 @@ Bonsai Rx Scripting Expressions Design true net462 - 2.8.0 diff --git a/Bonsai.Scripting.Expressions/Bonsai.Scripting.Expressions.csproj b/Bonsai.Scripting.Expressions/Bonsai.Scripting.Expressions.csproj index 72c518c9..f0838fad 100644 --- a/Bonsai.Scripting.Expressions/Bonsai.Scripting.Expressions.csproj +++ b/Bonsai.Scripting.Expressions/Bonsai.Scripting.Expressions.csproj @@ -4,7 +4,6 @@ Bonsai Scripting Library containing expression scripting infrastructure for Bonsai. Bonsai Rx Scripting Expressions net462 - 2.8.0 diff --git a/Bonsai.Scripting.IronPython.Design/Bonsai.Scripting.IronPython.Design.csproj b/Bonsai.Scripting.IronPython.Design/Bonsai.Scripting.IronPython.Design.csproj index 88c345e1..b34eff06 100644 --- a/Bonsai.Scripting.IronPython.Design/Bonsai.Scripting.IronPython.Design.csproj +++ b/Bonsai.Scripting.IronPython.Design/Bonsai.Scripting.IronPython.Design.csproj @@ -5,7 +5,6 @@ Bonsai Rx Scripting Iron Python Design true net462 - 2.8.0 diff --git a/Bonsai.Scripting.IronPython/Bonsai.Scripting.IronPython.csproj b/Bonsai.Scripting.IronPython/Bonsai.Scripting.IronPython.csproj index 586a6706..033c5920 100644 --- a/Bonsai.Scripting.IronPython/Bonsai.Scripting.IronPython.csproj +++ b/Bonsai.Scripting.IronPython/Bonsai.Scripting.IronPython.csproj @@ -4,7 +4,6 @@ Bonsai Scripting Library containing IronPython scripting infrastructure for Bonsai. Bonsai Rx Scripting Iron Python net462 - 2.8.0 diff --git a/Bonsai.Scripting/Bonsai.Scripting.csproj b/Bonsai.Scripting/Bonsai.Scripting.csproj index 0cb86184..3bfcb3ed 100644 --- a/Bonsai.Scripting/Bonsai.Scripting.csproj +++ b/Bonsai.Scripting/Bonsai.Scripting.csproj @@ -5,7 +5,6 @@ Bonsai Rx Scripting true net462 - 2.8.0 diff --git a/Bonsai.Setup.Bootstrapper/Bonsai.Setup.Bootstrapper.wixproj b/Bonsai.Setup.Bootstrapper/Bonsai.Setup.Bootstrapper.wixproj index 0db1b171..12c57680 100644 --- a/Bonsai.Setup.Bootstrapper/Bonsai.Setup.Bootstrapper.wixproj +++ b/Bonsai.Setup.Bootstrapper/Bonsai.Setup.Bootstrapper.wixproj @@ -8,13 +8,14 @@ 3.6 {da1c1aa7-15f6-4787-b441-e75bcffe680b} 2.0 - Bonsai-2.8.3 + Bonsai-$(Version) Bundle $(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets $(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets Debug + $(DefineConstants);BonsaiDisplayVersion=$(Version) diff --git a/Bonsai.Setup.Bootstrapper/Bundle.wxs b/Bonsai.Setup.Bootstrapper/Bundle.wxs index cfd5f39f..038a1a54 100644 --- a/Bonsai.Setup.Bootstrapper/Bundle.wxs +++ b/Bonsai.Setup.Bootstrapper/Bundle.wxs @@ -22,6 +22,7 @@ LaunchWorkingFolder="[InstallFolder]"/> + diff --git a/Bonsai.Setup.Bootstrapper/Theme/RtfLargeTheme.xml b/Bonsai.Setup.Bootstrapper/Theme/RtfLargeTheme.xml index 0fefb022..bcece6ca 100644 --- a/Bonsai.Setup.Bootstrapper/Theme/RtfLargeTheme.xml +++ b/Bonsai.Setup.Bootstrapper/Theme/RtfLargeTheme.xml @@ -18,7 +18,7 @@ - #(loc.InstallVersion) + Version [BonsaiDisplayVersion] #(loc.InstallAcceptCheckbox) diff --git a/Bonsai.Shaders.Design/Bonsai.Shaders.Design.csproj b/Bonsai.Shaders.Design/Bonsai.Shaders.Design.csproj index eeef98c3..70813389 100644 --- a/Bonsai.Shaders.Design/Bonsai.Shaders.Design.csproj +++ b/Bonsai.Shaders.Design/Bonsai.Shaders.Design.csproj @@ -5,7 +5,6 @@ Bonsai Rx Shaders Design Graphics OpenGL true net462 - 0.27.0 diff --git a/Bonsai.Shaders.Rendering/Bonsai.Shaders.Rendering.csproj b/Bonsai.Shaders.Rendering/Bonsai.Shaders.Rendering.csproj index 237c9417..b980d5f6 100644 --- a/Bonsai.Shaders.Rendering/Bonsai.Shaders.Rendering.csproj +++ b/Bonsai.Shaders.Rendering/Bonsai.Shaders.Rendering.csproj @@ -4,7 +4,6 @@ Bonsai Shaders Rendering Library containing modules for rendering complex 3D scenes. Bonsai Rx Shaders Rendering Assets Graphics OpenGL net462 - 0.3.1 diff --git a/Bonsai.Shaders/Bonsai.Shaders.csproj b/Bonsai.Shaders/Bonsai.Shaders.csproj index 1ec69034..af7d4367 100644 --- a/Bonsai.Shaders/Bonsai.Shaders.csproj +++ b/Bonsai.Shaders/Bonsai.Shaders.csproj @@ -4,7 +4,6 @@ Bonsai Shaders Library containing modules for dynamic control of shader primitives. Bonsai Rx Shaders Graphics OpenGL net462 - 0.27.1 diff --git a/Bonsai.StarterPack/Bonsai.StarterPack.csproj b/Bonsai.StarterPack/Bonsai.StarterPack.csproj index f977386b..e0274efc 100644 --- a/Bonsai.StarterPack/Bonsai.StarterPack.csproj +++ b/Bonsai.StarterPack/Bonsai.StarterPack.csproj @@ -7,7 +7,6 @@ false false net462 - 2.8.1 + true true @@ -30,5 +30,10 @@ true + + + none + \ No newline at end of file diff --git a/tooling/Common.csproj.targets b/tooling/Common.csproj.targets deleted file mode 100644 index 8ef0e682..00000000 --- a/tooling/Common.csproj.targets +++ /dev/null @@ -1,6 +0,0 @@ - - - $([System.DateTime]::UtcNow.Subtract($([System.DateTime]::Parse(2011/12/12))).Days) - $(VersionPrefix).$(DaysFromFirstRevision) - - \ No newline at end of file diff --git a/tooling/Common.targets b/tooling/Common.targets index 4bdf6cfb..707b0e2b 100644 --- a/tooling/Common.targets +++ b/tooling/Common.targets @@ -13,7 +13,7 @@ - + diff --git a/tooling/Common.wixproj.props b/tooling/Common.wixproj.props new file mode 100644 index 00000000..53ed6cae --- /dev/null +++ b/tooling/Common.wixproj.props @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/tooling/CurrentVersion.props b/tooling/CurrentVersion.props new file mode 100644 index 00000000..6193f263 --- /dev/null +++ b/tooling/CurrentVersion.props @@ -0,0 +1,6 @@ + + + + 2.9.0 + + \ No newline at end of file diff --git a/tooling/Versioning.props b/tooling/Versioning.props new file mode 100644 index 00000000..9f960a96 --- /dev/null +++ b/tooling/Versioning.props @@ -0,0 +1,62 @@ + + + + + + 0 + + $(BonsaiVersion)-dev$(DevVersion) + <_FileVersionRevision>$([MSBuild]::Add(60000, $(DevVersion))) + + + $(BonsaiVersion)$(CiBuildVersionSuffix) + $(CiBuildVersion) + <_FileVersionRevision>0 + <_FileVersionRevision Condition="'$(CiIsForRelease)' != 'true' and '$(CiRunNumber)' != ''">$(CiRunNumber) + + + + + $(WarningsAsErrors);CS7035 + + + + + $([System.Text.RegularExpressions.Regex]::Replace('$(Version)', '[\-\+].+$', '')).$(_FileVersionRevision) + + + + + 99.99.99 + 99.99.99.0 + 0000000000000000000000000000000000000000 + false + + + + <_UnchangedBonsaiVersion>$(Version) + <_UnchangedBonsaiFileVersion>$(FileVersion) + + + + + + + + + + \ No newline at end of file From aacd46d55775497ed990d876c32f7c56116e08c8 Mon Sep 17 00:00:00 2001 From: David Maas Date: Mon, 1 Jul 2024 18:45:52 -0500 Subject: [PATCH 14/17] Fix information missing from the about box The labels in the table try to use word wrap when they're too long, but only the first line is visible so the wrapped text just disappears instead. AutoEllipsis prevents the wrap and instead cuts off excess information with an ellipsis. Version was disappearing entirely when build metadata was included. The copyright year range was being cut off as well, made the form a bit wider so it's fully visible. --- Bonsai.Editor/AboutBox.Designer.cs | 59 +++++++++++++++--------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/Bonsai.Editor/AboutBox.Designer.cs b/Bonsai.Editor/AboutBox.Designer.cs index 0ff1b932..2efe4e94 100644 --- a/Bonsai.Editor/AboutBox.Designer.cs +++ b/Bonsai.Editor/AboutBox.Designer.cs @@ -27,6 +27,7 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { + this.okButton = new System.Windows.Forms.Button(); this.tableLayoutPanel = new Bonsai.Editor.TableLayoutPanel(); this.logoPictureBox = new System.Windows.Forms.PictureBox(); this.labelProductName = new Bonsai.Editor.Label(); @@ -34,16 +35,25 @@ private void InitializeComponent() this.labelCopyright = new Bonsai.Editor.Label(); this.labelCompanyName = new Bonsai.Editor.Label(); this.textBoxDescription = new System.Windows.Forms.RichTextBox(); - this.okButton = new System.Windows.Forms.Button(); this.tableLayoutPanel.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit(); this.SuspendLayout(); // + // okButton + // + this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.okButton.Location = new System.Drawing.Point(387, 239); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(75, 23); + this.okButton.TabIndex = 24; + this.okButton.Text = "&OK"; + // // tableLayoutPanel // this.tableLayoutPanel.ColumnCount = 2; - this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F)); - this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F)); + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 31.6129F)); + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 68.3871F)); this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 4); this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0); this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1); @@ -61,7 +71,7 @@ private void InitializeComponent() this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); - this.tableLayoutPanel.Size = new System.Drawing.Size(417, 265); + this.tableLayoutPanel.Size = new System.Drawing.Size(465, 265); this.tableLayoutPanel.TabIndex = 0; // // logoPictureBox @@ -70,55 +80,59 @@ private void InitializeComponent() this.logoPictureBox.Image = global::Bonsai.Editor.Properties.Resources.Bonsai; this.logoPictureBox.Location = new System.Drawing.Point(3, 107); this.logoPictureBox.Name = "logoPictureBox"; - this.logoPictureBox.Size = new System.Drawing.Size(131, 126); + this.logoPictureBox.Size = new System.Drawing.Size(141, 126); this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; this.logoPictureBox.TabIndex = 12; this.logoPictureBox.TabStop = false; // // labelProductName // + this.labelProductName.AutoEllipsis = true; this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill; - this.labelProductName.Location = new System.Drawing.Point(143, 0); + this.labelProductName.Location = new System.Drawing.Point(153, 0); this.labelProductName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); this.labelProductName.MaximumSize = new System.Drawing.Size(0, 17); this.labelProductName.Name = "labelProductName"; - this.labelProductName.Size = new System.Drawing.Size(271, 17); + this.labelProductName.Size = new System.Drawing.Size(309, 17); this.labelProductName.TabIndex = 19; this.labelProductName.Text = "Product Name"; this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // labelVersion // + this.labelVersion.AutoEllipsis = true; this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill; - this.labelVersion.Location = new System.Drawing.Point(143, 26); + this.labelVersion.Location = new System.Drawing.Point(153, 26); this.labelVersion.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); this.labelVersion.MaximumSize = new System.Drawing.Size(0, 17); this.labelVersion.Name = "labelVersion"; - this.labelVersion.Size = new System.Drawing.Size(271, 17); + this.labelVersion.Size = new System.Drawing.Size(309, 17); this.labelVersion.TabIndex = 0; this.labelVersion.Text = "Version"; this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // labelCopyright // + this.labelCopyright.AutoEllipsis = true; this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill; - this.labelCopyright.Location = new System.Drawing.Point(143, 52); + this.labelCopyright.Location = new System.Drawing.Point(153, 52); this.labelCopyright.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 17); this.labelCopyright.Name = "labelCopyright"; - this.labelCopyright.Size = new System.Drawing.Size(271, 17); + this.labelCopyright.Size = new System.Drawing.Size(309, 17); this.labelCopyright.TabIndex = 21; this.labelCopyright.Text = "Copyright"; this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // // labelCompanyName // + this.labelCompanyName.AutoEllipsis = true; this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill; - this.labelCompanyName.Location = new System.Drawing.Point(143, 78); + this.labelCompanyName.Location = new System.Drawing.Point(153, 78); this.labelCompanyName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 17); this.labelCompanyName.Name = "labelCompanyName"; - this.labelCompanyName.Size = new System.Drawing.Size(271, 17); + this.labelCompanyName.Size = new System.Drawing.Size(309, 17); this.labelCompanyName.TabIndex = 22; this.labelCompanyName.Text = "Company Name"; this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; @@ -126,33 +140,21 @@ private void InitializeComponent() // textBoxDescription // this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill; - this.textBoxDescription.Location = new System.Drawing.Point(143, 107); + this.textBoxDescription.Location = new System.Drawing.Point(153, 107); this.textBoxDescription.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3); - this.textBoxDescription.Multiline = true; this.textBoxDescription.Name = "textBoxDescription"; this.textBoxDescription.ReadOnly = true; - this.textBoxDescription.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Both; - this.textBoxDescription.Size = new System.Drawing.Size(271, 126); + this.textBoxDescription.Size = new System.Drawing.Size(309, 126); this.textBoxDescription.TabIndex = 23; this.textBoxDescription.TabStop = false; this.textBoxDescription.Text = "Description"; // - // okButton - // - this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.okButton.Location = new System.Drawing.Point(339, 239); - this.okButton.Name = "okButton"; - this.okButton.Size = new System.Drawing.Size(75, 23); - this.okButton.TabIndex = 24; - this.okButton.Text = "&OK"; - // // AboutBox // this.AcceptButton = this.okButton; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(435, 283); + this.ClientSize = new System.Drawing.Size(483, 283); this.Controls.Add(this.tableLayoutPanel); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.MaximizeBox = false; @@ -164,7 +166,6 @@ private void InitializeComponent() this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "AboutBox"; this.tableLayoutPanel.ResumeLayout(false); - this.tableLayoutPanel.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit(); this.ResumeLayout(false); From 1822ed8d2558c22568f26a8212672600d31be9d9 Mon Sep 17 00:00:00 2001 From: David Maas Date: Tue, 2 Jul 2024 19:44:56 -0500 Subject: [PATCH 15/17] Add build kind to main window titles for unstable/dev/preview releases --- Bonsai.Editor/AboutBox.cs | 22 ++++++++++++++++++++-- Bonsai.Editor/EditorForm.cs | 3 +++ Bonsai.Editor/StartScreen.cs | 1 + tooling/Versioning.props | 8 ++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/Bonsai.Editor/AboutBox.cs b/Bonsai.Editor/AboutBox.cs index e01f4db2..442d3ee7 100644 --- a/Bonsai.Editor/AboutBox.cs +++ b/Bonsai.Editor/AboutBox.cs @@ -11,14 +11,32 @@ partial class AboutBox : Form public AboutBox() { InitializeComponent(); - this.Text = String.Format("About {0}", AssemblyTitle); + this.Text = $"About {AssemblyTitle}{BuildKindTitleSuffix}"; this.labelProductName.Text = AssemblyProduct; - this.labelVersion.Text = String.Format("Version {0}", AssemblyVersion); + this.labelVersion.Text = $"Version {AssemblyVersion}"; this.labelCopyright.Text = AssemblyCopyright; this.labelCompanyName.Text = AssemblyCompany; this.textBoxDescription.Text = AssemblyDescription + Environment.NewLine + Resources.AttributionNotices; } + internal static string BuildKindTitleSuffix + { + get + { +#if BUILD_KIND_DEV + return " [Dev]"; +#elif BUILD_KIND_UNSTABLE + return " [Unstable]"; +#elif BUILD_KIND_PREVIEW + return " [Preview]"; +#elif BUILD_KIND_OFFICIAL_RELEASE + return ""; +#else +#error "Unknown build kind!" +#endif + } + } + #region Assembly Attribute Accessors public string AssemblyTitle diff --git a/Bonsai.Editor/EditorForm.cs b/Bonsai.Editor/EditorForm.cs index bf12a9e4..e90ad05f 100644 --- a/Bonsai.Editor/EditorForm.cs +++ b/Bonsai.Editor/EditorForm.cs @@ -187,6 +187,8 @@ public EditorForm( editorControl.Leave += delegate { menuStrip.Enabled = true; }; } components.Add(editorControl); + + UpdateTitle(); } #region Loading @@ -1473,6 +1475,7 @@ void UpdateTitle() if (modified) title.Append('*'); if (workflowRunning) title.AppendFormat(" ({0})", Resources.RunningStatus); if (!emptyFileName) title.AppendFormat(" - {0}", Resources.BonsaiTitle); + title.Append(AboutBox.BuildKindTitleSuffix); Text = title.ToString(); } diff --git a/Bonsai.Editor/StartScreen.cs b/Bonsai.Editor/StartScreen.cs index 3fe2a558..07cbefc3 100644 --- a/Bonsai.Editor/StartScreen.cs +++ b/Bonsai.Editor/StartScreen.cs @@ -36,6 +36,7 @@ public StartScreen() openTreeView.Nodes.Add(galleryNode); openTreeView.Nodes.Add(packageManagerNode); FileName = string.Empty; + Text += AboutBox.BuildKindTitleSuffix; } public EditorResult EditorResult { get; private set; } diff --git a/tooling/Versioning.props b/tooling/Versioning.props index 9f960a96..225f2ada 100644 --- a/tooling/Versioning.props +++ b/tooling/Versioning.props @@ -7,15 +7,23 @@ $(BonsaiVersion)-dev$(DevVersion) <_FileVersionRevision>$([MSBuild]::Add(60000, $(DevVersion))) + BUILD_KIND_DEV $(BonsaiVersion)$(CiBuildVersionSuffix) $(CiBuildVersion) <_FileVersionRevision>0 <_FileVersionRevision Condition="'$(CiIsForRelease)' != 'true' and '$(CiRunNumber)' != ''">$(CiRunNumber) + + BUILD_KIND_UNSTABLE + BUILD_KIND_OFFICIAL_RELEASE + BUILD_KIND_PREVIEW + BUILD_KIND_UNKNOWN + $(DefineConstants);$(BuildKindConstant) + $(WarningsAsErrors);CS7035 From cdc563eddb754078553ff42fb6a11c250dd04511 Mon Sep 17 00:00:00 2001 From: David Maas Date: Tue, 2 Jul 2024 22:34:55 -0500 Subject: [PATCH 16/17] Update solution items --- Bonsai.sln | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Bonsai.sln b/Bonsai.sln index 5da155d9..a797ab1b 100644 --- a/Bonsai.sln +++ b/Bonsai.sln @@ -67,13 +67,22 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{B4486E9B-95F2-482C-9190-59F76D2C859C}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig - Bonsai.Tests.proj = Bonsai.Tests.proj Directory.Build.props = Directory.Build.props Directory.Build.targets = Directory.Build.targets EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bonsai.Templates", "Bonsai.Templates\Bonsai.Templates.csproj", "{FD09545E-4FB8-4730-B936-FE0BCF43E883}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tooling", "tooling", "{69C99DD4-0616-43BB-82EC-EABE18279BCC}" + ProjectSection(SolutionItems) = preProject + tooling\Common.csproj.props = tooling\Common.csproj.props + tooling\Common.props = tooling\Common.props + tooling\Common.targets = tooling\Common.targets + tooling\Common.wixproj.props = tooling\Common.wixproj.props + tooling\CurrentVersion.props = tooling\CurrentVersion.props + tooling\Versioning.props = tooling\Versioning.props + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU From 3a4a723d7adc1e882d67e1da52ccd5bb3bf19946 Mon Sep 17 00:00:00 2001 From: David Maas Date: Wed, 3 Jul 2024 20:10:56 -0500 Subject: [PATCH 17/17] Add CI status and version badges to readme --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 583b0515..89787ce1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # Bonsai - Visual Reactive Programming +[![Download Bonsai](https://img.shields.io/nuget/v/Bonsai?style=flat-square&label=Download%20Bonsai&labelColor=5e616c&color=ec2227)](https://bonsai-rx.org/docs/articles/installation.html) +[![CI Status](https://img.shields.io/github/actions/workflow/status/bonsai-rx/bonsai/Bonsai.yml?branch=main&style=flat-square&label=CI)](https://github.com/bonsai-rx/bonsai/actions) + This is the main repository for the [Bonsai](https://bonsai-rx.org/) visual programming language. It contains source code for the compiler, IDE, and standard library. With Bonsai you tell your computer what to do not through long listings of text but by manipulating graphical elements in a workflow. Bonsai is built on top of [Rx.NET](http://reactivex.io/), and like in Rx, workflow elements in Bonsai represent asynchronous streams of data called [Observables](https://bonsai-rx.org/docs/articles/observables.html) which can be connected together to perform complex operations.