Add support for loading repo config
[tig] / tig.c
diff --git a/tig.c b/tig.c
index b0f5382..cdb20ae 100644 (file)
--- a/tig.c
+++ b/tig.c
@@ -1,5 +1,14 @@
 /* Copyright (c) 2006 Jonas Fonseca <fonseca@diku.dk>
- * See license info at the bottom. */
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
 /**
  * TIG(1)
  * ======
@@ -227,6 +236,7 @@ static int opt_num_interval = NUMBER_INTERVAL;
 static int opt_tab_size                = TABSIZE;
 static enum request opt_request = REQ_VIEW_MAIN;
 static char opt_cmd[SIZEOF_CMD]        = "";
+static char opt_encoding[20]   = "UTF-8";
 static FILE *opt_pipe          = NULL;
 
 /* Returns the index of log or diff command or -1 to exit. */
@@ -429,6 +439,82 @@ parse_options(int argc, char *argv[])
 }
 
 
+/**
+ * ENVIRONMENT VARIABLES
+ * ---------------------
+ * Several options related to the interface with git can be configured
+ * via environment options.
+ *
+ * Repository references
+ * ~~~~~~~~~~~~~~~~~~~~~
+ * Commits that are referenced by tags and branch heads will be marked
+ * by the reference name surrounded by '[' and ']':
+ *
+ *     2006-03-26 19:42 Petr Baudis         | [cogito-0.17.1] Cogito 0.17.1
+ *
+ * If you want to filter out certain directories under `.git/refs/`, say
+ * `tmp` you can do it by setting the following variable:
+ *
+ *     $ TIG_LS_REMOTE="git ls-remote . | sed /\/tmp\//d" tig
+ *
+ * Or set the variable permanently in your environment.
+ *
+ * TIG_LS_REMOTE::
+ *     Set command for retrieving all repository references. The command
+ *     should output data in the same format as git-ls-remote(1).
+ **/
+
+#define TIG_LS_REMOTE \
+       "git ls-remote . 2>/dev/null"
+
+/**
+ * [[view-commands]]
+ * View commands
+ * ~~~~~~~~~~~~~
+ * It is possible to alter which commands are used for the different views.
+ * If for example you prefer commits in the main view to be sorted by date
+ * and only show 500 commits, use:
+ *
+ *     $ TIG_MAIN_CMD="git log --date-order -n500 --pretty=raw %s" tig
+ *
+ * Or set the variable permanently in your environment.
+ *
+ * Notice, how `%s` is used to specify the commit reference. There can
+ * be a maximum of 5 `%s` ref specifications.
+ *
+ * TIG_DIFF_CMD::
+ *     The command used for the diff view. By default, git show is used
+ *     as a backend.
+ *
+ * TIG_LOG_CMD::
+ *     The command used for the log view. If you prefer to have both
+ *     author and committer shown in the log view be sure to pass
+ *     `--pretty=fuller` to git log.
+ *
+ * TIG_MAIN_CMD::
+ *     The command used for the main view. Note, you must always specify
+ *     the option: `--pretty=raw` since the main view parser expects to
+ *     read that format.
+ **/
+
+#define TIG_DIFF_CMD \
+       "git show --patch-with-stat --find-copies-harder -B -C %s"
+
+#define TIG_LOG_CMD    \
+       "git log --cc --stat -n100 %s"
+
+#define TIG_MAIN_CMD \
+       "git log --topo-order --stat --pretty=raw %s"
+
+/* ... silently ignore that the following are also exported. */
+
+#define TIG_HELP_CMD \
+       "man tig 2>/dev/null"
+
+#define TIG_PAGER_CMD \
+       ""
+
+
 /*
  * Line-oriented content detection.
  */
