Display branches
authorJoachim Breitner <mail@joachim-breitner.de>
Thu, 6 Aug 2015 14:11:01 +0000 (16:11 +0200)
committerJoachim Breitner <mail@joachim-breitner.de>
Thu, 6 Aug 2015 14:11:01 +0000 (16:11 +0200)
for now, just like tags, so not as useful as it could be.

Also limit both branches and tags to those that contain the start
commit.

ghc/settings.yaml
install-jslibs.sh
site/index.html
site/js/gipeda.js
src/BenchmarkSettings.hs
src/Development/Shake/Gitlib.hs
src/Shake.hs

index a162f3b..aef3f00 100644 (file)
@@ -3,6 +3,7 @@ revisionInfo: '<a href="https://git.haskell.org/ghc.git/commitdiff/{{rev}}">View
 limitRecent: 50
 start: 55e7ab1210975e6276f3cab3ac0e1f35bcd772f0
 interestingTags: "*-release"
+interestingBranches: "*"
 
 benchmarks:
   - match: "*"
index 3ee8ea4..9b38a3a 100755 (executable)
@@ -33,5 +33,5 @@ test -d bootstrap || {
        rm -f bootstrap-3.3.1-dist.zip
        cd ..
        }
-test -e naturalSort.j ||
+test -e naturalSort.js ||
        wget -c https://raw.githubusercontent.com/overset/javascript-natural-sort/master/naturalSort.js
