Skip to content

Commit

Permalink
Ensure releases are serialized in order
Browse files Browse the repository at this point in the history
Fix: #25
  • Loading branch information
io7m committed May 3, 2024
1 parent 65f8e95 commit 2ac01ca
Show file tree
Hide file tree
Showing 12 changed files with 421 additions and 27 deletions.
9 changes: 7 additions & 2 deletions README-CHANGES.xml
Expand Up @@ -34,14 +34,19 @@
<c:change date="2021-01-12T00:00:00+00:00" summary="Improved documentation"/>
</c:changes>
</c:release>
<c:release date="2024-05-03T18:52:30+00:00" is-open="true" ticket-system="com.io7m.github.changelog" version="5.0.0">
<c:release date="2024-05-03T19:20:59+00:00" is-open="true" ticket-system="com.io7m.github.changelog" version="5.0.0">
<c:changes>
<c:change compatible="false" date="2024-04-28T00:00:00+00:00" summary="Require JDK 17"/>
<c:change date="2024-05-03T18:52:30+00:00" summary="Allow qualifiers in version numbers.">
<c:change date="2024-05-03T00:00:00+00:00" summary="Allow qualifiers in version numbers.">
<c:tickets>
<c:ticket id="24"/>
</c:tickets>
</c:change>
<c:change date="2024-05-03T19:20:59+00:00" summary="Ensure releases are serialized in order.">
<c:tickets>
<c:ticket id="25"/>
</c:tickets>
</c:change>
</c:changes>
</c:release>
<c:release date="2017-01-10T00:00:00+00:00" is-open="false" ticket-system="com.io7m.github.changelog" version="3.0.3">
Expand Down
Expand Up @@ -17,14 +17,14 @@
package com.io7m.changelog.cmdline;

import com.io7m.changelog.cmdline.internal.CLCommandChangeAdd;
import com.io7m.changelog.cmdline.internal.CLCommandReleaseCurrent;
import com.io7m.changelog.cmdline.internal.CLCommandReleaseSetVersion;
import com.io7m.changelog.cmdline.internal.CLCommandWriteAtom;
import com.io7m.changelog.cmdline.internal.CLCommandInitialize;
import com.io7m.changelog.cmdline.internal.CLCommandWritePlain;
import com.io7m.changelog.cmdline.internal.CLCommandReleaseBegin;
import com.io7m.changelog.cmdline.internal.CLCommandReleaseCurrent;
import com.io7m.changelog.cmdline.internal.CLCommandReleaseFinish;
import com.io7m.changelog.cmdline.internal.CLCommandReleaseSetVersion;
import com.io7m.changelog.cmdline.internal.CLCommandVersion;
import com.io7m.changelog.cmdline.internal.CLCommandWriteAtom;
import com.io7m.changelog.cmdline.internal.CLCommandWritePlain;
import com.io7m.changelog.cmdline.internal.CLCommandWriteXHTML;
import com.io7m.claypot.core.CLPApplicationConfiguration;
import com.io7m.claypot.core.CLPCommandConstructorType;
Expand Down
Expand Up @@ -38,6 +38,7 @@
import java.util.List;
import java.util.Optional;
import java.util.ServiceLoader;
import java.util.TreeMap;

