- 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:
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user