]> source.dussan.org Git - jgit.git/commitdiff
Implement SHA-256 abstraction 76/52176/12
authorMatthias Sohn <matthias.sohn@sap.com>
Fri, 17 Jul 2015 14:22:56 +0000 (16:22 +0200)
committerSaša Živkov <sasa.zivkov@sap.com>
Thu, 4 Feb 2016 16:49:42 +0000 (17:49 +0100)
The Large File Storage extension specified by GitHub [1] uses SHA-256 to
compute the ID of large files stored by the extension. Hence implement a
SHA-256 abstraction similar to the SHA-1 abstraction used by JGit.

[1] https://git-lfs.github.com/

Bug: 470333
Change-Id: I3a95954543c8570d73929e55f4a884b55dbf1b7a
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
66 files changed:
BUCK
org.eclipse.jgit.lfs.test/.classpath [new file with mode: 0644]
org.eclipse.jgit.lfs.test/.gitignore [new file with mode: 0644]
org.eclipse.jgit.lfs.test/.project [new file with mode: 0644]
org.eclipse.jgit.lfs.test/.settings/org.eclipse.core.resources.prefs [new file with mode: 0644]
org.eclipse.jgit.lfs.test/.settings/org.eclipse.core.runtime.prefs [new file with mode: 0644]
org.eclipse.jgit.lfs.test/.settings/org.eclipse.jdt.core.prefs [new file with mode: 0644]
org.eclipse.jgit.lfs.test/.settings/org.eclipse.jdt.ui.prefs [new file with mode: 0644]
org.eclipse.jgit.lfs.test/.settings/org.eclipse.mylyn.tasks.ui.prefs [new file with mode: 0644]
org.eclipse.jgit.lfs.test/.settings/org.eclipse.mylyn.team.ui.prefs [new file with mode: 0644]
org.eclipse.jgit.lfs.test/.settings/org.eclipse.pde.api.tools.prefs [new file with mode: 0644]
org.eclipse.jgit.lfs.test/.settings/org.eclipse.pde.core.prefs [new file with mode: 0644]
org.eclipse.jgit.lfs.test/BUCK [new file with mode: 0644]
org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF [new file with mode: 0644]
org.eclipse.jgit.lfs.test/build.properties [new file with mode: 0644]
org.eclipse.jgit.lfs.test/plugin.properties [new file with mode: 0644]
org.eclipse.jgit.lfs.test/pom.xml [new file with mode: 0644]
org.eclipse.jgit.lfs.test/src/org/eclipse/jgit/lfs/test/LongObjectIdTestUtils.java [new file with mode: 0644]
org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectIdTest.java [new file with mode: 0644]
org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/LongObjectIdTest.java [new file with mode: 0644]
org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/MutableLongObjectIdTest.java [new file with mode: 0644]
org.eclipse.jgit.lfs/.classpath [new file with mode: 0644]
org.eclipse.jgit.lfs/.fbprefs [new file with mode: 0644]
org.eclipse.jgit.lfs/.gitignore [new file with mode: 0644]
org.eclipse.jgit.lfs/.project [new file with mode: 0644]
org.eclipse.jgit.lfs/.settings/org.eclipse.core.resources.prefs [new file with mode: 0644]
org.eclipse.jgit.lfs/.settings/org.eclipse.core.runtime.prefs [new file with mode: 0644]
org.eclipse.jgit.lfs/.settings/org.eclipse.jdt.core.prefs [new file with mode: 0644]
org.eclipse.jgit.lfs/.settings/org.eclipse.jdt.ui.prefs [new file with mode: 0644]
org.eclipse.jgit.lfs/.settings/org.eclipse.mylyn.tasks.ui.prefs [new file with mode: 0644]
org.eclipse.jgit.lfs/.settings/org.eclipse.mylyn.team.ui.prefs [new file with mode: 0644]
org.eclipse.jgit.lfs/.settings/org.eclipse.pde.api.tools.prefs [new file with mode: 0644]
org.eclipse.jgit.lfs/.settings/org.eclipse.pde.core.prefs [new file with mode: 0644]
org.eclipse.jgit.lfs/BUCK [new file with mode: 0644]
org.eclipse.jgit.lfs/META-INF/MANIFEST.MF [new file with mode: 0644]
org.eclipse.jgit.lfs/about.html [new file with mode: 0644]
org.eclipse.jgit.lfs/build.properties [new file with mode: 0644]
org.eclipse.jgit.lfs/plugin.properties [new file with mode: 0644]
org.eclipse.jgit.lfs/pom.xml [new file with mode: 0644]
org.eclipse.jgit.lfs/resources/org/eclipse/jgit/lfs/internal/LfsText.properties [new file with mode: 0644]
org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/InvalidLongObjectIdException.java [new file with mode: 0644]
org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsText.java [new file with mode: 0644]
org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectId.java [new file with mode: 0644]
org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AnyLongObjectId.java [new file with mode: 0644]
org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/Constants.java [new file with mode: 0644]
org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/LongObjectId.java [new file with mode: 0644]
org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/MutableLongObjectId.java [new file with mode: 0644]
org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.gitignore [new file with mode: 0644]
org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.project [new file with mode: 0644]
org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.settings/org.eclipse.core.resources.prefs [new file with mode: 0644]
org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.settings/org.eclipse.core.runtime.prefs [new file with mode: 0644]
org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.settings/org.eclipse.mylyn.tasks.ui.prefs [new file with mode: 0644]
org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.settings/org.eclipse.mylyn.team.ui.prefs [new file with mode: 0644]
org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/build.properties [new file with mode: 0644]
org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/edl-v10.html [new file with mode: 0644]
org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.properties [new file with mode: 0644]
org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.xml [new file with mode: 0644]
org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/license.html [new file with mode: 0644]
org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/pom.xml [new file with mode: 0644]
org.eclipse.jgit.packaging/org.eclipse.jgit.repository/category.xml
org.eclipse.jgit.packaging/org.eclipse.jgit.repository/pom.xml
org.eclipse.jgit.packaging/pom.xml
org.eclipse.jgit.test/tst/org/eclipse/jgit/util/NBTest.java
org.eclipse.jgit/src/org/eclipse/jgit/util/NB.java
org.eclipse.jgit/src/org/eclipse/jgit/util/RawParseUtils.java
pom.xml

diff --git a/BUCK b/BUCK
index f19b7bdc5dfb1a31a1e71d77801959dc745ff229..1deab2fe3ed3140424a2120067c3ae4661af4a48 100644 (file)
--- a/BUCK
+++ b/BUCK
@@ -29,6 +29,22 @@ java_library(
   visibility = ['PUBLIC'],
 )
 