/**
* The "change-add" command.
Expand Down Expand Up @@ -164,10 +165,13 @@ public Status executeActual()
.setDate(now)
.build();

final var releasesNow = new TreeMap<>(changelog.releases());
releasesNow.put(releaseWrite.version(), releaseWrite);

final var changelogWrite =
CChangelog.builder()
.from(changelog)
.putReleases(releaseWrite.version(), releaseWrite)
.setReleases(releasesNow)
.build();

final var pathTemp = Paths.get(this.path + ".tmp");
Expand Down
Expand Up @@ -35,6 +35,7 @@
import java.time.ZonedDateTime;
import java.util.Optional;
import java.util.ServiceLoader;
import java.util.TreeMap;

import static com.io7m.claypot.core.CLPCommandType.Status.FAILURE;
import static com.io7m.claypot.core.CLPCommandType.Status.SUCCESS;
Expand Down Expand Up @@ -152,10 +153,13 @@ public Status executeActual()
.setVersion(nextVersion)
.build();

final var releasesNow = new TreeMap<>(changelog.releases());
releasesNow.put(release.version(), release);

final var newChangelog =
CChangelog.builder()
.from(changelog)
.putReleases(release.version(), release)
.setReleases(releasesNow)
.build();

writers.write(this.path, pathTemp, newChangelog);
Expand Down
Expand Up @@ -36,6 +36,7 @@
import java.time.ZonedDateTime;
import java.util.Optional;
import java.util.ServiceLoader;
import java.util.TreeMap;

/**
* The "release-finish" command.
Expand Down Expand Up @@ -126,10 +127,13 @@ public Status executeActual()
.setDate(ZonedDateTime.now(Clock.systemUTC()))
.build();

final var releasesNow = new TreeMap<>(changelog.releases());
releasesNow.put(closedRelease.version(), closedRelease);

final var newChangelog =
CChangelog.builder()
.from(changelog)
.putReleases(closedRelease.version(), closedRelease)
.setReleases(releasesNow)
.build();

writers.write(this.path, pathTemp, newChangelog);
Expand Down
Expand Up @@ -32,8 +32,8 @@
import java.nio.file.Paths;
import java.time.Clock;
import java.time.ZonedDateTime;
import java.util.HashMap;
import java.util.ServiceLoader;
import java.util.TreeMap;

/**
* The "release-set-version" command.
Expand Down Expand Up @@ -121,14 +121,14 @@ public Status executeActual()
.setVersion(version)
.build();

final var oldReleases = new HashMap<>(changelog.releases());
oldReleases.remove(currentRelease.version());
oldReleases.put(version, updatedRelease);
final var releasesNow = new TreeMap<>(changelog.releases());
releasesNow.remove(currentRelease.version());
releasesNow.put(version, updatedRelease);

final var newChangelog =
CChangelog.builder()
.from(changelog)
.setReleases(oldReleases)
.setReleases(releasesNow)
.build();

writers.write(this.path, pathTemp, newChangelog);
Expand Down
Expand Up @@ -19,10 +19,9 @@
import com.io7m.junreachable.UnreachableCodeException;

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.TreeMap;
import java.util.stream.Collectors;

/**
Expand Down Expand Up @@ -64,10 +63,10 @@ public static Optional<CChangelog> upToAndIncluding(
.stream()
.filter(v -> v.compareTo(version) >= 0)
.limit(count)
.collect(Collectors.toList());
.toList();

final var releasesFiltered =
new HashMap<CVersion, CRelease>(versions.size());
new TreeMap<CVersion, CRelease>();
for (final var currentVersion : versions) {
releasesFiltered.put(currentVersion, releases.get(version));
}
Expand Down Expand Up @@ -104,11 +103,15 @@ public static CChangelog limit(
.collect(Collectors.toSet());

final var newReleases =
changelog.releases()
.entrySet()
.stream()
.filter(e -> versions.contains(e.getKey()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
new TreeMap<CVersion, CRelease>();

changelog.releases()
.entrySet()
.stream()
.filter(e -> versions.contains(e.getKey()))
.forEach(entry -> {
newReleases.put(entry.getKey(), entry.getValue());
});

return CChangelog.builder()
.from(changelog)
Expand Down
Expand Up @@ -25,6 +25,8 @@
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.stream.Collectors;

import static org.immutables.value.Value.Immutable;
Expand All @@ -47,7 +49,11 @@ public interface CChangelogType
* @return The list of releases
*/

Map<CVersion, CRelease> releases();
@Value.Default
default SortedMap<CVersion, CRelease> releases()
{
return new TreeMap<>();
}

/**
* @return The ticket systems
Expand Down
Expand Up @@ -29,6 +29,7 @@
import java.time.Clock;
import java.time.ZonedDateTime;
import java.util.Optional;
import java.util.TreeMap;

import static org.junit.jupiter.api.Assertions.assertEquals;

Expand Down Expand Up @@ -80,10 +81,13 @@ public void testNextVersionSemantic()
.setUri(URI.create("http://www.example.com"))
.build();

final var releasesNow = new TreeMap<CVersion, CRelease>();
releasesNow.put(version, release);

final var c =
CChangelog.builder()
.setProject(CProjectName.of("changelog"))
.putReleases(version, release)
.setReleases(releasesNow)
.putTicketSystems("x", ticketSystem)
.build();

Expand Down Expand Up @@ -124,10 +128,13 @@ public void testFindTicketSystemDefault()
.setUri(URI.create("http://www.example.com"))
.build();

final var releasesNow = new TreeMap<CVersion, CRelease>();
releasesNow.put(version, release);

final var c =
CChangelog.builder()
.setProject(CProjectName.of("changelog"))
.putReleases(version, release)
.setReleases(releasesNow)
.putTicketSystems("x", ticketSystem0)
.putTicketSystems("y", ticketSystem1)
.build();
Expand Down
Expand Up @@ -64,6 +64,13 @@ public final void testRoundTrip2()
this.runRoundTrip("/com/io7m/changelog/tests/xml/audiobook.xml");
}

@Test
public final void testRoundTrip3()
throws Exception
{
this.runRoundTrip("/com/io7m/changelog/tests/xml/audiobook-20240503.xml");
}

private void runRoundTrip(
final String name)
throws IOException, URISyntaxException
Expand Down

0 comments on commit 2ac01ca

Please sign in to comment.