summary history branches tags files
commit:cfc589e3b27bf405cafa3d613cf7b7b515e3f5c6
author:Trevor Bentley
committer:Trevor Bentley
date:Fri Jan 13 17:29:00 2023 +0100
parents:10082c20965be1507ee0f51dc4b6eff7fa3ed7de
make parsed branch configurable
diff --git a/config.toml b/config.toml
line changes: +15/-0
index 68c111e..e048fd3
--- a/config.toml
+++ b/config.toml
@@ -19,6 +19,20 @@
 # This is accessible in all templates.
 #site_description = ""
 
+# Which branch to use for generating history.
+#
+# Itsy-Gitsy currently only supports traversing the history of a single branch,
+# which is the one named here.  Common options are "master" and "main".
+# Defaults to "master" if not specified.
+#
+# Note that this probably should not contain any remote prefix, like "origin/",
+# though it may.  Also note that the "default branch" is only a concept for
+# remote repositories; local repositories do not have the concept, hence this
+# must be explicitly specified.
+#
+# This can also be set per-repository.
+#branch = "master"
+
 # List of directories, each of which contains Git repositories to
 # index.
 #
@@ -457,6 +471,7 @@ generated_by = "Itsy-Gitsy"
 
 # Per-repository settings, same as the global versions described above:
 
+#branch                 = "master"
 #render_markdown        = false
 #syntax_highlighting    = false
 #syntax_highlight_theme = "base16-ocean.dark"

diff --git a/src/git.rs b/src/git.rs
line changes: +5/-3
index fd0ad3f..ff4adba
--- a/src/git.rs
+++ b/src/git.rs
@@ -192,6 +192,8 @@ pub fn parse_repo(
     let mut history_count = 0;
     let mut branch_count = 0;
     let mut tag_count = 0;
+    let branch_name = settings.branch.as_deref().unwrap_or("master");
+    let branch_obj = repo.revparse_single(branch_name)?;
 
     // Cache the shortnames of all references
     let mut references: BTreeMap<String, Vec<String>> = BTreeMap::new();
@@ -213,7 +215,7 @@ pub fn parse_repo(
     loud!();
     let mut revwalk = repo.revwalk()?;
     revwalk.set_sorting(git2::Sort::TOPOLOGICAL)?;
-    revwalk.push_head()?;
+    revwalk.push(branch_obj.id())?;
     loudest!(" - Parsing history:");
     for oid in revwalk {
         let oid = oid?;
@@ -379,11 +381,11 @@ pub fn parse_repo(
     let max_depth = settings.limit_tree_depth.unwrap_or(usize::MAX);
     if max_depth > 0 {
         loudest!(" - Walking root files");
-        walk_file_tree(&repo, "HEAD", &mut root_files, 0, usize::MAX, false, "")?;
+        walk_file_tree(&repo, branch_name, &mut root_files, 0, usize::MAX, false, "")?;
         // TODO: maybe this should be optional?  Walking the whole tree
         // could be slow on huge repos.
         loudest!(" - Walking all files");
-        walk_file_tree(&repo, "HEAD", &mut all_files, 0, max_depth, true, "")?;
+        walk_file_tree(&repo, branch_name, &mut all_files, 0, max_depth, true, "")?;
     }
     loud!(" - parsed {} files", all_files.len());
 

diff --git a/src/main.rs b/src/main.rs
line changes: +0/-1
index 984fcb6..7f2659e
--- a/src/main.rs
+++ b/src/main.rs
@@ -10,7 +10,6 @@ use settings::{GitsyCli, GitsySettings};
 // TODO:
 //
 //   * basic, light, dark, and fancy default themes
-//   * specify default branch, use instead of HEAD
 //   * better error propagation
 //   * automated tests
 //   * documentation + examples

diff --git a/src/settings.rs b/src/settings.rs
line changes: +4/-0
index 9008229..889426c
--- a/src/settings.rs
+++ b/src/settings.rs
@@ -192,6 +192,7 @@ pub struct GitsySettingsRepo {
     pub name: Option<String>,
     pub description: Option<String>,
     pub website: Option<String>,
+    pub branch: Option<String>,
     pub asset_files: Option<Vec<String>>,
     pub render_markdown: Option<bool>,
     pub syntax_highlight: Option<bool>,
@@ -232,6 +233,7 @@ pub struct GitsySettings {
     pub site_url: Option<String>,
     pub site_description: Option<String>,
     pub asset_files: Option<Vec<String>>,
+    pub branch: Option<String>,
     #[serde(rename(deserialize = "gitsy_templates"))]
     pub templates: GitsySettingsTemplates,
     #[serde(rename(deserialize = "gitsy_outputs"))]
@@ -300,6 +302,7 @@ impl GitsySettings {
                     if repo.name.is_none() {
                         repo.name = Some(k.clone());
                     }
+                    global_to_repo!(settings, repo, branch);
                     global_to_repo!(settings, repo, render_markdown);
                     global_to_repo!(settings, repo, syntax_highlight);
                     global_to_repo!(settings, repo, syntax_highlight_theme);
@@ -332,6 +335,7 @@ impl GitsySettings {
                         repo_descriptions.insert(GitsySettingsRepo {
                             path: dir.path().clone(),
                             name: Some(name),
+                            branch: settings.branch.clone(),
                             render_markdown: settings.render_markdown.clone(),
                             syntax_highlight: settings.syntax_highlight.clone(),
                             syntax_highlight_theme: settings.syntax_highlight_theme.clone(),