diff --git a/README.md b/README.md index 66d1d5e..96a2869 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,10 @@ Several [bundle applications](#bundle-apps) using this framework are also availa ## Requirements -- **Running**: Java 11 or later +- **Running**: Java 17 or later - **Building**: Java 17 or later (required by Gradle 9) -> **Note**: This is the last release supporting Java 11 as a runtime target. -> Future versions will require Java 17 or later. +> To run on Java 11, use the pre-built JAR from [v0.7.0](https://github.com/sh5i/git-stein/releases/tag/v0.7.0). ## Build and Run diff --git a/build.gradle b/build.gradle index 09e8d75..49be582 100644 --- a/build.gradle +++ b/build.gradle @@ -17,29 +17,14 @@ java { // v61 (Java 17, LTS) // v65 (Java 21, LTS) // v69 (Java 25, LTS) - languageVersion = JavaLanguageVersion.of(11) + languageVersion = JavaLanguageVersion.of(17) } } dependencies { - // jgit 7.x requires Java 17; staying on 6.x for Java 11 compatibility - api 'org.eclipse.jgit:org.eclipse.jgit:6.10.1.202505221210-r' - - // JDT 3.29+ and eclipse platform require Java 17; staying on 3.28.x for Java 11 compatibility - implementation 'org.eclipse.jdt:org.eclipse.jdt.core:3.28.0' - implementation 'org.eclipse.platform:org.eclipse.core.commands:3.8.0' - implementation 'org.eclipse.platform:org.eclipse.core.contenttype:3.5.100' - implementation 'org.eclipse.platform:org.eclipse.core.expressions:3.5.100' - implementation 'org.eclipse.platform:org.eclipse.core.filesystem:1.7.0' - implementation 'org.eclipse.platform:org.eclipse.core.jobs:3.8.0' - implementation 'org.eclipse.platform:org.eclipse.core.resources:3.14.0' - implementation 'org.eclipse.platform:org.eclipse.core.runtime:3.13.0' - implementation 'org.eclipse.platform:org.eclipse.equinox.app:1.3.400' - implementation 'org.eclipse.platform:org.eclipse.equinox.common:3.8.0' - implementation 'org.eclipse.platform:org.eclipse.equinox.preferences:3.6.1' - implementation 'org.eclipse.platform:org.eclipse.equinox.registry:3.6.100' - implementation 'org.eclipse.platform:org.eclipse.osgi:3.11.2' - implementation 'org.eclipse.platform:org.eclipse.text:3.6.0' + api 'org.eclipse.jgit:org.eclipse.jgit:7.6.0.202603022253-r' + + implementation 'org.eclipse.jdt:org.eclipse.jdt.core:3.45.0' implementation 'org.slf4j:slf4j-api:2.0.17' implementation 'ch.qos.logback:logback-classic:1.5.32' diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 1b33c55..61285a6 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37f78a6..c61a118 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 23d15a9..adff685 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/gradlew.bat b/gradlew.bat index 5eed7ee..e509b2d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/src/main/java/jp/ac/titech/c/se/stein/Application.java b/src/main/java/jp/ac/titech/c/se/stein/Application.java index 15eb759..bf956b2 100644 --- a/src/main/java/jp/ac/titech/c/se/stein/Application.java +++ b/src/main/java/jp/ac/titech/c/se/stein/Application.java @@ -274,8 +274,8 @@ public int execute(final ParseResult parseResult) throws ExecutionException, Par // help if (parseResult.subcommands().size() >= 2) { final Object cmd = parseResult.subcommands().get(0).commandSpec().userObject(); - if (cmd instanceof SettableHelpCommand) { - ((SettableHelpCommand) cmd).setCommand(parseResult.subcommands().get(1).commandSpec().name()); + if (cmd instanceof SettableHelpCommand shc) { + shc.setCommand(parseResult.subcommands().get(1).commandSpec().name()); } } if (CommandLine.printHelpIfRequested(parseResult)) { @@ -310,8 +310,8 @@ public List optimizeRewriters(final List comma final List pending = new ArrayList<>(); for (final RewriterCommand cmd : commands) { - if (cmd instanceof BlobTranslator) { - pending.add((BlobTranslator) cmd); + if (cmd instanceof BlobTranslator t) { + pending.add(t); } else { flushPendingTranslators(pending, result); result.add(cmd); diff --git a/src/main/java/jp/ac/titech/c/se/stein/app/Anonymize.java b/src/main/java/jp/ac/titech/c/se/stein/app/Anonymize.java index ad906ae..a113e01 100644 --- a/src/main/java/jp/ac/titech/c/se/stein/app/Anonymize.java +++ b/src/main/java/jp/ac/titech/c/se/stein/app/Anonymize.java @@ -126,8 +126,7 @@ public AnyHotEntry rewriteBlobEntry(BlobEntry entry, final Context c) { @Override protected AnyColdEntry rewriteTreeEntry(TreeEntry entry, Context c) { final AnyColdEntry result = super.rewriteTreeEntry(entry, c); - if (isTreeNameEnabled && result instanceof Entry) { - final Entry e = (Entry) result; + if (isTreeNameEnabled && result instanceof Entry e) { return Entry.of(e.mode, treeNameMap.convert(e.name), e.id, e.directory); } return result; diff --git a/src/main/java/jp/ac/titech/c/se/stein/app/blob/Cregit.java b/src/main/java/jp/ac/titech/c/se/stein/app/blob/Cregit.java index 5decb18..250a9b4 100644 --- a/src/main/java/jp/ac/titech/c/se/stein/app/blob/Cregit.java +++ b/src/main/java/jp/ac/titech/c/se/stein/app/blob/Cregit.java @@ -62,20 +62,11 @@ protected void setLanguage(final String language) { this.language = language; if (filter.isDefault()) { switch (language) { - case "C": - filter.setPatterns(C_EXT); - break; - case "C++": - filter.setPatterns(CXX_EXT); - break; - case "C#": - filter.setPatterns(CSHARP_EXT); - break; - case "Java": - filter.setPatterns(JAVA_EXT); - break; - default: - log.error("Unknown language: {}", language); + case "C" -> filter.setPatterns(C_EXT); + case "C++" -> filter.setPatterns(CXX_EXT); + case "C#" -> filter.setPatterns(CSHARP_EXT); + case "Java" -> filter.setPatterns(JAVA_EXT); + default -> log.error("Unknown language: {}", language); } } } diff --git a/src/main/java/jp/ac/titech/c/se/stein/app/blob/FilterBlob.java b/src/main/java/jp/ac/titech/c/se/stein/app/blob/FilterBlob.java index 4da0153..17cad4b 100644 --- a/src/main/java/jp/ac/titech/c/se/stein/app/blob/FilterBlob.java +++ b/src/main/java/jp/ac/titech/c/se/stein/app/blob/FilterBlob.java @@ -61,18 +61,13 @@ public Long convert(final String value) { final int len = value.length(); final char unit = Character.toUpperCase(value.charAt(len - 1)); final String num = value.substring(0, len - 1); - switch (unit) { - case 'B': - return convert(num); - case 'K': - return displaySizeToByteCount(num, 1024); - case 'M': - return displaySizeToByteCount(num, 1024 * 1024); - case 'G': - return displaySizeToByteCount(num, 1024 * 1024 * 1024); - default: - return displaySizeToByteCount(value, 1); - } + return switch (unit) { + case 'B' -> convert(num); + case 'K' -> displaySizeToByteCount(num, 1024); + case 'M' -> displaySizeToByteCount(num, 1024 * 1024); + case 'G' -> displaySizeToByteCount(num, 1024 * 1024 * 1024); + default -> displaySizeToByteCount(value, 1); + }; } protected long displaySizeToByteCount(final String value, final long base) { diff --git a/src/main/java/jp/ac/titech/c/se/stein/app/blob/HistorageViaJDT.java b/src/main/java/jp/ac/titech/c/se/stein/app/blob/HistorageViaJDT.java index 1f862b1..889a622 100644 --- a/src/main/java/jp/ac/titech/c/se/stein/app/blob/HistorageViaJDT.java +++ b/src/main/java/jp/ac/titech/c/se/stein/app/blob/HistorageViaJDT.java @@ -159,8 +159,8 @@ public ClassModule(final String name, final Module parent, final String content, @Override public String getBasename() { - if (parent instanceof ClassModule) { - return parent.getBasename() + "." + name; + if (parent instanceof ClassModule cm) { + return cm.getBasename() + "." + name; } else { return parent.getBasename().equals(name) ? name : name + "[" + parent.getBasename() + "]"; } @@ -300,8 +300,7 @@ protected CompilationUnit parse() { * Creates a JDT ASTParser. */ protected ASTParser createParser() { - final ASTParser parser = ASTParser.newParser(AST.JLS17); - @SuppressWarnings("unchecked") + final ASTParser parser = ASTParser.newParser(AST.JLS25); final Map options = DefaultCodeFormatterConstants.getEclipseDefaultSettings(); options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_17); options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_17); diff --git a/src/main/java/jp/ac/titech/c/se/stein/app/blob/TokenizeViaJDT.java b/src/main/java/jp/ac/titech/c/se/stein/app/blob/TokenizeViaJDT.java index 34c52ba..7672b36 100644 --- a/src/main/java/jp/ac/titech/c/se/stein/app/blob/TokenizeViaJDT.java +++ b/src/main/java/jp/ac/titech/c/se/stein/app/blob/TokenizeViaJDT.java @@ -39,7 +39,7 @@ public AnyHotEntry rewriteBlobEntry(final BlobEntry entry, final Context c) { * Encodes the given source to linetoken format. */ public static String encode(final String source) { - final IScanner scanner = ToolFactory.createScanner(true, true, false, JavaCore.VERSION_17); + final IScanner scanner = ToolFactory.createScanner(true, true, false, JavaCore.VERSION_25); scanner.setSource(source.toCharArray()); final StringBuilder buffer = new StringBuilder(); try { diff --git a/src/main/java/jp/ac/titech/c/se/stein/core/Context.java b/src/main/java/jp/ac/titech/c/se/stein/core/Context.java index 2af2465..86388b9 100644 --- a/src/main/java/jp/ac/titech/c/se/stein/core/Context.java +++ b/src/main/java/jp/ac/titech/c/se/stein/core/Context.java @@ -101,20 +101,14 @@ protected String entryToString(final Map.Entry e) { } protected static String getStringValue(final Key key, final Object value) { - switch (key) { - case commit: - return ((RevCommit) value).name(); - case path: - return '"' + (String) value + '"'; - case entry: - return value.toString(); - case tag: - return ((RevTag) value).name(); - case ref: - return ((Ref) value).getName(); - default: - return null; - } + return switch (key) { + case commit -> ((RevCommit) value).name(); + case path -> '"' + (String) value + '"'; + case entry -> value.toString(); + case tag -> ((RevTag) value).name(); + case ref -> ((Ref) value).getName(); + default -> null; + }; } @Override diff --git a/src/main/java/jp/ac/titech/c/se/stein/core/RepositoryAccess.java b/src/main/java/jp/ac/titech/c/se/stein/core/RepositoryAccess.java index 7be85c7..a568cd1 100644 --- a/src/main/java/jp/ac/titech/c/se/stein/core/RepositoryAccess.java +++ b/src/main/java/jp/ac/titech/c/se/stein/core/RepositoryAccess.java @@ -1,6 +1,5 @@ package jp.ac.titech.c.se.stein.core; -import java.io.File; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; @@ -298,17 +297,11 @@ public ObjectId writeBlob(final byte[] data, final Context writingContext) { public ObjectId copyTree(final ObjectId treeId, final RepositoryAccess target, final Context c) { final List entries = new ArrayList<>(); for (final Entry e : readTree(treeId, null)) { - switch (e.getType()) { - case TREE: - entries.add(Entry.of(e.getMode(), e.getName(), copyTree(e.getId(), target, c))); - break; - case BLOB: - entries.add(Entry.of(e.getMode(), e.getName(), copyBlob(e.getId(), target, c))); - break; - default: - entries.add(e); - break; - } + entries.add(switch (e.getType()) { + case tree -> Entry.of(e.getMode(), e.getName(), copyTree(e.getId(), target, c)); + case blob -> Entry.of(e.getMode(), e.getName(), copyBlob(e.getId(), target, c)); + default -> e; + }); } return target.writeTree(entries, c); } diff --git a/src/main/java/jp/ac/titech/c/se/stein/entry/AnyColdEntry.java b/src/main/java/jp/ac/titech/c/se/stein/entry/AnyColdEntry.java index 4bde10a..5254ddb 100644 --- a/src/main/java/jp/ac/titech/c/se/stein/entry/AnyColdEntry.java +++ b/src/main/java/jp/ac/titech/c/se/stein/entry/AnyColdEntry.java @@ -102,14 +102,11 @@ public String toString() { @Override public AnyColdEntry normalize() { - switch (size()) { - case 0: - return empty(); - case 1: - return entries.get(0); - default: - return this; - } + return switch (size()) { + case 0 -> empty(); + case 1 -> entries.get(0); + default -> this; + }; } } diff --git a/src/main/java/jp/ac/titech/c/se/stein/entry/BlobEntry.java b/src/main/java/jp/ac/titech/c/se/stein/entry/BlobEntry.java index cbc00ca..965ced6 100644 --- a/src/main/java/jp/ac/titech/c/se/stein/entry/BlobEntry.java +++ b/src/main/java/jp/ac/titech/c/se/stein/entry/BlobEntry.java @@ -18,7 +18,7 @@ * @see SourceBlob * @see NewBlob */ -public abstract class BlobEntry extends HotEntry { +public abstract sealed class BlobEntry extends HotEntry permits BlobEntry.SourceBlob, BlobEntry.NewBlob { public abstract byte[] getBlob(); /** @@ -61,7 +61,7 @@ public NewBlob update(final String newContent) { * The blob content is lazily loaded on the first call to {@link #getBlob()}. */ @RequiredArgsConstructor(access = AccessLevel.PACKAGE) - public static class SourceBlob extends BlobEntry { + public static final class SourceBlob extends BlobEntry { @Delegate(types = SingleEntry.class) private final Entry entry; @@ -93,7 +93,7 @@ public String toString() { */ @Slf4j @RequiredArgsConstructor(access = AccessLevel.PACKAGE) - public static class NewBlob extends BlobEntry { + public static final class NewBlob extends BlobEntry { @Getter private final int mode; diff --git a/src/main/java/jp/ac/titech/c/se/stein/entry/HotEntry.java b/src/main/java/jp/ac/titech/c/se/stein/entry/HotEntry.java index 21689c7..d35b1f0 100644 --- a/src/main/java/jp/ac/titech/c/se/stein/entry/HotEntry.java +++ b/src/main/java/jp/ac/titech/c/se/stein/entry/HotEntry.java @@ -18,7 +18,7 @@ * @see TreeEntry * @see Entry */ -public abstract class HotEntry implements AnyHotEntry, SingleEntry { +public abstract sealed class HotEntry implements AnyHotEntry, SingleEntry permits BlobEntry, TreeEntry { /** * Creates a {@link BlobEntry} that lazily reads blob content from the given source. */ diff --git a/src/main/java/jp/ac/titech/c/se/stein/entry/SingleEntry.java b/src/main/java/jp/ac/titech/c/se/stein/entry/SingleEntry.java index 1b63591..9c5f377 100644 --- a/src/main/java/jp/ac/titech/c/se/stein/entry/SingleEntry.java +++ b/src/main/java/jp/ac/titech/c/se/stein/entry/SingleEntry.java @@ -14,7 +14,7 @@ public interface SingleEntry extends Comparable { * The kind of object an entry refers to. */ enum Type { - BLOB, TREE, LINK + blob, tree, link } /** @@ -70,11 +70,11 @@ default boolean isBlob() { */ default Type getType() { if (isTree()) { - return Type.TREE; + return Type.tree; } else if (isLink()) { - return Type.LINK; + return Type.link; } else { - return Type.BLOB; + return Type.blob; } } diff --git a/src/main/java/jp/ac/titech/c/se/stein/entry/TreeEntry.java b/src/main/java/jp/ac/titech/c/se/stein/entry/TreeEntry.java index fb267fd..7a74cfe 100644 --- a/src/main/java/jp/ac/titech/c/se/stein/entry/TreeEntry.java +++ b/src/main/java/jp/ac/titech/c/se/stein/entry/TreeEntry.java @@ -19,7 +19,7 @@ * @see SourceTree * @see NewTree */ -public abstract class TreeEntry extends HotEntry { +public abstract sealed class TreeEntry extends HotEntry permits TreeEntry.SourceTree, TreeEntry.NewTree { @Override public int getMode() { return FileMode.TREE.getBits(); @@ -53,7 +53,7 @@ public NewTree update(List newChildren) { * A Hot tree entry backed by an existing tree in a repository. * The tree contents are lazily loaded on the first call to {@link #getEntries()}. */ - public static class SourceTree extends TreeEntry { + public static final class SourceTree extends TreeEntry { @Delegate(types = SingleEntry.class) private final Entry entry; @@ -106,7 +106,7 @@ public String toString() { * On {@link #fold}, children are recursively folded and an empty tree * (all children produce zero IDs) collapses to a zero-ID entry.

*/ - public static class NewTree extends TreeEntry { + public static final class NewTree extends TreeEntry { @Getter private final String name; @Getter diff --git a/src/main/java/jp/ac/titech/c/se/stein/rewriter/BlobTranslator.java b/src/main/java/jp/ac/titech/c/se/stein/rewriter/BlobTranslator.java index ed995f6..9eceeef 100644 --- a/src/main/java/jp/ac/titech/c/se/stein/rewriter/BlobTranslator.java +++ b/src/main/java/jp/ac/titech/c/se/stein/rewriter/BlobTranslator.java @@ -69,14 +69,13 @@ public AnyHotEntry rewriteBlobEntry(final BlobEntry entry, final Context c) { } private AnyHotEntry apply(AnyHotEntry input, List rest, Context c) { - if (input instanceof BlobEntry) { + if (input instanceof BlobEntry blob) { final BlobTranslator head = rest.get(0); final List tail = rest.subList(1, rest.size()); - final AnyHotEntry result = head.rewriteBlobEntry((BlobEntry) input, c); + final AnyHotEntry result = head.rewriteBlobEntry(blob, c); return tail.isEmpty() ? result : apply(result, tail, c); } - if (input instanceof TreeEntry) { - final TreeEntry tree = (TreeEntry) input; + if (input instanceof TreeEntry tree) { final List newChildren = tree.getHotEntries().stream() .flatMap(e -> apply(e, rest, c).stream()) .collect(Collectors.toList()); diff --git a/src/main/java/jp/ac/titech/c/se/stein/rewriter/RepositoryRewriter.java b/src/main/java/jp/ac/titech/c/se/stein/rewriter/RepositoryRewriter.java index a681b3e..02c5b5c 100644 --- a/src/main/java/jp/ac/titech/c/se/stein/rewriter/RepositoryRewriter.java +++ b/src/main/java/jp/ac/titech/c/se/stein/rewriter/RepositoryRewriter.java @@ -346,25 +346,17 @@ protected AnyColdEntry getEntry(final Entry entry, final Context c) { */ protected AnyColdEntry rewriteEntry(final Entry entry, final Context c) { final Context uc = c.with(Key.entry, entry); - switch (entry.getType()) { - case BLOB: - final AnyColdEntry newBlob = rewriteBlobEntry(HotEntry.of(entry, source), uc).fold(target, uc); - log.debug("Rewrite blob: {} -> {} {}", entry, newBlob, c); - return newBlob; - case TREE: + final AnyColdEntry result = switch (entry.getType()) { + case blob -> rewriteBlobEntry(HotEntry.of(entry, source), uc).fold(target, uc); + case tree -> { final String path = entry.isRoot() ? "" : c.getPath() + "/" + entry.name; final String dir = isPathSensitive ? path : null; - final AnyColdEntry newTree = rewriteTreeEntry(HotEntry.ofTree(entry, source, dir), uc.with(Key.path, path)); - log.debug("Rewrite tree: {} -> {} {}", entry, newTree, c); - return newTree; - case LINK: - final AnyColdEntry newLink = rewriteLinkEntry(entry, uc); - log.debug("Rewrite link: {} -> {} {}", entry, newLink, c); - return newLink; - default: - assert false; - return null; - } + yield rewriteTreeEntry(HotEntry.ofTree(entry, source, dir), uc.with(Key.path, path)); + } + case link -> rewriteLinkEntry(entry, uc); + }; + log.debug("Rewrite {}: {} -> {} {}", entry.getType(), entry, result, c); + return result; } protected AnyHotEntry rewriteBlobEntry(BlobEntry entry, Context c) { @@ -529,36 +521,36 @@ protected RefEntry rewriteRefEntry(final RefEntry entry, final Context c) { * Rewrites the referred object by a ref or a tag. */ protected ObjectId rewriteRefObject(final ObjectId id, final int type, final Context c) { - switch (type) { - case Constants.OBJ_COMMIT: // 1: commit + return switch (type) { + case Constants.OBJ_COMMIT -> { final ObjectId newCommitId = commitMapping.get(id); if (newCommitId == null) { log.warn("Rewritten commit not found: {} {}", id.name(), c); - return id; + yield id; } - return newCommitId; - - case Constants.OBJ_TREE: // 2: tree + yield newCommitId; + } + case Constants.OBJ_TREE -> { // TODO rewriting opportunity for this tree final ObjectId newTreeId = source.copyTree(id, target, c); log.warn("A ref object tree {} found, just copied {}", id.name(), c); - return newTreeId; - - case Constants.OBJ_BLOB: // 3: blob + yield newTreeId; + } + case Constants.OBJ_BLOB -> { // TODO rewriting opportunity for this blob final ObjectId newBlobId = source.copyBlob(id, target, c); log.warn("A ref object blob {} found, just copied {}", id.name(), c); - return newBlobId; - - case Constants.OBJ_TAG: // 4: tag + yield newBlobId; + } + case Constants.OBJ_TAG -> { final ObjectId newTagId = tagMapping.get(id); - return newTagId != null ? newTagId : rewriteTag(source.parseTag(id), c); - - default: - // referring non-commit and non-tag; ignore it + yield newTagId != null ? newTagId : rewriteTag(source.parseTag(id), c); + } + default -> { log.warn("Ignore unknown type ({}): {} {}", type, id.name(), c); - return id; - } + yield id; + } + }; } /** diff --git a/src/test/java/jp/ac/titech/c/se/stein/entry/EntryTest.java b/src/test/java/jp/ac/titech/c/se/stein/entry/EntryTest.java index 1999e22..22c68cc 100644 --- a/src/test/java/jp/ac/titech/c/se/stein/entry/EntryTest.java +++ b/src/test/java/jp/ac/titech/c/se/stein/entry/EntryTest.java @@ -36,17 +36,17 @@ public void testType() { assertTrue(blob.isBlob()); assertFalse(blob.isTree()); assertFalse(blob.isLink()); - assertEquals(SingleEntry.Type.BLOB, blob.getType()); + assertEquals(SingleEntry.Type.blob, blob.getType()); assertTrue(tree.isTree()); assertFalse(tree.isBlob()); assertFalse(tree.isLink()); - assertEquals(SingleEntry.Type.TREE, tree.getType()); + assertEquals(SingleEntry.Type.tree, tree.getType()); assertTrue(link.isLink()); assertFalse(link.isBlob()); assertFalse(link.isTree()); - assertEquals(SingleEntry.Type.LINK, link.getType()); + assertEquals(SingleEntry.Type.link, link.getType()); } @Test diff --git a/src/test/java/jp/ac/titech/c/se/stein/entry/HotEntryTest.java b/src/test/java/jp/ac/titech/c/se/stein/entry/HotEntryTest.java index 4714651..3f52f45 100644 --- a/src/test/java/jp/ac/titech/c/se/stein/entry/HotEntryTest.java +++ b/src/test/java/jp/ac/titech/c/se/stein/entry/HotEntryTest.java @@ -41,7 +41,7 @@ public void testSingleEntryMethods() { final BlobEntry withDir = HotEntry.of(BLOB_MODE, "hello", HELLO, "src"); assertEquals("src/hello", withDir.getPath()); assertTrue(withDir.isBlob()); - assertEquals(SingleEntry.Type.BLOB, withDir.getType()); + assertEquals(SingleEntry.Type.blob, withDir.getType()); } @Test