aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2024-12-28lib/bytes: split the hexdump related functions to separate packageShulhan
Package hexdump implements reading and writing bytes from and into hexadecimal number. It support parsing output from hexdump(1) tool.
2024-12-28lib/binary: implement append-only binary fileShulhan
The binary is new package that complement the standard binary package Currently it implement append-only binary that encode the data using [binary.Writer]. We call them "Apo" for short.
2024-12-28lib/watchfs: cleaning up, merge shared identifiers to package fileShulhan
2024-12-28lib/watchfs: detach the options from memfsShulhan
2024-12-28lib/memfs: move the old Watcher and DirWatcher to watchfsShulhan
The watchfs package now contains the original, v1, of the Watcher and DirWatcher types. This changes require exporting method [memfs.MemFS.UpdateContent].
2024-12-28lib/memfs: refactoring Watch to use "watchfs/v2"Shulhan
2024-12-28watchfs/v2: implement new directory watcherShulhan
DirWatcher scan the content of directory in [fs.DirWatcherOptions.Root] recursively for the files to be watched, using the [fs.DirWatcherOptions.Includes] field. A single file, [fs.DirWatcherOptions.FileWatcherOptions.FilePath], will be watched for changes that will trigger re-scanning the content of Root recursively. The result of re-scanning is list of the Includes files (only files not new directory) that are changes, which will be send to channel C. On each [os.FileInfo] received from C, a deleted file have [os.FileInfo.Size] equal to [NodeFlagDeleted]. The channel will send an empty slice if no changes. The implementation of file changes in this code is naive, using loop and comparison of mode, modification time, and size; at least it should works on most operating system.
2024-12-28watchfs/v2: implement new file watcherShulhan
The watchfs package contains new FileWatcher, more simple than what we have in [memfs.Watcher].
2024-12-28go.mod: update Go toolchains to version 1.23.4Shulhan
We will needs slices and maps packages that are available since Go 1.23.
2024-12-28lib/test: update comment to show link on reflect.EqualerShulhan
2024-12-28lib/reflect: refactor the Equaler method EqualShulhan
This changes the Equal signature from "Equal(v any) bool" to "Equal(v any) error". The reason for this changes is to force the method to return an error message that is understand-able by caller. While at it, simplify checking for Equaler interface in internal doEqualStruct function.
2024-12-28lib/http: simplify setting Client TransportShulhan
While at it, set the ExpectContinueTimeout using the Timeout from ClientOptions.
2024-12-28lib/http: add method to return default HTTP Transport in ClientShulhan
The returned [http.Transport] is created after the Client instantiated. Their value can be customized by user when needed, which should affect the Transport inside the Client.
2024-12-28lib/ssh: implement Run with contextShulhan
Instead of depends on fork of crypto with CL that needs [proposal], implement them in here so we can update crypto to the latest release. [proposal]: https://go-review.googlesource.com/c/crypto/+/552435
2024-12-28lib/play: simplify running Go codeShulhan
This changes remove the field pid in the struct command that wait for process ID, instead execute cmd with Run directly. In the Run function, use the UnsafeRun to store temporary directory and move the statements that writes go.mod and main.go into the method writes of Request. This remove unnecessary unsafeRun function.
2024-12-28lib/play: move all HTTP related methods to its own fileShulhan
2024-12-28lib/play: initialize user's home and cache dir in initShulhan
The home and cache dir should never changes during a running program, so we can set in once during package initialization. If Go failed to get the home and cache it will be set to system temporary directory.
2024-12-28lib/play: implement function to test Go codeShulhan
The Test and HTTPHandleTest functions accept Request with File and Body fields.
2024-12-07Release pakakeh.go v0.58.1 (2024-12-07)v0.58.1Shulhan
=== Enhancements * lib/play: add custom request to run unsafe directory directly As exceptional, the Run and HTTPHandleRun accept the following request for running program inside custom "go.mod", { "unsafe_run": <path> } The "unsafe_run" define the path to directory relative to HTTP server working directory. Once request accepted it will change the directory into "unsafe_run" first and then run "go run ." directly. Go code that executed inside "unsafe_run" should be not modifiable and safe from mallicious execution. * lib/play: add option to Run with specific Go version and without race The idea is to allow testing Go code on specific Go version. For example, before Go 1.22, the for loop with variable is shared among block statements, which cause every use of that variable is run with the last value. * lib/play: expose the Timeout variable By exposing the Timeout, user can set their maximum time the program can run in their playground.
2024-12-07go.mod: update all dependenciesShulhan
2024-12-06lib/play: add custom request to run unsafe directory directlyShulhan
As exceptional, the Run and HTTPHandleRun accept the following request for running program inside custom "go.mod", { "unsafe_run": <path> } The "unsafe_run" define the path to directory relative to HTTP server working directory. Once request accepted it will change the directory into "unsafe_run" first and then run "go run ." directly. Go code that executed inside "unsafe_run" should be not modifiable and safe from mallicious execution.
2024-12-03lib/memfs: move compiled regex to their optionsShulhan
This changes move the following fields and methods from MemFS, * incRE and excRE fields to Options, * isIncluded and isExclude methods to Options, * watchRE field to WatchOptions, * isWatched method to WatchOptions. The reason is to allow other type that use Options or WatchOptions to use isIncluded, isExclude, or isWatched methods.
2024-11-16lib/play: add option to Run with specific Go version and without raceShulhan
The idea is to allow testing Go code on specific Go version. For example, before Go 1.22, the for loop with variable is shared among block statements, which cause every use of that variable is run with the last value.
2024-10-30lib/play: expose the Timeout variableShulhan
By exposing the Timeout, user can set their maximum time the program can run in their playground.
2024-10-06.github/workflows: update Go to v1.23.2Shulhan
Eventhough the go.mod define go version 1.22.0, the [lib/play] use Go version 1.23.2 for running testing.
2024-10-06Release pakakeh.go v0.58.0 (2024-10-06)v0.58.0Shulhan
This release update the minimum Go module to 1.22.0, the last version supported by Go tools. === Breaking changes * lib/http: remove writing StatusNoContent on ResponseTypeNode To make it consistent with RequestTypeNone, the ResponseTypeNone should not write any response header or HTTP status code. It will be handled manually by [Endpoint.Call]. === New features * lib/play: new package for formatting and running Go code Package play provides callable APIs and HTTP handlers to format and run Go code, similar to Go playground, but using HTTP instead of WebSocket. * lib/http: add Server method to register handler by function The RegisterHandleFunc register a pattern with a handler, similar to [http.ServeMux.HandleFunc]. The pattern follow the Go 1.22 format: [METHOD] PATH The METHOD is optional, default to GET. The PATH must not contains the domain name and space. Unlike standard library, variable in PATH is read using ":var" not "{var}". This endpoint will accept any content type and return the body as is; it is up to the handler to read and set the content type and the response headers. If the METHOD and/or PATH is already registered it will panic. * lib/bytes: add function AppendInt64 and AppendUint64 The AppendInt64 append an int64 value into slice of byte. The AppendUint64 append an uint64 value into slice of byte.
2024-10-06go.mod: update all dependenciesShulhan
2024-10-04lib/play: new package for formatting and running Go codeShulhan
Package play provides callable APIs and HTTP handlers to format and run Go code, similar to Go playground, but using HTTP instead of WebSocket.
2024-09-30lib/http: add Server method to register handler by functionShulhan
The RegisterHandleFunc register a pattern with a handler, similar to [http.ServeMux.HandleFunc]. The pattern follow the Go 1.22 format: [METHOD] PATH The METHOD is optional, default to GET. The PATH must not contains the domain name and space. Unlike standard library, variable in PATH is read using ":var" not "{var}". This endpoint will accept any content type and return the body as is; it is up to the handler to read and set the content type and the response headers. If the METHOD and/or PATH is already registered it will panic.
2024-09-30lib/http: remove writing StatusNoContent on ResponseTypeNodeShulhan
To make consistent with RequestTypeNone, the ResponseTypeNone should not write any response header or HTTP status code. It will be handled manually by [Endpoint.Call].
2024-09-30lib/bytes: add function AppendInt64 and AppendUint64Shulhan
The AppendInt64 append an int64 value into slice of byte. The AppendUint64 append an uint64 value into slice of byte.
2024-09-30go.mod: update module to v1.22.0Shulhan
2024-09-30all: simplify some statementsShulhan
2024-09-13all: initialize SPDX licenseShulhan
From now on, any new or changes to files will use SDPX license format in the file header.
2024-09-13all: replace golangci-lint with 'got vet'Shulhan
This is the second time the golangci-lint does not work using go tip. We also found that running golangci-lint on VM with 8GB cause the program crash with out of memory.
2024-09-04Release pakakeh.go v0.57.0 (2024-09-03)v0.57.0Shulhan
=== Breaking changes * lib/sql: replace [http.FileSystem] with [memfs.MemFS] Accepting the [http.FileSystem] means that the parameter can receive an instance of [embed.FS], but in most cases, it will fail. Case example, when we embed SQL files for migration under "db/migration" using the "go:embed" directive, //go:embed db/migration/*.sql var DBMigrationFS embed.FS and then call the [Migrate] function, it will not find any ".sql" files inside the "/" directory because the files is stored under "db/migration/" prefix (also there is no "/" when using embed.FS). === Chores * lib/memfs: document the comparison with "go:embed" directive Compare it to "go:embed", the memfs package is more flexible and portable. Currently, we found three disadvantages of using "go:embed", - The "go:embed" only works if files or directory to be embedded is in the same parent directory. - Accessing the embedded file require the original path. - No development mode. None of those limitation affected the memfs package.
2024-09-04all: fix various linter warningsShulhan
While at it, temporary disable gosec due to excessive report for G115, which may be true, but may also break the current working program. We should alter and fix once we can test and make sure that it does not breaks.
2024-09-03go.mod: update all dependenciesShulhan
2024-08-09lib/sql: replace [http.FileSystem] with [memfs.MemFS]Shulhan
Accepting the [http.FileSystem] means that the parameter can receive an instance of [embed.FS], but in most cases, it will fail. Case example, when we embed SQL files for migration under "db/migration" using the "go:embed" directive, //go:embed db/migration/*.sql var DBMigrationFS embed.FS and then call the [Migrate] function, it will not found any ".sql" files inside the "/" directory because the files is stored under "db/migration/" prefix (also there is no "/" when using embed.FS).
2024-08-09lib/memfs: document the comparison with "go:embed" directiveShulhan
Compared it with "go:embed", the memfs package is more flexible and portable. Currently, we found three disadvantages of using "go:embed", #1 - The "go:embed" only works if files or directory to be embedded is in the same parent directory. #2 - Accessing the embedded file require the original path. #3 - No development mode.
2024-08-04Release pakakeh.go v0.56.0 (2024-08-04)v0.56.0Shulhan
== New features * cmd/emaildecode: CLI to decode email body to plain text The emaildecode accept file as input. If the email header contains content-transfer-encoding with value quoted-printable or base64, it will decode the message body and print it to stdout as plain text. == Bug fixes * lib/memfs: another fix for refresh In previous commit we use wrong condition when handling directory "." as Root. == Enhancements * lib/email: allow message that end lines with LF only Although, a message from network must end with CRLF, a message from (another) client may have been sanitized and end with LF only. * lib/email: decode the message body based on content-transfer-encoding After the header and body has been parsed, if the header contains Content-Transfer-Encoding, we decode the body into its local formats. Currently supported encoding is "quoted-printable" and "base64". == Others * lib/email: export the Header fields By exporting the fields, this allow the caller to filter or manage the field manually. * _doc: add partial note and summary for RFC 2183 The RFC 2183 is define Content-Disposition header field in the internet message. * lib/ini: mention that marshaling []byte does not supported Due to "byte" is considered as "uint8" during reflection, we cannot tell whether the value is slice of byte of slice of number with type uint8.
2024-08-04lib/ini: mention that marshaling []byte does not supportedShulhan
Due to "byte" is considered as "uint8" during reflection, we cannot tell whether the value is slice of byte of slice of number with type uint8.
2024-08-04_doc: add partial note and summary for RFC 2183Shulhan
The RFC 2183 is define Content-Disposition header field in the internet message.
2024-08-04cmd/emaildecode: CLI to decode email body to plain textShulhan
The emaildecode accept file as input. If the email header contains content-transfer-encoding with value quoted-printable or base64, it will decode the message body and print it to stdout as plain text.
2024-08-04lib/email: export the field Fields in HeaderShulhan
By exporting the field, this allow the caller to filter or manage the Header Fields manually.
2024-08-03lib/email: decode the message body based on content-transfer-encodingShulhan
After the header and body has been parsed, if the header contains Content-Transfer-Encoding, we decode the body into its local formats. Currently supported encoding is "quoted-printable" and "base64".
2024-08-03lib/email: allow message that end lines with LF onlyShulhan
Although, a message from network must end with CRLF, a message from (another) client may have been sanitized and end with LF only.
2024-08-03lib/memfs: another fix for refreshShulhan
In previous commit we use wrong condition when handling directory "." as Root.
2024-07-22Release pakakeh.go v0.55.2 (2024-07-22)v0.55.2Shulhan
=== Bug fix * lib/memfs: sanitize the Root directory to fix refresh In [MemFS.refresh], if the requested url is "/file1" and [Options.Root] is ".", the path during refresh become "file1" and if passed to [filepath.Dir] it will return ".". This cause the loop on refresh never end because there is no PathNodes equal with ".".
2024-07-22lib/memfs: sanitize the Root directory to fix refreshShulhan
In [MemFS.refresh], if the requested url is "/file1" and [Options.Root] is ".", the path during refresh become "file1" and if passed to [filepath.Dir] it will return ".". This cause the loop on refresh never end because there is no PathNodes equal with ".".