{"id":37021363,"url":"https://github.com/jscancella/bagging","last_synced_at":"2026-01-14T02:31:13.251Z","repository":{"id":36746460,"uuid":"153771158","full_name":"jscancella/bagging","owner":"jscancella","description":"A clean and easy to use implementation of the BagIt specification","archived":false,"fork":false,"pushed_at":"2025-12-31T15:08:28.000Z","size":1012,"stargazers_count":3,"open_issues_count":16,"forks_count":8,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-04T23:29:19.482Z","etag":null,"topics":["bagit","bagit-profile","bagit-specification","checksum","hacktoberfest","hacktoberfest2021","java-library"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jscancella.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-10-19T11:14:23.000Z","updated_at":"2025-12-18T17:47:01.000Z","dependencies_parsed_at":"2023-10-21T20:42:00.008Z","dependency_job_id":"a2d56cf7-7956-44fd-b6d2-b6343b967d66","html_url":"https://github.com/jscancella/bagging","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/jscancella/bagging","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jscancella%2Fbagging","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jscancella%2Fbagging/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jscancella%2Fbagging/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jscancella%2Fbagging/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jscancella","download_url":"https://codeload.github.com/jscancella/bagging/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jscancella%2Fbagging/sbom","scorecard":{"id":435286,"data":{"date":"2025-08-11","repo":{"name":"github.com/jscancella/bagging","commit":"7be38f0fdc0ebb705644dd1204e983f6f3289477"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.4,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":10,"reason":"24 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":8,"reason":"5 out of the last 5 releases have a total of 5 signed artifacts.","details":["Info: signed release artifact: bagging-5.2-javadoc.jar.asc: https://github.com/jscancella/bagging/releases/tag/v5.2","Info: signed release artifact: bagging-5.1.0-javadoc.jar.asc: https://github.com/jscancella/bagging/releases/tag/v5.1","Info: signed release artifact: bagging-5.0.0-javadoc.jar.asc: https://github.com/jscancella/bagging/releases/tag/v5.0","Info: signed release artifact: bagging-4.7-javadoc.jar.asc: https://github.com/jscancella/bagging/releases/tag/v4.7","Info: signed release artifact: bagging-4.6-javadoc.jar.asc: https://github.com/jscancella/bagging/releases/tag/v4.6","Warn: release artifact v5.2 does not have provenance: https://api.github.com/repos/jscancella/bagging/releases/139812466","Warn: release artifact v5.1 does not have provenance: https://api.github.com/repos/jscancella/bagging/releases/126230801","Warn: release artifact v5.0 does not have provenance: https://api.github.com/repos/jscancella/bagging/releases/113229572","Warn: release artifact v4.7 does not have provenance: https://api.github.com/repos/jscancella/bagging/releases/97322459","Warn: release artifact v4.6 does not have provenance: https://api.github.com/repos/jscancella/bagging/releases/88593519"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-19T04:28:59.392Z","repository_id":36746460,"created_at":"2025-08-19T04:28:59.392Z","updated_at":"2025-08-19T04:28:59.392Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408711,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bagit","bagit-profile","bagit-specification","checksum","hacktoberfest","hacktoberfest2021","java-library"],"created_at":"2026-01-14T02:31:12.472Z","updated_at":"2026-01-14T02:31:13.243Z","avatar_url":"https://github.com/jscancella.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Bagging Library\n\n## Description\nThis is a software library intended to support the creation, manipulation, and validation of \"bags\" from the [bagit specification](https://tools.ietf.org/html/draft-kunze-bagit). \nIt currently supports version 0.93 through 1.0.\n\n## Badges\n|             |                                                    |\n|-------------|----------------------------------------------------|\n|Build Status |[![CircleCI](https://img.shields.io/circleci/project/github/jscancella/bagging/master.svg?label=CircleCi\u0026maxAge=600)](https://app.circleci.com/pipelines/github/jscancella/bagging) [![Appveyor Build Status (Windows)](https://img.shields.io/appveyor/ci/jscancella/bagging/master.svg?label=Appveyor%20(Windows)\u0026maxAge=600)](https://ci.appveyor.com/project/jscancella/bagging)|\n|Metrics      |[![Coverage Status](https://coveralls.io/repos/github/jscancella/bagging/badge.svg?branch=master)](https://coveralls.io/github/jscancella/bagging?branch=master) [![Github Latest Release Downloads](https://img.shields.io/github/downloads/jscancella/bagging/latest/total.svg?maxAge=600)]()|\n|Download     |[![Maven Central](https://img.shields.io/maven-central/v/com.github.jscancella/bagging)](https://search.maven.org/artifact/com.github.jscancella/bagging)|\n|Documentation|[![javadoc.io](https://img.shields.io/badge/javadoc.io-latest-blue.svg?maxAge=31556926)](http://www.javadoc.io/doc/com.github.jscancella/bagging)|\n\n## Requirements\n* minimum Java 17\n* gradle (for development only)\n\n## Documentation\nWe strive to have great documentation! Thus this file follows recommendations from https://www.divio.com/blog/documentation/\nEditors and grammar aficionados are welcome and encouraged to edit this content to make it even better! See `Helping Contribute` below.\n\n### Explanation\n#### What is a \"bag\"?\nA \"bag\" is a way to transfer files from one location to another and verify that the files sent are complete (you received exactly what you were supposed to receive), and that they are correct (none of the bits have changed). While many people use \"bags\" for other purposes, they are tangential to the purpose of file transfer. \n\n#### What is a typical use case for a bag?\nTypically you need to send files out of band (i.e. not using the internet) and you need to ensure that all the files are received correctly. Usually this is due to the amount of files being transferred is very large, the internet connection is too slow or unreliable, or there is no physical connection to the internet.\n\n#### What is fetching?\nTo save on transferring all the files (or multiple copies of the same file) you can use a fetch.txt file. This special file lists where those other files are located on the internet. This library does not handle trying to retrieve these files due to the complicated nature of retrieving files over the internet.\n\n#### What is a BagIt-Profile?\nA BagIt-Profile is a [specification](http://www.bagit-profiles.github.io/bagit-profile-specification) that allows creators and consumers agree on what should be included in a bag. These agreements are saved in a bagit-profile file formatted in JSON and available from a URI (see the specification for more details/requirements). See the `How to verify against a profile?` section for more information\n\n#### How do I include information about the bag within the bag? (metadata)\nThere is a special file called bag-info.txt (or package-info.txt for older versions) that is formatted for easy reading by humans. This file is just a list of key value pairs, and with some very few exceptions has no bearing on the bag other than to give additional information.\n\n#### History of bagit\nThe BagIt specification was first created by the Library of Congress because it needed a way to verify that donated material on hard drives was correct and complete.\n\n### How-to guides\n#### How to read a bag?\n```java\nPath rootDir = Paths.get(\"RootDirectoryOfExistingBag\");\nBag bag = Bag.read(rootDir);\n```\n\n#### How to write a bag?\n```java\nPath outputDir = Paths.get(\"WhereYouWantToWriteTheBagTo\");\nbag.write(outputDir); //where bag is a Bag object\n```\n\n#### How to create a bag programmatically?\n```java\nBagBuilder builder = new BagBuilder();\nBag bag = builder.addAlgorithm(\"md5\")\n    .addPayloadFile(Paths.get(\"/foo.txt\"))\n    .addMetadata(\"someKey\", \"someValue\")\n    .rootDir(Paths.get(\"/myNewBag\"))\n    .write();\n```\n\n#### How to validate a bag?\nThere are three kinds of validations:\n1. Verify a bag is complete.\n2. Verify a bag is correct.\n3. Just check file count and bite size.\n\n##### Verify Complete\n```java\nboolean ignoreHiddenFiles = true;\nbag.isValid(ignoreHiddenFiles);\n```\n\n##### Verify Valid (both complete and correct)\n```java\nboolean ignoreHiddenFiles = true;\nbag.isComplete(ignoreHiddenFiles);\n```\n\n#### How to lint a bag (check for potential issues)?\n```java\nPath folder = Paths.get(\"BagYouWantToCheck\");\nSet\u003cBagitWarning\u003e warnings = BagLinter.lintBag(folder);\n```\n\n#### How to verify against a profile?\n```java\nPath rootDir = Paths.get(\"RootDirectoryOfExistingBag\");\nBag bag = Bag.read(rootDir);\nInputStream jsonProfile = new URL(\"https://github.com/bagit-profiles/bagit-profiles/blob/1.1.0/bagProfileFoo.json\").openStream();\nassert BagLinter.checkAgainstProfile(jsonProfile, bag) == true;\n```\n\n#### How to include a new checksum algorithm?\nBy default MD5, SHA1, SHA224, SHA256, SHA384, and SHA512 are provided. However, there will be times when you want (or must) use a different algorithm. \n\nThe [BagitChecksumNameMapping](https://github.com/jscancella/bagging/blob/master/src/main/java/com/github/jscancella/hash/BagitChecksumNameMapping.java) \ncontains the mapping between bagit checksum names and their implementation and is the only place you need to modify to change which implementation you would like to use.\nNote: to enable multi-threaded bag creation and checking multiple instances of the hasher could exist at the same time.\n\n```java\npublic enum SHA3Hasher implements Hasher {\n  \n  private static final int _64_KB = 1024 * 64;\n  private static final int CHUNK_SIZE = _64_KB;\n  private static final String MESSAGE_DIGEST_NAME = \"SHA3-256\";\n  private MessageDigest messageDigestInstance;\n\n  @Override\n  public String hash(Path path) throws IOException{\n    reset();\n    updateMessageDigest(path, messageDigestInstance);\n    return formatMessageDigest(messageDigestInstance);\n  }\n\n  @Override\n  public void update(byte[] bytes, int length){\n    messageDigestInstance.update(bytes, 0, length);\n  }\n\n  @Override\n  public String getHash(){\n    return formatMessageDigest(messageDigestInstance);\n  }\n\n  @Override\n  public void reset(){\n    messageDigestInstance.reset();\n  }\n\n  @Override\n  public String getBagitAlgorithmName(){\n    return \"sha3256\";\n  }\n  \n  private static void updateMessageDigest(final Path path, final MessageDigest messageDigest) throws IOException{\n    try(final InputStream is = new BufferedInputStream(Files.newInputStream(path, StandardOpenOption.READ))){\n      final byte[] buffer = new byte[CHUNK_SIZE];\n      int read = is.read(buffer);\n\n      while(read != -1){\n        messageDigest.update(buffer, 0, read);\n        read = is.read(buffer);\n      }\n    }\n  }\n  \n  private static String formatMessageDigest(final MessageDigest messageDigest){\n    try(final Formatter formatter = new Formatter()){\n      for (final byte b : messageDigest.digest()) {\n        formatter.format(\"%02x\", b);\n      }\n      \n      return formatter.toString();\n    }\n  }\n\n  @Override\n  public void initialize() throws NoSuchAlgorithmException{\n    messageDigestInstance = MessageDigest.getInstance(MESSAGE_DIGEST_NAME);\n  }\n\n}\n\nBagitChecksumNameMapping.add(\"sha3256\", SHA3Hasher.class);\n```\n\n#### How to create a new conformance profile \nThis is beyond the scope of this project, however please see https://github.com/bagit-profiles/bagit-profiles for in-depth documentation on profiles. \n\n#### Classes/Methods not to use outside this project\nThere are many classes that were not designed to be used outside this project, the rules for this are:\n* If a class/method does not contain a javadoc.\n* If a class is in a package named \"internal\". Any internal classes can be removed at any time and effort will be made to preserve backwards compatibility.\n* If a class is final, that class was not designed to be extended by users outside this project.\n\n#### Javadocs\nAll public interfaces/classes have javadocs detailing what the class's responsibilities are and, what the methods do and are used for  (http://www.javadoc.io/doc).\n\n#### Code coverage\nTo see a nice view of what code is covered by the various tests, check out [coveralls.io](https://coveralls.io/github/jscancella/bagging).\nWe strive to try and maintain 90% or better code coverage knowing that testing language specifics (like getters and setters) are not helpful. Ideally we also have 100% coverage of each branch condition, but again this is more an ideal than a hard requirement.\n\n#### Testing (conformance-suite)\nBecause there are many test cases for using the BagIt specification correctly, the Library of Congress decided to create a suite of known issues as well as canonical basic bags for each specification version. These test cases are stored in a git repository and can be found at https://github.com/libraryofcongress/bagit-conformance-suite.git\nWe use these test cases to ensure we are correctly adhering to the BagIt specification.  \n\n## Frequently asked questions (FAQ)\n#### BagIt, bag, bagit, Bagger, Bagging names are all so similar. Why?!\nNaming stuff is hard, and generally we humans are bad at naming similar things distinctly. So in order to make it easier, here is a short list of definitions\n* bag - a group of files in a particular format to ensure the files received are correct and complete\n* BagIt - the name of the specification (or how is a bag structured)\n* bagit (notice the all lowercase naming) - The original java implementation that also contained a command line utility by the same name.\n* Bagger - a java desktop application (GUI) that used bagit to create bags\n* Bagging - this library which tries to correctly implement all versions of the BagIt specification in a clean and concise way\n\n#### Is there a command line utility in here?\nThe short answer, no. The long answer is that having a java command line utility has caused more confusion and frustration than it has helped. If you need a command line implementation, try taking a look at the [python implementation from the Library of Congress](https://github.com/libraryofcongress/bagit-python) instead.\n\n#### How do I include the tag-manifest checksum in the tag-manifest?\nYou don't because in order to generate a checksum of the tag file it can't change. Thus if you try to add a line for the tag-manifest containing a checksum, that checksum will change and no longer be valid.\n\n#### How do I check/create a compressed (zip, gz, etc) bag using this library?\nThe specific functionality for checking or creating a bag while it is still compressed is not supported and there are not plans to support it in the future. I would recommend you use your favorite application to compress/decompress and then work with the bag as normal. \n\n#### Is BagIt good for archiving?\nMaybe, it really depends on what you are trying to achieve. \nAre you trying to create a super safe copy of your files that will prevent bitrot and other storage problems from ever happening? - then no the BagIt specification won't help you because it can't keep files safe (erasure codes, multiple copies, etc) but only aids in checking completeness and correctness. If that is your use case, I would recommend that you use the BagIt specification when you receive files outside the internet and then use other software to ensure those files are safe from corruption.\n\n## Support\n#### Bugs\nIf you find a bug in Bagging please let us know by [submitting a bug report!](https://github.com/jscancella/bagging/issues/new)\nWhen creating a bug report please try to include the following information which will greatly aid in resolving the issue faster:\n* a small example showing the incorrect behavior\n* the expected behavior\n* the actual behavior\n* the operating system being used\n* version of Bagging being used\n\n#### Feature requests\nWe would love to hear your ideas to make this library even better! First submit a new [issue](https://github.com/jscancella/bagging/issues/new) discussing what feature you would like added. Please include the following information when submitting:\n* Current behavior (if applicable).\n* Proposed behavior.\n* Why this feature is useful.\n* A small code example if possible.\n\n#### Questions\nIt is impossible for this documentation to cover all questions that you might have. Therefore, if you don't understand something or would like more clarification please submit a [issue](https://github.com/jscancella/bagging/issues/new) with your question. I will try to answer it as best I can, and if useful will be added to the FAQ section.\n\n#### Helping Contribute\nIf you value this project, please consider contributing! All pull requests will be reviewed with an aim to have them incorporated into this project. Don't know how to submit a pull request? No worries, check out github's great documentation at https://help.github.com/articles/about-pull-requests/.\nYou will need to also sign a document stating that you freely give all copyright over to this project for any submitted pull requests.\nSome of the items we will check when you submit a pull request are:\n* Does the pull request follow the style of the rest of the project?\n* Do all the tests and other code quality checks still pass?\n* Does the pull request maintain the same level of code coverage?\n* If adding new functionality, were test cases added for the base case and several edge cases?\n* Was documentation updated (if applicable)?\n\n#### Other Languages\nFrom the start Bagging was built knowing that not all people speak English. If you are able to translate from English to another language we would love your help! Please see the link for Transifex to get started.\n\n#### Community\nThere is a very active community around digital archiving. One of which is The Digital Curation Google Group (https://groups.google.com/d/forum/digital-curation) which  is an open discussion list that reaches many of the contributors to and users of this project.\n\n## Technical Reference\nOne of the inspirations for writing this library was to create a simple to use interface for creating, reading, writing, verifying, and linting BagIt specification bags. The coding therefore tries to adhere with the best practices in [Effective Java by Joshua Bloch](https://www.amazon.com/Effective-Java-Joshua-Bloch/dp/0134685997) as well as experiences from the team members.\n\n#### Windows Development Notes\n* Install JDK 8+\n* while gradle may work running from your IDE this has not been tested and isn't really supported. Instead run all gradle commands from the commandline using the `gradlew.bat` script root directory. git-bash seems to generally work, but sometimes crashes for unknown reasons.\n* Before submitting a pull request run `./gradlew.bat clean check` and there are no errors.\n\n#### Mac Development Notes\n* Install JDK 8+\n* while gradle may work running from your IDE this has not been tested and isn't really supported. Instead run all gradle commands from the commandline using the `gradlew` script root directory.\n* Before submitting a pull request run `./gradlew.bat clean check` and there are no errors.\n\n#### Linux Development Notes\n* Install JDK 8+\n* while gradle may work running from your IDE this has not been tested and isn't really supported. Instead run all gradle commands from the commandline using the `gradlew` script root directory.\n* Before submitting a pull request run `./gradlew.bat clean check` and there are no errors.\n\n#### Building a release\nMake sure you have setup your `gradle.properties` file and have distributed your gpg key\n* install gnupg\n* generate a key `gpg --full-generate-key`\n* export your key `gpg --export-secret-keys -o C:\\Users\\John\\secring.gpg`\n* upload your key to various keyservers\n  * `gpg --keyserver hkp://pool.sks-keyservers.net --send-keys DF5644DC`\n  * `gpg --keyserver http://keyserver.ubuntu.com --send-keys DF5644DC`\n  * `gpg --keyserver https://keys.openpgp.org --send-keys DF5644DC`\n  * `gpg --keyserver http://pgp.mit.edu --send-keys DF5644DC`\n* setup your `gradle.properties file`\n```\nsigning.keyId=\u003cLAST 8 NUMBERS of ID\u003e\nsigning.password=\u003cPASSWORD YOU USED DURING CREATION\u003e\nsigning.secretKeyRingFile=C:\\\\Users\\\\John\\\\secring.gpg\n\nossrhUsername=\u003cJIRA USERNAME FOR OSS. See https://issues.sonatype.org/browse/OSSRH-55497\u003e\nossrhPassword=\u003cJIRA PASSWORD\u003e\n```\n\nNow actually upload the new version\n* run `./gradlew publish -Pversion=\"\u003cVERSION YOU ARE CALLING THIS RELEASE\u003e\"`\n* sign in to https://oss.sonatype.org/\n* The following is an abreviated version of https://central.sonatype.org/pages/releasing-the-deployment.html\n  * Go to the \"staging repositories\" (naviagation on the left)\n  * Find the artifact you just uploaded and click \"close\" button at the top of the page\n  * Allow time for nexus to go through its automated checking\n  * click \"release\" button at the top of page\n\n## Roadmap for this library\n* Maintain interoperability with the [BagIt specification](https://tools.ietf.org/html/rfc8493).\n* Fix bugs/issues reported (on going).\n* Translate to various languages (on going).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjscancella%2Fbagging","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjscancella%2Fbagging","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjscancella%2Fbagging/lists"}