Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/build-test-installer-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
@.github/workflows/build-test-installer-release.yml
Copy link

Copilot AI Nov 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change replaces the entire CI/CD workflow file with a git submodule reference. GitHub Actions cannot execute submodule references as workflows. This will completely break the automated build, test, and release pipeline.

Suggested change
@.github/workflows/build-test-installer-release.yml
name: Build, Test, Installer, Release
on:
push:
branches:
- main
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
release:
needs: build
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm install
- name: Build installer
run: npm run build:installer
- name: Release
run: npm run release

Copilot uses AI. Check for mistakes.
1 change: 1 addition & 0 deletions .github/workflows/test-report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
test
14 changes: 11 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# SayMore�
# SayMore�

SayMore provides an intuitive and enjoyable way to manage language documentation tasks.

Expand All @@ -22,6 +22,14 @@ Please see [Tips for Testing Palaso Software](https://docs.google.com/document/d

Reports can be entered in https://jira.sil.org/projects/SP/issues. They can be entered there via email by sending to saymore_issues@sil.org.

### Continuous Build System
## Github Actions CI
Every PR triggers a build and runs tests.

Each time code is checked in, an automatic build begins on our [TeamCity build server](https://build.palaso.org/project.html?projectId=SayMore&tab=projectOverview), running all the unit tests. This automatic build doesn't publish a new installer, however. That kind of build is launched manually, by pressing a button on the TeamCity page. This "publish" process builds SayMore, makes and installer, rsyncs it to the distribution server, and writes out a little bit of html which the [SayMore download page](https://software.sil.org/saymore/download/) then displays to the user. It also creates a build artifact that enables the SayMore program to check to see whether a newer version is available.
Every commit on the main branch will produce a signed installer for user testing as desired. Simply go to the Actions tab and find the Actions run for that commit if you want to download the installer. The installer is attached to the run artifact.

# Release Process
To release a new version, just tag a commit on the main branch e.g. v3.7.5
This will trigger Github Actions to produce a Release with the signed installer attached

# Release TODO
Implement the "publish" process on TeamCity, which builds SayMore, makes and installer, rsyncs it to the distribution server, and writes out a little bit of html which the [SayMore download page](https://software.sil.org/saymore/download/) then displays to the user. It also creates a build artifact that enables the SayMore program to check to see whether a newer version is available.
98 changes: 37 additions & 61 deletions build/SayMore.proj
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<RootDir Condition="'$(teamcity_version)' == ''">$(MSBuildProjectDirectory)\..</RootDir>
<RootDir Condition="'$(teamcity_version)' != ''">$(teamcity_build_checkoutDir)</RootDir>
<BUILD_NUMBER Condition="'$(BUILD_NUMBER)'==''">3.7.100</BUILD_NUMBER>
<RootDir>$(MSBuildProjectDirectory)\..</RootDir>
<RootDir Condition="'$(GITHUB_WORKSPACE)' != ''">$(GITHUB_WORKSPACE)</RootDir>
<BuildTasksDll Condition="Exists('$(RootDir)/packages/SIL.BuildTasks.3.1.1/tools/SIL.BuildTasks.dll')">$(RootDir)/packages/SIL.BuildTasks.3.1.1/tools/SIL.BuildTasks.dll</BuildTasksDll>
<BuildTasksDll Condition="!Exists('$(RootDir)/packages/SIL.BuildTasks.3.1.1/tools/SIL.BuildTasks.dll')">$(RootDir)/packages/SIL.BuildTasks/tools/SIL.BuildTasks.dll</BuildTasksDll>
<SILReleaseTasksProps>$(RootDir)/packages/SIL.ReleaseTasks.3.1.1/build/SIL.ReleaseTasks.props</SILReleaseTasksProps>
Expand All @@ -20,7 +19,6 @@
<Exec Command='$(NuGetCommand) install SIL.BuildTasks -excludeVersion -PreRelease -source "$(PackageSources)" -solutionDirectory "$(SolutionDir)."' />
<Exec Command='$(NuGetCommand) install SIL.ReleaseTasks -excludeVersion -PreRelease -source "$(PackageSources)" -solutionDirectory "$(SolutionDir)"' />
<Exec Command='$(NuGetCommand) install SIL.libpalaso.l10ns -excludeVersion -PreRelease -source "$(PackageSources)" -solutionDirectory "$(SolutionDir)."' />
<Exec Command='$(NuGetCommand) install NUnit.Extension.TeamCityEventListener -excludeVersion -source "$(PackageSources)" -solutionDirectory "$(SolutionDir)."' />
<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="BuildInternal"
Properties="Configuration=$(Configuration)" Condition="$(RestartBuild)" />
</Target>
Expand All @@ -33,18 +31,10 @@
<UsingTask TaskName="NUnit3" AssemblyFile="$(BuildTasksDll)" Condition="Exists('$(BuildTasksDll)')" />

<Target Name="VersionNumbers">
<Message Text="BUILD_NUMBER: $(BUILD_NUMBER)" Importance="high"/>

<Split Input="$(BUILD_NUMBER)" Delimiter="." OutputSubString="2">
<Output TaskParameter="ReturnValue" PropertyName="BuildCounter" />
</Split>

<Message Text="BuildCounter: $(BuildCounter)" Importance="high"/>

<!-- Note, after some thought, we've decided this is the best place to keep the version number (not on TeamCity, not in the assemblies). -->
<CreateProperty Value="3.7.$(BuildCounter)">
<Output PropertyName="Version" TaskParameter="Value"/>
</CreateProperty>
<PropertyGroup>
<!-- The Version should be set from the outside, if not, set a meaningless default value -->
<Version Condition="'$(Version)' == ''">1.0.0.0</Version>
</PropertyGroup>

<Message Text="Version: $(Version)" Importance="high"/>
</Target>
Expand Down Expand Up @@ -84,7 +74,7 @@
<ItemGroup>
<TestAssemblies Include="$(RootDir)/output/release/*Tests.dll;"/>
</ItemGroup>
<NUnit3 Condition="'$(teamcity_version)' == ''"
<NUnit3
Assemblies="@(TestAssemblies)"
ToolPath="$(RootDir)/packages/NUnit.ConsoleRunner.3.20.1/tools"
ExcludeCategory="$(excludedCategories)"
Expand All @@ -94,15 +84,7 @@
OutputXmlFile="$(RootDir)/output/$(Configuration)/TestResults.xml"
UseNUnit3Xml = "true"
TeamCity="false"/>
<NUnit3 Condition="'$(teamcity_version)' != ''"
Assemblies="@(TestAssemblies)"
ToolPath="$(RootDir)/packages/NUnit.ConsoleRunner.3.20.1/tools"
ExcludeCategory="SkipOnTeamCity,$(excludedCategories)"
WorkingDirectory="$(RootDir)/output/$(Configuration)"
Force32Bit="$(useNUnit-x86)"
Verbose="true"
TeamCity="true"/>
</Target>
</Target>

<Target Name="UpdateDownloadInfo" DependsOnTargets="VersionNumbers" >

Expand Down Expand Up @@ -149,21 +131,34 @@
changing of the script, but I haven't figured that out. -->

<FileUpdate File="$(RootDir)\src\Installer\Installer.wxs" Regex='Property_ProductVersion = ".*"'
ReplacementText ="Property_ProductVersion = &quot;$(Version)&quot;" />
ReplacementText ="Property_ProductVersion = &quot;$(Version)&quot;" />

<Message Text="Making Installer Version: $(Version)" Importance="high" />

<MSBuild Projects="$(RootDir)\src\Installer\Installer.wixproj"/>

<!-- remove an existing one with the same name, if necessary -->
<Delete Files="$(RootDir)\output\installer\SayMoreInstaller.$(Version).msi" TreatErrorsAsWarnings="false" />
<!-- Ensure destination folder exists -->
<MakeDir Directories="$(RootDir)\output\installer" />

<Exec Command='sign /d "SayMoreInstaller.$(Version).msi" "$(RootDir)\output\installer\SayMoreInstaller.msi"'></Exec>
<PropertyGroup>
<InstallerSourceMsi>$(RootDir)\output\installer\SayMoreInstaller.msi</InstallerSourceMsi>
<InstallerSourceMsi Condition="!Exists('$(InstallerSourceMsi)')">$(RootDir)\src\Installer\bin\$(Configuration)\SayMoreInstaller.msi</InstallerSourceMsi>
<InstallerSourceMsi Condition="!Exists('$(InstallerSourceMsi)')">$(RootDir)\src\Installer\bin\$(Configuration)\en-us\SayMoreInstaller.msi</InstallerSourceMsi>
</PropertyGroup>

<Copy SourceFiles="$(RootDir)\output\installer\SayMoreInstaller.msi"
DestinationFiles="$(RootDir)\output\installer\SayMoreInstaller.$(Version).msi"
/>

<!-- Helpful debug -->
<Message Text="Looking for MSI at: $(InstallerSourceMsi)" Importance="high" />

<!-- Guard with an explicit error if it's missing -->
<Error
Text="Expected MSI not found at $(InstallerSourceMsi)."
Condition="!Exists('$(InstallerSourceMsi)')" />

<!-- Copy + rename with version -->
<Copy
SourceFiles="$(InstallerSourceMsi)"
DestinationFiles="$(RootDir)\output\installer\SayMoreInstaller.$(Version).msi" />

<!-- appcast.xml is used as part of the update notification system -->
<Copy SourceFiles ="$(RootDir)\src\Installer\appcast.xml"
DestinationFolder ="$(RootDir)\output\installer"/>
Expand All @@ -177,46 +172,27 @@

</Target>

<!-- The "Installer" Target used to depend on this, but the Edolo Sample data was removed
in version 3 of SayMore, so there is no need to continue to generate this WIX include
file. (See SampleData\ReadMe.txt)
<Target Name="MakeWixForSampleData">
<MakeDir ContinueOnError ="true" Directories ="$(RootDir)\output\Installer\"/>

<MakeWixForDirTree
DirectoryReferenceId="SampleDataDir"
GiveAllPermissions="true"
ComponentGroupId="SampleData"
RootDirectory="$(RootDir)\SampleData"
OutputFilePath="$(RootDir)\output\Installer\GeneratedSampleDataFiles.wxs"
MatchRegExPattern=".*"
>
<Output TaskParameter="OutputFilePath" ItemName="Compile" />
</MakeWixForDirTree>
</Target>
-->

<Target Name="copyLibL10ns" DependsOnTargets="RestoreLocalPackages">
<Error Text="Palaso L10ns package missing. Expected at $(RootDir)/packages/SIL.libpalaso.l10ns"
Condition="!Exists('$(RootDir)/packages/SIL.libpalaso.l10ns/SIL.libpalaso.l10ns.nupkg')" />
<ItemGroup>
<XliffFiles Include="$(RootDir)/packages/SIL.libpalaso.l10ns/content/**/*.xlf"/>
</ItemGroup>
<Copy SourceFiles="@(XliffFiles)"
DestinationFiles="@(XliffFiles->'$(RootDir)/DistFiles/%(Filename)%(Extension)')"
SkipUnchangedFiles="true"/>
DestinationFiles="@(XliffFiles->'$(RootDir)/DistFiles/%(Filename)%(Extension)')"
SkipUnchangedFiles="true"/>
</Target>

<Target Name="MakeWixForDistFiles" DependsOnTargets="copyLibL10ns">
<MakeDir ContinueOnError ="true" Directories ="$(RootDir)\output\Installer\"/>

<MakeWixForDirTree
DirectoryReferenceId="ProgramDir"
ComponentGroupId="DistFiles"
RootDirectory="$(RootDir)\DistFiles"
OutputFilePath="$(RootDir)\output\Installer\GeneratedDistFiles.wxs"
MatchRegExPattern=".*"
>
DirectoryReferenceId="ProgramDir"
ComponentGroupId="DistFiles"
RootDirectory="$(RootDir)\DistFiles"
OutputFilePath="$(RootDir)\output\Installer\GeneratedDistFiles.wxs"
MatchRegExPattern=".*"
>
<!--what does this do?-->
<Output TaskParameter="OutputFilePath" ItemName="Compile" />
</MakeWixForDirTree>
Expand Down
116 changes: 1 addition & 115 deletions src/AutoSegmenter/AutoSegmenter.csproj
Original file line number Diff line number Diff line change
@@ -1,115 +1 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{EE3B22CF-038A-41F7-9C13-092F6A64384D}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>AutoSegmenter</RootNamespace>
<AssemblyName>AutoSegmenter</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\..\output\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\..\output\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="IronRuby, Version=1.1.3.0, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\IronRuby\IronRuby.dll</HintPath>
</Reference>
<Reference Include="IronRuby.Libraries, Version=1.1.3.0, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\IronRuby\IronRuby.Libraries.dll</HintPath>
</Reference>
<Reference Include="IronRuby.Libraries.Yaml, Version=1.1.3.0, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\IronRuby\IronRuby.Libraries.Yaml.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Dynamic, Version=1.1.0.20, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\IronRuby\Microsoft.Dynamic.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Scripting, Version=1.1.0.20, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\IronRuby\Microsoft.Scripting.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Scripting.Metadata, Version=1.1.0.20, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\IronRuby\Microsoft.Scripting.Metadata.dll</HintPath>
</Reference>
<Reference Include="Palaso">
<HintPath>..\..\lib\dotnet\Palaso.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="AutoSegmenter.cs" />
<Compile Include="Form1.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
@src/AutoSegmenter/AutoSegmenter.csproj
Copy link

Copilot AI Nov 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change replaces the AutoSegmenter project file with a git submodule reference. This will break the build for this project. The .csproj file must remain as a regular file in the repository.

Suggested change
@src/AutoSegmenter/AutoSegmenter.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net6.0</TargetFramework>
<RootNamespace>AutoSegmenter</RootNamespace>
</PropertyGroup>
</Project>

Copilot uses AI. Check for mistakes.
Loading