index ecd21cc..7a30355 100644 (file)
@@ -252,6 +252,49 @@ html {
   </table>
 </script>
 
+<script id="branches"  type="text/x-handlebars-template">
+  <h2>Branches</h2>
+  <table class="table branch-table">
+   {{#each_unnaturally branches}}
+     {{#with (lookup ../revisions this)}}
+      {{#with this.summary}}
+      <tr class="branch-row">
+       <td class="col-md-2 text-right">
+        <abbrv class="timeago" title="{{ iso8601 this.gitDate }}">{{ humanDate this.gitDate}}</abbrv>
+       </td>
+       <td class="col-md-1">
+       <a href="{{revisionLink hash}}">
+          {{> rev-id hash=hash}}
+       </a>
+       </td>
+       <td class="col-md-2">
+        <strong>{{ @key }}</strong>
+       </td>
+       <td class="col-md-7">
+        {{ gitSubject }}
+       </td>
+      </tr>
+      {{/with}}
+     {{else}}
+      <tr
+       title="The tip of this branch has not been benchmarked yet"
+       class="branch-row">
+       <td class="col-md-2 text-right">
+       </td>
+       <td class="col-md-1">
+          {{> rev-id hash=this}}
+       </td>
+       <td class="col-md-2">
+        {{ @key }}
+       </td>
+       <td class="col-md-7 text-right">
+       </td>
+      </tr>
+     {{/with}}
+   {{/each_unnaturally}}
+  </table>
+</script>
+
 <script id="revTooltip" type="text/x-handlebars-template">
  <a href="{{revisionLink hash}}">
   {{> rev-id hash=hash}}
@@ -333,13 +376,16 @@ html {
  <div class="container">
   <h1>Recent commits</h1>
   {{> summary-list (recentCommits revisions)}}
-  {{> tags }}
- </div>
- <div class="container">
   <p class="text-center">
     <a href="{{allLink}}">view older commits...</a>
   </p>
  </div>
+ <div class="container">
+  {{> tags }}
+ </div>
+ <div class="container">
+  {{> branches }}
+ </div>
 </script>
 
 <script id="complete" type="text/x-handlebars-template">
@@ -348,6 +394,7 @@ html {
   <h1>All commits</h1>
   {{> summary-list (allCommits revisions)}}
   {{> tags }}
+  {{> branches }}
  </div>
 </script>
 
index 8cfc55f..9b7ba8f 100644 (file)
@@ -150,7 +150,7 @@ $(function ()  {
     templates[id] = Handlebars.compile(source);
   });
 
-  var partials_ids =  ["nav", "summary-icons", "summary-list", "rev-id", "nothing", "tags"];
+  var partials_ids =  ["nav", "summary-icons", "summary-list", "rev-id", "nothing", "tags", "branches"];
   partials_ids.forEach(function(id) {
     var source = $("#" + id).html();
     Handlebars.registerPartial(id, source);
@@ -233,7 +233,9 @@ Handlebars.registerHelper('each_unnaturally', function(context,options){
     if (context) {
        console.log(context);
        var keys = jQuery.map(context, function(v,k) {return k});
-       var sorted_keys = keys.sort(naturalSort).reverse();
+        // needs https://github.com/overset/javascript-natural-sort/issues/21 fixed
+       //var sorted_keys = keys.sort(naturalSort).reverse();
+       var sorted_keys = keys.sort().reverse();
        sorted_keys.map(function (k,i) {
            output += options.fn(context[k], {data: {key: k, index: i}});
        });
index 6d9b91f..d2db176 100644 (file)
@@ -88,6 +88,7 @@ data Settings = Settings
    , limitRecent :: Integer
    , start :: String
    , interestingTags :: Maybe String
+   , interestingBranches :: Maybe String
    , benchSettings :: BenchName -> BenchSettings
    }
 
@@ -98,6 +99,7 @@ instance FromJSON Settings where
                  <*> v .: "limitRecent"
                  <*> v .: "start"
                  <*> v .:? "interestingTags"
+                 <*> v .:? "interestingBranches"
                  <*> (unS <$> v.: "benchmarks")
     parseJSON _ = mzero
 
index deb951b..682b5f2 100644 (file)
@@ -5,6 +5,7 @@ module Development.Shake.Gitlib
     , getGitContents
     , doesGitFileExist
     , readGitFile
+    , isGitAncestor
     ) where
 
 import System.IO
@@ -13,6 +14,7 @@ import qualified Data.Text as T
 import qualified Data.Text.Encoding as T
 import Data.Functor
 import Data.Maybe
+import System.Exit
 
 
 import Development.Shake
@@ -36,6 +38,9 @@ newtype GitSHA = GitSHA T.Text
 newtype GetGitFileRefQ = GetGitFileRefQ (RepoPath, RefName, FilePath)
     deriving (Typeable,Eq,Hashable,Binary,NFData,Show)
 
+newtype IsGitAncestorQ = IsGitAncestorQ (RepoPath, RefName, RefName)
+    deriving (Typeable,Eq,Hashable,Binary,NFData,Show)
+
 instance Rule GetGitReferenceQ GitSHA where
     storedValue _ (GetGitReferenceQ (repoPath, name)) = do
         Just . GitSHA <$> getGitReference' repoPath name
@@ -45,11 +50,19 @@ instance Rule GetGitFileRefQ (Maybe T.Text) where
         ref' <- getGitReference' repoPath name
         Just <$> getGitFileRef' repoPath ref' filename
 
+instance Rule IsGitAncestorQ Bool where
+    storedValue _ (IsGitAncestorQ (repoPath, ancestor, child)) = do
+        Just <$> isGitAncestor' repoPath ancestor child
+
 getGitReference :: RepoPath -> String -> Action String
 getGitReference repoPath refName = do
     GitSHA ref' <- apply1 $ GetGitReferenceQ (repoPath, T.pack refName)
     return $ T.unpack ref'
 
+isGitAncestor :: RepoPath -> String -> String -> Action Bool
+isGitAncestor repoPath ancName childName = do
+    apply1 $ IsGitAncestorQ (repoPath, T.pack ancName, T.pack childName)
+
 getGitContents :: RepoPath -> Action [FilePath]
 getGitContents repoPath = do
     GitSHA ref' <- apply1 $ GetGitReferenceQ (repoPath, "HEAD")
@@ -77,6 +90,12 @@ getGitReference' repoPath refName = do
 getGitReference' repoPath refName = do
     T.pack . concat . lines . fromStdout <$> cmd ["git", "-C", repoPath, "rev-parse", T.unpack refName++"^{commit}"]
 
+isGitAncestor' :: RepoPath -> RefName -> RefName -> IO Bool
+-- Easier using git
+isGitAncestor' repoPath ancName childName = do
+    Exit c <- cmd ["git", "-C", repoPath, "merge-base", "--is-ancestor", T.unpack ancName, T.unpack childName]
+    return (c == ExitSuccess)
+
 getGitFileRef' :: RepoPath -> T.Text -> FilePath -> IO (Maybe T.Text)
 getGitFileRef' repoPath ref' fn = do
     withRepository lgFactory repoPath $ do
@@ -109,4 +128,6 @@ defaultRuleGitLib = do
     rule $ \(GetGitFileRefQ (repoPath, refName, fn)) -> Just $ do
         GitSHA ref' <- apply1 $ GetGitReferenceQ (repoPath, "HEAD")
         liftIO $ getGitFileRef' repoPath ref' fn
+    rule $ \(IsGitAncestorQ (repoPath, ancName, childName)) -> Just $ liftIO $
+        isGitAncestor' repoPath ancName childName
 
index 218cd45..a38ad09 100644 (file)
@@ -164,7 +164,21 @@ shakeMain = do
                 writeFileChanged out ""
             Just pattern -> do
                 Stdout tags <- git "tag" ["-l", pattern]
-                writeFileChanged out tags
+                tags' <- filterM (isGitAncestor "repository" (S.start s)) (lines tags)
+                writeFileChanged out (unlines tags')
+
+    "site/out/branches.txt" *> \ out -> do
+        alwaysRerun
+
+        need ["settings.yaml"]
+        s <- liftIO $ S.readSettings "settings.yaml"
+        case S.interestingBranches s of
+            Nothing ->
+                writeFileChanged out ""
+            Just pattern -> do
+                Stdout branches <- git "branch" ["--list", pattern]
+                branches' <- filterM (isGitAncestor "repository" (S.start s)) (map (drop 2) $ lines branches)
+                writeFileChanged out (unlines branches')
 
     "graphs" ~> do
         [latest] <- readFileLines "site/out/latest.txt"
@@ -226,7 +240,16 @@ shakeMain = do
         tagsAndHashes <- forM tags $ \t -> do
             h <- getGitReference "repository" ("refs/tags/" ++ t)
             return $ (t, h)
-        let o = object [ T.pack "tags" .= object [ (T.pack t .= h) | (t,h) <- tagsAndHashes ]]
+
+        branches <- readFileLines "site/out/branches.txt"
+        branchesAndHashes <- forM branches $ \t -> do
+            h <- getGitReference "repository" ("refs/heads/" ++ t)
+            return $ (t, h)
+
+        let o = object
+                [ T.pack "tags" .= object [ (T.pack t .= h) | (t,h) <- tagsAndHashes ]
+                , T.pack "branches" .= object [ (T.pack t .= h) | (t,h) <- branchesAndHashes ]
+                ]
         liftIO $ LBS.writeFile out (encode o)
         tagCommits <- filterM (doesLogExist logSource) (map snd tagsAndHashes)