@@ -549,82 +635,6 @@ struct line {
 
 
 /**
- * ENVIRONMENT VARIABLES
- * ---------------------
- * Several options related to the interface with git can be configured
- * via environment options.
- *
- * Repository references
- * ~~~~~~~~~~~~~~~~~~~~~
- * Commits that are referenced by tags and branch heads will be marked
- * by the reference name surrounded by '[' and ']':
- *
- *     2006-03-26 19:42 Petr Baudis         | [cogito-0.17.1] Cogito 0.17.1
- *
- * If you want to filter out certain directories under `.git/refs/`, say
- * `tmp` you can do it by setting the following variable:
- *
- *     $ TIG_LS_REMOTE="git ls-remote . | sed /\/tmp\//d" tig
- *
- * Or set the variable permanently in your environment.
- *
- * TIG_LS_REMOTE::
- *     Set command for retrieving all repository references. The command
- *     should output data in the same format as git-ls-remote(1).
- **/
-
-#define TIG_LS_REMOTE \
-       "git ls-remote . 2>/dev/null"
-
-/**
- * [[view-commands]]
- * View commands
- * ~~~~~~~~~~~~~
- * It is possible to alter which commands are used for the different views.
- * If for example you prefer commits in the main view to be sorted by date
- * and only show 500 commits, use:
- *
- *     $ TIG_MAIN_CMD="git log --date-order -n500 --pretty=raw %s" tig
- *
- * Or set the variable permanently in your environment.
- *
- * Notice, how `%s` is used to specify the commit reference. There can
- * be a maximum of 5 `%s` ref specifications.
- *
- * TIG_DIFF_CMD::
- *     The command used for the diff view. By default, git show is used
- *     as a backend.
- *
- * TIG_LOG_CMD::
- *     The command used for the log view. If you prefer to have both
- *     author and committer shown in the log view be sure to pass
- *     `--pretty=fuller` to git log.
- *
- * TIG_MAIN_CMD::
- *     The command used for the main view. Note, you must always specify
- *     the option: `--pretty=raw` since the main view parser expects to
- *     read that format.
- **/
-
-#define TIG_DIFF_CMD \
-       "git show --patch-with-stat --find-copies-harder -B -C %s"
-
-#define TIG_LOG_CMD    \
-       "git log --cc --stat -n100 %s"
-
-#define TIG_MAIN_CMD \
-       "git log --topo-order --stat --pretty=raw %s"
-
-/* ... silently ignore that the following are also exported. */
-
-#define TIG_HELP_CMD \
-       "man tig 2>/dev/null"
-
-#define TIG_PAGER_CMD \
-       ""
-
-
-/**
  * The viewer
  * ----------
  * The display consists of a status window on the last line of the screen and
@@ -2372,6 +2382,44 @@ load_refs(void)
        return OK;
 }
 
+static int
+load_config(void)
+{
+       FILE *pipe = popen("git repo-config --list", "r");
+       char buffer[BUFSIZ];
+       char *name;
+
+       if (!pipe)
+               return ERR;
+
+       while ((name = fgets(buffer, sizeof(buffer), pipe))) {
+               char *value = strchr(name, '=');
+               int valuelen, namelen;
+
+               /* No boolean options, yet */
+               if (!value)
+                       continue;
+
+               namelen  = value - name;
+
+               *value++ = 0;
+               valuelen = strlen(value);
+               if (valuelen > 0)
+                       value[valuelen - 1] = 0;
+
+               if (!strcmp(name, "i18n.commitencoding")) {
+                       string_copy(opt_encoding, value);
+               }
+       }
+
+       if (ferror(pipe))
+               return ERR;
+
+       pclose(pipe);
+
+       return OK;
+}
+
 /*
  * Main
  */
@@ -2426,6 +2474,9 @@ main(int argc, char *argv[])
        if (refs_size == 0 && opt_request != REQ_VIEW_PAGER)
                die("Not a git repository");
 
+       if (load_config() == ERR)
+               die("Failed to load repo config.");
+
        for (i = 0; i < ARRAY_SIZE(views) && (view = &views[i]); i++)
                view->cmd_env = getenv(view->cmd_env);
 
@@ -2606,7 +2657,7 @@ main(int argc, char *argv[])
  *
  * COPYRIGHT
  * ---------
- * Copyright (c) Jonas Fonseca <fonseca@diku.dk>, 2006
+ * Copyright (c) 2006 Jonas Fonseca <fonseca@diku.dk>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -2615,10 +2666,12 @@ main(int argc, char *argv[])
  *
  * SEE ALSO
  * --------
- * [verse]
- * link:http://www.kernel.org/pub/software/scm/git/docs/[git(7)],
- * link:http://www.kernel.org/pub/software/scm/cogito/docs/[cogito(7)]
- * gitk(1): git repository browser written using tcl/tk,
- * qgit(1): git repository browser written using c++/Qt,
- * gitview(1): git repository browser written using python/gtk.
+ * - link:http://www.kernel.org/pub/software/scm/git/docs/[git(7)],
+ * - link:http://www.kernel.org/pub/software/scm/cogito/docs/[cogito(7)]
+ *
+ * Other git repository browsers:
+*
+ *  - gitk(1)
+ *  - qgit(1)
+ *  - gitview(1)
  **/