* [domain] rename S3MetaData as MatchedMetadata
* [domain] rename S3ObjectsData as RemoteObjects
* [core] ActionGenerator refactoring
* [core] ActionGenerator.createAction renamed and no longer a stream
* [core] ActionGenerator refactor
* [core] ActionGenerator Usage of head on collections
* [core] Extract Filters from domain.Filter
* [core] extract LocalFileValidator
* [domain] LocalFile remove unused isDirectory
* [domain] LocalFile move/rename relative as relativeToSource on companion
* [domain] LocalFile move and rename matches as matchesHash on companion
* [domain] LocalFile move md5base64 to companion
* [domain] Logger remove
* [domain] MD5Hash move hash to companion
* [domain] MD5Hash move digest to companion
* [domain] MD5Hash move hash64 to companion
* [domain] RemoteKey move class methods to companion
* [domain] Sources move forPath to companion
Led to being able to cleanup LocalFileStream.localFile and adding
LocalFiles.one
* [domain] UploadEventLogger rename method as apply
* [core] Convert HashService into an effect Hasher
* [core] LocalFileStreamSuite fix prep of test env
* [core] LocalFileStreamSuite Refactor
* [core] Add Hasher.hashObjectChunk
* [core] make MD5HashGenerator private
Moved MD5HashGenerator into package hasher and made it private to that
package, together with the Hasher effect which is the only permitted
user of it. Added hex and digest methods to Hasher.
Similar for the ETageGenerator in [storage-aws], moved into a hasher
package and made private. It can only be accessed using the S3Hasher
effect.
* [domain] Add Monoid
* [domain] Sources use Monoid
* [core] ActionGenerator Refactor
* [core] Use >>= and *> operators
* [config] Refactoring
* [storage-aws] Refactoring
* [domain] Refactoring
* [core] Refactoring
* [config] refactoring
* Refactoring
* [core] PlanBuilder Refactoring
* [core] Make PlanBuilder into an object
* [storate-aws] Copier Reduce the number of parameters
* [config] merge config package object with Config object
* [config] Only extract batchMode value where used
Don't pull it out early then pass a boolean around
* [config] new module
* [config] stub module
* [domain] Rename domain.Config as domain.LegacyConfig
* [config] Move LegacyConfig to config module
* [config] Move config parsing and validation into module
* [config] Complete migration to module for Config
* [config] Config You should not name methods after their defining object
* [config] Rename LegacyConfig as Configuration
Also remove redundant uses
* [core] LocalFileStream Refactoring
* [changelog] update
* [console] Rename MyConsole as Console
* [console] break infinite loop
* [console] fix typo
* [console] clean up helpers
* [cli] Main use ZIO#provide to run program
* [cli] Main define Program type alias
* [cli] Program handle cli args in Program
* [cli] Program doesn't extend PlanBuilder
* [cli] refactoring
* [cli] rename ParseArgs as CliArgs
* [cli] CliArgs#apply renamed a parse
* [storage-aws] S3StorageService renamed as S3Storage
* [storage-api] Rename StorageService as Storage.Service
* [storage-api] make Storage.copy effectTotal
* [storage-api] make Storage.delete effectTotal
* [storage-api] make Storage.shutdown effectTotal
* [storage-api] make Storage.upload effectTotal
* [storage-aws] Lister refactoring
* [storage-aws] make Lister into a trait
* [storage-aws] make Copier into a trait
* [storage-aws] make Deleter into a trait
* [storate-aws] make Uploader into a trait
* [storage-aws] AmazonS3 move error handling out of client wrapper
* [storage-aws] DeleterTest added
* [storage-aws] ListerTest added
* [storage-aws] Uploader refactoring
* [storage-aws] CopierTest test Copier directly
* [storage-aws] DeleterTest test Deleter directly
* [storate-aws] ListerTest test Lister directly
* [storage-aws] UploaderTest added
* [storage-aws] S3Storage.Live replaces S3StorageServiceBuilder
* Complete migration to Module for Storage
* [cli] Main define LiveThorpApp object
* [core] Add CoreTypes
* [cli] Program Refactoring
* [core] PlanBuilding Refactoring
* [changelog] updated
* [console] Console.Live Usage of get on optional type
* [storage-aws] AmazonS3ClientTestFixture Use wildcards when selecting more than 6 elements
* [sbt] Add ZIO dependency to storage-api
* Convert to use ZIO
* [sbt] remove cats-effect dependency
* [changelog] updated
* [cli] Program restore actions to correct order (copy, upload, delete)
* [cli] Program You should not name methods after their defining object
* [core] ConfigValidationException Redundant braces after class definition
* [core] LocalFileStreamSuite Usage of get on optional type.
* [core] PlanBuilderTest Usage of get on optional type.
* [domain] Drop use of Lenses macro and only create used lenses
* [core] Drop use of Lenses macro and only create used lenses
* [sbt] drop paradise plugin
* [changelog] updated
* [core] Add test file that we create incorrect hash for
By 'incorrect' we mean "not what AWS S3 think is correct" for this
file.
* [domain] HexEncoder rewritten to correctly decode hex
* [domain] HexEncoder encode to uppercase
* [sbt] Add monocle for support for lenses
* [domain] UploadEventListener make a case class
* [domain] Add @Lenses to all case classes
* [core] Add @Lenses to case classes
* [core] ActionGenerator use lense
* [core] ConfigOption use Lenses
* [core] ConfigurationBuilder remove unused fields
* [core] ConfigurationBuilder refactoring
* [core] SyncLogging use lenses
* [core] syncLogging refactoring
* [scalafmt] Add .scalafmt
* [sbt] Add unused import warning and make them errors
* [core] ConfigurationBuilder remove unused import
* [core] ConfigurationBuilder apply scalafmt
* [domain] reformat
* [storage-api] reformat
* [core] reformat and some refactoring
* [storage-aws] reformat
* [cli] reformat
* [core] post rebase fix up
* [storage-aws] UploaderSuite tidy up
* [domain] MD5Hash tweak
Without doing this we have a file that we don't create a valid md5
hash for. See #103
* [storage-aws] UploaderSuite remove unused import
* [storage-aws] StorageServiceSuite reformatted
* [sbt] consistent settings for all modules
Can't enable as stubbing TransferManager attempts to use the default
constructor for TransferManager.
* [storage-aws] Add AmazonTransferManager
This gives us an interface we can safely stub in unit tests without
the compiler failing the build because TransferManager's default
constructor is deprecated.
* [storage-aws] Add AmazonUpload
Prevents deprecation errors due to deprecated parameters on Transfer.
* [sbt] mode import to top of file
* [domain] Config defaults to an empty Sources list
* [core] ConfigurationBuilterTest add test for parsing .thorp.conf
* [core] ConfigQuery if no Sources given returns current dir
* [core] rewrote config loader
- Only settings from explicit sources are used
* [changelog] updated
* [core] Remove stray println statements
* [core] SyncLogging tidy up multi-source messages
* [changelog] updated
* [readme] updated
* [core] ConfigQuery added sources()
* [cli] ParseArgs allow specifying multiple sources
* [domain,core,cli] Source datatype changed to Path
* [domain] Sources added to hold multiple paths in order
* [domain] Config sources change datatype to Sources
* [core] Scan sources for .thorp.config and include any sources listed
This allows the inclusion of a `.thorp.config` file in a source with a
single line `source = ....` that causes that other source to also be
synched into the same remote prefix as the current source.
* [core] ConfigurationBuilderTest add more pending tests
* [[core] ConfigurationBuilderTest rewrite using loan-pattern for fixtures
* [core] ConfigOptionTest use TemporaryFolder
* [core] ConfigOptionTest remove unused fields
* [cli] ParseArgsTest don't use get on an Option
* [core] ConfigurationBuilderTest don't use get on Either
* [core] TemporaryFolder Move import to top of file
* [core] TemporaryFolder use Try over try-finally
* [core] ConfigurationBuilderTest don't use get on Either
* [core] TemporaryFolders.withDirectory propogate errors
* [core] TemporaryFolders add writeFile and createFile
* [core] PlanBuilderTest create a plan with two sources with unique files in both
* [core] ActionGenerator only upload file by name in first source
create a plan
two sources
same filename in both
- only upload file in first source
* [domain] LastModified with no params is now()
* [core] PlanBuilderTest 2 sources w/remote only in 2nd src do nothing
* [core] PlanBuilderTest 2 sources w/remote only in 2nd src do nothing
* [domain] RemoteKey map to a file when prefix is empty
* [domain] S3ObjectData defaults to empty
* [core] KeyGenerator Avoid delimiter when empty prefix key
* [core] PlanBuilderTest when remote not in sources delete from remote
* [core] PlanBuilderTest extract helper md5Hash()
* [core] PlanBuilderTest one source a file no matching remote key
* [core] PlanBuildingTest file with matching key and hash do nothing
* [core] PlanBuilderTest file w/matching remote key and different hash
* [core] PlanBuilderTest a remote key with and without local file
* [core] DummyStorageService Use wildcards when selecting more than 6 elements
* [changelog] updated
* [core] Wrap Stream[LocalFile] as LocalFiles
* [core] LocalFiles counts files
* [core] LocalFiles sums file lengths
* [core] Restore logFileScan
* [storage-aws] Lister logs when fetching object summaries
* [storage-aws] Extract ListerLogger
* [core] Synchronise use leftMap
* [core] Syncronise extract assemblePlan
* [core] Wrap Stream[Action] in SyncPlan
* [core] Copy the file count and totalSizeBytes across to SyncPlan
* [cli] Program rename actions as syncPlan
* [cli] Program extract thorpArchive def
* [cli] Program extract createPlan def
* [cli] Program refactoring
* [cli] Program remove println showing version
* [cli] Program rename actions parameter as syncPlan
* [core] ThorpArchive add an index to each action
* [cli] Program make SyncPlan available to ThorpArchive
* [core] Pass SyncTotals to Archive
* [domain] Move SyncTotals into module
* [domain] Pass index and SyncTotals to UploadEventListener
* [domain] UploadEventLogger add file count a size progress bars
* [domain] UploadEventLogger better display stability and add file index
* [cli] Index files in correct order
* [cli] Program extends Synchronise
* [core] Rename Synchronise as PlanBuilder
* [cli] Program add test to check actions don't get reordered from plan
* [core] collect file size totals
* [domain] UploadEventLogger include percentage
* [cli] ProgramTest Use wildcards when selecting more than 6 elements
* [changelog] Updated
* [readme] Updated
* [domain] Config Add batch-mode flag
* [core] ConfigOption Add BatchMode option
* [core] ConfigQuery Add batchMode query
Also replaced verbose exists case clauses with a simple contains.
* [core] ConfigOptions added to replace Seq[ConfigOption]
* [core] Syncronise rename method to createPlan
* [cli] Program rename apply as run
* [storage-aws] S3StorageServiceBuilder stop using IO to create object
* [storage-aws] S3StorageServiceBuilder make default service lazy
* [storage-aws] Rename S3ClientCopier => Copier
* [storage-aws] Rename S3ClientDeleter => Deleter
* [storage-aws] Rename S3ClientObjectLister => Lister
* [storage-aws] Only attach upload listener when in batch mode
Only detects batch mode when selected as a command line option
* [core] Synchronise use leftMap rather than swap.map.swap
* [cli] ParseArgs add `-B` and `--batch` options to enable batch mode
* [core] ThorpArchive logs file uploaded when in batch mode
* [sbt] make name and version available within Scala
Available as `thorp.BuildInfo._`
* [core] ConfigOption Add Version option
* [cli] ParseArgs add command-line options `-V` and `--version`
* [core] ConfigQuery add showVersion query
* [cli] Program shows version then exit
* [cli] Main don't show "Done"
* [storage-aws] ETagGenerator add stub
* [core] MD5HashGenerator add hex and digest helpers
* [domain] MD5Hash can always provide base64 and also digest
Rather that store the base 64 digest some of the time, simply decode
it from the hex hash. The same for the binary digest.
MD5Hash is now cleaner now that it no longer has Option parameters.
* [core] MD5HashGenerator add stubs to allow reading file chunks
* [domain] MD5HashData add sub-objects
* [domain] MD5HashData move back into test where it belongs
* [sbt] add sbt-bloop plugin
* [domain] MD5HashData Add hash of big-file
* [domain] MD5HashData Add hash of big-file
* [core] MD5HashGenerator find end of chunk correctly
* [core] MD5HashGenerator offset is a Long
* [core] MD5HashGenerator don't read past the end of the file
* [storage-aws] ETagGenerator can reproduce ETags
* [storage-aws] ETagGeneratorTest added
* [storate-aws] ETagGenerator refactoring
* [storage-aws] ETageGenerator refactoring
* [core] SyncSuite remove redundant braces
* [storage-api] HashService added
* [storage-aws] S3HashService added
* [core] LocalFileStream refactoring
* [core] integrate HashService and ETagGenerator
* Optimise imports
* [domain] HexEncoder added to replace java 8 only DataTypeConverter
* [core] MD5HashGenerator refactoring
* [core] S3MetaDataEnricher refactoring
* [core] S3MetaDataEnricherSuite refactoring
* [storage-aws] ETagGeneratorTest refactoring
* [storage-aws] StorageServiceSuite refactoring
* [core] S3MetaDataEnricher refactoring
* [core] refactoring
* [storage-aws] refactoring
* [core,storage-{api,aws}] Allow Lister errors to be reported to user
* [cli,core,storage-*] Display simple error message when bucket is invalid
* [core] optimise imports
* [storate-aws] optimise imports
* [core] SyncSuite don't use get on an optional type
* [aws-lib] Uploader provide request with the already calculated md5 hash
* [aws-lib] remove unused accepts method
* [aws-lib] Uploader refactoring
* [domain] Config remove unused threshold and max retries items
* [core] Show upload errors in summary
* [domain] LocalFile add helper to explicitly compare by hash value
Looking to add an optional field to MD5Hash but we want to do our
checks here only on the hash value, not whether a digest is available
or not.
* [core] Sync refactoring
* [core] SyncSuite invoke subject inside it method and after declaring expectations
* [core] SyncSuite use the localfile hash rather than something arbitrary
* [cli] Add `--no-global` and `--no-user` options
* [core] LocalFileStream refactoring
* [core] SyncSuite: ignore user and global configuration files
* [domain] MD5Hash now can optionally store the base64 encoded hash
* [core] MD5HashGenerator pass the digest to MD5Hash
* [aws-lib] Uploader use the base64 encoded hash
* [changelog] updated
* [core] rename the config supplied from CLI as such
This distinguishes it as config supplied from the command line.
* [core] add ConfigOption
* [core] ConfigOption can update a Config
* [core] new validator for config
* [domain] Config doesn't validate source any more
* [cli] PrintLogger default to not print debug messages
* [cli] Use ConfigOptions and new ConfigValidator
* [sbt] Use common settings for project root
* [domain] RemoteKey can handle when prefix is empty
* [cli] remove banner
* [domain] Logger can create version of itself with debug flipped
* [core] Build and validate Config within core module
This means that the `thorp-lib` module can validate its input from a
list of `ConfigOption`s.
* [core] refactor ConfigurationBuilder
* [core] refactor ConfigurationBuilder
* [sbt] starting back from tagless-final by using IO where needed
* [core] Add ParseConfigFile
* [sbt] Make cats-effect available from the domain
* Roll back from tagless-final to just use cat-effect's IO
* [core] extract ParseConfigLines
* [core] ConfigurationBuilder rename apply as buildConfig
* [core] ParseConfig[Files,Lines] rename apply methods
* [core] refactor ParseConfigFile and add tests
* [core] Sync fix call to run
* [core] SyncSuite update tests to use ConfigOptions
* [aws-api] TTFI UploadProgressLogging#logTransfer
* [aws-api] TTFI UploadProgressLogging#logRequestCycle
* [aws-api] TTFI UploadProgressLogging#logByteTransfer
* [aws-api] TTFI UploadProgressListener
* [aws-lib] TTFI UploaderLogging
* [aws-api] UploadProgressListener refactoring
* [aws-api] UploadProgressListener remove IO/Monad
This class is a wrapper for a callback method used by the AWS SDK.
Unfortunately you can't get the IO() created when that listener is
called by the SDK, so unless we manually run unsafeRunSync, as we have
done previously, it would never be executed.
This removes the IO monad entirely and simply runs the code when the
callback is triggered.
* [aws-lib] S3ClientLogging remove unused method
* [aws-lib] TTFI S3ClientLogging
* [aws-lib] TTFI S3ClientCopier
* [aws-lib] TTFI S3ClientObjectLister
* [aws-lib] TTFI Uploader
* [aws-lib] TTFI S3ClientDeleter
* [aws-api] TTFI S3Client
* [aws-lib] TTFI S3ClientBuilder and ThorpS3Client
* [core] TTFI ActionSubmitter
* [cli] TTFI Logger
* [core] TTFI MD5HashGenerator
* [core] TTFI LocalFileStream
* [core] Sync refactoring
* [core] TTFI Sync
* [aws-lib] S3ObjectsByHashSuite truncate lastmodified to match Date
* [aws-lib] ThorpS3ClientSuite truncate lastmodified to match Date
* [core] MD5HashGeneratorTest switch to Id from IO
* [sbt] restrict cats-effect to cli module, cats-core elsewhere
* [core] MD5HashGenerator collapse lines
* [domain] SizeTranslation includes decimals for larger sizes
* [core] MD5HashGenerator rewrite for memory efficiency
No longer attempt to create an Array the size of the file to be
parsed.
Now it creates a single small buffer and reads 8kb chunks in at a
time. Only creating an additional smaller buffer to read the tail of
the file.
Remove methods to parsing only part of a file are they were no longer
used, and remove the relevant tests.
* [aws-lib] Uploader refactoring
* [aws-lib] Uploader remove redundant braces
* [aws-lib] Uploader start upload inside IO
The upload method starts the upload to S3, so should be within the IO.
* [core] log count of errors
* [aws-lib] Uploader handle errors and count them
* [aws-lib] fold S3ClientUploader trait into it's only implementation
This trait was only implemented by S3ClientTransferManager.
* [core] SyncLogging: more robust matching
No longer cares about parameters to case classes, just their types.
* [cli] Logger uses IO for log methods
* [aws-lib] remove 'transfer-manager'prefix and only show tryCount > 1
* [sbt,cli] remove log4j and scala-logging dependencies
* [domain] move QuoteStripper to Domain
Use it directly in MD5Hash to strip quotes from any input.
* [core] SyncLogging call info in proper context
If the IO.unit returned by the info calls isn't part of the chain that
is returned from the function, then the delayed IO action is never
called.
* [aws-lib] Display size in bytes of file being uploaded
* [core] call info in correct context
* [cli] call info in correct context
* [aws-lib] raise summary fetch message to info 1
* [cli] include correct level in info messages
* [aws-lib] S3ClientLogging adjust logging levels
* [aws-lib] display file sizes in english
* [aws-lib] ObjectLister use IO.bracket properly
* [aws-lib] Copier use IO.bracket properly
* [aws-lib] Deleter refactor
* [aws-lib] TransferManagerLogging remove unused methods
* [aws-lib] TransferManager refactor
* [aws-lib] TransferManager refactor
* [aws-lib] TransferManager displays log messages
Use the UploadProgressListener that was being ignored, and use
unsafeRunSync to execute the suspended effect within the IO[Unit].
Using unsafeRunSync is required to render the effects as the listener
returns Unit, meaning the suspended effects would be discarded.
* [domain] Extract SizeTranslation into module
* [aws-api] report bytes transferred in progress
* [core] fix calls to info
info now returns an IO already, so don't need to wrap it in one.
* [aws-lib] remove unused class
* [aws-lib] UploadProgress displays progress bar while uploading
* [aws-api] UploadProgressLogging optimise imports
* [aws-api] UploadProgressLogging rename variables
* [domain] add Terminal object
* [aws-api] UploadProgressLogging use console width and two lines
- Improved clearing of lines after progress bar
- Use console width for progress bar size
* [aws-lib] S3ClientLogging optimise imports
* [aws-lib] TransferManager clear line before logging
* [aws-lib] rename class as TransferManager
* [aws-lib] rename TransferManger as Uploader to not clash
We are using an AWS SDK class with the same name.
* [domain] rename Filter as Include
* [cli]ParseArgs allow exclude and include parameters to be repeated
* [core] don't include include/exclude details in logging
* [domain] combine Include and Exclude into Filter
Config now collect includes and Excludes into a single list and passed
each file to the Filter.isIncluded method, with the list of Filters,
to determine if a file should be included.
* [core] MD5HashGenerator uses IO to return where there is file IO
This required that LocalFile in the domain module no longer be
supplied with a function to convert a File into an MD5Hash. Because
such a function requires reading the file it now must use IO, which we
don't allow in the domain module.
Unfortunate ripple effects out to users of MD5HashGenerator and
LocalFile.
* [aws-lib] Add own copy of test class MD5HashData
* [core] close files after calculating their MD5 hash
FileInputStream was never closed, so eventually ran into
ToManyFilesOpen.
Will come back to look at this again with IO.bracket for better
guarantee that FIS is closed.
Signed-off-by: Paul Campbell <pcampbell@kemitix.net>
* [aws-lib] Fetch all MD5 hashes under prefix
Initial request only returns the first 1000.
* [sbt] add scalamock as a test dependency
* [aws-lib]SyncSuite: minor layout changes
* [aws-lib]SyncSuite: remove test
* [core] move SyncSuite to same module as subject it tests
* [aws-lib]ThorpS3Client: remove commented lines
* [aws-lib] remove PutObject versions of Uploader
* [aws-lib] rename to TransferManager to remove Multi-part from name
* [aws-lib]TransferManager: change logging prefix
* [aws-lib] convert logging classes to objects
* [aws-lib] convert ObjectLister to use V1 SDK
* [aws-lib] convert Copier to use V1 SDK
* [aws-lib] extract S3ObjectsBy{Hash,Key} to objects
* [aws-lib]S3ClientSuite: rewrite test using mocks
* [aws-lib]TransferManager rewrite using for-comprehension
* [aws-lib]Copier: remote bucket name from target remote key
* [aws-lib]TransferManager: refactor logging to use IO themselves
* [aws-lib] Remove test class MyAmazonS3
* [aws-lib]ObjectLister: optimise imports
* [aws-lib] S3ClientSuite remove commented code
* [aws-lib]ThropS3ClientSuite update to V1 api
* [aws-lib]S3ClientSuite: make test as pending
It works okay on its own, but when run as part of a suite it fails.
Will look at this again once all V2 SDK is removed.
* [aws-lib] convert Deleter to use V1 SDK
* [aws-lib] Client Logging remove redundant braces
* [aws-lib] stop injecting the V2 SDK
* [sbt] remove v2 SDK dependencies
* [aws-lib] remove redundant helpers for v2 SDK
* [sbt] upgrade aws jackson dependencies
The jackson libraries used by AWS have security flaws, but are Java 6
compatible, which AWS want to preserve.
* [aws-lib] clean up TransferManager tests
* [core] convert QuoteStripper to an object and move to core
* [aws-lib]S3ClientUploader: use case matching instead of else if blocks
* [aws-lib] put imports at top of file
* [domain] remove redundant braces after class definition
* [aws-lib] remove redundant braces after class definition
* [core] avoid using head on a collection