Add per-repo notify_on_pull configuration
Build / build (push) Failing after 10s

- Add rcNotifyOnPull field to RepoConfig (default: False)
- notify_on_pull YAML config key per repository
- When enabled, sends a desktop notification whenever new commits
  are pulled from the remote (with commit count and summaries)
- Uses HEAD comparison to detect actual new commits, not just
  successful pull execution
- Updated example config and spec
This commit is contained in:
2026-05-14 10:20:24 -04:00
parent f66dfcbccb
commit 97078928fc
3 changed files with 24 additions and 0 deletions
+1
View File
@@ -15,3 +15,4 @@
## Supports configurable log levels (debug, info, warn, error) ## Supports configurable log levels (debug, info, warn, error)
## Supports logging to a file instead of stderr via --log-file or log_file config ## Supports logging to a file instead of stderr via --log-file or log_file config
## Can notify on pull: per-repo notify_on_pull setting sends a desktop notification when new commits are pulled from the remote
+1
View File
@@ -6,6 +6,7 @@ repos:
- path: /home/jbrechtel/org - path: /home/jbrechtel/org
remote: origin remote: origin
branch: main branch: main
# notify_on_pull: true # send a notification when new commits are pulled
- path: /work/personal/hawat - path: /work/personal/hawat
# remote defaults to "origin" # remote defaults to "origin"
# branch defaults to "main" # branch defaults to "main"
+22
View File
@@ -64,6 +64,8 @@ data RepoConfig = RepoConfig
-- ^ Remote name to pull from. -- ^ Remote name to pull from.
, rcBranch :: !Text , rcBranch :: !Text
-- ^ Branch to pull. -- ^ Branch to pull.
, rcNotifyOnPull :: !Bool
-- ^ Send a notification when new commits are pulled from the remote.
} }
deriving (Show, Eq) deriving (Show, Eq)
@@ -105,6 +107,7 @@ defaultRepoConfig =
{ rcPath = "." { rcPath = "."
, rcRemote = "origin" , rcRemote = "origin"
, rcBranch = "main" , rcBranch = "main"
, rcNotifyOnPull = False
} }
-- | Sensible defaults for options. -- | Sensible defaults for options.
@@ -167,6 +170,7 @@ instance FromJSON RepoConfig where
<$> o .: "path" <$> o .: "path"
<*> (fromMaybe "origin" <$> o .:? "remote") <*> (fromMaybe "origin" <$> o .:? "remote")
<*> (fromMaybe "main" <$> o .:? "branch") <*> (fromMaybe "main" <$> o .:? "branch")
<*> (fromMaybe False <$> o .:? "notify_on_pull")
-- | Load a YAML config file. -- | Load a YAML config file.
loadConfig :: FilePath -> IO Config loadConfig :: FilePath -> IO Config
@@ -341,6 +345,8 @@ syncRepo opts logger repo = do
("Commit failed in " <> rcPath repo <> " (exit " <> show commitCode <> ")") ("Commit failed in " <> rcPath repo <> " (exit " <> show commitCode <> ")")
-- Pull -- Pull
logRepo logger repo ("pulling " <> rcRemote repo <> "/" <> rcBranch repo) logRepo logger repo ("pulling " <> rcRemote repo <> "/" <> rcBranch repo)
(_, headBefore, _) <- runGitIn (rcPath repo) ["rev-parse", "HEAD"]
let headBefore' = T.strip headBefore
(pullCode, pullOut, pullErr) <- gitPull logger repo (pullCode, pullOut, pullErr) <- gitPull logger repo
case pullCode of case pullCode of
ExitSuccess -> do ExitSuccess -> do
@@ -348,6 +354,22 @@ syncRepo opts logger repo = do
if T.null trimmed if T.null trimmed
then logRepo logger repo "pull: already up to date" then logRepo logger repo "pull: already up to date"
else logRepo logger repo ("pull succeeded:\n" <> trimmed) else logRepo logger repo ("pull succeeded:\n" <> trimmed)
-- Notify on new commits pulled, if configured
when (rcNotifyOnPull repo) $ do
(_, headAfter, _) <- runGitIn (rcPath repo) ["rev-parse", "HEAD"]
let headAfter' = T.strip headAfter
when (headBefore' /= headAfter') $ do
let range = T.unpack headBefore' <> ".." <> T.unpack headAfter'
(_, logOut, _) <- runGitIn (rcPath repo) ["log", "--oneline", range]
let newCommits = filter (not . T.null) (T.lines logOut)
count = length newCommits
summary = T.unlines (take 5 newCommits)
more = if count > 5 then "\n... and " <> T.pack (show (count - 5)) <> " more" else ""
logRepo logger repo ("pulled " <> T.pack (show count) <> " new commit(s)")
notifyUser
opts
("Converge: " <> show count <> " New Commit(s) in " <> rcPath repo)
("Pulled " <> show count <> " new commit(s):\n" <> T.unpack summary <> T.unpack more)
_ -> do _ -> do
logRepoAt logger Error repo ("pull FAILED (exit " <> T.pack (show pullCode) <> "): " <> T.strip (pullOut <> pullErr)) logRepoAt logger Error repo ("pull FAILED (exit " <> T.pack (show pullCode) <> "): " <> T.strip (pullOut <> pullErr))
notifyUser notifyUser