Commit Briefs

38e11cc05b Stefan Sperling

add a utf8 todo item


494e2b9b6a Stefan Sperling

plug a memory leak in 'got blame'

The leak is present in got_privsep_recv_traversed_commits. There is an edge case where it receives consecutive imsgs. The first behaves as normal and we got_object_id_dup the last commit id for changed_commit_id. The following imsg(s) then still allocates the last commit id, leaking the one(s) prior allocated. Patch by Kyle Ackerman


c237d8914d Omar Polo

render_notification: don't leak fd on error



54dbd95c88 Omar Polo

fmt


78e82c8a2a Stefan Sperling

remove GOT_ERR_ITER_BUSY from got_commit_graph_iter_start()

Just clear any left-over iteration state and begin a fresh iteration instead of returning GOT_ERR_ITER_BUSY if the caller did not loop through the entire graph. This change currently doesn't matter much since all existing callers only do a single pass over the graph. But it frees up an error code and makes this API more flexible.



4e2fa922ce Stefan Sperling

hide a pointless end-of-file error on imsg pipe in libexec helpers

This error popped up in op's regress builder: got-fetch-pack: error 118 "test-repo: Permission denied": poll: unexpected end of file ok op@



e70fd95218 Stefan Sperling

split gotd/session.c into session_read.c and session_write.c

This makes it easier to tweak the read/write code paths separately.



1cb49b67c1 Stefan Sperling

get rid of gotd client_id field where it is not needed

This ID was necessary back when session and repo processes supported connections from multiple clients. Nowadays, these processes run per connection and exit once a single client session has been served. The other processes already identify the client via the session/repo file descriptor which has sent an imsg.



818f96befd Stefan Sperling

track session state in struct gotd_session instead of got_session_client

Eventually, I would like to disconnect clients before notifications are generated. This change helps pave the way towards this goal.


09486e84b6 Omar Polo

got-notify-email: bufferize smtp parsing

instead of read(2)ing one byte at the time, use a temporary buffer. Special care is needed for the regress where all the replies are queued up-front instead of a real SMTP server where we'd get a reply only after a command. ok and improvements stsp@


39910b637a Omar Polo

got-notify-email: split dial() out of send_email()

This allows to reduce the set of pledge(2) promises needed at runtime down to only "stdio" which will also help sandboxing -portable. ok stsp


100d3e4bb8 Omar Polo

mark smtp_timeout as static


dfa6ae4cb7 Omar Polo

fmt


7d68253bff Omar Polo

plug memleak in parsing the notify options

The strings need to be released regardless of the process parsing the file.


ba97b2d7ec Stefan Sperling

add initial support for commit notifications to gotd(8)

At present only email notifications are implemented. Code for HTTP notifications is not yet finished, hence HTTP-related documentation remains hidden for now. This adds a new 'notify' process which has an "exec" pledge. It runs helper programs which implement the notification transport layer, such as got-notify-email which speaks SMTP. This design avoids having to link all of gotd with network libraries and related crypto libraries. Notification content is generated by the 'repo_write' process. Commit log messages and diffstats are written to a file which the 'notify' process will pass on to its helpers on stdin. The default output looks similar to 'got log -d'. If too many new commits are present the output looks similar to 'got log -s' instead. Tags always look like 'got tag -l'. The session process coordinates generation of notifications. It maintains a notification queue which holds one notification per updated reference, and passes notification requests from this queue to the 'repo_write' process for notification content creation and then to the 'notify' process for notification delivery. Only one notification can be in flight at a time to avoid file descriptor starvation if many references get updated in a single client session. ok op@


0f8a0e25ff Stefan Sperling

make output of 'got ref -l' more consistent

Ensure that got ref -l provides consistent output regardless of whether references are packed or not. Problem reported by naddy@ Also make 'got ref -l name' work consistently when the provided argument is the name of a reference, rather than a ref-prefix. ok naddy


e0cc3e2b47 Stefan Sperling

introduce got_poll_read_full_timeout()

Upcoming gotd code needs to avoid infinite network socket read timeouts.


05fd31691c Stefan Sperling

add support for reading blobs to object_open_io.c


4c9b88110f Stefan Sperling

introduce got_opentemp_truncatefd()


30a624fb1e Stefan Sperling

avoid a rename/stat race when gotd installs a new pack and then uses it

Reset the cached repository's pack directory mtime after installing a new pack and pack index file. I have observed the mtime of the pack directory as reported by stat(2) remaining unchanged, until some time has passed beyond the rename(2) calls used to install the pack file and its index. If gotd immediately tries to read objects installed in a new pack file then the mtime reported by stat(2) might appear as unchanged. gotd will then fail to update its cached list of pack index files and not find the newly installed objects. Clearing the cached timestamp forces a readdir(3) call which does expose the newly installed pack index file as expected. Not sure whether stat(2) is supposed to immediately expose mtime changes after a rename(2). If so then this might warrant digging into the kernel. Seen while running regression tests for upcoming gotd notification support.