summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2026-10-30 20:05:36 +0100
committerRoman Smrž <roman.smrz@seznam.cz>2026-10-30 20:22:23 +0100
commit5f497fe9e20cc414113f46b5b97a88e4cb77aef9 (patch)
treeb083fe04ecd0a73107e186e7098fdbc610e4c23a /src
parent09df29c85950e4908dbabeceb503ce3764f32561 (diff)
Last tag selection based on creation time
Diffstat (limited to 'src')
-rw-r--r--src/Expression.hs9
-rw-r--r--src/Repo.hs9
2 files changed, 18 insertions, 0 deletions
diff --git a/src/Expression.hs b/src/Expression.hs
index 994912e..bf35f2a 100644
--- a/src/Expression.hs
+++ b/src/Expression.hs
@@ -31,6 +31,7 @@ import Data.Maybe
import Data.Proxy
import Data.Text (Text)
import Data.Text qualified as T
+import Data.Time.LocalTime
import Data.Void
import Text.Megaparsec
@@ -277,6 +278,9 @@ parseRangeExpression = bimap errorBundlePretty id . runParser parser ""
"highesttag" -> do
pat <- parseTagPattern
return $ SingleRevisionExpression $ StaticRef $ TagRef pat higherTag
+ "lasttag" -> do
+ pat <- parseTagPattern
+ return $ SingleRevisionExpression $ StaticRef $ TagRef pat laterTag
_ -> unexpected $ Tokens $ NE.fromList $ chunkToTokens @Text Proxy tok
, do
@@ -306,3 +310,8 @@ higherTag t t'
= Left $ read @Integer $ T.unpack s
| otherwise
= Right s
+
+laterTag :: Tag a -> Tag a -> Tag a
+laterTag t t'
+ | zonedTimeToUTC (tagTime t) < zonedTimeToUTC (tagTime t') = t'
+ | otherwise = t
diff --git a/src/Repo.hs b/src/Repo.hs
index b6ad8d4..7fe699c 100644
--- a/src/Repo.hs
+++ b/src/Repo.hs
@@ -52,6 +52,8 @@ import Data.Maybe
import Data.Text (Text)
import Data.Text qualified as T
import Data.Text.Encoding
+import Data.Time.Format
+import Data.Time.LocalTime
import System.Environment
import System.Exit
@@ -118,6 +120,8 @@ data Tag a = Tag
{ tagTag :: Text
, tagId :: TagId
, tagObject :: a
+ , tagTagger :: Text
+ , tagTime :: ZonedTime
, tagMessage :: Text
}
@@ -263,6 +267,11 @@ tryReadTag repo tag = do
guard (otype == "commit")
tagTag <- T.pack <$> lookup "tag" info
cid <- CommitId . BC.pack <$> lookup "object" info
+
+ tagger <- T.pack <$> lookup "tagger" info
+ let tagTagger = T.dropEnd 1 $ T.dropWhileEnd (/= ' ') $ T.dropEnd 1 $ T.dropWhileEnd (/= ' ') tagger
+ tagTime <- parseTimeM False defaultTimeLocale "%s %z" $ T.unpack $ T.drop (T.length tagTagger + 1) tagger
+
let tagMessage = T.pack $ unlines $ dropWhile null message
Just $ do
tagObject <- liftIO $ mkCommit repo cid