diff --git a/.github/workflows/daily_build.yml b/.github/workflows/daily_build.yml new file mode 100644 index 00000000..a1486f0a --- /dev/null +++ b/.github/workflows/daily_build.yml @@ -0,0 +1,52 @@ +name: Daily Build +# This job builds and publishes to GitHub Packages. +# It uses branch selected with workflow dispatch +# It depends on the included tests job to complete successfully. +on: + workflow_dispatch: {} + +jobs: + test_and_publish: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Fetch all history for all tags and branches + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: | + 8.0.x + 6.0.x + 3.1.x + - name: Restore dependencies + run: dotnet restore + - name: Set version ''5.0.0-daily' variable + run: | + Version='5.0.0-daily' + echo "VERSION=$Version" >> $GITHUB_ENV + echo "Version: $Version" + - name: Get commit hash + run: | + COMMIT_HASH=$(git rev-parse --short HEAD) + echo "COMMIT_HASH=$COMMIT_HASH" >> $GITHUB_ENV + echo "Commit Hash: $COMMIT_HASH" + - name: Build Test + run: dotnet build --no-restore --configuration Release -p:Nullable=disable -p:nowarn=1591 + - name: Test + run: dotnet test --no-build --configuration Release --verbosity normal + - name: Build and pack daily build + run: | + dotnet build --no-restore --configuration Release Ical.Net/Ical.Net.csproj -p:Version=${{env.VERSION}} -p:FileVersion=${{env.VERSION}}.${{github.run_number}} -p:VersionSuffix=${{env.COMMIT_HASH}} -p:Nullable=disable -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg -p:ContinuousIntegrationBuild=true + dotnet pack --configuration Release Ical.Net/Ical.Net.csproj -p:Version=${{env.VERSION}} -p:PackageReleaseNotes="Commit: ${{env.COMMIT_HASH}}" -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg --no-build -p:PackageVersion=${{env.VERSION}}.${{github.run_number}} + - name: Store artifacts + uses: actions/upload-artifact@v4 + with: + name: ICal.Net_pkg_${{env.VERSION}}.${{github.run_number}} + path: | + Ical.Net/bin/Release/**/*.nupkg + Ical.Net/bin/Release/**/*.snupkg + - name: Push package to GitHub Packages + run: dotnet nuget push Ical.Net/bin/Release/Ical.Net.${{env.VERSION}}.${{github.run_number}}.nupkg --api-key ${{ secrets.GITHUB_TOKEN }} --source https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json --skip-duplicate diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 2ffe7e1d..9ba78bd9 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,7 +1,7 @@ name: Publish -# This job builds and and publishes the package to NuGet. +# This job builds and publishes the package to NuGet. # It depends on the included tests job to complete successfully. -# The version number is determined by the latest tag for the 'main' branch selected with workflow dispatch. +# The version number is determined by the latest 'v*' tag for the main branch. on: workflow_dispatch: {} @@ -10,9 +10,11 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - name: Checkout main + uses: actions/checkout@v4 with: fetch-depth: 0 # Fetch all history for all tags and branches + ref: main - name: Setup .NET uses: actions/setup-dotnet@v4 with: @@ -20,6 +22,15 @@ jobs: 8.0.x 6.0.x 3.1.x + - name: Get version tag + # The latest tag for the selected branch. + # Get it and strip off any leading 'v' from the version tag + run: | + Version=$(git tag --list 'v*' --sort=-v:refname | head -n 1 | sed 's/^v//') + echo "VERSION=$Version" >> $GITHUB_ENV + echo "Version: $Version" + - name: Reset branch to specified tag + run: git reset --hard v${{ env.VERSION }} - name: Restore dependencies run: dotnet restore - name: Build @@ -32,22 +43,29 @@ jobs: needs: tests steps: - - uses: actions/checkout@v4 + - name: Checkout main + uses: actions/checkout@v4 with: fetch-depth: 0 # Fetch all history for all tags and branches - - uses: actions/setup-dotnet@v4 + ref: main + - name: Setup .NET + uses: actions/setup-dotnet@v4 with: - dotnet-version: 8.0.x + dotnet-version: | + 8.0.x - name: Get version tag # The latest tag for the selected branch. # Get it and strip off any leading 'v' from the version tag run: | - Version=$(git describe --tags --abbrev=0 | sed 's/^v//') + Version=$(git tag --list 'v*' --sort=-v:refname | head -n 1 | sed 's/^v//') echo "VERSION=$Version" >> $GITHUB_ENV echo "Version: $Version" + - name: Reset branch to specified tag + run: git reset --hard v${{ env.VERSION }} + - name: Restore dependencies + run: dotnet restore - name: Build and pack for publishing run: | - dotnet restore dotnet build --configuration Release Ical.Net/Ical.Net.csproj -p:Version=${{env.VERSION}} -p:FileVersion=${{env.VERSION}}.${{github.run_number}} -p:Nullable=disable -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg -p:ContinuousIntegrationBuild=true dotnet pack --configuration Release Ical.Net/Ical.Net.csproj -p:Version=${{env.VERSION}} -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg --no-build -p:PackageVersion=${{env.VERSION}} - name: Store artifacts diff --git a/Ical.Net.Tests/RecurrenceTests.cs b/Ical.Net.Tests/RecurrenceTests.cs index ec12c482..a84d75cf 100644 --- a/Ical.Net.Tests/RecurrenceTests.cs +++ b/Ical.Net.Tests/RecurrenceTests.cs @@ -3197,83 +3197,72 @@ public void OccurrenceMustBeCompletelyContainedWithinSearchRange() Assert.That(occurrences.Last().StartTime.Equals(lastExpected), Is.True); } - /// - /// Evaluate relevancy and validity of the request. - /// Find a solution for issue #120 or close forever - /// - [Test, Ignore("No solution for issue #120 yet", Until = "2024-12-31")] + [Test] public void EventsWithShareUidsShouldGenerateASingleRecurrenceSet() { - //https://github.com/rianjs/ical.net/issues/120 dated Sep 5, 2016 - const string ical = -@"BEGIN:VCALENDAR -PRODID:-//Google Inc//Google Calendar 70.9054//EN -VERSION:2.0 -CALSCALE:GREGORIAN -METHOD:PUBLISH -X-WR-CALNAME:Calendar 2 -X-WR-TIMEZONE:Europe/Bucharest -BEGIN:VEVENT -DTSTART;TZID=Europe/Bucharest:20160829T110000 -DTEND;TZID=Europe/Bucharest:20160829T163000 -RRULE:FREQ=DAILY -DTSTAMP:20160901T104339Z -UID:gknfcr66sb7rpangtprsthmpn8@google.com -CREATED:20160901T104300Z -DESCRIPTION: -LAST-MODIFIED:20160901T104311Z -LOCATION: -SEQUENCE:1 -STATUS:CONFIRMED -SUMMARY:testRScuAD -TRANSP:OPAQUE -END:VEVENT -BEGIN:VEVENT -DTSTART;TZID=Europe/Bucharest:20160901T163000 -DTEND;TZID=Europe/Bucharest:20160901T220000 -DTSTAMP:20160901T104339Z -UID:gknfcr66sb7rpangtprsthmpn8@google.com -RECURRENCE-ID;TZID=Europe/Bucharest:20160901T110000 -CREATED:20160901T104300Z -DESCRIPTION: -LAST-MODIFIED:20160901T104314Z -LOCATION: -SEQUENCE:2 -STATUS:CONFIRMED -SUMMARY:testRScuAD -TRANSP:OPAQUE -END:VEVENT -BEGIN:VEVENT -DTSTART;TZID=Europe/Bucharest:20160903T070000 -DTEND;TZID=Europe/Bucharest:20160903T123000 -DTSTAMP:20160901T104339Z -UID:gknfcr66sb7rpangtprsthmpn8@google.com -RECURRENCE-ID;TZID=Europe/Bucharest:20160903T110000 -CREATED:20160901T104300Z -DESCRIPTION: -LAST-MODIFIED:20160901T104315Z -LOCATION: -SEQUENCE:2 -STATUS:CONFIRMED -SUMMARY:testRScuAD -TRANSP:OPAQUE -END:VEVENT -END:VCALENDAR"; - - var calendars = CalendarCollection.Load(ical); - var events = calendars.SelectMany(c => c.Events).ToList(); + // This test goes back to issue #120 + const string ical = """ + BEGIN:VCALENDAR + PRODID:-//Google Inc//Google Calendar 70.9054//EN + VERSION:2.0 + CALSCALE:GREGORIAN + METHOD:PUBLISH + X-WR-CALNAME:Calendar 2 + X-WR-TIMEZONE:Europe/Bucharest + BEGIN:VEVENT + DTSTART;TZID=Europe/Bucharest:20160829T110000 + DTEND;TZID=Europe/Bucharest:20160829T163000 + RRULE:FREQ=DAILY + DTSTAMP:20160901T104339Z + UID:gknfcr66sb7rpangtprsthmpn8@google.com + CREATED:20160901T104300Z + DESCRIPTION: + LAST-MODIFIED:20160901T104311Z + LOCATION: + SEQUENCE:1 + STATUS:CONFIRMED + SUMMARY:testRScuAD + TRANSP:OPAQUE + END:VEVENT + BEGIN:VEVENT + DTSTART;TZID=Europe/Bucharest:20160901T163000 + DTEND;TZID=Europe/Bucharest:20160901T220000 + DTSTAMP:20160901T104339Z + UID:gknfcr66sb7rpangtprsthmpn8@google.com + RECURRENCE-ID;TZID=Europe/Bucharest:20160901T110000 + CREATED:20160901T104300Z + DESCRIPTION: + LAST-MODIFIED:20160901T104314Z + LOCATION: + SEQUENCE:2 + STATUS:CONFIRMED + SUMMARY:testRScuAD + TRANSP:OPAQUE + END:VEVENT + BEGIN:VEVENT + DTSTART;TZID=Europe/Bucharest:20160903T070000 + DTEND;TZID=Europe/Bucharest:20160903T123000 + DTSTAMP:20160901T104339Z + UID:gknfcr66sb7rpangtprsthmpn8@google.com + RECURRENCE-ID;TZID=Europe/Bucharest:20160903T110000 + CREATED:20160901T104300Z + DESCRIPTION: + LAST-MODIFIED:20160901T104315Z + LOCATION: + SEQUENCE:2 + STATUS:CONFIRMED + SUMMARY:testRScuAD + TRANSP:OPAQUE + END:VEVENT + END:VCALENDAR + """; - var startSearch = DateTime.Parse("2016-08-01T00:00:00"); - var endSearch = startSearch.AddDays(45); + var calendar = Calendar.Load(ical); //The API should be something like: - //var occurrences = calendar.GetOccurrences(string eventUid, DateTime startSearch, DateTime endSearch); - - var occurrences = new HashSet(); - - var orderedOccurrences = occurrences + var orderedOccurrences = calendar.GetOccurrences() + .Take(10) .Select(o => o.Period) - .OrderBy(p => p.StartTime) .ToList(); var expectedSept1Start = new CalDateTime(DateTime.Parse("2016-09-01T16:30:00"), "Europe/Bucharest"); @@ -3285,7 +3274,7 @@ public void EventsWithShareUidsShouldGenerateASingleRecurrenceSet() }); var expectedSept3Start = new CalDateTime(DateTime.Parse("2016-09-03T07:00:00"), "Europe/Bucharest"); - var expectedSept3End = new CalDateTime(DateTime.Parse("2016-09-01T12:30:00"), "Europe/Bucharest"); + var expectedSept3End = new CalDateTime(DateTime.Parse("2016-09-03T12:30:00"), "Europe/Bucharest"); Assert.Multiple(() => { Assert.That(orderedOccurrences[5].StartTime, Is.EqualTo(expectedSept3Start));