+java_library(
+  name = 'jgit-lfs',
+  exported_deps = [
+    ':jgit',
+    '//org.eclipse.jgit.lfs:jgit-lfs'
+  ],
+  visibility = ['PUBLIC'],
+)
+
+genrule(
+  name = 'jgit-lfs_src',
+  cmd = 'ln -s $(location //org.eclipse.jgit.lfs:jgit-lfs_src) $OUT',
+  out = 'jgit-lfs_src.zip',
+  visibility = ['PUBLIC'],
+)
+
 java_library(
   name = 'junit',
   exported_deps = [
diff --git a/org.eclipse.jgit.lfs.test/.classpath b/org.eclipse.jgit.lfs.test/.classpath
new file mode 100644 (file)
index 0000000..efc781d
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="src" path="tst"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.jgit.lfs.test/.gitignore b/org.eclipse.jgit.lfs.test/.gitignore
new file mode 100644 (file)
index 0000000..4dc0091
--- /dev/null
@@ -0,0 +1,2 @@
+/target
+/bin
diff --git a/org.eclipse.jgit.lfs.test/.project b/org.eclipse.jgit.lfs.test/.project
new file mode 100644 (file)
index 0000000..c5dddb0
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.eclipse.jgit.lfs.test</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+               <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.eclipse.jgit.lfs.test/.settings/org.eclipse.core.resources.prefs b/org.eclipse.jgit.lfs.test/.settings/org.eclipse.core.resources.prefs
new file mode 100644 (file)
index 0000000..4824b80
--- /dev/null
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1\r
+encoding/<project>=UTF-8\r
diff --git a/org.eclipse.jgit.lfs.test/.settings/org.eclipse.core.runtime.prefs b/org.eclipse.jgit.lfs.test/.settings/org.eclipse.core.runtime.prefs
new file mode 100644 (file)
index 0000000..5a0ad22
--- /dev/null
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/org.eclipse.jgit.lfs.test/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jgit.lfs.test/.settings/org.eclipse.jdt.core.prefs
new file mode 100644 (file)
index 0000000..dcc0d3a
--- /dev/null
@@ -0,0 +1,398 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=warning
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
+org.eclipse.jdt.core.compiler.problem.deadCode=error
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=error
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=error
+org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=80
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/org.eclipse.jgit.lfs.test/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.jgit.lfs.test/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644 (file)
index 0000000..c336cce
--- /dev/null
@@ -0,0 +1,61 @@
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_JGit Format
+formatter_settings_version=12
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=false
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=false
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=true
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=false
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=false
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.jgit.lfs.test/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.jgit.lfs.test/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644 (file)
index 0000000..3dec4d9
--- /dev/null
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.jgit.lfs.test/.settings/org.eclipse.mylyn.team.ui.prefs b/org.eclipse.jgit.lfs.test/.settings/org.eclipse.mylyn.team.ui.prefs
new file mode 100644 (file)
index 0000000..ce7a0f0
--- /dev/null
@@ -0,0 +1,2 @@
+commit.comment.template=${task.description} \n\nBug\: ${task.key}
+eclipse.preferences.version=1
diff --git a/org.eclipse.jgit.lfs.test/.settings/org.eclipse.pde.api.tools.prefs b/org.eclipse.jgit.lfs.test/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644 (file)
index 0000000..d585687
--- /dev/null
@@ -0,0 +1,93 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_JAVADOC_TAG=Ignore
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Error
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/org.eclipse.jgit.lfs.test/.settings/org.eclipse.pde.core.prefs b/org.eclipse.jgit.lfs.test/.settings/org.eclipse.pde.core.prefs
new file mode 100644 (file)
index 0000000..923c37f
--- /dev/null
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+resolve.requirebundle=false
diff --git a/org.eclipse.jgit.lfs.test/BUCK b/org.eclipse.jgit.lfs.test/BUCK
new file mode 100644 (file)
index 0000000..d0fb96f
--- /dev/null
@@ -0,0 +1,31 @@
+TESTS = glob(['tst/**/*.java'])
+
+for t in TESTS:
+  n = t[len('tst/'):len(t)-len('.java')].replace('/', '.')
+  java_test(
+    name = n,
+    labels = ['lfs'],
+    srcs = [t],
+    deps = [
+      ':helpers',
+      '//org.eclipse.jgit.junit:junit',
+      '//org.eclipse.jgit.lfs:jgit-lfs',
+      '//org.eclipse.jgit:jgit',
+      '//lib:hamcrest-core',
+      '//lib:hamcrest-library',
+      '//lib:junit',
+    ],
+    source_under_test = ['//org.eclipse.jgit.lfs:jgit-lfs'],
+  )
+
+java_library(
+  name = 'helpers',
+  srcs = glob(['src/**/*.java']),
+  deps = [
+    '//org.eclipse.jgit:jgit',
+    '//org.eclipse.jgit.lfs:jgit-lfs',
+    '//org.eclipse.jgit.junit:junit',
+    '//lib:junit',
+  ],
+  visibility = ['PUBLIC']
+)
diff --git a/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs.test/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..118583c
--- /dev/null
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %plugin_name
+Bundle-SymbolicName: org.eclipse.jgit.lfs.test
+Bundle-Version: 4.3.0.qualifier
+Bundle-Vendor: %provider_name
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Import-Package: org.eclipse.jgit.junit;version="[4.3.0,4.4.0)",
+ org.eclipse.jgit.lfs.errors;version="[4.3.0,4.4.0)",
+ org.eclipse.jgit.lfs.lib;version="[4.3.0,4.4.0)",
+ org.eclipse.jgit.lib;version="[4.3.0,4.4.0)",
+ org.eclipse.jgit.util;version="[4.3.0,4.4.0)",
+ org.hamcrest.core;version="[1.1.0,2.0.0)",
+ org.junit;version="[4.0.0,5.0.0)",
+ org.junit.runner;version="[4.0.0,5.0.0)",
+ org.junit.runners;version="[4.0.0,5.0.0)"
+Export-Package: org.eclipse.jgit.lfs.lib;version="4.3.0";x-internal:=true,
+ org.eclipse.jgit.lfs.test;version="4.3.0";x-internal:=true
+
diff --git a/org.eclipse.jgit.lfs.test/build.properties b/org.eclipse.jgit.lfs.test/build.properties
new file mode 100644 (file)
index 0000000..47ae091
--- /dev/null
@@ -0,0 +1,5 @@
+source.. = tst/, src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.properties
diff --git a/org.eclipse.jgit.lfs.test/plugin.properties b/org.eclipse.jgit.lfs.test/plugin.properties
new file mode 100644 (file)
index 0000000..f900780
--- /dev/null
@@ -0,0 +1,2 @@
+plugin_name=JGit LFS Tests
+provider_name=Eclipse JGit
diff --git a/org.eclipse.jgit.lfs.test/pom.xml b/org.eclipse.jgit.lfs.test/pom.xml
new file mode 100644 (file)
index 0000000..ae72a80
--- /dev/null
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright (C) 2015 Matthias Sohn <matthias.sohn@sap.com>
+   and other copyright owners as documented in the project's IP log.
+
+   This program and the accompanying materials are made available
+   under the terms of the Eclipse Distribution License v1.0 which
+   accompanies this distribution, is reproduced below, and is
+   available at http://www.eclipse.org/org/documents/edl-v10.php
+
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or
+   without modification, are permitted provided that the following
+   conditions are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above
+     copyright notice, this list of conditions and the following
+     disclaimer in the documentation and/or other materials provided
+     with the distribution.
+
+   - Neither the name of the Eclipse Foundation, Inc. nor the
+     names of its contributors may be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+   CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+   OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+   CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.jgit</groupId>
+    <artifactId>org.eclipse.jgit-parent</artifactId>
+    <version>4.3.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>org.eclipse.jgit.lfs.test</artifactId>
+  <name>JGit - Large File Storage Tests</name>
+
+  <description>
+    Tests for the Large File Extension (LFS).
+  </description>
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.jgit</groupId>
+      <artifactId>org.eclipse.jgit</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.jgit</groupId>
+      <artifactId>org.eclipse.jgit.lfs</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.jgit</groupId>
+      <artifactId>org.eclipse.jgit.junit</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <testSourceDirectory>tst/</testSourceDirectory>
+    <sourceDirectory>src/</sourceDirectory>
+
+    <testResources>
+      <testResource>
+        <directory>tst-rsrc/</directory>
+      </testResource>
+    </testResources>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>test-jar</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <argLine>-Djava.io.tmpdir=${project.build.directory}  -Xmx300m</argLine>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/org.eclipse.jgit.lfs.test/src/org/eclipse/jgit/lfs/test/LongObjectIdTestUtils.java b/org.eclipse.jgit.lfs.test/src/org/eclipse/jgit/lfs/test/LongObjectIdTestUtils.java
new file mode 100644 (file)
index 0000000..6c6400f
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2015, Matthias Sohn <matthias.sohn@sap.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.eclipse.jgit.lfs.test;
+
+import java.io.BufferedInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.security.MessageDigest;
+
+import org.eclipse.jgit.lfs.lib.Constants;
+import org.eclipse.jgit.lfs.lib.LongObjectId;
+
+public class LongObjectIdTestUtils {
+
+       /**
+        * Create id as hash of the given string.
+        *
+        * @param s
+        *            the string to hash
+        * @return id calculated by hashing string
+        */
+       public static LongObjectId hash(String s) {
+               MessageDigest md = Constants.newMessageDigest();
+               md.update(s.getBytes(StandardCharsets.UTF_8));
+               return LongObjectId.fromRaw(md.digest());
+       }
+
+       /**
+        * Create id as hash of a file content
+        *
+        * @param file
+        *            the file to hash
+        * @return id calculated by hashing file content
+        * @throws FileNotFoundException
+        *             if file doesn't exist
+        * @throws IOException
+        */
+       public static LongObjectId hash(Path file)
+                       throws FileNotFoundException, IOException {
+               MessageDigest md = Constants.newMessageDigest();
+               try (InputStream is = new BufferedInputStream(
+                               Files.newInputStream(file))) {
+                       final byte[] buffer = new byte[4096];
+                       for (int read = 0; (read = is.read(buffer)) != -1;) {
+                               md.update(buffer, 0, read);
+                       }
+               }
+               return LongObjectId.fromRaw(md.digest());
+       }
+}
diff --git a/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectIdTest.java b/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectIdTest.java
new file mode 100644 (file)
index 0000000..8938a78
--- /dev/null
@@ -0,0 +1,596 @@
+/*
+ * Copyright (C) 2015, Matthias Sohn <matthias.sohn@sap.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.eclipse.jgit.lfs.lib;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.eclipse.jgit.lfs.test.LongObjectIdTestUtils;
+import org.junit.Test;
+
+/*
+ * Ported to SHA-256 from org.eclipse.jgit.lib.AbbreviatedObjectIdTest
+ */
+public class AbbreviatedLongObjectIdTest {
+       @Test
+       public void testEmpty_FromByteArray() {
+               final AbbreviatedLongObjectId i;
+               i = AbbreviatedLongObjectId.fromString(new byte[] {}, 0, 0);
+               assertNotNull(i);
+               assertEquals(0, i.length());
+               assertFalse(i.isComplete());
+               assertEquals("", i.name());
+       }
+
+       @Test
+       public void testEmpty_FromString() {
+               final AbbreviatedLongObjectId i = AbbreviatedLongObjectId
+                               .fromString("");
+               assertNotNull(i);
+               assertEquals(0, i.length());
+               assertFalse(i.isComplete());
+               assertEquals("", i.name());
+       }
+
+       @Test
+       public void testFull_FromByteArray() {
+               final String s = "27e15b72937fc8f558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10";
+               final byte[] b = org.eclipse.jgit.lib.Constants.encodeASCII(s);
+               final AbbreviatedLongObjectId i = AbbreviatedLongObjectId.fromString(b,
+                               0, b.length);
+               assertNotNull(i);
+               assertEquals(s.length(), i.length());
+               assertTrue(i.isComplete());
+               assertEquals(s, i.name());
+
+               final LongObjectId f = i.toLongObjectId();
+               assertNotNull(f);
+               assertEquals(LongObjectId.fromString(s), f);
+               assertEquals(f.hashCode(), i.hashCode());
+       }
+
+       @Test
+       public void testFull_FromString() {
+               final String s = "27e15b72937fc8f558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10";
+               final AbbreviatedLongObjectId i = AbbreviatedLongObjectId.fromString(s);
+               assertNotNull(i);
+               assertEquals(s.length(), i.length());
+               assertTrue(i.isComplete());
+               assertEquals(s, i.name());
+
+               final LongObjectId f = i.toLongObjectId();
+               assertNotNull(f);
+               assertEquals(LongObjectId.fromString(s), f);
+               assertEquals(f.hashCode(), i.hashCode());
+       }
+
+       @Test
+       public void test1_FromString() {
+               final String s = "2";
+               final AbbreviatedLongObjectId i = AbbreviatedLongObjectId.fromString(s);
+               assertNotNull(i);
+               assertEquals(s.length(), i.length());
+               assertFalse(i.isComplete());
+               assertEquals(s, i.name());
+               assertNull(i.toLongObjectId());
+       }
+
+       @Test
+       public void test2_FromString() {
+               final String s = "27";
+               final AbbreviatedLongObjectId i = AbbreviatedLongObjectId.fromString(s);
+               assertNotNull(i);
+               assertEquals(s.length(), i.length());
+               assertFalse(i.isComplete());
+               assertEquals(s, i.name());
+               assertNull(i.toLongObjectId());
+       }
+
+       @Test
+       public void test3_FromString() {
+               final String s = "27e";
+               final AbbreviatedLongObjectId i = AbbreviatedLongObjectId.fromString(s);
+               assertNotNull(i);
+               assertEquals(s.length(), i.length());
+               assertFalse(i.isComplete());
+               assertEquals(s, i.name());
+               assertNull(i.toLongObjectId());
+       }
+
+       @Test
+       public void test4_FromString() {
+               final String s = "27e1";
+               final AbbreviatedLongObjectId i = AbbreviatedLongObjectId.fromString(s);
+               assertNotNull(i);
+               assertEquals(s.length(), i.length());
+               assertFalse(i.isComplete());
+               assertEquals(s, i.name());
+               assertNull(i.toLongObjectId());
+       }
+
+       @Test
+       public void test5_FromString() {
+               final String s = "27e15";
+               final AbbreviatedLongObjectId i = AbbreviatedLongObjectId.fromString(s);
+               assertNotNull(i);
+               assertEquals(s.length(), i.length());
+               assertFalse(i.isComplete());
+               assertEquals(s, i.name());
+               assertNull(i.toLongObjectId());
+       }
+
+       @Test
+       public void test6_FromString() {
+               final String s = "27e15b";
+               final AbbreviatedLongObjectId i = AbbreviatedLongObjectId.fromString(s);
+               assertNotNull(i);
+               assertEquals(s.length(), i.length());
+               assertFalse(i.isComplete());
+               assertEquals(s, i.name());
+               assertNull(i.toLongObjectId());
+       }
+
+       @Test
+       public void test7_FromString() {
+               final String s = "27e15b7";
+               final AbbreviatedLongObjectId i = AbbreviatedLongObjectId.fromString(s);
+               assertNotNull(i);
+               assertEquals(s.length(), i.length());
+               assertFalse(i.isComplete());
+               assertEquals(s, i.name());
+               assertNull(i.toLongObjectId());
+       }
+
+       @Test
+       public void test8_FromString() {
+               final String s = "27e15b72";
+               final AbbreviatedLongObjectId i = AbbreviatedLongObjectId.fromString(s);
+               assertNotNull(i);
+               assertEquals(s.length(), i.length());
+               assertFalse(i.isComplete());
+               assertEquals(s, i.name());
+               assertNull(i.toLongObjectId());
+       }
+
+       @Test
+       public void test9_FromString() {
+               final String s = "27e15b729";
+               final AbbreviatedLongObjectId i = AbbreviatedLongObjectId.fromString(s);
+               assertNotNull(i);
+               assertEquals(s.length(), i.length());
+               assertFalse(i.isComplete());
+               assertEquals(s, i.name());
+               assertNull(i.toLongObjectId());
+       }
+
+       @Test
+       public void test15_FromString() {
+               final String s = "27e15b72937fc8f";
+               final AbbreviatedLongObjectId i = AbbreviatedLongObjectId.fromString(s);
+               assertNotNull(i);
+               assertEquals(s.length(), i.length());
+               assertFalse(i.isComplete());
+               assertEquals(s, i.name());
+               assertNull(i.toLongObjectId());
+       }
+
+       @Test
+       public void test16_FromString() {
+               final String s = "27e15b72937fc8f5";
+               final AbbreviatedLongObjectId i = AbbreviatedLongObjectId.fromString(s);
+               assertNotNull(i);
+               assertEquals(s.length(), i.length());
+               assertFalse(i.isComplete());
+               assertEquals(s, i.name());
+               assertNull(i.toLongObjectId());
+       }
+
+       @Test
+       public void test17_FromString() {
+               final String s = "27e15b72937fc8f55";
+               final AbbreviatedLongObjectId i = AbbreviatedLongObjectId.fromString(s);
+               assertNotNull(i);
+               assertEquals(s.length(), i.length());
+               assertFalse(i.isComplete());
+               assertEquals(s, i.name());
+               assertNull(i.toLongObjectId());
+       }
+
+       @Test
+       public void test33_FromString() {
+               final String s = "27e15b72937fc8f558da24ac3d50ec203";
+               final AbbreviatedLongObjectId i = AbbreviatedLongObjectId.fromString(s);
+               assertNotNull(i);
+               assertEquals(s.length(), i.length());
+               assertFalse(i.isComplete());
+               assertEquals(s, i.name());
+               assertNull(i.toLongObjectId());
+       }
+
+       @Test
+       public void testEquals_Short() {
+               final String s = "27e15b72";
+               final AbbreviatedLongObjectId a = AbbreviatedLongObjectId.fromString(s);
+               final AbbreviatedLongObjectId b = AbbreviatedLongObjectId.fromString(s);
+               assertNotSame(a, b);
+               assertTrue(a.hashCode() == b.hashCode());
+               assertEquals(b, a);
+               assertEquals(a, b);
+       }
+
+       @Test
+       public void testEquals_Full() {
+               final String s = "27e15b72937fc8f558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10";
+               final AbbreviatedLongObjectId a = AbbreviatedLongObjectId.fromString(s);
+               final AbbreviatedLongObjectId b = AbbreviatedLongObjectId.fromString(s);
+               assertNotSame(a, b);
+               assertTrue(a.hashCode() == b.hashCode());
+               assertEquals(b, a);
+               assertEquals(a, b);
+       }
+
+       @Test
+       public void testNotEquals_SameLength() {
+               final String sa = "27e15b72";
+               final String sb = "27e15b7f";
+               final AbbreviatedLongObjectId a = AbbreviatedLongObjectId
+                               .fromString(sa);
+               final AbbreviatedLongObjectId b = AbbreviatedLongObjectId
+                               .fromString(sb);
+               assertFalse(a.equals(b));
+               assertFalse(b.equals(a));
+       }
+
+       @Test
+       public void testNotEquals_DiffLength() {
+               final String sa = "27e15b72abcd";
+               final String sb = "27e15b72";
+               final AbbreviatedLongObjectId a = AbbreviatedLongObjectId
+                               .fromString(sa);
+               final AbbreviatedLongObjectId b = AbbreviatedLongObjectId
+                               .fromString(sb);
+               assertFalse(a.equals(b));
+               assertFalse(b.equals(a));
+       }
+
+       @Test
+       public void testPrefixCompare_Full() {
+               final String s1 = "27e15b72937fc8f558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10";
+               final AbbreviatedLongObjectId a = AbbreviatedLongObjectId
+                               .fromString(s1);
+               final LongObjectId i1 = LongObjectId.fromString(s1);
+               assertEquals(0, a.prefixCompare(i1));
+               assertTrue(i1.startsWith(a));
+
+               final String s2 = "27e15b72937fc8f558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b11";
+               final LongObjectId i2 = LongObjectId.fromString(s2);
+               assertTrue(a.prefixCompare(i2) < 0);
+               assertFalse(i2.startsWith(a));
+
+               final String s3 = "27e15b72937fc8f558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b0f";
+               final LongObjectId i3 = LongObjectId.fromString(s3);
+               assertTrue(a.prefixCompare(i3) > 0);
+               assertFalse(i3.startsWith(a));
+       }
+
+       @Test
+       public void testPrefixCompare_1() {
+               final String sa = "2";
+               final AbbreviatedLongObjectId a = AbbreviatedLongObjectId
+                               .fromString(sa);
+
+               final String s1 = "27e15b72937fc8f558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10";
+               final LongObjectId i1 = LongObjectId.fromString(s1);
+               assertEquals(0, a.prefixCompare(i1));
+               assertTrue(i1.startsWith(a));
+
+               final String s2 = "37e15b72937fc8f558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10";
+               final LongObjectId i2 = LongObjectId.fromString(s2);
+               assertTrue(a.prefixCompare(i2) < 0);
+               assertFalse(i2.startsWith(a));
+
+               final String s3 = "17e15b72937fc8f558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10";
+               final LongObjectId i3 = LongObjectId.fromString(s3);
+               assertTrue(a.prefixCompare(i3) > 0);
+               assertFalse(i3.startsWith(a));
+       }
+
+       @Test
+       public void testPrefixCompare_15() {
+               final String sa = "27e15b72937fc8f";
+               final AbbreviatedLongObjectId a = AbbreviatedLongObjectId
+                               .fromString(sa);
+
+               final String s1 = "27e15b72937fc8f558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10";
+               final LongObjectId i1 = LongObjectId.fromString(s1);
+               assertEquals(0, a.prefixCompare(i1));
+               assertTrue(i1.startsWith(a));
+
+               final String s2 = "27e15b72937fc90558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10";
+               final LongObjectId i2 = LongObjectId.fromString(s2);
+               assertTrue(a.prefixCompare(i2) < 0);
+               assertFalse(i2.startsWith(a));
+
+               final String s3 = "27e15b72937fc8e558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10";
+               final LongObjectId i3 = LongObjectId.fromString(s3);
+               assertTrue(a.prefixCompare(i3) > 0);
+               assertFalse(i3.startsWith(a));
+       }
+
+       @Test
+       public void testPrefixCompare_16() {
+               final String sa = "27e15b72937fc8f5";
+               final AbbreviatedLongObjectId a = AbbreviatedLongObjectId
+                               .fromString(sa);
+
+               final String s1 = "27e15b72937fc8f558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10";
+               final LongObjectId i1 = LongObjectId.fromString(s1);
+               assertEquals(0, a.prefixCompare(i1));
+               assertTrue(i1.startsWith(a));
+
+               final String s2 = "27e15b72937fc8f658da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10";
+               final LongObjectId i2 = LongObjectId.fromString(s2);
+               assertTrue(a.prefixCompare(i2) < 0);
+               assertFalse(i2.startsWith(a));
+
+               final String s3 = "27e15b72937fc8f458da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10";
+               final LongObjectId i3 = LongObjectId.fromString(s3);
+               assertTrue(a.prefixCompare(i3) > 0);
+               assertFalse(i3.startsWith(a));
+       }
+
+       @Test
+       public void testPrefixCompare_17() {
+               final String sa = "27e15b72937fc8f55";
+               final AbbreviatedLongObjectId a = AbbreviatedLongObjectId
+                               .fromString(sa);
+
+               final String s1 = "27e15b72937fc8f558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10";
+               final LongObjectId i1 = LongObjectId.fromString(s1);
+               assertEquals(0, a.prefixCompare(i1));
+               assertTrue(i1.startsWith(a));
+
+               final String s2 = "27e15b72937fc8f568da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10";
+               final LongObjectId i2 = LongObjectId.fromString(s2);
+               assertTrue(a.prefixCompare(i2) < 0);
+               assertFalse(i2.startsWith(a));
+
+               final String s3 = "27e15b72937fc8f548da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10";
+               final LongObjectId i3 = LongObjectId.fromString(s3);
+               assertTrue(a.prefixCompare(i3) > 0);
+               assertFalse(i3.startsWith(a));
+       }
+
+       @Test
+       public void testPrefixCompare_33() {
+               final String sa = "27e15b72937fc8f558da24ac3d50ec203";
+               final AbbreviatedLongObjectId a = AbbreviatedLongObjectId
+                               .fromString(sa);
+
+               final String s1 = "27e15b72937fc8f558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10";
+               final LongObjectId i1 = LongObjectId.fromString(s1);
+               assertEquals(0, a.prefixCompare(i1));
+               assertTrue(i1.startsWith(a));
+
+               final String s2 = "27e15b72937fc8f558da24ac3d50ec20402a4cf21e33b87ae8e4ce90e89c4b10";
+               final LongObjectId i2 = LongObjectId.fromString(s2);
+               assertTrue(a.prefixCompare(i2) < 0);
+               assertFalse(i2.startsWith(a));
+
+               final String s3 = "27e15b72937fc8f558da24ac3d50ec20202a4cf21e33b87ae8e4ce90e89c4b10";
+               final LongObjectId i3 = LongObjectId.fromString(s3);
+               assertTrue(a.prefixCompare(i3) > 0);
+               assertFalse(i3.startsWith(a));
+       }
+
+       @Test
+       public void testIsId() {
+               // These are all too short.
+               assertFalse(AbbreviatedLongObjectId.isId(""));
+               assertFalse(AbbreviatedLongObjectId.isId("a"));
+
+               // These are too long.
+               assertFalse(AbbreviatedLongObjectId.isId(LongObjectId
+                               .fromString(
+                                               "27e15b72937fc8f558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10")
+                               .name() + "0"));
+               assertFalse(AbbreviatedLongObjectId.isId(LongObjectId
+                               .fromString(
+                                               "27e15b72937fc8f558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10")
+                               .name() + "c0ffee"));
+
+               // These contain non-hex characters.
+               assertFalse(AbbreviatedLongObjectId.isId("01notahexstring"));
+
+               // These should all work.
+               assertTrue(AbbreviatedLongObjectId.isId("ab"));
+               assertTrue(AbbreviatedLongObjectId.isId("abc"));
+               assertTrue(AbbreviatedLongObjectId.isId("abcd"));
+               assertTrue(AbbreviatedLongObjectId.isId("abcd0"));
+               assertTrue(AbbreviatedLongObjectId.isId("abcd09"));
+               assertTrue(AbbreviatedLongObjectId.isId(LongObjectId
+                               .fromString(
+                                               "27e15b72937fc8f558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10")
+                               .name()));
+       }
+
+       @Test
+       public void testAbbreviate() {
+               AnyLongObjectId id = LongObjectIdTestUtils.hash("test");
+               assertEquals(
+                               "abbreviated id should match the id it was abbreviated from", 0,
+                               id.abbreviate(10).prefixCompare(id));
+       }
+
+       @Test
+       public void testFromStringByteWrongLength() {
+               byte[] buf = new byte[65];
+               try {
+                       AbbreviatedLongObjectId.fromString(buf, 0, 65);
+                       fail("expected IllegalArgumentException for too long AbbreviatedLongObjectId");
+               } catch (IllegalArgumentException e) {
+                       // expected
+               }
+       }
+
+       @Test
+       public void testFromStringWrongLength() {
+               AnyLongObjectId id = LongObjectIdTestUtils.hash("test");
+               try {
+                       AbbreviatedLongObjectId.fromString(id.name() + "c0ffee");
+                       fail("expected IllegalArgumentException for too long AbbreviatedLongObjectId");
+               } catch (IllegalArgumentException e) {
+                       // expected
+               }
+       }
+
+       @Test
+       public void testFromLongObjectId() {
+               AnyLongObjectId id = LongObjectIdTestUtils.hash("test");
+               assertEquals(0,
+                               AbbreviatedLongObjectId.fromLongObjectId(id).prefixCompare(id));
+       }
+
+       @Test
+       public void testPrefixCompareByte() {
+               AnyLongObjectId id = LongObjectId.fromString(
+                               "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef");
+               byte[] buf = new byte[32];
+               id.copyRawTo(buf, 0);
+
+               AbbreviatedLongObjectId a = id.abbreviate(62);
+               assertEquals(0, a.prefixCompare(buf, 0));
+
+               a = LongObjectId
+                               .fromString(
+                                               "0023456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef")
+                               .abbreviate(16);
+               assertEquals(-1, a.prefixCompare(buf, 0));
+               a = LongObjectId
+                               .fromString(
+                                               "0123456789abcdef0023456789abcdef0123456789abcdef0123456789abcdef")
+                               .abbreviate(32);
+               assertEquals(-1, a.prefixCompare(buf, 0));
+               a = LongObjectId
+                               .fromString(
+                                               "0123456789abcdef0123456789abcdef0023456789abcdef0123456789abcdef")
+                               .abbreviate(48);
+               assertEquals(-1, a.prefixCompare(buf, 0));
+               a = LongObjectId
+                               .fromString(
+                                               "0123456789abcdef0123456789abcdef0123456789abcdef0023456789abcdef")
+                               .abbreviate(64);
+               assertEquals(-1, a.prefixCompare(buf, 0));
+
+               a = LongObjectId
+                               .fromString(
+                                               "1123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef")
+                               .abbreviate(16);
+               assertEquals(1, a.prefixCompare(buf, 0));
+               a = LongObjectId
+                               .fromString(
+                                               "0123456789abcdef1123456789abcdef0123456789abcdef0123456789abcdef")
+                               .abbreviate(32);
+               assertEquals(1, a.prefixCompare(buf, 0));
+               a = LongObjectId
+                               .fromString(
+                                               "0123456789abcdef0123456789abcdef1123456789abcdef0123456789abcdef")
+                               .abbreviate(48);
+               assertEquals(1, a.prefixCompare(buf, 0));
+               a = LongObjectId
+                               .fromString(
+                                               "0123456789abcdef0123456789abcdef0123456789abcdef1123456789abcdef")
+                               .abbreviate(64);
+               assertEquals(1, a.prefixCompare(buf, 0));
+       }
+
+       @Test
+       public void testPrefixCompareLong() {
+               AnyLongObjectId id = new LongObjectId(1L, 2L, 3L, 4L);
+               long[] buf = new long[4];
+               id.copyRawTo(buf, 0);
+
+               AbbreviatedLongObjectId a = id.abbreviate(62);
+               assertEquals(0, a.prefixCompare(buf, 0));
+
+               a = new LongObjectId(0L, 2L, 3L, 4L).abbreviate(16);
+               assertEquals(-1, a.prefixCompare(buf, 0));
+               a = new LongObjectId(1L, 1L, 3L, 4L).abbreviate(32);
+               assertEquals(-1, a.prefixCompare(buf, 0));
+               a = new LongObjectId(1L, 2L, 2L, 4L).abbreviate(48);
+               assertEquals(-1, a.prefixCompare(buf, 0));
+               a = new LongObjectId(1L, 2L, 3L, 3L).abbreviate(64);
+               assertEquals(-1, a.prefixCompare(buf, 0));
+
+               a = new LongObjectId(2L, 2L, 3L, 4L).abbreviate(16);
+               assertEquals(1, a.prefixCompare(buf, 0));
+               a = new LongObjectId(1L, 3L, 3L, 4L).abbreviate(32);
+               assertEquals(1, a.prefixCompare(buf, 0));
+               a = new LongObjectId(1L, 2L, 4L, 4L).abbreviate(48);
+               assertEquals(1, a.prefixCompare(buf, 0));
+               a = new LongObjectId(1L, 2L, 3L, 5L).abbreviate(64);
+               assertEquals(1, a.prefixCompare(buf, 0));
+       }
+
+       @Test
+       public void testGetFirstByte() {
+               AnyLongObjectId id = LongObjectId.fromString(
+                               "f423456789abcdef0123456789abcdef0123456789abcdef1123456789abcdef");
+               AbbreviatedLongObjectId a = id.abbreviate(10);
+               assertEquals(0xf4, a.getFirstByte());
+               assertEquals(id.getFirstByte(), a.getFirstByte());
+       }
+
+       @Test
+       public void testNotEquals() {
+               AbbreviatedLongObjectId a = new LongObjectId(1L, 2L, 3L, 4L)
+                               .abbreviate(10);
+               assertFalse(a.equals("different"));
+       }
+}
diff --git a/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/LongObjectIdTest.java b/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/LongObjectIdTest.java
new file mode 100644 (file)
index 0000000..435a2a3
--- /dev/null
@@ -0,0 +1,427 @@
+/*
+ * Copyright (C) 2015, Matthias Sohn <matthias.sohn@sap.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.eclipse.jgit.lfs.lib;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.eclipse.jgit.junit.JGitTestUtil;
+import org.eclipse.jgit.lfs.errors.InvalidLongObjectIdException;
+import org.eclipse.jgit.lfs.test.LongObjectIdTestUtils;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.util.FileUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/*
+ * Ported to SHA-256 from org.eclipse.jgit.lib.ObjectIdTest
+ */
+public class LongObjectIdTest {
+       private static Path tmp;
+
+       @BeforeClass
+       public static void setup() throws IOException {
+               tmp = Files.createTempDirectory("jgit_test_");
+       }
+
+       @AfterClass
+       public static void tearDown() throws IOException {
+               FileUtils.delete(tmp.toFile(), FileUtils.RECURSIVE | FileUtils.RETRY);
+       }
+
+       @Test
+       public void test001_toString() {
+               final String x = "8367b0edc81df80e6b42eb1b71f783111224e058cb3da37894d065d2deb7ab0a";
+               final LongObjectId oid = LongObjectId.fromString(x);
+               assertEquals(x, oid.name());
+       }
+
+       @Test
+       public void test002_toString() {
+               final String x = "140ce71d628cceb78e3709940ba52a651a0c4a9c1400f2e15e998a1a43887edf";
+               final LongObjectId oid = LongObjectId.fromString(x);
+               assertEquals(x, oid.name());
+       }
+
+       @Test
+       public void test003_equals() {
+               final String x = "8367b0edc81df80e6b42eb1b71f783111224e058cb3da37894d065d2deb7ab0a";
+               final LongObjectId a = LongObjectId.fromString(x);
+               final LongObjectId b = LongObjectId.fromString(x);
+               assertEquals(a.hashCode(), b.hashCode());
+               assertEquals("a and b should be equal", b, a);
+       }
+
+       @Test
+       public void test004_isId() {
+               assertTrue("valid id", LongObjectId.isId(
+                               "8367b0edc81df80e6b42eb1b71f783111224e058cb3da37894d065d2deb7ab0a"));
+       }
+
+       @Test
+       public void test005_notIsId() {
+               assertFalse("bob is not an id", LongObjectId.isId("bob"));
+       }
+
+       @Test
+       public void test006_notIsId() {
+               assertFalse("63 digits is not an id", LongObjectId.isId(
+                               "8367b0edc81df80e6b42eb1b71f783111224e058cb3da37894d065d2deb7ab0"));
+       }
+
+       @Test
+       public void test007_isId() {
+               assertTrue("uppercase is accepted", LongObjectId.isId(
+                               "8367b0edc81df80e6b42eb1b71f783111224e058cb3da37894d065d2dEb7ab0A"));
+       }
+
+       @Test
+       public void test008_notIsId() {
+               assertFalse("g is not a valid hex digit", LongObjectId.isId(
+                               "g367b0edc81df80e6b42eb1b71f783111224e058cb3da37894d065d2deb7ab0a"));
+       }
+
+       @Test
+       public void test009_toString() {
+               final String x = "140ce71d628cceb78e3709940ba52a651a0c4a9c1400f2e15e998a1a43887edf";
+               final LongObjectId oid = LongObjectId.fromString(x);
+               assertEquals(x, LongObjectId.toString(oid));
+       }
+
+       @Test
+       public void test010_toString() {
+               final String x = "0000000000000000000000000000000000000000000000000000000000000000";
+               assertEquals(x, LongObjectId.toString(null));
+       }
+
+       @Test
+       public void test011_toString() {
+               final String x = "0123456789ABCDEFabcdef01234567890123456789ABCDEFabcdef0123456789";
+               final LongObjectId oid = LongObjectId.fromString(x);
+               assertEquals(x.toLowerCase(), oid.name());
+       }
+
+       @Test
+       public void testGetByte() {
+               byte[] raw = new byte[32];
+               for (int i = 0; i < 32; i++)
+                       raw[i] = (byte) (0xa0 + i);
+               LongObjectId id = LongObjectId.fromRaw(raw);
+
+               assertEquals(raw[0] & 0xff, id.getFirstByte());
+               assertEquals(raw[0] & 0xff, id.getByte(0));
+               assertEquals(raw[1] & 0xff, id.getByte(1));
+               assertEquals(raw[1] & 0xff, id.getSecondByte());
+
+               for (int i = 2; i < 32; i++) {
+                       assertEquals("index " + i, raw[i] & 0xff, id.getByte(i));
+               }
+               try {
+                       id.getByte(32);
+                       fail("LongObjectId has 32 byte only");
+               } catch (ArrayIndexOutOfBoundsException e) {
+                       // expected
+               }
+       }
+
+       @Test
+       public void testSetByte() {
+               byte[] exp = new byte[32];
+               for (int i = 0; i < 32; i++) {
+                       exp[i] = (byte) (0xa0 + i);
+               }
+
+               MutableLongObjectId id = new MutableLongObjectId();
+               id.fromRaw(exp);
+               assertEquals(LongObjectId.fromRaw(exp).name(), id.name());
+
+               id.setByte(0, 0x10);
+               assertEquals(0x10, id.getByte(0));
+               exp[0] = 0x10;
+               assertEquals(LongObjectId.fromRaw(exp).name(), id.name());
+
+               for (int p = 1; p < 32; p++) {
+                       id.setByte(p, 0x10 + p);
+                       assertEquals(0x10 + p, id.getByte(p));
+                       exp[p] = (byte) (0x10 + p);
+                       assertEquals(LongObjectId.fromRaw(exp).name(), id.name());
+               }
+
+               for (int p = 0; p < 32; p++) {
+                       id.setByte(p, 0x80 + p);
+                       assertEquals(0x80 + p, id.getByte(p));
+                       exp[p] = (byte) (0x80 + p);
+                       assertEquals(LongObjectId.fromRaw(exp).name(), id.name());
+               }
+       }
+
+       @Test
+       public void testZeroId() {
+               AnyLongObjectId zero = new LongObjectId(0L, 0L, 0L, 0L);
+               assertEquals(zero, LongObjectId.zeroId());
+               assertEquals(
+                               "0000000000000000000000000000000000000000000000000000000000000000",
+                               LongObjectId.zeroId().name());
+       }
+
+       @Test
+       public void testEquals() {
+               AnyLongObjectId id1 = LongObjectIdTestUtils.hash("test");
+               assertTrue("id should equal itself", id1.equals(id1));
+               AnyLongObjectId id2 = new LongObjectId(id1);
+               assertEquals("objects should be equals", id1, id2);
+
+               id2 = LongObjectIdTestUtils.hash("other");
+               assertNotEquals("objects should be not equal", id1, id2);
+       }
+
+       @Test
+       public void testCopyRawBytes() {
+               AnyLongObjectId id1 = LongObjectIdTestUtils.hash("test");
+               AnyLongObjectId id2 = new LongObjectId(id1);
+
+               byte[] buf = new byte[64];
+               id1.copyRawTo(buf, 0);
+               id2.copyRawTo(buf, 32);
+               assertTrue("objects should be equals",
+                               LongObjectId.equals(buf, 0, buf, 32));
+       }
+
+       @Test
+       public void testCopyRawLongs() {
+               long[] a = new long[4];
+               a[0] = 1L;
+               a[1] = 2L;
+               a[2] = 3L;
+               a[3] = 4L;
+               AnyLongObjectId id1 = new LongObjectId(a[0], a[1], a[2], a[3]);
+               AnyLongObjectId id2 = LongObjectId.fromRaw(a);
+               assertEquals("objects should be equals", id1, id2);
+       }
+
+       @Test
+       public void testCopyFromStringInvalid() {
+               AnyLongObjectId id1 = LongObjectIdTestUtils.hash("test");
+               try {
+                       LongObjectId.fromString(id1.name() + "01234");
+                       fail("expected InvalidLongObjectIdException");
+               } catch (InvalidLongObjectIdException e) {
+                       assertEquals("Invalid id: " + id1.name() + "01234",
+                                       e.getMessage());
+               }
+       }
+
+       @Test
+       public void testCopyFromStringByte() {
+               AnyLongObjectId id1 = LongObjectIdTestUtils.hash("test");
+               byte[] buf = new byte[64];
+               Charset cs = StandardCharsets.US_ASCII;
+               cs.encode(id1.name()).get(buf);
+               AnyLongObjectId id2 = LongObjectId.fromString(buf, 0);
+               assertEquals("objects should be equals", id1, id2);
+       }
+
+       @Test
+       public void testHashFile() throws IOException {
+               AnyLongObjectId id1 = LongObjectIdTestUtils.hash("test");
+               Path f = tmp.resolve("test");
+               JGitTestUtil.write(f.toFile(), "test");
+               AnyLongObjectId id2 = LongObjectIdTestUtils.hash(f);
+               assertEquals("objects should be equals", id1, id2);
+       }
+
+       @Test
+       public void testCompareTo() {
+               AnyLongObjectId id1 = LongObjectId.fromString(
+                               "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef");
+               assertEquals(0, id1.compareTo(LongObjectId.fromString(
+                               "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef")));
+               assertEquals(0, id1.compareTo(id1));
+
+               assertEquals(-1, id1.compareTo(LongObjectId.fromString(
+                               "1123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef")));
+               assertEquals(-1, id1.compareTo(LongObjectId.fromString(
+                               "0123456789abcdef1123456789abcdef0123456789abcdef0123456789abcdef")));
+               assertEquals(-1, id1.compareTo(LongObjectId.fromString(
+                               "0123456789abcdef0123456789abcdef1123456789abcdef0123456789abcdef")));
+               assertEquals(-1, id1.compareTo(LongObjectId.fromString(
+                               "0123456789abcdef0123456789abcdef0123456789abcdef1123456789abcdef")));
+
+               assertEquals(1, id1.compareTo(LongObjectId.fromString(
+                               "0023456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef")));
+               assertEquals(1, id1.compareTo(LongObjectId.fromString(
+                               "0123456789abcdef0023456789abcdef0123456789abcdef0123456789abcdef")));
+               assertEquals(1, id1.compareTo(LongObjectId.fromString(
+                               "0123456789abcdef0123456789abcdef0023456789abcdef0123456789abcdef")));
+               assertEquals(1, id1.compareTo(LongObjectId.fromString(
+                               "0123456789abcdef0123456789abcdef0123456789abcdef0023456789abcdef")));
+       }
+
+       @Test
+       public void testCompareToByte() {
+               AnyLongObjectId id1 = LongObjectId.fromString(
+                               "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef");
+               byte[] buf = new byte[32];
+               id1.copyRawTo(buf, 0);
+               assertEquals(0, id1.compareTo(buf, 0));
+
+               LongObjectId
+                               .fromString(
+                                               "1123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef")
+                               .copyRawTo(buf, 0);
+               assertEquals(-1, id1.compareTo(buf, 0));
+
+               LongObjectId
+                               .fromString(
+                                               "0023456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef")
+                               .copyRawTo(buf, 0);
+               assertEquals(1, id1.compareTo(buf, 0));
+       }
+
+       @Test
+       public void testCompareToLong() {
+               AnyLongObjectId id1 = new LongObjectId(1L, 2L, 3L, 4L);
+               long[] buf = new long[4];
+               id1.copyRawTo(buf, 0);
+               assertEquals(0, id1.compareTo(buf, 0));
+
+               new LongObjectId(2L, 2L, 3L, 4L).copyRawTo(buf, 0);
+               assertEquals(-1, id1.compareTo(buf, 0));
+
+               new LongObjectId(0L, 2L, 3L, 4L).copyRawTo(buf, 0);
+               assertEquals(1, id1.compareTo(buf, 0));
+       }
+
+       @Test
+       public void testCopyToByte() {
+               AnyLongObjectId id1 = LongObjectIdTestUtils.hash("test");
+               byte[] buf = new byte[64];
+               id1.copyTo(buf, 0);
+               assertEquals(id1, LongObjectId.fromString(buf, 0));
+       }
+
+       @Test
+       public void testCopyRawToByteBuffer() {
+               AnyLongObjectId id1 = LongObjectIdTestUtils.hash("test");
+               ByteBuffer buf = ByteBuffer.allocate(32);
+               id1.copyRawTo(buf);
+               assertEquals(id1, LongObjectId.fromRaw(buf.array(), 0));
+       }
+
+       @Test
+       public void testCopyToByteBuffer() {
+               AnyLongObjectId id1 = LongObjectIdTestUtils.hash("test");
+               ByteBuffer buf = ByteBuffer.allocate(64);
+               id1.copyTo(buf);
+               assertEquals(id1, LongObjectId.fromString(buf.array(), 0));
+       }
+
+       @Test
+       public void testCopyRawToOutputStream() throws IOException {
+               AnyLongObjectId id1 = LongObjectIdTestUtils.hash("test");
+               ByteArrayOutputStream os = new ByteArrayOutputStream(32);
+               id1.copyRawTo(os);
+               assertEquals(id1, LongObjectId.fromRaw(os.toByteArray(), 0));
+       }
+
+       @Test
+       public void testCopyToOutputStream() throws IOException {
+               AnyLongObjectId id1 = LongObjectIdTestUtils.hash("test");
+               ByteArrayOutputStream os = new ByteArrayOutputStream(64);
+               id1.copyTo(os);
+               assertEquals(id1, LongObjectId.fromString(os.toByteArray(), 0));
+       }
+
+       @Test
+       public void testCopyToWriter() throws IOException {
+               AnyLongObjectId id1 = LongObjectIdTestUtils.hash("test");
+               ByteArrayOutputStream os = new ByteArrayOutputStream(64);
+               OutputStreamWriter w = new OutputStreamWriter(os, Constants.CHARSET);
+               id1.copyTo(w);
+               w.close();
+               assertEquals(id1, LongObjectId.fromString(os.toByteArray(), 0));
+       }
+
+       @Test
+       public void testCopyToWriterWithBuf() throws IOException {
+               AnyLongObjectId id1 = LongObjectIdTestUtils.hash("test");
+               ByteArrayOutputStream os = new ByteArrayOutputStream(64);
+               OutputStreamWriter w = new OutputStreamWriter(os, Constants.CHARSET);
+               char[] buf = new char[64];
+               id1.copyTo(buf, w);
+               w.close();
+               assertEquals(id1, LongObjectId.fromString(os.toByteArray(), 0));
+       }
+
+       @Test
+       public void testCopyToStringBuilder() {
+               AnyLongObjectId id1 = LongObjectIdTestUtils.hash("test");
+               StringBuilder sb = new StringBuilder();
+               char[] buf = new char[64];
+               id1.copyTo(buf, sb);
+               assertEquals(id1, LongObjectId.fromString(sb.toString()));
+       }
+
+       @Test
+       public void testCopy() {
+               AnyLongObjectId id1 = LongObjectIdTestUtils.hash("test");
+               assertEquals(id1.copy(), id1);
+               MutableLongObjectId id2 = new MutableLongObjectId();
+               id2.fromObjectId(id1);
+               assertEquals(id1, id2.copy());
+       }
+}
diff --git a/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/MutableLongObjectIdTest.java b/org.eclipse.jgit.lfs.test/tst/org/eclipse/jgit/lfs/lib/MutableLongObjectIdTest.java
new file mode 100644 (file)
index 0000000..9bdc3ab
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2015, Matthias Sohn <matthias.sohn@sap.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.eclipse.jgit.lfs.lib;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+/*
+ * Ported to SHA-256 from org.eclipse.jgit.lib.MutableObjectIdTest
+ */
+public class MutableLongObjectIdTest {
+
+       @Test
+       public void testFromRawLong() {
+               MutableLongObjectId m = new MutableLongObjectId();
+               m.fromRaw(new long[] { 1L, 2L, 3L, 4L });
+               assertEquals(new LongObjectId(1L, 2L, 3L, 4L), m);
+       }
+
+       @Test
+       public void testFromString() {
+               AnyLongObjectId id = new LongObjectId(1L, 2L, 3L, 4L);
+               MutableLongObjectId m = new MutableLongObjectId();
+               m.fromString(id.name());
+               assertEquals(id, m);
+       }
+
+       @Test
+       public void testFromStringByte() {
+               AnyLongObjectId id = new LongObjectId(1L, 2L, 3L, 4L);
+               MutableLongObjectId m = new MutableLongObjectId();
+               byte[] buf = new byte[64];
+               id.copyTo(buf, 0);
+               m.fromString(buf, 0);
+               assertEquals(id, m);
+       }
+
+       @Test
+       public void testCopy() {
+               MutableLongObjectId m = new MutableLongObjectId();
+               m.fromRaw(new long[] { 1L, 2L, 3L, 4L });
+               assertEquals(m, new MutableLongObjectId(m));
+       }
+
+       @Test
+       public void testToObjectId() {
+               MutableLongObjectId m = new MutableLongObjectId();
+               m.fromRaw(new long[] { 1L, 2L, 3L, 4L });
+               assertEquals(m, m.toObjectId());
+       }
+}
diff --git a/org.eclipse.jgit.lfs/.classpath b/org.eclipse.jgit.lfs/.classpath
new file mode 100644 (file)
index 0000000..04a2be7
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="src" path="resources"/>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.jgit.lfs/.fbprefs b/org.eclipse.jgit.lfs/.fbprefs
new file mode 100644 (file)
index 0000000..81a0767
--- /dev/null
@@ -0,0 +1,125 @@
+#FindBugs User Preferences
+#Mon May 04 16:24:13 PDT 2009
+detectorAppendingToAnObjectOutputStream=AppendingToAnObjectOutputStream|true
+detectorBadAppletConstructor=BadAppletConstructor|false
+detectorBadResultSetAccess=BadResultSetAccess|true
+detectorBadSyntaxForRegularExpression=BadSyntaxForRegularExpression|true
+detectorBadUseOfReturnValue=BadUseOfReturnValue|true
+detectorBadlyOverriddenAdapter=BadlyOverriddenAdapter|true
+detectorBooleanReturnNull=BooleanReturnNull|true
+detectorCallToUnsupportedMethod=CallToUnsupportedMethod|true
+detectorCheckImmutableAnnotation=CheckImmutableAnnotation|true
+detectorCheckTypeQualifiers=CheckTypeQualifiers|true
+detectorCloneIdiom=CloneIdiom|false
+detectorComparatorIdiom=ComparatorIdiom|true
+detectorConfusedInheritance=ConfusedInheritance|true
+detectorConfusionBetweenInheritedAndOuterMethod=ConfusionBetweenInheritedAndOuterMethod|true
+detectorCrossSiteScripting=CrossSiteScripting|true
+detectorDoInsideDoPrivileged=DoInsideDoPrivileged|true
+detectorDontCatchIllegalMonitorStateException=DontCatchIllegalMonitorStateException|true
+detectorDontUseEnum=DontUseEnum|true
+detectorDroppedException=DroppedException|true
+detectorDumbMethodInvocations=DumbMethodInvocations|true
+detectorDumbMethods=DumbMethods|true
+detectorDuplicateBranches=DuplicateBranches|true
+detectorEmptyZipFileEntry=EmptyZipFileEntry|true
+detectorEqualsOperandShouldHaveClassCompatibleWithThis=EqualsOperandShouldHaveClassCompatibleWithThis|true
+detectorFinalizerNullsFields=FinalizerNullsFields|true
+detectorFindBadCast2=FindBadCast2|true
+detectorFindBadForLoop=FindBadForLoop|true
+detectorFindCircularDependencies=FindCircularDependencies|false
+detectorFindDeadLocalStores=FindDeadLocalStores|true
+detectorFindDoubleCheck=FindDoubleCheck|true
+detectorFindEmptySynchronizedBlock=FindEmptySynchronizedBlock|true
+detectorFindFieldSelfAssignment=FindFieldSelfAssignment|true
+detectorFindFinalizeInvocations=FindFinalizeInvocations|true
+detectorFindFloatEquality=FindFloatEquality|true
+detectorFindHEmismatch=FindHEmismatch|true
+detectorFindInconsistentSync2=FindInconsistentSync2|true
+detectorFindJSR166LockMonitorenter=FindJSR166LockMonitorenter|true
+detectorFindLocalSelfAssignment2=FindLocalSelfAssignment2|true
+detectorFindMaskedFields=FindMaskedFields|true
+detectorFindMismatchedWaitOrNotify=FindMismatchedWaitOrNotify|true
+detectorFindNakedNotify=FindNakedNotify|true
+detectorFindNonSerializableStoreIntoSession=FindNonSerializableStoreIntoSession|true
+detectorFindNonSerializableValuePassedToWriteObject=FindNonSerializableValuePassedToWriteObject|true
+detectorFindNonShortCircuit=FindNonShortCircuit|true
+detectorFindNullDeref=FindNullDeref|true
+detectorFindNullDerefsInvolvingNonShortCircuitEvaluation=FindNullDerefsInvolvingNonShortCircuitEvaluation|true
+detectorFindOpenStream=FindOpenStream|true
+detectorFindPuzzlers=FindPuzzlers|true
+detectorFindRefComparison=FindRefComparison|true
+detectorFindReturnRef=FindReturnRef|true
+detectorFindRunInvocations=FindRunInvocations|true
+detectorFindSelfComparison=FindSelfComparison|true
+detectorFindSelfComparison2=FindSelfComparison2|true
+detectorFindSleepWithLockHeld=FindSleepWithLockHeld|true
+detectorFindSpinLoop=FindSpinLoop|true
+detectorFindSqlInjection=FindSqlInjection|true
+detectorFindTwoLockWait=FindTwoLockWait|true
+detectorFindUncalledPrivateMethods=FindUncalledPrivateMethods|true
+detectorFindUnconditionalWait=FindUnconditionalWait|true
+detectorFindUninitializedGet=FindUninitializedGet|true
+detectorFindUnrelatedTypesInGenericContainer=FindUnrelatedTypesInGenericContainer|true
+detectorFindUnreleasedLock=FindUnreleasedLock|true
+detectorFindUnsatisfiedObligation=FindUnsatisfiedObligation|true
+detectorFindUnsyncGet=FindUnsyncGet|true
+detectorFindUselessControlFlow=FindUselessControlFlow|true
+detectorFormatStringChecker=FormatStringChecker|true
+detectorHugeSharedStringConstants=HugeSharedStringConstants|true
+detectorIDivResultCastToDouble=IDivResultCastToDouble|true
+detectorIncompatMask=IncompatMask|true
+detectorInconsistentAnnotations=InconsistentAnnotations|true
+detectorInefficientMemberAccess=InefficientMemberAccess|false
+detectorInefficientToArray=InefficientToArray|true
+detectorInfiniteLoop=InfiniteLoop|true
+detectorInfiniteRecursiveLoop=InfiniteRecursiveLoop|true
+detectorInfiniteRecursiveLoop2=InfiniteRecursiveLoop2|false
+detectorInheritanceUnsafeGetResource=InheritanceUnsafeGetResource|true
+detectorInitializationChain=InitializationChain|true
+detectorInstantiateStaticClass=InstantiateStaticClass|true
+detectorInvalidJUnitTest=InvalidJUnitTest|true
+detectorIteratorIdioms=IteratorIdioms|true
+detectorLazyInit=LazyInit|true
+detectorLoadOfKnownNullValue=LoadOfKnownNullValue|true
+detectorMethodReturnCheck=MethodReturnCheck|true
+detectorMultithreadedInstanceAccess=MultithreadedInstanceAccess|true
+detectorMutableLock=MutableLock|true
+detectorMutableStaticFields=MutableStaticFields|true
+detectorNaming=Naming|true
+detectorNumberConstructor=NumberConstructor|true
+detectorOverridingEqualsNotSymmetrical=OverridingEqualsNotSymmetrical|true
+detectorPreferZeroLengthArrays=PreferZeroLengthArrays|true
+detectorPublicSemaphores=PublicSemaphores|false
+detectorQuestionableBooleanAssignment=QuestionableBooleanAssignment|true
+detectorReadReturnShouldBeChecked=ReadReturnShouldBeChecked|true
+detectorRedundantInterfaces=RedundantInterfaces|true
+detectorRepeatedConditionals=RepeatedConditionals|true
+detectorRuntimeExceptionCapture=RuntimeExceptionCapture|true
+detectorSerializableIdiom=SerializableIdiom|true
+detectorStartInConstructor=StartInConstructor|true
+detectorStaticCalendarDetector=StaticCalendarDetector|true
+detectorStringConcatenation=StringConcatenation|true
+detectorSuperfluousInstanceOf=SuperfluousInstanceOf|true
+detectorSuspiciousThreadInterrupted=SuspiciousThreadInterrupted|true
+detectorSwitchFallthrough=SwitchFallthrough|true
+detectorSynchronizeAndNullCheckField=SynchronizeAndNullCheckField|true
+detectorSynchronizeOnClassLiteralNotGetClass=SynchronizeOnClassLiteralNotGetClass|true
+detectorSynchronizingOnContentsOfFieldToProtectField=SynchronizingOnContentsOfFieldToProtectField|true
+detectorURLProblems=URLProblems|true
+detectorUncallableMethodOfAnonymousClass=UncallableMethodOfAnonymousClass|true
+detectorUnnecessaryMath=UnnecessaryMath|true
+detectorUnreadFields=UnreadFields|true
+detectorUseObjectEquals=UseObjectEquals|false
+detectorUselessSubclassMethod=UselessSubclassMethod|false
+detectorVarArgsProblems=VarArgsProblems|true
+detectorVolatileUsage=VolatileUsage|true
+detectorWaitInLoop=WaitInLoop|true
+detectorWrongMapIterator=WrongMapIterator|true
+detectorXMLFactoryBypass=XMLFactoryBypass|true
+detector_threshold=2
+effort=default
+excludefilter0=findBugs/FindBugsExcludeFilter.xml
+filter_settings=Medium|BAD_PRACTICE,CORRECTNESS,MT_CORRECTNESS,PERFORMANCE,STYLE|false
+filter_settings_neg=MALICIOUS_CODE,NOISE,I18N,SECURITY,EXPERIMENTAL|
+run_at_full_build=true
diff --git a/org.eclipse.jgit.lfs/.gitignore b/org.eclipse.jgit.lfs/.gitignore
new file mode 100644 (file)
index 0000000..934e0e0
--- /dev/null
@@ -0,0 +1,2 @@
+/bin
+/target
diff --git a/org.eclipse.jgit.lfs/.project b/org.eclipse.jgit.lfs/.project
new file mode 100644 (file)
index 0000000..d9beec1
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.eclipse.jgit.lfs</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.eclipse.jgit.lfs/.settings/org.eclipse.core.resources.prefs b/org.eclipse.jgit.lfs/.settings/org.eclipse.core.resources.prefs
new file mode 100644 (file)
index 0000000..99f26c0
--- /dev/null
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.jgit.lfs/.settings/org.eclipse.core.runtime.prefs b/org.eclipse.jgit.lfs/.settings/org.eclipse.core.runtime.prefs
new file mode 100644 (file)
index 0000000..5a0ad22
--- /dev/null
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/org.eclipse.jgit.lfs/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jgit.lfs/.settings/org.eclipse.jdt.core.prefs
new file mode 100644 (file)
index 0000000..ff39d16
--- /dev/null
@@ -0,0 +1,398 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=warning
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
+org.eclipse.jdt.core.compiler.problem.deadCode=error
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=error
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=error
+org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=1
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=80
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/org.eclipse.jgit.lfs/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.jgit.lfs/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644 (file)
index 0000000..c336cce
--- /dev/null
@@ -0,0 +1,61 @@
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_JGit Format
+formatter_settings_version=12
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=false
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=false
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=true
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=false
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=false
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.jgit.lfs/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.jgit.lfs/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644 (file)
index 0000000..3dec4d9
--- /dev/null
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.jgit.lfs/.settings/org.eclipse.mylyn.team.ui.prefs b/org.eclipse.jgit.lfs/.settings/org.eclipse.mylyn.team.ui.prefs
new file mode 100644 (file)
index 0000000..ce7a0f0
--- /dev/null
@@ -0,0 +1,2 @@
+commit.comment.template=${task.description} \n\nBug\: ${task.key}
+eclipse.preferences.version=1
diff --git a/org.eclipse.jgit.lfs/.settings/org.eclipse.pde.api.tools.prefs b/org.eclipse.jgit.lfs/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644 (file)
index 0000000..3294d4f
--- /dev/null
@@ -0,0 +1,98 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Ignore
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Error
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+MISSING_EE_DESCRIPTIONS=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=false
+eclipse.preferences.version=1
+incompatible_api_component_version=Error
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/org.eclipse.jgit.lfs/.settings/org.eclipse.pde.core.prefs b/org.eclipse.jgit.lfs/.settings/org.eclipse.pde.core.prefs
new file mode 100644 (file)
index 0000000..923c37f
--- /dev/null
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+resolve.requirebundle=false
diff --git a/org.eclipse.jgit.lfs/BUCK b/org.eclipse.jgit.lfs/BUCK
new file mode 100644 (file)
index 0000000..ddb3a10
--- /dev/null
@@ -0,0 +1,17 @@
+SRCS = glob(['src/**'])
+RESOURCES = glob(['resources/**'])
+
+java_library(
+  name = 'jgit-lfs',
+  srcs = SRCS,
+  resources = RESOURCES,
+  deps = [
+    '//org.eclipse.jgit:jgit'
+  ],
+  visibility = ['PUBLIC'],
+)
+
+java_sources(
+  name = 'jgit-lfs_src',
+  srcs = SRCS + RESOURCES,
+)
diff --git a/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF b/org.eclipse.jgit.lfs/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..9a1fd7b
--- /dev/null
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %plugin_name
+Bundle-SymbolicName: org.eclipse.jgit.lfs
+Bundle-Version: 4.3.0.qualifier
+Bundle-Localization: plugin
+Bundle-Vendor: %provider_name
+Export-Package: org.eclipse.jgit.lfs.errors;version="4.3.0",
+ org.eclipse.jgit.lfs.internal;version="4.3.0";x-friends:="org.eclipse.jgit.lfs.test",
+ org.eclipse.jgit.lfs.lib;version="4.3.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Import-Package: org.eclipse.jgit.internal.storage.file;version="[4.3.0,4.4.0)",
+ org.eclipse.jgit.lib;version="[4.3.0,4.4.0)",
+ org.eclipse.jgit.nls;version="[4.3.0,4.4.0)",
+ org.eclipse.jgit.util;version="[4.3.0,4.4.0)"
diff --git a/org.eclipse.jgit.lfs/about.html b/org.eclipse.jgit.lfs/about.html
new file mode 100644 (file)
index 0000000..721e62d
--- /dev/null
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Distribution License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+       margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<p><b>Eclipse Distribution License - v 1.0</b></p>
+
+<p>Copyright (c) 2007, Eclipse Foundation, Inc. and its licensors. </p>
+
+<p>All rights reserved.</p>
+<p>Redistribution and use in source and binary forms, with or without modification,
+       are permitted provided that the following conditions are met:
+<ul><li>Redistributions of source code must retain the above copyright notice,
+       this list of conditions and the following disclaimer. </li>
+<li>Redistributions in binary form must reproduce the above copyright notice,
+       this list of conditions and the following disclaimer in the documentation
+       and/or other materials provided with the distribution. </li>
+<li>Neither the name of the Eclipse Foundation, Inc. nor the names of its
+       contributors may be used to endorse or promote products derived from
+       this software without specific prior written permission. </li></ul>
+</p>
+<p>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.</p>
+
+</body>
+
+</html>
diff --git a/org.eclipse.jgit.lfs/build.properties b/org.eclipse.jgit.lfs/build.properties
new file mode 100644 (file)
index 0000000..8148271
--- /dev/null
@@ -0,0 +1,7 @@
+source.. = src/,\
+           resources/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.properties,\
+               about.html
diff --git a/org.eclipse.jgit.lfs/plugin.properties b/org.eclipse.jgit.lfs/plugin.properties
new file mode 100644 (file)
index 0000000..7c22ddb
--- /dev/null
@@ -0,0 +1,2 @@
+plugin_name=JGit Large File Storage
+provider_name=Eclipse JGit
diff --git a/org.eclipse.jgit.lfs/pom.xml b/org.eclipse.jgit.lfs/pom.xml
new file mode 100644 (file)
index 0000000..bfee4ca
--- /dev/null
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright (C) 2015, Matthias Sohn <matthias.sohn@sap.com>
+   and other copyright owners as documented in the project's IP log.
+
+   This program and the accompanying materials are made available
+   under the terms of the Eclipse Distribution License v1.0 which
+   accompanies this distribution, is reproduced below, and is
+   available at http://www.eclipse.org/org/documents/edl-v10.php
+
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or
+   without modification, are permitted provided that the following
+   conditions are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above
+     copyright notice, this list of conditions and the following
+     disclaimer in the documentation and/or other materials provided
+     with the distribution.
+
+   - Neither the name of the Eclipse Foundation, Inc. nor the
+     names of its contributors may be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+   CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+   OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+   CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.jgit</groupId>
+    <artifactId>org.eclipse.jgit-parent</artifactId>
+    <version>4.3.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>org.eclipse.jgit.lfs</artifactId>
+  <name>JGit - Large File Storage</name>
+
+  <description>
+    JGit Large File Storage (LFS) implementation.
+  </description>
+
+  <properties>
+    <translate-qualifier/>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.eclipse.jgit</groupId>
+      <artifactId>org.eclipse.jgit</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+  <build>
+    <sourceDirectory>src/</sourceDirectory>
+
+    <resources>
+      <resource>
+        <directory>.</directory>
+        <includes>
+          <include>plugin.properties</include>
+          <include>about.html</include>
+        </includes>
+      </resource>
+      <resource>
+        <directory>resources/</directory>
+      </resource>
+    </resources>
+
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-source-plugin</artifactId>
+        <inherited>true</inherited>
+        <executions>
+          <execution>
+            <id>attach-sources</id>
+            <phase>process-classes</phase>
+            <goals>
+              <goal>jar</goal>
+            </goals>
+            <configuration>
+              <archive>
+                <manifestFile>${source-bundle-manifest}</manifestFile>
+              </archive>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifestFile>${bundle-manifest}</manifestFile>
+          </archive>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>clirr-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>clirr-maven-plugin</artifactId>
+        <version>${clirr-version}</version>
+        <configuration>
+          <comparisonVersion>${jgit-last-release-version}</comparisonVersion>
+          <minSeverity>info</minSeverity>
+        </configuration>
+      </plugin>
+    </plugins>
+  </reporting>
+</project>
diff --git a/org.eclipse.jgit.lfs/resources/org/eclipse/jgit/lfs/internal/LfsText.properties b/org.eclipse.jgit.lfs/resources/org/eclipse/jgit/lfs/internal/LfsText.properties
new file mode 100644 (file)
index 0000000..700e2d5
--- /dev/null
@@ -0,0 +1,4 @@
+incorrectLONG_OBJECT_ID_LENGTH=Incorrect LONG_OBJECT_ID_LENGTH.
+invalidLongId=Invalid id: {0}
+invalidLongIdLength=Invalid id length {0}; should be {1}
+requiredHashFunctionNotAvailable=Required hash function {0} not available.
\ No newline at end of file
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/InvalidLongObjectIdException.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/errors/InvalidLongObjectIdException.java
new file mode 100644 (file)
index 0000000..1f6e2d1
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2009, Jonas Fonseca <fonseca@diku.dk>
+ * Copyright (C) 2007, Robin Rosenberg <robin.rosenberg@dewire.com>
+ * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.eclipse.jgit.lfs.errors;
+
+import java.io.UnsupportedEncodingException;
+import java.text.MessageFormat;
+
+import org.eclipse.jgit.lfs.internal.LfsText;
+
+/**
+ * Thrown when an invalid long object id is passed in as an argument.
+ *
+ * @since 4.3
+ */
+public class InvalidLongObjectIdException extends IllegalArgumentException {
+       private static final long serialVersionUID = 1L;
+
+       /**
+        * Create exception with bytes of the invalid object id.
+        *
+        * @param bytes containing the invalid id.
+        * @param offset in the byte array where the error occurred.
+        * @param length of the sequence of invalid bytes.
+        */
+       public InvalidLongObjectIdException(byte[] bytes, int offset, int length) {
+               super(MessageFormat.format(LfsText.get().invalidLongId,
+                               asAscii(bytes, offset, length)));
+       }
+
+       /**
+        * @param idString
+        *            String containing the invalid id
+        */
+       public InvalidLongObjectIdException(String idString) {
+               super(MessageFormat.format(LfsText.get().invalidLongId, idString));
+       }
+
+       private static String asAscii(byte[] bytes, int offset, int length) {
+               try {
+                       return ": " + new String(bytes, offset, length, "US-ASCII"); //$NON-NLS-1$ //$NON-NLS-2$
+               } catch (UnsupportedEncodingException e2) {
+                       return ""; //$NON-NLS-1$
+               } catch (StringIndexOutOfBoundsException e2) {
+                       return ""; //$NON-NLS-1$
+               }
+       }
+}
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsText.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/internal/LfsText.java
new file mode 100644 (file)
index 0000000..eaffcc9
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2015, Matthias Sohn <matthias.sohn@sap.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.eclipse.jgit.lfs.internal;
+
+import org.eclipse.jgit.nls.NLS;
+import org.eclipse.jgit.nls.TranslationBundle;
+
+/**
+ * Translation bundle for JGit LFS server
+ */
+public class LfsText extends TranslationBundle {
+
+       /**
+        * @return an instance of this translation bundle
+        */
+       public static LfsText get() {
+               return NLS.getBundleFor(LfsText.class);
+       }
+
+       // @formatter:off
+       /***/ public String incorrectLONG_OBJECT_ID_LENGTH;
+       /***/ public String invalidLongId;
+       /***/ public String invalidLongIdLength;
+       /***/ public String requiredHashFunctionNotAvailable;
+}
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectId.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AbbreviatedLongObjectId.java
new file mode 100644 (file)
index 0000000..e9eb0e3
--- /dev/null
@@ -0,0 +1,375 @@
+/*
+ * Copyright (C) 2015, Matthias Sohn <matthias.sohn@sap.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.eclipse.jgit.lfs.lib;
+
+import java.io.Serializable;
+import java.text.MessageFormat;
+
+import org.eclipse.jgit.lfs.errors.InvalidLongObjectIdException;
+import org.eclipse.jgit.lfs.internal.LfsText;
+import org.eclipse.jgit.lib.AbbreviatedObjectId;
+import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.util.NB;
+import org.eclipse.jgit.util.RawParseUtils;
+
+/**
+ * A prefix abbreviation of an {@link LongObjectId}.
+ * <p>
+ * Enable abbreviating SHA-256 strings used by Git LFS, using sufficient leading
+ * digits from the LongObjectId name to still be unique within the repository
+ * the string was generated from. These ids are likely to be unique for a useful
+ * period of time, especially if they contain at least 6-10 hex digits.
+ * <p>
+ * This class converts the hex string into a binary form, to make it more
+ * efficient for matching against an object.
+ *
+ * Ported to SHA-256 from {@link AbbreviatedObjectId}
+ *
+ * @since 4.3
+ */
+public final class AbbreviatedLongObjectId implements Serializable {
+       private static final long serialVersionUID = 1L;
+
+       /**
+        * Test a string of characters to verify it is a hex format.
+        * <p>
+        * If true the string can be parsed with {@link #fromString(String)}.
+        *
+        * @param id
+        *            the string to test.
+        * @return true if the string can converted into an AbbreviatedObjectId.
+        */
+       public static final boolean isId(final String id) {
+               if (id.length() < 2
+                               || Constants.LONG_OBJECT_ID_STRING_LENGTH < id.length())
+                       return false;
+               try {
+                       for (int i = 0; i < id.length(); i++)
+                               RawParseUtils.parseHexInt4((byte) id.charAt(i));
+                       return true;
+               } catch (ArrayIndexOutOfBoundsException e) {
+                       return false;
+               }
+       }
+
+       /**
+        * Convert an AbbreviatedObjectId from hex characters (US-ASCII).
+        *
+        * @param buf
+        *            the US-ASCII buffer to read from.
+        * @param offset
+        *            position to read the first character from.
+        * @param end
+        *            one past the last position to read (<code>end-offset</code> is
+        *            the length of the string).
+        * @return the converted object id.
+        */
+       public static final AbbreviatedLongObjectId fromString(final byte[] buf,
+                       final int offset, final int end) {
+               if (end - offset > Constants.LONG_OBJECT_ID_STRING_LENGTH)
+                       throw new IllegalArgumentException(MessageFormat.format(
+                                                       LfsText.get().invalidLongIdLength,
+                                       Integer.valueOf(end - offset),
+                                       Integer.valueOf(Constants.LONG_OBJECT_ID_STRING_LENGTH)));
+               return fromHexString(buf, offset, end);
+       }
+
+       /**
+        * Convert an AbbreviatedObjectId from an {@link AnyObjectId}.
+        * <p>
+        * This method copies over all bits of the Id, and is therefore complete
+        * (see {@link #isComplete()}).
+        *
+        * @param id
+        *            the {@link ObjectId} to convert from.
+        * @return the converted object id.
+        */
+       public static final AbbreviatedLongObjectId fromLongObjectId(
+                       AnyLongObjectId id) {
+               return new AbbreviatedLongObjectId(
+                               Constants.LONG_OBJECT_ID_STRING_LENGTH, id.w1, id.w2, id.w3,
+                               id.w4);
+       }
+
+       /**
+        * Convert an AbbreviatedLongObjectId from hex characters.
+        *
+        * @param str
+        *            the string to read from. Must be &lt;= 64 characters.
+        * @return the converted object id.
+        */
+       public static final AbbreviatedLongObjectId fromString(final String str) {
+               if (str.length() > Constants.LONG_OBJECT_ID_STRING_LENGTH)
+                       throw new IllegalArgumentException(
+                                       MessageFormat.format(LfsText.get().invalidLongId, str));
+               final byte[] b = org.eclipse.jgit.lib.Constants.encodeASCII(str);
+               return fromHexString(b, 0, b.length);
+       }
+
+       private static final AbbreviatedLongObjectId fromHexString(final byte[] bs,
+                       int ptr, final int end) {
+               try {
+                       final long a = hexUInt64(bs, ptr, end);
+                       final long b = hexUInt64(bs, ptr + 16, end);
+                       final long c = hexUInt64(bs, ptr + 32, end);
+                       final long d = hexUInt64(bs, ptr + 48, end);
+                       return new AbbreviatedLongObjectId(end - ptr, a, b, c, d);
+               } catch (ArrayIndexOutOfBoundsException e1) {
+                       throw new InvalidLongObjectIdException(bs, ptr, end - ptr);
+               }
+       }
+
+       private static final long hexUInt64(final byte[] bs, int p, final int end) {
+               if (16 <= end - p)
+                       return RawParseUtils.parseHexInt64(bs, p);
+
+               long r = 0;
+               int n = 0;
+               while (n < 16 && p < end) {
+                       r <<= 4;
+                       r |= RawParseUtils.parseHexInt4(bs[p++]);
+                       n++;
+               }
+               return r << (16 - n) * 4;
+       }
+
+       static long mask(final int nibbles, final long word, final long v) {
+               final long b = (word - 1) * 16;
+               if (b + 16 <= nibbles) {
+                       // We have all of the bits required for this word.
+                       //
+                       return v;
+               }
+
+               if (nibbles <= b) {
+                       // We have none of the bits required for this word.
+                       //
+                       return 0;
+               }
+
+               final long s = 64 - (nibbles - b) * 4;
+               return (v >>> s) << s;
+       }
+
+       /** Number of half-bytes used by this id. */
+       final int nibbles;
+
+       final long w1;
+
+       final long w2;
+
+       final long w3;
+
+       final long w4;
+
+       AbbreviatedLongObjectId(final int n, final long new_1, final long new_2,
+                       final long new_3, final long new_4) {
+               nibbles = n;
+               w1 = new_1;
+               w2 = new_2;
+               w3 = new_3;
+               w4 = new_4;
+       }
+
+       /** @return number of hex digits appearing in this id */
+       public int length() {
+               return nibbles;
+       }
+
+       /** @return true if this ObjectId is actually a complete id. */
+       public boolean isComplete() {
+               return length() == Constants.LONG_OBJECT_ID_STRING_LENGTH;
+       }
+
+       /** @return a complete ObjectId; null if {@link #isComplete()} is false */
+       public LongObjectId toLongObjectId() {
+               return isComplete() ? new LongObjectId(w1, w2, w3, w4) : null;
+       }
+
+       /**
+        * Compares this abbreviation to a full object id.
+        *
+        * @param other
+        *            the other object id.
+        * @return &lt;0 if this abbreviation names an object that is less than
+        *         <code>other</code>; 0 if this abbreviation exactly matches the
+        *         first {@link #length()} digits of <code>other.name()</code>;
+        *         &gt;0 if this abbreviation names an object that is after
+        *         <code>other</code>.
+        */
+       public final int prefixCompare(final AnyLongObjectId other) {
+               int cmp;
+
+               cmp = NB.compareUInt64(w1, mask(1, other.w1));
+               if (cmp != 0)
+                       return cmp;
+
+               cmp = NB.compareUInt64(w2, mask(2, other.w2));
+               if (cmp != 0)
+                       return cmp;
+
+               cmp = NB.compareUInt64(w3, mask(3, other.w3));
+               if (cmp != 0)
+                       return cmp;
+
+               return NB.compareUInt64(w4, mask(4, other.w4));
+       }
+
+       /**
+        * Compare this abbreviation to a network-byte-order LongObjectId.
+        *
+        * @param bs
+        *            array containing the other LongObjectId in network byte order.
+        * @param p
+        *            position within {@code bs} to start the compare at. At least
+        *            32 bytes, starting at this position are required.
+        * @return &lt;0 if this abbreviation names an object that is less than
+        *         <code>other</code>; 0 if this abbreviation exactly matches the
+        *         first {@link #length()} digits of <code>other.name()</code>;
+        *         &gt;0 if this abbreviation names an object that is after
+        *         <code>other</code>.
+        */
+       public final int prefixCompare(final byte[] bs, final int p) {
+               int cmp;
+
+               cmp = NB.compareUInt64(w1, mask(1, NB.decodeInt64(bs, p)));
+               if (cmp != 0)
+                       return cmp;
+
+               cmp = NB.compareUInt64(w2, mask(2, NB.decodeInt64(bs, p + 8)));
+               if (cmp != 0)
+                       return cmp;
+
+               cmp = NB.compareUInt64(w3, mask(3, NB.decodeInt64(bs, p + 16)));
+               if (cmp != 0)
+                       return cmp;
+
+               return NB.compareUInt64(w4, mask(4, NB.decodeInt64(bs, p + 24)));
+       }
+
+       /**
+        * Compare this abbreviation to a network-byte-order LongObjectId.
+        *
+        * @param bs
+        *            array containing the other LongObjectId in network byte order.
+        * @param p
+        *            position within {@code bs} to start the compare at. At least 4
+        *            longs, starting at this position are required.
+        * @return &lt;0 if this abbreviation names an object that is less than
+        *         <code>other</code>; 0 if this abbreviation exactly matches the
+        *         first {@link #length()} digits of <code>other.name()</code>;
+        *         &gt;0 if this abbreviation names an object that is after
+        *         <code>other</code>.
+        */
+       public final int prefixCompare(final long[] bs, final int p) {
+               int cmp;
+
+               cmp = NB.compareUInt64(w1, mask(1, bs[p]));
+               if (cmp != 0)
+                       return cmp;
+
+               cmp = NB.compareUInt64(w2, mask(2, bs[p + 1]));
+               if (cmp != 0)
+                       return cmp;
+
+               cmp = NB.compareUInt64(w3, mask(3, bs[p + 2]));
+               if (cmp != 0)
+                       return cmp;
+
+               return NB.compareUInt64(w4, mask(4, bs[p + 3]));
+       }
+
+       /** @return value for a fan-out style map, only valid of length &gt;= 2. */
+       public final int getFirstByte() {
+               return (int) (w1 >>> 56);
+       }
+
+       private long mask(final long word, final long v) {
+               return mask(nibbles, word, v);
+       }
+
+       @Override
+       public int hashCode() {
+               return (int) (w1 >> 32);
+       }
+
+       @Override
+       public boolean equals(final Object o) {
+               if (o instanceof AbbreviatedLongObjectId) {
+                       final AbbreviatedLongObjectId b = (AbbreviatedLongObjectId) o;
+                       return nibbles == b.nibbles && w1 == b.w1 && w2 == b.w2
+                                       && w3 == b.w3 && w4 == b.w4;
+               }
+               return false;
+       }
+
+       /**
+        * @return string form of the abbreviation, in lower case hexadecimal.
+        */
+       public final String name() {
+               final char[] b = new char[Constants.LONG_OBJECT_ID_STRING_LENGTH];
+
+               AnyLongObjectId.formatHexChar(b, 0, w1);
+               if (nibbles <= 16)
+                       return new String(b, 0, nibbles);
+
+               AnyLongObjectId.formatHexChar(b, 16, w2);
+               if (nibbles <= 32)
+                       return new String(b, 0, nibbles);
+
+               AnyLongObjectId.formatHexChar(b, 32, w3);
+               if (nibbles <= 48)
+                       return new String(b, 0, nibbles);
+
+               AnyLongObjectId.formatHexChar(b, 48, w4);
+               return new String(b, 0, nibbles);
+       }
+
+       @SuppressWarnings("nls")
+       @Override
+       public String toString() {
+               return "AbbreviatedLongObjectId[" + name() + "]"; //$NON-NLS-1$
+       }
+}
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AnyLongObjectId.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/AnyLongObjectId.java
new file mode 100644 (file)
index 0000000..1f0df88
--- /dev/null
@@ -0,0 +1,555 @@
+/*
+ * Copyright (C) 2015, Matthias Sohn <matthias.sohn@sap.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.eclipse.jgit.lfs.lib;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.nio.ByteBuffer;
+
+import org.eclipse.jgit.lib.AnyObjectId;
+import org.eclipse.jgit.lib.ObjectReader;
+import org.eclipse.jgit.util.NB;
+
+/**
+ * A (possibly mutable) SHA-256 abstraction.
+ * <p>
+ * If this is an instance of {@link MutableLongObjectId} the concept of equality
+ * with this instance can alter at any time, if this instance is modified to
+ * represent a different object name.
+ *
+ * Ported to SHA-256 from {@link AnyObjectId}
+ *
+ * @since 4.3
+ */
+public abstract class AnyLongObjectId implements Comparable<AnyLongObjectId> {
+
+       /**
+        * Compare two object identifier byte sequences for equality.
+        *
+        * @param firstObjectId
+        *            the first identifier to compare. Must not be null.
+        * @param secondObjectId
+        *            the second identifier to compare. Must not be null.
+        * @return true if the two identifiers are the same.
+        */
+       public static boolean equals(final AnyLongObjectId firstObjectId,
+                       final AnyLongObjectId secondObjectId) {
+               if (firstObjectId == secondObjectId)
+                       return true;
+
+               // We test word 2 first as odds are someone already used our
+               // word 1 as a hash code, and applying that came up with these
+               // two instances we are comparing for equality. Therefore the
+               // first two words are very likely to be identical. We want to
+               // break away from collisions as quickly as possible.
+               //
+               return firstObjectId.w2 == secondObjectId.w2
+                               && firstObjectId.w3 == secondObjectId.w3
+                               && firstObjectId.w4 == secondObjectId.w4
+                               && firstObjectId.w1 == secondObjectId.w1;
+       }
+
+       long w1;
+
+       long w2;
+
+       long w3;
+
+       long w4;
+
+       /**
+        * Get the first 8 bits of the LongObjectId.
+        *
+        * This is a faster version of {@code getByte(0)}.
+        *
+        * @return a discriminator usable for a fan-out style map. Returned values
+        *         are unsigned and thus are in the range [0,255] rather than the
+        *         signed byte range of [-128, 127].
+        */
+       public final int getFirstByte() {
+               return (int) (w1 >>> 56);
+       }
+
+       /**
+        * Get the second 8 bits of the LongObjectId.
+        *
+        * @return a discriminator usable for a fan-out style map. Returned values
+        *         are unsigned and thus are in the range [0,255] rather than the
+        *         signed byte range of [-128, 127].
+        */
+       public final int getSecondByte() {
+               return (int) ((w1 >>> 48) & 0xff);
+       }
+
+       /**
+        * Get any byte from the LongObjectId.
+        *
+        * Callers hard-coding {@code getByte(0)} should instead use the much faster
+        * special case variant {@link #getFirstByte()}.
+        *
+        * @param index
+        *            index of the byte to obtain from the raw form of the
+        *            LongObjectId. Must be in range [0,
+        *            {@link Constants#LONG_OBJECT_ID_LENGTH}).
+        * @return the value of the requested byte at {@code index}. Returned values
+        *         are unsigned and thus are in the range [0,255] rather than the
+        *         signed byte range of [-128, 127].
+        * @throws ArrayIndexOutOfBoundsException
+        *             {@code index} is less than 0, equal to
+        *             {@link Constants#LONG_OBJECT_ID_LENGTH}, or greater than
+        *             {@link Constants#LONG_OBJECT_ID_LENGTH}.
+        */
+       public final int getByte(int index) {
+               long w;
+               switch (index >> 3) {
+               case 0:
+                       w = w1;
+                       break;
+               case 1:
+                       w = w2;
+                       break;
+               case 2:
+                       w = w3;
+                       break;
+               case 3:
+                       w = w4;
+                       break;
+               default:
+                       throw new ArrayIndexOutOfBoundsException(index);
+               }
+
+               return (int) ((w >>> (8 * (15 - (index & 15)))) & 0xff);
+       }
+
+       /**
+        * Compare this LongObjectId to another and obtain a sort ordering.
+        *
+        * @param other
+        *            the other id to compare to. Must not be null.
+        * @return &lt; 0 if this id comes before other; 0 if this id is equal to
+        *         other; &gt; 0 if this id comes after other.
+        */
+       public final int compareTo(final AnyLongObjectId other) {
+               if (this == other)
+                       return 0;
+
+               int cmp;
+
+               cmp = NB.compareUInt64(w1, other.w1);
+               if (cmp != 0)
+                       return cmp;
+
+               cmp = NB.compareUInt64(w2, other.w2);
+               if (cmp != 0)
+                       return cmp;
+
+               cmp = NB.compareUInt64(w3, other.w3);
+               if (cmp != 0)
+                       return cmp;
+
+               return NB.compareUInt64(w4, other.w4);
+       }
+
+       /**
+        * Compare this LongObjectId to a network-byte-order LongObjectId.
+        *
+        * @param bs
+        *            array containing the other LongObjectId in network byte order.
+        * @param p
+        *            position within {@code bs} to start the compare at. At least
+        *            32 bytes, starting at this position are required.
+        * @return a negative integer, zero, or a positive integer as this object is
+        *         less than, equal to, or greater than the specified object.
+        */
+       public final int compareTo(final byte[] bs, final int p) {
+               int cmp;
+
+               cmp = NB.compareUInt64(w1, NB.decodeInt64(bs, p));
+               if (cmp != 0)
+                       return cmp;
+
+               cmp = NB.compareUInt64(w2, NB.decodeInt64(bs, p + 8));
+               if (cmp != 0)
+                       return cmp;
+
+               cmp = NB.compareUInt64(w3, NB.decodeInt64(bs, p + 16));
+               if (cmp != 0)
+                       return cmp;
+
+               return NB.compareUInt64(w4, NB.decodeInt64(bs, p + 24));
+       }
+
+       /**
+        * Compare this LongObjectId to a network-byte-order LongObjectId.
+        *
+        * @param bs
+        *            array containing the other LongObjectId in network byte order.
+        * @param p
+        *            position within {@code bs} to start the compare at. At least 4
+        *            longs, starting at this position are required.
+        * @return a negative integer, zero, or a positive integer as this object is
+        *         less than, equal to, or greater than the specified object.
+        */
+       public final int compareTo(final long[] bs, final int p) {
+               int cmp;
+
+               cmp = NB.compareUInt64(w1, bs[p]);
+               if (cmp != 0)
+                       return cmp;
+
+               cmp = NB.compareUInt64(w2, bs[p + 1]);
+               if (cmp != 0)
+                       return cmp;
+
+               cmp = NB.compareUInt64(w3, bs[p + 2]);
+               if (cmp != 0)
+                       return cmp;
+
+               return NB.compareUInt64(w4, bs[p + 3]);
+       }
+
+       /**
+        * Tests if this LongObjectId starts with the given abbreviation.
+        *
+        * @param abbr
+        *            the abbreviation.
+        * @return true if this LongObjectId begins with the abbreviation; else
+        *         false.
+        */
+       public boolean startsWith(final AbbreviatedLongObjectId abbr) {
+               return abbr.prefixCompare(this) == 0;
+       }
+
+       public final int hashCode() {
+               return (int) (w1 >> 32);
+       }
+
+       /**
+        * Determine if this LongObjectId has exactly the same value as another.
+        *
+        * @param other
+        *            the other id to compare to. May be null.
+        * @return true only if both LongObjectIds have identical bits.
+        */
+       public final boolean equals(final AnyLongObjectId other) {
+               return other != null ? equals(this, other) : false;
+       }
+
+       public final boolean equals(final Object o) {
+               if (o instanceof AnyLongObjectId)
+                       return equals((AnyLongObjectId) o);
+               else
+                       return false;
+       }
+
+       /**
+        * Copy this LongObjectId to an output writer in raw binary.
+        *
+        * @param w
+        *            the buffer to copy to. Must be in big endian order.
+        */
+       public void copyRawTo(final ByteBuffer w) {
+               w.putLong(w1);
+               w.putLong(w2);
+               w.putLong(w3);
+               w.putLong(w4);
+       }
+
+       /**
+        * Copy this LongObjectId to a byte array.
+        *
+        * @param b
+        *            the buffer to copy to.
+        * @param o
+        *            the offset within b to write at.
+        */
+       public void copyRawTo(final byte[] b, final int o) {
+               NB.encodeInt64(b, o, w1);
+               NB.encodeInt64(b, o + 8, w2);
+               NB.encodeInt64(b, o + 16, w3);
+               NB.encodeInt64(b, o + 24, w4);
+       }
+
+       /**
+        * Copy this LongObjectId to an long array.
+        *
+        * @param b
+        *            the buffer to copy to.
+        * @param o
+        *            the offset within b to write at.
+        */
+       public void copyRawTo(final long[] b, final int o) {
+               b[o] = w1;
+               b[o + 1] = w2;
+               b[o + 2] = w3;
+               b[o + 3] = w4;
+       }
+
+       /**
+        * Copy this LongObjectId to an output writer in raw binary.
+        *
+        * @param w
+        *            the stream to write to.
+        * @throws IOException
+        *             the stream writing failed.
+        */
+       public void copyRawTo(final OutputStream w) throws IOException {
+               writeRawLong(w, w1);
+               writeRawLong(w, w2);
+               writeRawLong(w, w3);
+               writeRawLong(w, w4);
+       }
+
+       private static void writeRawLong(final OutputStream w, long v)
+                       throws IOException {
+               w.write((int) (v >>> 56));
+               w.write((int) (v >>> 48));
+               w.write((int) (v >>> 40));
+               w.write((int) (v >>> 32));
+               w.write((int) (v >>> 24));
+               w.write((int) (v >>> 16));
+               w.write((int) (v >>> 8));
+               w.write((int) v);
+       }
+
+       /**
+        * Copy this LongObjectId to an output writer in hex format.
+        *
+        * @param w
+        *            the stream to copy to.
+        * @throws IOException
+        *             the stream writing failed.
+        */
+       public void copyTo(final OutputStream w) throws IOException {
+               w.write(toHexByteArray());
+       }
+
+       /**
+        * Copy this LongObjectId to a byte array in hex format.
+        *
+        * @param b
+        *            the buffer to copy to.
+        * @param o
+        *            the offset within b to write at.
+        */
+       public void copyTo(byte[] b, int o) {
+               formatHexByte(b, o + 0, w1);
+               formatHexByte(b, o + 16, w2);
+               formatHexByte(b, o + 32, w3);
+               formatHexByte(b, o + 48, w4);
+       }
+
+       /**
+        * Copy this LongObjectId to a ByteBuffer in hex format.
+        *
+        * @param b
+        *            the buffer to copy to.
+        */
+       public void copyTo(ByteBuffer b) {
+               b.put(toHexByteArray());
+       }
+
+       private byte[] toHexByteArray() {
+               final byte[] dst = new byte[Constants.LONG_OBJECT_ID_STRING_LENGTH];
+               formatHexByte(dst, 0, w1);
+               formatHexByte(dst, 16, w2);
+               formatHexByte(dst, 32, w3);
+               formatHexByte(dst, 48, w4);
+               return dst;
+       }
+
+       private static final byte[] hexbyte = { '0', '1', '2', '3', '4', '5', '6',
+                       '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+
+       private static void formatHexByte(final byte[] dst, final int p, long w) {
+               int o = p + 15;
+               while (o >= p && w != 0) {
+                       dst[o--] = hexbyte[(int) (w & 0xf)];
+                       w >>>= 4;
+               }
+               while (o >= p)
+                       dst[o--] = '0';
+       }
+
+       /**
+        * Copy this LongObjectId to an output writer in hex format.
+        *
+        * @param w
+        *            the stream to copy to.
+        * @throws IOException
+        *             the stream writing failed.
+        */
+       public void copyTo(final Writer w) throws IOException {
+               w.write(toHexCharArray());
+       }
+
+       /**
+        * Copy this LongObjectId to an output writer in hex format.
+        *
+        * @param tmp
+        *            temporary char array to buffer construct into before writing.
+        *            Must be at least large enough to hold 2 digits for each byte
+        *            of object id (64 characters or larger).
+        * @param w
+        *            the stream to copy to.
+        * @throws IOException
+        *             the stream writing failed.
+        */
+       public void copyTo(final char[] tmp, final Writer w) throws IOException {
+               toHexCharArray(tmp);
+               w.write(tmp, 0, Constants.LONG_OBJECT_ID_STRING_LENGTH);
+       }
+
+       /**
+        * Copy this LongObjectId to a StringBuilder in hex format.
+        *
+        * @param tmp
+        *            temporary char array to buffer construct into before writing.
+        *            Must be at least large enough to hold 2 digits for each byte
+        *            of object id (64 characters or larger).
+        * @param w
+        *            the string to append onto.
+        */
+       public void copyTo(final char[] tmp, final StringBuilder w) {
+               toHexCharArray(tmp);
+               w.append(tmp, 0, Constants.LONG_OBJECT_ID_STRING_LENGTH);
+       }
+
+       char[] toHexCharArray() {
+               final char[] dst = new char[Constants.LONG_OBJECT_ID_STRING_LENGTH];
+               toHexCharArray(dst);
+               return dst;
+       }
+
+       private void toHexCharArray(final char[] dst) {
+               formatHexChar(dst, 0, w1);
+               formatHexChar(dst, 16, w2);
+               formatHexChar(dst, 32, w3);
+               formatHexChar(dst, 48, w4);
+       }
+
+       private static final char[] hexchar = { '0', '1', '2', '3', '4', '5', '6',
+                       '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+
+       static void formatHexChar(final char[] dst, final int p, long w) {
+               int o = p + 15;
+               while (o >= p && w != 0) {
+                       dst[o--] = hexchar[(int) (w & 0xf)];
+                       w >>>= 4;
+               }
+               while (o >= p)
+                       dst[o--] = '0';
+       }
+
+       @SuppressWarnings("nls")
+       @Override
+       public String toString() {
+               return "AnyLongObjectId[" + name() + "]";
+       }
+
+       /**
+        * @return string form of the SHA-256, in lower case hexadecimal.
+        */
+       public final String name() {
+               return new String(toHexCharArray());
+       }
+
+       /**
+        * @return string form of the SHA-256, in lower case hexadecimal.
+        */
+       public final String getName() {
+               return name();
+       }
+
+       /**
+        * Return an abbreviation (prefix) of this object SHA-256.
+        * <p>
+        * This implementation does not guarantee uniqueness. Callers should instead
+        * use {@link ObjectReader#abbreviate(AnyObjectId, int)} to obtain a unique
+        * abbreviation within the scope of a particular object database.
+        *
+        * @param len
+        *            length of the abbreviated string.
+        * @return SHA-256 abbreviation.
+        */
+       public AbbreviatedLongObjectId abbreviate(final int len) {
+               final long a = AbbreviatedLongObjectId.mask(len, 1, w1);
+               final long b = AbbreviatedLongObjectId.mask(len, 2, w2);
+               final long c = AbbreviatedLongObjectId.mask(len, 3, w3);
+               final long d = AbbreviatedLongObjectId.mask(len, 4, w4);
+               return new AbbreviatedLongObjectId(len, a, b, c, d);
+       }
+
+       /**
+        * Obtain an immutable copy of this current object.
+        * <p>
+        * Only returns <code>this</code> if this instance is an unsubclassed
+        * instance of {@link LongObjectId}; otherwise a new instance is returned
+        * holding the same value.
+        * <p>
+        * This method is useful to shed any additional memory that may be tied to
+        * the subclass, yet retain the unique identity of the object id for future
+        * lookups within maps and repositories.
+        *
+        * @return an immutable copy, using the smallest memory footprint possible.
+        */
+       public final LongObjectId copy() {
+               if (getClass() == LongObjectId.class)
+                       return (LongObjectId) this;
+               return new LongObjectId(this);
+       }
+
+       /**
+        * Obtain an immutable copy of this current object.
+        * <p>
+        * See {@link #copy()} if <code>this</code> is a possibly subclassed (but
+        * immutable) identity and the application needs a lightweight identity
+        * <i>only</i> reference.
+        *
+        * @return an immutable copy. May be <code>this</code> if this is already an
+        *         immutable instance.
+        */
+       public abstract LongObjectId toObjectId();
+}
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/Constants.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/Constants.java
new file mode 100644 (file)
index 0000000..92a5c42
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2015, Matthias Sohn <matthias.sohn@sap.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.eclipse.jgit.lfs.lib;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.text.MessageFormat;
+
+import org.eclipse.jgit.lfs.internal.LfsText;
+
+/**
+ * Misc. constants used throughout JGit LFS extension.
+ *
+ * @since 4.3
+ **/
+@SuppressWarnings("nls")
+public final class Constants {
+       /** Hash function used natively by Git LFS extension for large objects. */
+       private static final String LONG_HASH_FUNCTION = "SHA-256";
+
+       /**
+        * A Git LFS large object hash is 256 bits, i.e. 32 bytes.
+        * <p>
+        * Changing this assumption is not going to be as easy as changing this
+        * declaration.
+        */
+       public static final int LONG_OBJECT_ID_LENGTH = 32;
+
+       /**
+        * A Git LFS large object can be expressed as a 64 character string of
+        * hexadecimal digits.
+        *
+        * @see #LONG_OBJECT_ID_LENGTH
+        */
+       public static final int LONG_OBJECT_ID_STRING_LENGTH = LONG_OBJECT_ID_LENGTH
+                       * 2;
+
+       /**
+        * Create a new digest function for objects.
+        *
+        * @return a new digest object.
+        * @throws RuntimeException
+        *             this Java virtual machine does not support the required hash
+        *             function. Very unlikely given that JGit uses a hash function
+        *             that is in the Java reference specification.
+        */
+       public static MessageDigest newMessageDigest() {
+               try {
+                       return MessageDigest.getInstance(LONG_HASH_FUNCTION);
+               } catch (NoSuchAlgorithmException nsae) {
+                       throw new RuntimeException(MessageFormat.format(
+                                       LfsText.get().requiredHashFunctionNotAvailable,
+                                       LONG_HASH_FUNCTION), nsae);
+               }
+       }
+
+       static {
+               if (LONG_OBJECT_ID_LENGTH != newMessageDigest().getDigestLength())
+                       throw new LinkageError(
+                                       LfsText.get().incorrectLONG_OBJECT_ID_LENGTH);
+       }
+}
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/LongObjectId.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/LongObjectId.java
new file mode 100644 (file)
index 0000000..c4a4e43
--- /dev/null
@@ -0,0 +1,309 @@
+/*
+ * Copyright (C) 2015, Matthias Sohn <matthias.sohn@sap.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.eclipse.jgit.lfs.lib;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+
+import org.eclipse.jgit.lfs.errors.InvalidLongObjectIdException;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.util.NB;
+import org.eclipse.jgit.util.RawParseUtils;
+
+/**
+ * A SHA-256 abstraction.
+ *
+ * Ported to SHA-256 from {@link ObjectId}
+ *
+ * @since 4.3
+ */
+public class LongObjectId extends AnyLongObjectId implements Serializable {
+       private static final long serialVersionUID = 1L;
+
+       private static final LongObjectId ZEROID;
+
+       private static final String ZEROID_STR;
+
+       static {
+               ZEROID = new LongObjectId(0L, 0L, 0L, 0L);
+               ZEROID_STR = ZEROID.name();
+       }
+
+       /**
+        * Get the special all-zero LongObjectId.
+        *
+        * @return the all-zero LongObjectId, often used to stand-in for no object.
+        */
+       public static final LongObjectId zeroId() {
+               return ZEROID;
+       }
+
+       /**
+        * Test a string of characters to verify that it can be interpreted as
+        * LongObjectId.
+        * <p>
+        * If true the string can be parsed with {@link #fromString(String)}.
+        *
+        * @param id
+        *            the string to test.
+        * @return true if the string can converted into an LongObjectId.
+        */
+       public static final boolean isId(final String id) {
+               if (id.length() != Constants.LONG_OBJECT_ID_STRING_LENGTH)
+                       return false;
+               try {
+                       for (int i = 0; i < Constants.LONG_OBJECT_ID_STRING_LENGTH; i++) {
+                               RawParseUtils.parseHexInt4((byte) id.charAt(i));
+                       }
+                       return true;
+               } catch (ArrayIndexOutOfBoundsException e) {
+                       return false;
+               }
+       }
+
+       /**
+        * Convert a LongObjectId into a hex string representation.
+        *
+        * @param i
+        *            the id to convert. May be null.
+        * @return the hex string conversion of this id's content.
+        */
+       public static final String toString(final LongObjectId i) {
+               return i != null ? i.name() : ZEROID_STR;
+       }
+
+       /**
+        * Compare two object identifier byte sequences for equality.
+        *
+        * @param firstBuffer
+        *            the first buffer to compare against. Must have at least 32
+        *            bytes from position fi through the end of the buffer.
+        * @param fi
+        *            first offset within firstBuffer to begin testing.
+        * @param secondBuffer
+        *            the second buffer to compare against. Must have at least 32
+        *            bytes from position si through the end of the buffer.
+        * @param si
+        *            first offset within secondBuffer to begin testing.
+        * @return true if the two identifiers are the same.
+        */
+       public static boolean equals(final byte[] firstBuffer, final int fi,
+                       final byte[] secondBuffer, final int si) {
+               return firstBuffer[fi] == secondBuffer[si]
+                               && firstBuffer[fi + 1] == secondBuffer[si + 1]
+                               && firstBuffer[fi + 2] == secondBuffer[si + 2]
+                               && firstBuffer[fi + 3] == secondBuffer[si + 3]
+                               && firstBuffer[fi + 4] == secondBuffer[si + 4]
+                               && firstBuffer[fi + 5] == secondBuffer[si + 5]
+                               && firstBuffer[fi + 6] == secondBuffer[si + 6]
+                               && firstBuffer[fi + 7] == secondBuffer[si + 7]
+                               && firstBuffer[fi + 8] == secondBuffer[si + 8]
+                               && firstBuffer[fi + 9] == secondBuffer[si + 9]
+                               && firstBuffer[fi + 10] == secondBuffer[si + 10]
+                               && firstBuffer[fi + 11] == secondBuffer[si + 11]
+                               && firstBuffer[fi + 12] == secondBuffer[si + 12]
+                               && firstBuffer[fi + 13] == secondBuffer[si + 13]
+                               && firstBuffer[fi + 14] == secondBuffer[si + 14]
+                               && firstBuffer[fi + 15] == secondBuffer[si + 15]
+                               && firstBuffer[fi + 16] == secondBuffer[si + 16]
+                               && firstBuffer[fi + 17] == secondBuffer[si + 17]
+                               && firstBuffer[fi + 18] == secondBuffer[si + 18]
+                               && firstBuffer[fi + 19] == secondBuffer[si + 19]
+                               && firstBuffer[fi + 20] == secondBuffer[si + 20]
+                               && firstBuffer[fi + 21] == secondBuffer[si + 21]
+                               && firstBuffer[fi + 22] == secondBuffer[si + 22]
+                               && firstBuffer[fi + 23] == secondBuffer[si + 23]
+                               && firstBuffer[fi + 24] == secondBuffer[si + 24]
+                               && firstBuffer[fi + 25] == secondBuffer[si + 25]
+                               && firstBuffer[fi + 26] == secondBuffer[si + 26]
+                               && firstBuffer[fi + 27] == secondBuffer[si + 27]
+                               && firstBuffer[fi + 28] == secondBuffer[si + 28]
+                               && firstBuffer[fi + 29] == secondBuffer[si + 29]
+                               && firstBuffer[fi + 30] == secondBuffer[si + 30]
+                               && firstBuffer[fi + 31] == secondBuffer[si + 31];
+       }
+
+       /**
+        * Convert a LongObjectId from raw binary representation.
+        *
+        * @param bs
+        *            the raw byte buffer to read from. At least 32 bytes must be
+        *            available within this byte array.
+        * @return the converted object id.
+        */
+       public static final LongObjectId fromRaw(final byte[] bs) {
+               return fromRaw(bs, 0);
+       }
+
+       /**
+        * Convert a LongObjectId from raw binary representation.
+        *
+        * @param bs
+        *            the raw byte buffer to read from. At least 32 bytes after p
+        *            must be available within this byte array.
+        * @param p
+        *            position to read the first byte of data from.
+        * @return the converted object id.
+        */
+       public static final LongObjectId fromRaw(final byte[] bs, final int p) {
+               final long a = NB.decodeInt64(bs, p);
+               final long b = NB.decodeInt64(bs, p + 8);
+               final long c = NB.decodeInt64(bs, p + 16);
+               final long d = NB.decodeInt64(bs, p + 24);
+               return new LongObjectId(a, b, c, d);
+       }
+
+       /**
+        * Convert a LongObjectId from raw binary representation.
+        *
+        * @param is
+        *            the raw long buffer to read from. At least 4 longs must be
+        *            available within this long array.
+        * @return the converted object id.
+        */
+       public static final LongObjectId fromRaw(final long[] is) {
+               return fromRaw(is, 0);
+       }
+
+       /**
+        * Convert a LongObjectId from raw binary representation.
+        *
+        * @param is
+        *            the raw long buffer to read from. At least 4 longs after p
+        *            must be available within this long array.
+        * @param p
+        *            position to read the first long of data from.
+        * @return the converted object id.
+        */
+       public static final LongObjectId fromRaw(final long[] is, final int p) {
+               return new LongObjectId(is[p], is[p + 1], is[p + 2], is[p + 3]);
+       }
+
+       /**
+        * Convert a LongObjectId from hex characters (US-ASCII).
+        *
+        * @param buf
+        *            the US-ASCII buffer to read from. At least 64 bytes after
+        *            offset must be available within this byte array.
+        * @param offset
+        *            position to read the first character from.
+        * @return the converted object id.
+        */
+       public static final LongObjectId fromString(final byte[] buf, final int offset) {
+               return fromHexString(buf, offset);
+       }
+
+       /**
+        * Convert a LongObjectId from hex characters.
+        *
+        * @param str
+        *            the string to read from. Must be 64 characters long.
+        * @return the converted object id.
+        */
+       public static LongObjectId fromString(final String str) {
+               if (str.length() != Constants.LONG_OBJECT_ID_STRING_LENGTH)
+                       throw new InvalidLongObjectIdException(str);
+               return fromHexString(org.eclipse.jgit.lib.Constants.encodeASCII(str),
+                               0);
+       }
+
+       private static final LongObjectId fromHexString(final byte[] bs, int p) {
+               try {
+                       final long a = RawParseUtils.parseHexInt64(bs, p);
+                       final long b = RawParseUtils.parseHexInt64(bs, p + 16);
+                       final long c = RawParseUtils.parseHexInt64(bs, p + 32);
+                       final long d = RawParseUtils.parseHexInt64(bs, p + 48);
+                       return new LongObjectId(a, b, c, d);
+               } catch (ArrayIndexOutOfBoundsException e1) {
+                       throw new InvalidLongObjectIdException(bs, p,
+                                       Constants.LONG_OBJECT_ID_STRING_LENGTH);
+               }
+       }
+
+       LongObjectId(final long new_1, final long new_2, final long new_3,
+                       final long new_4) {
+               w1 = new_1;
+               w2 = new_2;
+               w3 = new_3;
+               w4 = new_4;
+       }
+
+       /**
+        * Initialize this instance by copying another existing LongObjectId.
+        * <p>
+        * This constructor is mostly useful for subclasses which want to extend a
+        * LongObjectId with more properties, but initialize from an existing
+        * LongObjectId instance acquired by other means.
+        *
+        * @param src
+        *            another already parsed LongObjectId to copy the value out of.
+        */
+       protected LongObjectId(final AnyLongObjectId src) {
+               w1 = src.w1;
+               w2 = src.w2;
+               w3 = src.w3;
+               w4 = src.w4;
+       }
+
+       @Override
+       public LongObjectId toObjectId() {
+               return this;
+       }
+
+       private void writeObject(ObjectOutputStream os) throws IOException {
+               os.writeLong(w1);
+               os.writeLong(w2);
+               os.writeLong(w3);
+               os.writeLong(w4);
+       }
+
+       private void readObject(ObjectInputStream ois) throws IOException {
+               w1 = ois.readLong();
+               w2 = ois.readLong();
+               w3 = ois.readLong();
+               w4 = ois.readLong();
+       }
+}
diff --git a/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/MutableLongObjectId.java b/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/lib/MutableLongObjectId.java
new file mode 100644 (file)
index 0000000..130e94e
--- /dev/null
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2015, Matthias Sohn <matthias.sohn@sap.com>
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.eclipse.jgit.lfs.lib;
+
+import java.text.MessageFormat;
+
+import org.eclipse.jgit.lfs.errors.InvalidLongObjectIdException;
+import org.eclipse.jgit.lfs.internal.LfsText;
+import org.eclipse.jgit.lib.MutableObjectId;
+import org.eclipse.jgit.util.NB;
+import org.eclipse.jgit.util.RawParseUtils;
+
+/**
+ * A mutable SHA-256 abstraction.
+ *
+ * Ported to SHA-256 from {@link MutableObjectId}
+ *
+ * @since 4.3
+ */
+public class MutableLongObjectId extends AnyLongObjectId {
+       /**
+        * Empty constructor. Initialize object with default (zeros) value.
+        */
+       public MutableLongObjectId() {
+               super();
+       }
+
+       /**
+        * Copying constructor.
+        *
+        * @param src
+        *            original entry, to copy id from
+        */
+       MutableLongObjectId(MutableLongObjectId src) {
+               fromObjectId(src);
+       }
+
+       /**
+        * Set any byte in the id.
+        *
+        * @param index
+        *            index of the byte to set in the raw form of the ObjectId. Must
+        *            be in range [0, {@link Constants#LONG_OBJECT_ID_LENGTH}).
+        * @param value
+        *            the value of the specified byte at {@code index}. Values are
+        *            unsigned and thus are in the range [0,255] rather than the
+        *            signed byte range of [-128, 127].
+        * @throws ArrayIndexOutOfBoundsException
+        *             {@code index} is less than 0, equal to
+        *             {@link Constants#LONG_OBJECT_ID_LENGTH}, or greater than
+        *             {@link Constants#LONG_OBJECT_ID_LENGTH}.
+        */
+       public void setByte(int index, int value) {
+               switch (index >> 3) {
+               case 0:
+                       w1 = set(w1, index & 7, value);
+                       break;
+               case 1:
+                       w2 = set(w2, index & 7, value);
+                       break;
+               case 2:
+                       w3 = set(w3, index & 7, value);
+                       break;
+               case 3:
+                       w4 = set(w4, index & 7, value);
+                       break;
+               default:
+                       throw new ArrayIndexOutOfBoundsException(index);
+               }
+       }
+
+       private static long set(long w, int index, long value) {
+               value &= 0xff;
+
+               switch (index) {
+               case 0:
+                       return (w & 0x00ffffffffffffffL) | (value << 56);
+               case 1:
+                       return (w & 0xff00ffffffffffffL) | (value << 48);
+               case 2:
+                       return (w & 0xffff00ffffffffffL) | (value << 40);
+               case 3:
+                       return (w & 0xffffff00ffffffffL) | (value << 32);
+               case 4:
+                       return (w & 0xffffffff00ffffffL) | (value << 24);
+               case 5:
+                       return (w & 0xffffffffff00ffffL) | (value << 16);
+               case 6:
+                       return (w & 0xffffffffffff00ffL) | (value << 8);
+               case 7:
+                       return (w & 0xffffffffffffff00L) | value;
+               default:
+                       throw new ArrayIndexOutOfBoundsException();
+               }
+       }
+
+       /** Make this id match {@link LongObjectId#zeroId()}. */
+       public void clear() {
+               w1 = 0;
+               w2 = 0;
+               w3 = 0;
+               w4 = 0;
+       }
+
+       /**
+        * Copy an LongObjectId into this mutable buffer.
+        *
+        * @param src
+        *            the source id to copy from.
+        */
+       public void fromObjectId(AnyLongObjectId src) {
+               this.w1 = src.w1;
+               this.w2 = src.w2;
+               this.w3 = src.w3;
+               this.w4 = src.w4;
+       }
+
+       /**
+        * Convert an LongObjectId from raw binary representation.
+        *
+        * @param bs
+        *            the raw byte buffer to read from. At least 32 bytes must be
+        *            available within this byte array.
+        */
+       public void fromRaw(final byte[] bs) {
+               fromRaw(bs, 0);
+       }
+
+       /**
+        * Convert an LongObjectId from raw binary representation.
+        *
+        * @param bs
+        *            the raw byte buffer to read from. At least 32 bytes after p
+        *            must be available within this byte array.
+        * @param p
+        *            position to read the first byte of data from.
+        */
+       public void fromRaw(final byte[] bs, final int p) {
+               w1 = NB.decodeInt64(bs, p);
+               w2 = NB.decodeInt64(bs, p + 8);
+               w3 = NB.decodeInt64(bs, p + 16);
+               w4 = NB.decodeInt64(bs, p + 24);
+       }
+
+       /**
+        * Convert an LongObjectId from binary representation expressed in integers.
+        *
+        * @param longs
+        *            the raw long buffer to read from. At least 4 longs must be
+        *            available within this longs array.
+        */
+       public void fromRaw(final long[] longs) {
+               fromRaw(longs, 0);
+       }
+
+       /**
+        * Convert an LongObjectId from binary representation expressed in longs.
+        *
+        * @param longs
+        *            the raw int buffer to read from. At least 4 longs after p must
+        *            be available within this longs array.
+        * @param p
+        *            position to read the first integer of data from.
+        *
+        */
+       public void fromRaw(final long[] longs, final int p) {
+               w1 = longs[p];
+               w2 = longs[p + 1];
+               w3 = longs[p + 2];
+               w4 = longs[p + 3];
+       }
+
+       /**
+        * Convert an LongObjectId from hex characters (US-ASCII).
+        *
+        * @param buf
+        *            the US-ASCII buffer to read from. At least 32 bytes after
+        *            offset must be available within this byte array.
+        * @param offset
+        *            position to read the first character from.
+        */
+       public void fromString(final byte[] buf, final int offset) {
+               fromHexString(buf, offset);
+       }
+
+       /**
+        * Convert an LongObjectId from hex characters.
+        *
+        * @param str
+        *            the string to read from. Must be 64 characters long.
+        */
+       public void fromString(final String str) {
+               if (str.length() != Constants.LONG_OBJECT_ID_STRING_LENGTH)
+                       throw new IllegalArgumentException(
+                                       MessageFormat.format(LfsText.get().invalidLongId, str));
+               fromHexString(org.eclipse.jgit.lib.Constants.encodeASCII(str), 0);
+       }
+
+       private void fromHexString(final byte[] bs, int p) {
+               try {
+                       w1 = RawParseUtils.parseHexInt64(bs, p);
+                       w2 = RawParseUtils.parseHexInt64(bs, p + 16);
+                       w3 = RawParseUtils.parseHexInt64(bs, p + 32);
+                       w4 = RawParseUtils.parseHexInt64(bs, p + 48);
+               } catch (ArrayIndexOutOfBoundsException e1) {
+                       throw new InvalidLongObjectIdException(bs, p,
+                                       Constants.LONG_OBJECT_ID_STRING_LENGTH);
+               }
+       }
+
+       @Override
+       public LongObjectId toObjectId() {
+               return new LongObjectId(this);
+       }
+}
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.gitignore b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.gitignore
new file mode 100644 (file)
index 0000000..2f7896d
--- /dev/null
@@ -0,0 +1 @@
+target/
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.project b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.project
new file mode 100644 (file)
index 0000000..c2061b9
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.eclipse.jgit.lfs.feature</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.pde.FeatureBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.FeatureNature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.settings/org.eclipse.core.resources.prefs b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.settings/org.eclipse.core.resources.prefs
new file mode 100644 (file)
index 0000000..14bdc2c
--- /dev/null
@@ -0,0 +1,3 @@
+#Fri Jun 18 23:33:45 CEST 2010
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.settings/org.eclipse.core.runtime.prefs b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.settings/org.eclipse.core.runtime.prefs
new file mode 100644 (file)
index 0000000..898252b
--- /dev/null
@@ -0,0 +1,3 @@
+#Fri Jun 18 23:33:45 CEST 2010
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.settings/org.eclipse.mylyn.tasks.ui.prefs
new file mode 100644 (file)
index 0000000..823c0f5
--- /dev/null
@@ -0,0 +1,4 @@
+#Tue Jul 19 20:11:28 CEST 2011
+eclipse.preferences.version=1
+project.repository.kind=bugzilla
+project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.settings/org.eclipse.mylyn.team.ui.prefs b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/.settings/org.eclipse.mylyn.team.ui.prefs
new file mode 100644 (file)
index 0000000..0cba949
--- /dev/null
@@ -0,0 +1,3 @@
+#Tue Jul 19 20:11:28 CEST 2011
+commit.comment.template=${task.description} \n\nBug\: ${task.key}
+eclipse.preferences.version=1
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/build.properties b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/build.properties
new file mode 100644 (file)
index 0000000..b4a8dde
--- /dev/null
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+               edl-v10.html,\
+               feature.properties,\
+               license.html
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/edl-v10.html b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/edl-v10.html
new file mode 100644 (file)
index 0000000..1826b47
--- /dev/null
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Distribution License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+    margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<p><b>Eclipse Distribution License - v 1.0</b></p>
+
+<p>Copyright (c) 2007, Eclipse Foundation, Inc. and its licensors. </p>
+
+<p>All rights reserved.</p>
+<p>Redistribution and use in source and binary forms, with or without modification,
+    are permitted provided that the following conditions are met:
+<ul><li>Redistributions of source code must retain the above copyright notice,
+    this list of conditions and the following disclaimer.</li>
+<li>Redistributions in binary form must reproduce the above copyright notice,
+    this list of conditions and the following disclaimer in the documentation
+    and/or other materials provided with the distribution.</li>
+<li>Neither the name of the Eclipse Foundation, Inc. nor the names of its
+    contributors may be used to endorse or promote products derived from
+    this software without specific prior written permission.</li></ul>
+</p>
+<p>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.</p>
+
+</body>
+
+</html>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.properties b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.properties
new file mode 100644 (file)
index 0000000..c5bffa8
--- /dev/null
@@ -0,0 +1,159 @@
+###############################################################################
+# Copyright (c) 20015 Matthias Sohn <matthias.sohn@sap.com> and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+###############################################################################
+
+featureName=Java implementation of Git - optional LFS support
+providerName=Eclipse JGit
+
+updateSiteName=Eclipse JGit Update Site
+
+# description property - text of the "Feature Description"
+description=\
+Optional LFS support.\n
+################ end of description property ##################################
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2015, Matthias Sohn et.al.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Distribution License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/org/documents/edl-v10.html\n
+################ end of copyright property ####################################
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+April 9, 2014\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/feature.xml
new file mode 100644 (file)
index 0000000..e8f74f4
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.jgit.lfs"
+      label="%featureName"
+      version="4.3.0.qualifier"
+      provider-name="%providerName">
+
+   <description url="http://www.eclipse.org/jgit/">
+      %description
+   </description>
+
+   <copyright>
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <url>
+      <update label="%updateSiteName" url="http://download.eclipse.org/egit/updates"/>
+      <discovery label="%updateSiteName" url="http://download.eclipse.org/egit/updates"/>
+   </url>
+
+   <requires>
+      <import plugin="org.eclipse.jgit"/>
+   </requires>
+
+   <plugin
+         id="org.eclipse.jgit.lfs"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/license.html b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/license.html
new file mode 100644 (file)
index 0000000..95ad95e
--- /dev/null
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
+<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>April 9, 2014</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY "CONTENT").  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   ("EPL").  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository ("Repository") in software modules ("Modules") and made available as downloadable archives ("Downloads").</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java\99 ARchive) in a directory named "plugins".</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named "features".  Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses").  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named "src" of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license ("Feature Update License") during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager ("Provisioning Technology") for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively "Installable Software"). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   ("Specification").</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur ("Provisioning Process") in which a user may execute the Provisioning Technology
+       on a machine ("Target Machine") with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software ("Installable Software Agreement") and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/pom.xml b/org.eclipse.jgit.packaging/org.eclipse.jgit.lfs.feature/pom.xml
new file mode 100644 (file)
index 0000000..ef7fd79
--- /dev/null
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright (C) 2015, Matthias Sohn <matthias.sohn@sap.com>
+   and other copyright owners as documented in the project's IP log.
+
+   This program and the accompanying materials are made available
+   under the terms of the Eclipse Distribution License v1.0 which
+   accompanies this distribution, is reproduced below, and is
+   available at http://www.eclipse.org/org/documents/edl-v10.php
+
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or
+   without modification, are permitted provided that the following
+   conditions are met:
+
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above
+     copyright notice, this list of conditions and the following
+     disclaimer in the documentation and/or other materials provided
+     with the distribution.
+
+   - Neither the name of the Eclipse Foundation, Inc. nor the
+     names of its contributors may be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+   CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+   OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+   CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.jgit</groupId>
+    <artifactId>jgit.tycho.parent</artifactId>
+    <version>4.3.0-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.eclipse.jgit.feature</groupId>
+  <artifactId>org.eclipse.jgit.lfs</artifactId>
+  <packaging>eclipse-feature</packaging>
+
+  <name>JGit - Optional LFS support</name>
+  <dependencies>
+
+    <dependency>
+      <groupId>org.eclipse.jgit</groupId>
+      <artifactId>org.eclipse.jgit</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.jgit</groupId>
+      <artifactId>org.eclipse.jgit.lfs</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+
+  </dependencies>
+
+</project>
index 2186ad98256a14a8217436a691ee7907c445576b..15d10e6c30c3522b0c686ba00149b6a3ad8830dc 100644 (file)
@@ -21,6 +21,9 @@
    <feature url="features/org.eclipse.jgit.http.apache_0.0.0.qualifier.jar" id="org.eclipse.jgit.http.apache" version="0.0.0" patch="true">
       <category name="JGit"/>
    </feature>
+   <feature url="features/org.eclipse.jgit.lfs_0.0.0.qualifier.jar" id="org.eclipse.jgit.lfs" version="0.0.0">
+      <category name="JGit"/>
+   </feature>
    <category-def name="JGit" label="JGit">
       <description>
          JGit
index 6e5fd09269736cb6a95f522ac6f7d3dd7a18a047..5f21a609dead10c3b22b612c2b9cf181e585be34 100644 (file)
          <artifactId>org.eclipse.jgit.http.apache</artifactId>
          <version>${project.version}</version>
        </dependency>
+    <dependency>
+         <groupId>org.eclipse.jgit</groupId>
+         <artifactId>org.eclipse.jgit.lfs</artifactId>
+         <version>${project.version}</version>
+       </dependency>
     <dependency>
       <groupId>org.eclipse.jgit</groupId>
       <artifactId>org.eclipse.jgit.pgm</artifactId>
index 7f44df875e2dc597ece4318930c5e0c5ab5bef0b..68efc465004bd956d40ef5ecf29939da97eb2441 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   Copyright (C) 2009, 2013, Matthias Sohn <matthias.sohn@sap.com>
+   Copyright (C) 2009, 2015, Matthias Sohn <matthias.sohn@sap.com>
    and other copyright owners as documented in the project's IP log.
 
    This program and the accompanying materials are made available
@@ -78,6 +78,7 @@
     <module>org.eclipse.jgit.target</module>
     <module>org.eclipse.jgit.feature</module>
     <module>org.eclipse.jgit.http.apache.feature</module>
+    <module>org.eclipse.jgit.lfs.feature</module>
     <module>org.eclipse.jgit.pgm.feature</module>
     <module>org.eclipse.jgit.source.feature</module>
     <module>org.eclipse.jgit.pgm.source.feature</module>
index 06cb11b37ab50af01fc521ffa87f63b115300ba3..7e11a61035898190505f5deba3dfbc2360a6e756 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, Google Inc.
+ * Copyright (C) 2008, 2015 Google Inc.
  * and other copyright owners as documented in the project's IP log.
  *
  * This program and the accompanying materials are made available
@@ -60,6 +60,17 @@ public class NBTest {
                assertTrue(NB.compareUInt32(1, -1) < 0);
        }
 
+       @Test
+       public void testCompareUInt64() {
+               assertTrue(NB.compareUInt64(0, 0) == 0);
+               assertTrue(NB.compareUInt64(1, 0) > 0);
+               assertTrue(NB.compareUInt64(0, 1) < 0);
+               assertTrue(NB.compareUInt64(-1, 0) > 0);
+               assertTrue(NB.compareUInt64(0, -1) < 0);
+               assertTrue(NB.compareUInt64(-1, 1) > 0);
+               assertTrue(NB.compareUInt64(1, -1) < 0);
+       }
+
        @Test
        public void testDecodeUInt16() {
                assertEquals(0, NB.decodeUInt16(b(0, 0), 0));
index 85c1648a0added4c8bccf8cde2894c69e3f4c4d2..8536f1dc25aef9158be01e60d1c1519ea61cbbf5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
+ * Copyright (C) 2008, 2015 Shawn O. Pearce <spearce@spearce.org>
  * and other copyright owners as documented in the project's IP log.
  *
  * This program and the accompanying materials are made available
@@ -65,6 +65,37 @@ public final class NB {
                return (a & 1) - (b & 1);
        }
 
+       /**
+        * Compare a 64 bit unsigned integer stored in a 64 bit signed integer.
+        * <p>
+        * This function performs an unsigned compare operation, even though Java
+        * does not natively support unsigned integer values. Negative numbers are
+        * treated as larger than positive ones.
+        *
+        * @param a
+        *            the first value to compare.
+        * @param b
+        *            the second value to compare.
+        * @return &lt; 0 if a &lt; b; 0 if a == b; &gt; 0 if a &gt; b.
+        * @since 4.3
+        */
+       public static int compareUInt64(final long a, final long b) {
+               long cmp = (a >>> 1) - (b >>> 1);
+               if (cmp > 0) {
+                       return 1;
+               } else if (cmp < 0) {
+                       return -1;
+               }
+               cmp = ((a & 1) - (b & 1));
+               if (cmp > 0) {
+                       return 1;
+               } else if (cmp < 0) {
+                       return -1;
+               } else {
+                       return 0;
+               }
+       }
+
        /**
         * Convert sequence of 2 bytes (network byte order) into unsigned value.
         *
index f2955f7e6bf7288e16d510511e16391a4ee565bc..86777b9cdc442d0dd561c0b39239771c4d5423f2 100644 (file)
@@ -365,6 +365,72 @@ public final class RawParseUtils {
                return (r << 4) | last;
        }
 
+       /**
+        * Parse 16 character base 16 (hex) formatted string to unsigned long.
+        * <p>
+        * The number is read in network byte order, that is, most significant
+        * nibble first.
+        *
+        * @param bs
+        *            buffer to parse digits from; positions {@code [p, p+16)} will
+        *            be parsed.
+        * @param p
+        *            first position within the buffer to parse.
+        * @return the integer value.
+        * @throws ArrayIndexOutOfBoundsException
+        *             if the string is not hex formatted.
+        * @since 4.3
+        */
+       public static final long parseHexInt64(final byte[] bs, final int p) {
+               long r = digits16[bs[p]] << 4;
+
+               r |= digits16[bs[p + 1]];
+               r <<= 4;
+
+               r |= digits16[bs[p + 2]];
+               r <<= 4;
+
+               r |= digits16[bs[p + 3]];
+               r <<= 4;
+
+               r |= digits16[bs[p + 4]];
+               r <<= 4;
+
+               r |= digits16[bs[p + 5]];
+               r <<= 4;
+
+               r |= digits16[bs[p + 6]];
+               r <<= 4;
+
+               r |= digits16[bs[p + 7]];
+               r <<= 4;
+
+               r |= digits16[bs[p + 8]];
+               r <<= 4;
+
+               r |= digits16[bs[p + 9]];
+               r <<= 4;
+
+               r |= digits16[bs[p + 10]];
+               r <<= 4;
+
+               r |= digits16[bs[p + 11]];
+               r <<= 4;
+
+               r |= digits16[bs[p + 12]];
+               r <<= 4;
+
+               r |= digits16[bs[p + 13]];
+               r <<= 4;
+
+               r |= digits16[bs[p + 14]];
+
+               final int last = digits16[bs[p + 15]];
+               if (r < 0 || last < 0)
+                       throw new ArrayIndexOutOfBoundsException();
+               return (r << 4) | last;
+       }
+
        /**
         * Parse a single hex digit to its numeric value (0-15).
         *
diff --git a/pom.xml b/pom.xml
index 0dda8cf597d76f3c1c586394baab73dac4d4fc1c..0393996776a350ffc26048ed34f1cbc255b6f3ae 100644 (file)
--- a/pom.xml
+++ b/pom.xml
     <module>org.eclipse.jgit.http.apache</module>
     <module>org.eclipse.jgit.http.server</module>
     <module>org.eclipse.jgit.pgm</module>
+    <module>org.eclipse.jgit.lfs</module>
     <module>org.eclipse.jgit.junit</module>
     <module>org.eclipse.jgit.junit.http</module>
 
     <module>org.eclipse.jgit.ant.test</module>
     <module>org.eclipse.jgit.http.test</module>
     <module>org.eclipse.jgit.pgm.test</module>
+    <module>org.eclipse.jgit.lfs.test</module>
   </modules>
 
 </project>