diff --git a/groovy18-reproducible-bytecode.patch b/groovy18-reproducible-bytecode.patch new file mode 100644 index 0000000..8a016de --- /dev/null +++ b/groovy18-reproducible-bytecode.patch @@ -0,0 +1,357 @@ +--- groovy-core-GROOVY_1_8_9/src/main/groovy/lang/MetaClassImpl.java 2023-09-26 13:31:23.326209336 +0200 ++++ groovy-core-GROOVY_1_8_9/src/main/groovy/lang/MetaClassImpl.java 2023-09-26 22:32:37.407884437 +0200 +@@ -135,7 +135,7 @@ + private Index classPropertyIndexForSuper = new MethodIndex(); + private final SingleKeyHashMap staticPropertyIndex = new SingleKeyHashMap(); + +- private final Map listeners = new HashMap(); ++ private final Map listeners = new TreeMap(); + private FastArray constructors; + private final List allMethods = new ArrayList(); + private boolean initialized; +@@ -143,7 +143,7 @@ + private final MetaProperty arrayLengthProperty = new MetaArrayLengthProperty(); + private static final MetaMethod AMBIGUOUS_LISTENER_METHOD = new DummyMetaMethod(); + private static final Object[] EMPTY_ARGUMENTS = {}; +- private final Set newGroovyMethodsSet = new HashSet(); ++ private final Set newGroovyMethodsSet = new LinkedHashSet(); + + private MetaMethod genericGetMethod; + private MetaMethod genericSetMethod; +--- groovy-core-GROOVY_1_8_9/src/main/groovy/util/ProxyGenerator.java 2023-09-26 13:31:23.332876047 +0200 ++++ groovy-core-GROOVY_1_8_9/src/main/groovy/util/ProxyGenerator.java 2023-09-26 22:14:38.014274779 +0200 +@@ -96,7 +96,7 @@ + } + + public GroovyObject instantiateAggregateFromBaseClass(Closure cl, Class clazz) { +- Map m = new HashMap(); ++ Map m = new TreeMap(); + m.put("*", cl); + return instantiateAggregateFromBaseClass(m, clazz, null); + } +@@ -132,7 +132,7 @@ + } + + public GroovyObject instantiateAggregate(Map closureMap, List interfaces, Class clazz, Object[] constructorArgs) { +- Map map = new HashMap(); ++ Map map = new LinkedHashMap(); + if (closureMap != null) { + map = closureMap; + } +@@ -181,7 +181,7 @@ + buffer.append(" }\n"); + + // add overwriting methods +- Map selectedMethods = new HashMap(); ++ Map selectedMethods = new TreeMap(); + List publicAndProtectedMethods = getInheritedMethods(baseClass, new ArrayList()); + boolean closureIndicator = map.containsKey("*"); + for (Method method : publicAndProtectedMethods) { +@@ -269,7 +269,7 @@ + } + + public GroovyObject instantiateDelegateWithBaseClass(Map closureMap, List interfaces, Object delegate, Class baseClass, String name) { +- Map map = new HashMap(); ++ Map map = new LinkedHashMap(); + if (closureMap != null) { + map = closureMap; + } +--- groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/antlr/AntlrParserPlugin.java 2023-09-26 13:31:23.336209403 +0200 ++++ groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/antlr/AntlrParserPlugin.java 2023-09-26 22:39:50.777395449 +0200 +@@ -42,7 +42,7 @@ + import java.security.AccessController; + import java.security.PrivilegedAction; + import java.util.ArrayList; +-import java.util.HashSet; ++import java.util.TreeSet; + import java.util.Iterator; + import java.util.LinkedList; + import java.util.List; +@@ -2573,7 +2573,7 @@ + private void checkDuplicateNamedParams(AST elist, List expressionList) { + if (expressionList.isEmpty()) return; + +- Set namedArgumentNames = new HashSet(); ++ Set namedArgumentNames = new TreeSet(); + for (Object expression : expressionList) { + MapEntryExpression meExp = (MapEntryExpression) expression; + if (meExp.getKeyExpression() instanceof ConstantExpression) { +--- groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/ast/ClassNode.java 2023-09-26 13:31:23.339542759 +0200 ++++ groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/ast/ClassNode.java 2023-09-26 22:58:08.701195570 +0200 +@@ -406,7 +406,7 @@ + } + + public Set getAllInterfaces () { +- Set res = new HashSet(); ++ Set res = new LinkedHashSet(); + getAllInterfaces(res); + return res; + } +--- groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/ast/VariableScope.java 2023-09-26 13:31:23.339542759 +0200 ++++ groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/ast/VariableScope.java 2023-09-26 20:06:22.392879780 +0200 +@@ -16,8 +16,8 @@ + package org.codehaus.groovy.ast; + + import java.util.Collections; +-import java.util.HashMap; + import java.util.Iterator; ++import java.util.LinkedHashMap; + import java.util.Map; + + /** +@@ -107,18 +107,15 @@ + VariableScope copy = new VariableScope(); + copy.clazzScope = clazzScope; + if (declaredVariables.size() > 0) { +- copy.declaredVariables = new HashMap(); +- copy.declaredVariables.putAll(declaredVariables); ++ copy.declaredVariables = new LinkedHashMap(declaredVariables); + } + copy.inStaticContext = inStaticContext; + copy.parent = parent; + if (referencedClassVariables.size() > 0) { +- copy.referencedClassVariables = new HashMap(); +- copy.referencedClassVariables.putAll(referencedClassVariables); ++ copy.referencedClassVariables = new LinkedHashMap(referencedClassVariables); + } + if (referencedLocalVariables.size() > 0) { +- copy.referencedLocalVariables = new HashMap(); +- copy.referencedLocalVariables.putAll(referencedLocalVariables); ++ copy.referencedLocalVariables = new LinkedHashMap(referencedLocalVariables); + } + copy.resolvesDynamic = resolvesDynamic; + return copy; +@@ -126,7 +123,7 @@ + + public void putDeclaredVariable(Variable var) { + if (declaredVariables == Collections.EMPTY_MAP) +- declaredVariables = new HashMap(); ++ declaredVariables = new LinkedHashMap(); + declaredVariables.put(var.getName(), var); + } + +@@ -144,13 +141,13 @@ + + public void putReferencedLocalVariable(Variable var) { + if (referencedLocalVariables == Collections.EMPTY_MAP) +- referencedLocalVariables = new HashMap(); ++ referencedLocalVariables = new LinkedHashMap(); + referencedLocalVariables.put(var.getName(), var); + } + + public void putReferencedClassVariable(Variable var) { + if (referencedClassVariables == Collections.EMPTY_MAP) +- referencedClassVariables = new HashMap(); ++ referencedClassVariables = new LinkedHashMap(); + referencedClassVariables.put(var.getName(), var); + } + +--- groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/classgen/asm/ClosureWriter.java 2023-09-26 13:31:23.342876115 +0200 ++++ groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/classgen/asm/ClosureWriter.java 2023-09-26 22:27:19.219143281 +0200 +@@ -15,7 +15,7 @@ + */ + package org.codehaus.groovy.classgen.asm; + +-import java.util.HashMap; ++import java.util.LinkedHashMap; + import java.util.Iterator; + import java.util.List; + +@@ -54,12 +54,12 @@ + + protected interface UseExistingReference {} + +- private HashMap closureClassMap; ++ private LinkedHashMap closureClassMap; + private WriterController controller; + + public ClosureWriter(WriterController wc) { + this.controller = wc; +- closureClassMap = new HashMap(); ++ closureClassMap = new LinkedHashMap(); + } + + public void writeClosure(ClosureExpression expression) { +--- groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/classgen/asm/MopWriter.java 2023-09-26 13:31:23.342876115 +0200 ++++ groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/classgen/asm/MopWriter.java 2023-09-26 22:29:22.783273049 +0200 +@@ -16,7 +16,7 @@ + package org.codehaus.groovy.classgen.asm; + + import java.lang.reflect.Modifier; +-import java.util.HashMap; ++import java.util.LinkedHashMap; + import java.util.LinkedList; + import java.util.List; + +@@ -78,7 +78,7 @@ + * @see #generateMopCalls(LinkedList, boolean) + */ + private void visitMopMethodList(List methods, boolean isThis) { +- HashMap mops = new HashMap(); ++ LinkedHashMap mops = new LinkedHashMap(); + LinkedList mopCalls = new LinkedList(); + for (Object method : methods) { + MethodNode mn = (MethodNode) method; +--- groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/classgen/Verifier.java 2023-09-26 13:31:23.342876115 +0200 ++++ groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/classgen/Verifier.java 2023-09-26 22:31:15.637347467 +0200 +@@ -139,7 +139,7 @@ + for (ClassNode classNode : classNodes) { + interfaces.add(classNode.getName()); + } +- Set interfaceSet = new HashSet(interfaces); ++ Set interfaceSet = new TreeSet(interfaces); + if (interfaceSet.size() != interfaces.size()) { + throw new RuntimeParserException("Duplicate interfaces in implements list: " + interfaces, classNode); + } +@@ -832,7 +832,7 @@ + List staticStatements = new ArrayList(); + final boolean isEnum = node.isEnum(); + List initStmtsAfterEnumValuesInit = new ArrayList(); +- Set explicitStaticPropsInEnum = new HashSet(); ++ Set explicitStaticPropsInEnum = new TreeSet(); + if (isEnum) { + for (PropertyNode propNode : node.getProperties()) { + if (!propNode.isSynthetic() && propNode.getField().isStatic()) { +@@ -1051,12 +1051,12 @@ + } + + protected void addCovariantMethods(ClassNode classNode) { +- Map methodsToAdd = new HashMap(); +- Map genericsSpec = new HashMap(); ++ Map methodsToAdd = new LinkedHashMap(); ++ Map genericsSpec = new LinkedHashMap(); + + // unimplemented abstract methods from interfaces +- Map abstractMethods = new HashMap(); +- Map allInterfaceMethods = new HashMap(); ++ Map abstractMethods = new LinkedHashMap(); ++ Map allInterfaceMethods = new TreeMap(); + ClassNode[] interfaces = classNode.getInterfaces(); + for (ClassNode iface : interfaces) { + Map ifaceMethodsMap = iface.getDeclaredMethodsMap(); +@@ -1086,7 +1086,7 @@ + + addCovariantMethods(classNode, declaredMethods, abstractMethods, methodsToAdd, genericsSpec); + +- Map declaredMethodsMap = new HashMap(); ++ Map declaredMethodsMap = new TreeMap(); + if (methodsToAdd.size() > 0) { + for (MethodNode mn : declaredMethods) { + declaredMethodsMap.put(mn.getTypeDescriptor(), mn); +@@ -1336,7 +1336,7 @@ + } + + private Map createGenericsSpec(ClassNode current, Map oldSpec) { +- Map ret = new HashMap(oldSpec); ++ Map ret = new LinkedHashMap(oldSpec); + // ret contains the type specs, what we now need is the type spec for the + // current class. To get that we first apply the type parameters to the + // current class and then use the type names of the current class to reset +--- groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/runtime/ClassExtender.java 2023-09-26 13:31:23.352876182 +0200 ++++ groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/runtime/ClassExtender.java 2023-09-26 22:52:18.192281834 +0200 +@@ -17,7 +17,7 @@ + + import groovy.lang.Closure; + +-import java.util.HashMap; ++import java.util.LinkedHashMap; + import java.util.Map; + + +@@ -82,6 +82,6 @@ + } + + protected Map createMap() { +- return new HashMap(); ++ return new LinkedHashMap(); + } + } +--- groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/tools/javac/JavaStubGenerator.java 2023-09-26 13:31:23.359542893 +0200 ++++ groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/tools/javac/JavaStubGenerator.java 2023-09-26 22:43:10.372033609 +0200 +@@ -41,7 +41,7 @@ + import java.io.StringWriter; + import java.util.ArrayList; + import java.util.Arrays; +-import java.util.HashMap; ++import java.util.TreeMap; + import java.util.Iterator; + import java.util.List; + import java.util.Map; +@@ -52,7 +52,7 @@ + private File outputPath; + private List toCompile = new ArrayList(); + private ArrayList propertyMethods = new ArrayList(); +- private Map propertyMethodsWithSigs = new HashMap(); ++ private Map propertyMethodsWithSigs = new TreeMap(); + private ArrayList constructors = new ArrayList(); + private ModuleNode currentModule; + +--- groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/transform/ASTTransformationVisitor.java 2023-09-26 13:31:23.362876249 +0200 ++++ groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/transform/ASTTransformationVisitor.java 2023-09-26 19:55:46.378599493 +0200 +@@ -59,7 +59,7 @@ + private Map> transforms; + private Map, ASTTransformation> transformInstances; + private static CompilationUnit compUnit; +- private static Set globalTransformNames = new HashSet(); ++ private static Set globalTransformNames = new LinkedHashSet(); + + private ASTTransformationVisitor(CompilePhase phase) { + this.phase = phase; +--- groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/transform/CategoryASTTransformation.java 2023-09-26 13:31:23.362876249 +0200 ++++ groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/transform/CategoryASTTransformation.java 2023-09-26 19:55:31.251830932 +0200 +@@ -31,7 +31,7 @@ + import groovy.lang.Reference; + + import java.util.Arrays; +-import java.util.HashSet; ++import java.util.LinkedHashSet; + import java.util.LinkedList; + import java.util.List; + import java.util.Set; +@@ -71,7 +71,7 @@ + ClassNode targetClass = getTargetClass(source, annotation); + + final LinkedList> varStack = new LinkedList>(); +- Set names = new HashSet(); ++ Set names = new LinkedHashSet(); + for (FieldNode field : parent.getFields()) { + names.add(field.getName()); + } +@@ -83,7 +83,7 @@ + } + + private void addVariablesToStack(Parameter[] params) { +- Set names = new HashSet(); ++ Set names = new LinkedHashSet(); + names.addAll(varStack.getLast()); + for (Parameter param : params) { + names.add(param.getName()); +@@ -107,7 +107,7 @@ + + @Override + public void visitBlockStatement(BlockStatement block) { +- Set names = new HashSet(); ++ Set names = new LinkedHashSet(); + names.addAll(varStack.getLast()); + varStack.add(names); + super.visitBlockStatement(block); +--- groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/transform/DelegateASTTransformation.java 2023-09-26 13:31:23.362876249 +0200 ++++ groovy-core-GROOVY_1_8_9/src/main/org/codehaus/groovy/transform/DelegateASTTransformation.java 2023-09-26 19:51:23.170159705 +0200 +@@ -34,7 +34,7 @@ + import java.util.ArrayList; + import java.util.Arrays; + import java.util.Collections; +-import java.util.HashSet; ++import java.util.LinkedHashSet; + import java.util.List; + import java.util.Set; + +@@ -111,7 +111,7 @@ + } + + private Set getInterfacesAndSuperInterfaces(ClassNode type) { +- Set res = new HashSet(); ++ Set res = new LinkedHashSet(); + if (type.isInterface()) { + res.add(type); + return res; diff --git a/groovy18.changes b/groovy18.changes index 00a69c8..c8d3a0e 100644 --- a/groovy18.changes +++ b/groovy18.changes @@ -1,3 +1,16 @@ +------------------------------------------------------------------- +Tue Feb 20 14:34:44 UTC 2024 - Fridrich Strba + +- Use %patch -P N instead of deprecated %patchN. + +------------------------------------------------------------------- +Tue Sep 26 18:10:22 UTC 2023 - Fridrich Strba + +- Added patch: + * groovy18-reproducible-bytecode.patch + + backport of upstream changes to have interface methods and + collected variables always in the same order + ------------------------------------------------------------------- Thu Sep 14 16:34:06 UTC 2023 - Fridrich Strba diff --git a/groovy18.spec b/groovy18.spec index c0ec125..283ab6e 100644 --- a/groovy18.spec +++ b/groovy18.spec @@ -1,7 +1,7 @@ # # spec file for package groovy18 # -# Copyright (c) 2023 SUSE LLC +# Copyright (c) 2024 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -46,6 +46,7 @@ Patch11: groovy18-nofork.patch Patch12: groovy18-jansi.patch Patch13: groovy18-jline2.patch Patch14: groovy18-timestamp.patch +Patch15: groovy18-reproducible-bytecode.patch BuildRequires: ant BuildRequires: ant-antlr BuildRequires: antlr @@ -128,21 +129,22 @@ find . -name "*.jar" -delete cp %{SOURCE3} . -%patch0 -p1 -%patch1 -p1 -%patch2 -p1 -%patch3 -p1 -%patch4 -p1 -%patch5 -p1 -%patch6 -p1 -%patch7 -p1 -%patch8 -p1 -%patch9 -p1 -%patch10 -p1 -%patch11 -p1 -%patch12 -p1 -%patch13 -p1 -%patch14 -p1 +%patch -P 0 -p1 +%patch -P 1 -p1 +%patch -P 2 -p1 +%patch -P 3 -p1 +%patch -P 4 -p1 +%patch -P 5 -p1 +%patch -P 6 -p1 +%patch -P 7 -p1 +%patch -P 8 -p1 +%patch -P 9 -p1 +%patch -P 10 -p1 +%patch -P 11 -p1 +%patch -P 12 -p1 +%patch -P 13 -p1 +%patch -P 14 -p1 +%patch -P 15 -p1 # build.xml is not compatible with Ant 1.10+ sed -i "s| depends=\"-excludeLegacyAntVersion\"||" build.xml