From 66c2cc2ba93ea9015b7ce43a2fb4edc601eaaf94 Mon Sep 17 00:00:00 2001
From: Magnus Hagander <magnus@hagander.net>
Date: Sat, 6 Mar 2010 15:28:09 +0000
Subject: [PATCH] Add --psqlrc=FILENAME parameter to psql, to process an
 explicitly named file instead of ~/.psqlrc on startup.

---
 doc/src/sgml/ref/psql-ref.sgml | 12 +++++++++++-
 src/bin/psql/help.c            |  3 ++-
 src/bin/psql/startup.c         | 26 ++++++++++++++++++--------
 3 files changed, 31 insertions(+), 10 deletions(-)

diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index 039ad0e301c..93b6d4c6c22 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.239 2010/02/19 14:36:45 momjian Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.240 2010/03/06 15:28:09 mha Exp $
 PostgreSQL documentation
 -->
 
@@ -481,6 +481,16 @@ PostgreSQL documentation
       </listitem>
     </varlistentry>
 
+    <varlistentry>
+      <term><option>--psqlrc=<replaceable class="parameter">FILENAME</></></term>
+      <listitem>
+      <para>
+      Read the start-up file from <replaceable class="parameter">FILENAME</>
+      instead of <filename>~/.psqlrc</>.
+      </para>
+      </listitem>
+    </varlistentry>
+
      <varlistentry>
       <term><option>-1</option></term>
       <term><option>--single-transaction</option></term>
diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c
index 6b835fbd26c..8d6350fce2d 100644
--- a/src/bin/psql/help.c
+++ b/src/bin/psql/help.c
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2010, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/help.c,v 1.155 2010/01/02 16:57:59 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/help.c,v 1.156 2010/03/06 15:28:09 mha Exp $
  */
 #include "postgres_fe.h"
 
@@ -99,6 +99,7 @@ usage(void)
 	printf(_("  -v, --set=, --variable=NAME=VALUE\n"
 			 "                           set psql variable NAME to VALUE\n"));
 	printf(_("  -X, --no-psqlrc          do not read startup file (~/.psqlrc)\n"));
+	printf(_("  --psqlrc=FILENAME        read startup commands from file (instead of ~/.psqlrc)\n"));
 	printf(_("  -1 (\"one\"), --single-transaction\n"
 			 "                           execute command file as a single transaction\n"));
 	printf(_("  --help                   show this help, then exit\n"));
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index c34de5cd8cb..6fac694cfbb 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2010, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/startup.c,v 1.162 2010/02/26 02:01:19 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/startup.c,v 1.163 2010/03/06 15:28:09 mha Exp $
  */
 #include "postgres_fe.h"
 
@@ -68,11 +68,12 @@ struct adhoc_opts
 	bool		no_readline;
 	bool		no_psqlrc;
 	bool		single_txn;
+	char	   *psqlrc;
 };
 
 static void parse_psql_options(int argc, char *argv[],
 				   struct adhoc_opts * options);
-static void process_psqlrc(char *argv0);
+static void process_psqlrc(char *argv0, struct adhoc_opts *options);
 static void process_psqlrc_file(char *filename);
 static void showVersion(void);
 static void EstablishVariableSpace(void);
@@ -247,8 +248,7 @@ main(int argc, char *argv[])
 	 */
 	if (options.action == ACT_FILE)
 	{
-		if (!options.no_psqlrc)
-			process_psqlrc(argv[0]);
+		process_psqlrc(argv[0], &options);
 
 		successResult = process_file(options.action_string, options.single_txn);
 	}
@@ -291,8 +291,7 @@ main(int argc, char *argv[])
 	 */
 	else
 	{
-		if (!options.no_psqlrc)
-			process_psqlrc(argv[0]);
+		process_psqlrc(argv[0], &options);
 
 		connection_warnings(true);
 		if (!pset.quiet && !pset.notty)
@@ -355,6 +354,7 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options)
 		{"password", no_argument, NULL, 'W'},
 		{"expanded", no_argument, NULL, 'x'},
 		{"no-psqlrc", no_argument, NULL, 'X'},
+		{"psqlrc", required_argument, NULL, 1},
 		{"help", no_argument, NULL, '?'},
 		{NULL, 0, NULL, 0}
 	};
@@ -515,6 +515,9 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options)
 			case 'X':
 				options->no_psqlrc = true;
 				break;
+			case 1:
+				options->psqlrc = pg_strdup(optarg);
+				break;
 			case '1':
 				options->single_txn = true;
 				break;
@@ -563,20 +566,27 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options)
  * Load .psqlrc file, if found.
  */
 static void
-process_psqlrc(char *argv0)
+process_psqlrc(char *argv0, struct adhoc_opts *options)
 {
 	char		home[MAXPGPATH];
 	char		rc_file[MAXPGPATH];
 	char		my_exec_path[MAXPGPATH];
 	char		etc_path[MAXPGPATH];
 
+	if (options->no_psqlrc)
+		return;
+
 	find_my_exec(argv0, my_exec_path);
 	get_etc_path(my_exec_path, etc_path);
 
 	snprintf(rc_file, MAXPGPATH, "%s/%s", etc_path, SYSPSQLRC);
 	process_psqlrc_file(rc_file);
 
-	if (get_home_path(home))
+	if (options->psqlrc)
+	{
+		process_psqlrc_file(options->psqlrc);
+	}
+	else if (get_home_path(home))
 	{
 		snprintf(rc_file, MAXPGPATH, "%s/%s", home, PSQLRC);
 		process_psqlrc_file(rc_file);
-- 
GitLab