make pg_controldata accept "-D dirname"

Started by Abhijit Menon-Senover 11 years ago20 messages
#1Abhijit Menon-Sen
ams@2ndQuadrant.com
1 attachment(s)

Hi.

I can never remember that pg_controldata takes only a dirname rather
than "-D dirname", and I gather I'm not the only one. Here's a tiny
patch to make it work either way. As far as I can see, it doesn't
break anything, not even if you have a data directory named "-D".

-- Abhijit

Attachments:

0001-Make-pg_controldata-ignore-a-D-before-DataDir.patchtext/x-diff; charset=us-asciiDownload
>From 15d43a3a47b3042d3365cf86d4bf585ed00fa744 Mon Sep 17 00:00:00 2001
From: Abhijit Menon-Sen <ams@2ndQuadrant.com>
Date: Wed, 24 Sep 2014 16:26:00 +0530
Subject: Make pg_controldata ignore a -D before DataDir

---
 src/bin/pg_controldata/pg_controldata.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/bin/pg_controldata/pg_controldata.c b/src/bin/pg_controldata/pg_controldata.c
index f815024..7e8d0c2 100644
--- a/src/bin/pg_controldata/pg_controldata.c
+++ b/src/bin/pg_controldata/pg_controldata.c
@@ -120,7 +120,11 @@ main(int argc, char *argv[])
 	}
 
 	if (argc > 1)
+	{
 		DataDir = argv[1];
+		if (strcmp(DataDir, "-D") == 0 && argc > 2)
+			DataDir = argv[2];
+	}
 	else
 		DataDir = getenv("PGDATA");
 	if (DataDir == NULL)
-- 
1.9.1

#2Heikki Linnakangas
hlinnakangas@vmware.com
In reply to: Abhijit Menon-Sen (#1)
Re: make pg_controldata accept "-D dirname"

On 09/24/2014 01:59 PM, Abhijit Menon-Sen wrote:

Hi.

I can never remember that pg_controldata takes only a dirname rather
than "-D dirname", and I gather I'm not the only one. Here's a tiny
patch to make it work either way. As far as I can see, it doesn't
break anything, not even if you have a data directory named "-D".

Ah, I frequently run into that too; but with pg_resetxlog.

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Magnus Hagander
magnus@hagander.net
In reply to: Abhijit Menon-Sen (#1)
Re: make pg_controldata accept "-D dirname"

On Wed, Sep 24, 2014 at 12:59 PM, Abhijit Menon-Sen <ams@2ndquadrant.com> wrote:

Hi.

I can never remember that pg_controldata takes only a dirname rather
than "-D dirname", and I gather I'm not the only one. Here's a tiny
patch to make it work either way. As far as I can see, it doesn't
break anything, not even if you have a data directory named "-D".

I haven't looked at the code, but definitely +1 for the feature.
That's really quite annoying.

--
Magnus Hagander
Me: http://www.hagander.net/
Work: http://www.redpill-linpro.com/

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#4Abhijit Menon-Sen
ams@2ndQuadrant.com
In reply to: Heikki Linnakangas (#2)
1 attachment(s)
Re: make pg_controldata accept "-D dirname"

At 2014-09-24 14:03:41 +0300, hlinnakangas@vmware.com wrote:

Ah, I frequently run into that too; but with pg_resetxlog.

Well, that's no fun. Patch attached.

-- Abhijit

Attachments:

0001-Make-pg_resetxlog-also-accept-D-datadir.patchtext/x-diff; charset=us-asciiDownload
>From 23fc4d90d0353e1c6d65ca5715fc0338199f01cf Mon Sep 17 00:00:00 2001
From: Abhijit Menon-Sen <ams@2ndQuadrant.com>
Date: Wed, 24 Sep 2014 16:48:36 +0530
Subject: Make pg_resetxlog also accept -D datadir

---
 src/bin/pg_resetxlog/pg_resetxlog.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c
index 302d005..3b43aff 100644
--- a/src/bin/pg_resetxlog/pg_resetxlog.c
+++ b/src/bin/pg_resetxlog/pg_resetxlog.c
@@ -89,7 +89,7 @@ main(int argc, char *argv[])
 	MultiXactId set_oldestmxid = 0;
 	char	   *endptr;
 	char	   *endptr2;
-	char	   *DataDir;
+	char	   *DataDir = NULL;
 	int			fd;
 
 	set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_resetxlog"));
@@ -111,10 +111,14 @@ main(int argc, char *argv[])
 	}
 
 
-	while ((c = getopt(argc, argv, "fl:m:no:O:x:e:")) != -1)
+	while ((c = getopt(argc, argv, "D:fl:m:no:O:x:e:")) != -1)
 	{
 		switch (c)
 		{
+			case 'D':
+				DataDir = optarg;
+				break;
+
 			case 'f':
 				force = true;
 				break;
@@ -233,7 +237,7 @@ main(int argc, char *argv[])
 		}
 	}
 
-	if (optind == argc)
+	if (DataDir == NULL && optind == argc)
 	{
 		fprintf(stderr, _("%s: no data directory specified\n"), progname);
 		fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
@@ -257,7 +261,8 @@ main(int argc, char *argv[])
 	}
 #endif
 
-	DataDir = argv[optind];
+	if (DataDir == NULL)
+		DataDir = argv[optind];
 
 	if (chdir(DataDir) < 0)
 	{
-- 
1.9.1

#5Michael Paquier
michael.paquier@gmail.com
In reply to: Abhijit Menon-Sen (#1)
Re: make pg_controldata accept "-D dirname"

On Wed, Sep 24, 2014 at 7:59 PM, Abhijit Menon-Sen <ams@2ndquadrant.com> wrote:

I can never remember that pg_controldata takes only a dirname rather
than "-D dirname", and I gather I'm not the only one. Here's a tiny
patch to make it work either way. As far as I can see, it doesn't
break anything, not even if you have a data directory named "-D".

+1. I forget it all the time as well...
-- 
Michael

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#6Rajeev rastogi
rajeev.rastogi@huawei.com
In reply to: Michael Paquier (#5)
Re: make pg_controldata accept "-D dirname"

On 24 September 2014 17:15, Michael Paquier Wrote:

On Wed, Sep 24, 2014 at 7:59 PM, Abhijit Menon-Sen <ams@2ndquadrant.com>
wrote:

I can never remember that pg_controldata takes only a dirname rather
than "-D dirname", and I gather I'm not the only one. Here's a tiny
patch to make it work either way. As far as I can see, it doesn't
break anything, not even if you have a data directory named "-D".

+1. I forget it all the time as well...

+1, always I get confused once pg_controldata does not work with -D.

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#7Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Magnus Hagander (#3)
Re: make pg_controldata accept "-D dirname"

Magnus Hagander wrote:

On Wed, Sep 24, 2014 at 12:59 PM, Abhijit Menon-Sen <ams@2ndquadrant.com> wrote:

Hi.

I can never remember that pg_controldata takes only a dirname rather
than "-D dirname", and I gather I'm not the only one. Here's a tiny
patch to make it work either way. As far as I can see, it doesn't
break anything, not even if you have a data directory named "-D".

I haven't looked at the code, but definitely +1 for the feature.
That's really quite annoying.

+1

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#8Thom Brown
thom@linux.com
In reply to: Magnus Hagander (#3)
Re: make pg_controldata accept "-D dirname"

On 24 September 2014 12:04, Magnus Hagander <magnus@hagander.net> wrote:

On Wed, Sep 24, 2014 at 12:59 PM, Abhijit Menon-Sen <ams@2ndquadrant.com>
wrote:

Hi.

I can never remember that pg_controldata takes only a dirname rather
than "-D dirname", and I gather I'm not the only one. Here's a tiny
patch to make it work either way. As far as I can see, it doesn't
break anything, not even if you have a data directory named "-D".

I haven't looked at the code, but definitely +1 for the feature.
That's really quite annoying.

And here I was thinking it was just me.

+1

Thom

#9Heikki Linnakangas
hlinnakangas@vmware.com
In reply to: Abhijit Menon-Sen (#4)
Re: make pg_controldata accept "-D dirname"

On 09/24/2014 02:21 PM, Abhijit Menon-Sen wrote:

At 2014-09-24 14:03:41 +0300, hlinnakangas@vmware.com wrote:

Ah, I frequently run into that too; but with pg_resetxlog.

Well, that's no fun. Patch attached.

Thanks. Please update the docs and usage(), too.

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#10Abhijit Menon-Sen
ams@2ndQuadrant.com
In reply to: Heikki Linnakangas (#9)
Re: make pg_controldata accept "-D dirname"

At 2014-09-24 16:02:29 +0300, hlinnakangas@vmware.com wrote:

Thanks. Please update the docs and usage(), too.

I'm sorry, but I don't think it would be an improvement to make the docs
explain that it's valid to use either "-D datadir" or specify it without
an option. If both commands were changed to *require* "-D datadir", that
would be worth documenting. But of course I didn't want to change any
behaviour for people who have a better memory than I do.

I think it's all right as a quick hack to remove an inconsistency that
has clearly annoyed many people, but not much more.

Would you be OK with my just sticking a "[-D]" before DATADIR in the
usage() message for both programs, with no further explanation? (But
to be honest, I don't think even that is necessary or desirable.)

-- Abhijit

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#11Abhijit Menon-Sen
ams@2ndQuadrant.com
In reply to: Abhijit Menon-Sen (#10)
Re: make pg_controldata accept "-D dirname"

To put it another way, I doubt any of the people who were surprised by
it looked at either the usage message or the docs. ;-)

-- Abhijit

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#12Tom Lane
tgl@sss.pgh.pa.us
In reply to: Abhijit Menon-Sen (#10)
Re: make pg_controldata accept "-D dirname"

Abhijit Menon-Sen <ams@2ndQuadrant.com> writes:

At 2014-09-24 16:02:29 +0300, hlinnakangas@vmware.com wrote:

Thanks. Please update the docs and usage(), too.

I'm sorry, but I don't think it would be an improvement to make the docs
explain that it's valid to use either "-D datadir" or specify it without
an option.

What's so hard about [ -D ] before the datadir argument?

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#13Abhijit Menon-Sen
ams@2ndQuadrant.com
In reply to: Tom Lane (#12)
2 attachment(s)
Re: make pg_controldata accept "-D dirname"

At 2014-09-24 09:25:12 -0400, tgl@sss.pgh.pa.us wrote:

What's so hard about [ -D ] before the datadir argument?

I'm sorry to have given you the impression that I objected to it because
it was hard. Since I proposed the same thing a few lines after what you
quoted, I guess I have to agree it's not hard.

I think it's pointless, because if you're going to look at the usage
message to begin with, why not do what it already says? But I don't
care enough to argue about it any further.

Patches attached.

-- Abhijit

P.S. Trivia: I can't find any other options in Postgres where the
argument is mandatory but the option is optional.

Attachments:

0001-Make-pg_controldata-ignore-a-D-before-DataDir.patchtext/x-diff; charset=us-asciiDownload
>From 69d7386ab59ca9df74af5abe5a5c3cf5a93e64bb Mon Sep 17 00:00:00 2001
From: Abhijit Menon-Sen <ams@2ndQuadrant.com>
Date: Wed, 24 Sep 2014 16:26:00 +0530
Subject: Make pg_controldata ignore a -D before DataDir

---
 src/bin/pg_controldata/pg_controldata.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/bin/pg_controldata/pg_controldata.c b/src/bin/pg_controldata/pg_controldata.c
index f815024..4386283 100644
--- a/src/bin/pg_controldata/pg_controldata.c
+++ b/src/bin/pg_controldata/pg_controldata.c
@@ -33,7 +33,7 @@ usage(const char *progname)
 {
 	printf(_("%s displays control information of a PostgreSQL database cluster.\n\n"), progname);
 	printf(_("Usage:\n"));
-	printf(_("  %s [OPTION] [DATADIR]\n"), progname);
+	printf(_("  %s [OPTION] [[-D] DATADIR]\n"), progname);
 	printf(_("\nOptions:\n"));
 	printf(_("  -V, --version  output version information, then exit\n"));
 	printf(_("  -?, --help     show this help, then exit\n"));
@@ -120,7 +120,11 @@ main(int argc, char *argv[])
 	}
 
 	if (argc > 1)
+	{
 		DataDir = argv[1];
+		if (strcmp(DataDir, "-D") == 0 && argc > 2)
+			DataDir = argv[2];
+	}
 	else
 		DataDir = getenv("PGDATA");
 	if (DataDir == NULL)
-- 
1.9.1

0002-Make-pg_resetxlog-also-accept-D-datadir.patchtext/x-diff; charset=us-asciiDownload
>From 388b5009281184051398657449e649ec9585a242 Mon Sep 17 00:00:00 2001
From: Abhijit Menon-Sen <ams@2ndQuadrant.com>
Date: Wed, 24 Sep 2014 16:48:36 +0530
Subject: Make pg_resetxlog also accept -D datadir

---
 src/bin/pg_resetxlog/pg_resetxlog.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c
index 302d005..8ff5df0 100644
--- a/src/bin/pg_resetxlog/pg_resetxlog.c
+++ b/src/bin/pg_resetxlog/pg_resetxlog.c
@@ -89,7 +89,7 @@ main(int argc, char *argv[])
 	MultiXactId set_oldestmxid = 0;
 	char	   *endptr;
 	char	   *endptr2;
-	char	   *DataDir;
+	char	   *DataDir = NULL;
 	int			fd;
 
 	set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_resetxlog"));
@@ -111,10 +111,14 @@ main(int argc, char *argv[])
 	}
 
 
-	while ((c = getopt(argc, argv, "fl:m:no:O:x:e:")) != -1)
+	while ((c = getopt(argc, argv, "D:fl:m:no:O:x:e:")) != -1)
 	{
 		switch (c)
 		{
+			case 'D':
+				DataDir = optarg;
+				break;
+
 			case 'f':
 				force = true;
 				break;
@@ -233,7 +237,7 @@ main(int argc, char *argv[])
 		}
 	}
 
-	if (optind == argc)
+	if (DataDir == NULL && optind == argc)
 	{
 		fprintf(stderr, _("%s: no data directory specified\n"), progname);
 		fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
@@ -257,7 +261,8 @@ main(int argc, char *argv[])
 	}
 #endif
 
-	DataDir = argv[optind];
+	if (DataDir == NULL)
+		DataDir = argv[optind];
 
 	if (chdir(DataDir) < 0)
 	{
@@ -1077,7 +1082,7 @@ static void
 usage(void)
 {
 	printf(_("%s resets the PostgreSQL transaction log.\n\n"), progname);
-	printf(_("Usage:\n  %s [OPTION]... DATADIR\n\n"), progname);
+	printf(_("Usage:\n  %s [OPTION]... [-D] DATADIR\n\n"), progname);
 	printf(_("Options:\n"));
 	printf(_("  -e XIDEPOCH      set next transaction ID epoch\n"));
 	printf(_("  -f               force update to be done\n"));
-- 
1.9.1

#14Heikki Linnakangas
hlinnakangas@vmware.com
In reply to: Abhijit Menon-Sen (#13)
Re: make pg_controldata accept "-D dirname"

On 09/24/2014 04:49 PM, Abhijit Menon-Sen wrote:

At 2014-09-24 09:25:12 -0400, tgl@sss.pgh.pa.us wrote:

What's so hard about [ -D ] before the datadir argument?

I'm sorry to have given you the impression that I objected to it because
it was hard. Since I proposed the same thing a few lines after what you
quoted, I guess I have to agree it's not hard.

I think it's pointless, because if you're going to look at the usage
message to begin with, why not do what it already says? But I don't
care enough to argue about it any further.

There's also the reverse situation: you see that a script contains a
line like "pg_controldata -D foo". You're accustomed to doing just
"pg_controldata foo", and you wonder what the -D option does. So you
look it up in the docs or "pg_controldata --help".

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#15Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Abhijit Menon-Sen (#13)
Re: make pg_controldata accept "-D dirname"

Abhijit Menon-Sen wrote:

P.S. Trivia: I can't find any other options in Postgres where the
argument is mandatory but the option is optional.

psql behaves similarly with its -d and -U switches also; note --help:

Usage:
psql [OPTION]... [DBNAME [USERNAME]]
...
-d, --dbname=DBNAME database name to connect to (default: "alvherre")
...
-U, --username=USERNAME database user name (default: "alvherre")

Both are optional and have defaults. Datadir for pg_controldata is also
optional and --help contains this blurb:

If no data directory (DATADIR) is specified, the environment variable PGDATA
is used.

I think you could replace those lines with
-D data directory blah (default: "value of $PGDATA")

But psql --help doesn't use $PGUSER to expand the default value for -U;
I'm not clear if this means we shouldn't expand PGDATA in the help line
for pg_controldata, or need to fix psql to expand PGUSER in -U.

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#16Abhijit Menon-Sen
ams@2ndQuadrant.com
In reply to: Alvaro Herrera (#15)
3 attachment(s)
Re: make pg_controldata accept "-D dirname"

Updated patches attached.

-- Abhijit

Attachments:

0001-Make-pg_controldata-ignore-a-D-before-DataDir.patchtext/x-diff; charset=us-asciiDownload
>From b3bd465357f96ebf1953b3a98f25fb51bac5eb26 Mon Sep 17 00:00:00 2001
From: Abhijit Menon-Sen <ams@2ndQuadrant.com>
Date: Wed, 24 Sep 2014 16:26:00 +0530
Subject: Make pg_controldata ignore a -D before DataDir

---
 doc/src/sgml/ref/pg_controldata.sgml    |  5 +++--
 src/bin/pg_controldata/pg_controldata.c | 13 +++++++++++--
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/doc/src/sgml/ref/pg_controldata.sgml b/doc/src/sgml/ref/pg_controldata.sgml
index fbf40fc..b4be660 100644
--- a/doc/src/sgml/ref/pg_controldata.sgml
+++ b/doc/src/sgml/ref/pg_controldata.sgml
@@ -40,8 +40,9 @@ PostgreSQL documentation
   <para>
    This utility can only be run by the user who initialized the cluster because
    it requires read access to the data directory.
-   You can specify the data directory on the command line, or use
-   the environment variable <envar>PGDATA</>.  This utility supports the options
+   You can specify the data directory on the command line, with or without
+   <option>-D</> or use the environment variable <envar>PGDATA</>.
+   This utility supports the options
    <option>-V</> and <option>--version</>, which print the
    <application>pg_controldata</application> version and exit.  It also
    supports options <option>-?</> and <option>--help</>, which output the
diff --git a/src/bin/pg_controldata/pg_controldata.c b/src/bin/pg_controldata/pg_controldata.c
index f815024..cfa6911 100644
--- a/src/bin/pg_controldata/pg_controldata.c
+++ b/src/bin/pg_controldata/pg_controldata.c
@@ -31,14 +31,19 @@
 static void
 usage(const char *progname)
 {
+	const char *pgdata;
+
+	pgdata = getenv("PGDATA");
+	if (!pgdata)
+		pgdata = "";
+
 	printf(_("%s displays control information of a PostgreSQL database cluster.\n\n"), progname);
 	printf(_("Usage:\n"));
 	printf(_("  %s [OPTION] [DATADIR]\n"), progname);
 	printf(_("\nOptions:\n"));
+	printf(_("  -D DATADIR     data directory (default: \"%s\")\n"), pgdata);
 	printf(_("  -V, --version  output version information, then exit\n"));
 	printf(_("  -?, --help     show this help, then exit\n"));
-	printf(_("\nIf no data directory (DATADIR) is specified, "
-			 "the environment variable PGDATA\nis used.\n\n"));
 	printf(_("Report bugs to <pgsql-bugs@postgresql.org>.\n"));
 }
 
@@ -120,7 +125,11 @@ main(int argc, char *argv[])
 	}
 
 	if (argc > 1)
+	{
 		DataDir = argv[1];
+		if (strcmp(DataDir, "-D") == 0 && argc > 2)
+			DataDir = argv[2];
+	}
 	else
 		DataDir = getenv("PGDATA");
 	if (DataDir == NULL)
-- 
1.9.1

0002-Make-pg_resetxlog-also-accept-D-datadir.patchtext/x-diff; charset=us-asciiDownload
>From 51c651a24db4f3b977fa38c08177acc062a5fb56 Mon Sep 17 00:00:00 2001
From: Abhijit Menon-Sen <ams@2ndQuadrant.com>
Date: Wed, 24 Sep 2014 16:48:36 +0530
Subject: Make pg_resetxlog also accept -D datadir

---
 doc/src/sgml/ref/pg_resetxlog.sgml  |  6 ++++--
 src/bin/pg_resetxlog/pg_resetxlog.c | 16 +++++++++++-----
 2 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/doc/src/sgml/ref/pg_resetxlog.sgml b/doc/src/sgml/ref/pg_resetxlog.sgml
index 0b53bd6..7b2386a 100644
--- a/doc/src/sgml/ref/pg_resetxlog.sgml
+++ b/doc/src/sgml/ref/pg_resetxlog.sgml
@@ -22,6 +22,7 @@ PostgreSQL documentation
  <refsynopsisdiv>
   <cmdsynopsis>
    <command>pg_resetxlog</command>
+   <arg choice="opt"><option>-D</option> <replaceable class="parameter">datadir</replaceable></arg>
    <arg choice="opt"><option>-f</option></arg>
    <arg choice="opt"><option>-n</option></arg>
    <arg choice="opt"><option>-o</option> <replaceable class="parameter">oid</replaceable></arg>
@@ -30,7 +31,7 @@ PostgreSQL documentation
    <arg choice="opt"><option>-m</option> <replaceable class="parameter">mxid</replaceable>,<replaceable class="parameter">mxid</replaceable></arg>
    <arg choice="opt"><option>-O</option> <replaceable class="parameter">mxoff</replaceable></arg>
    <arg choice="opt"><option>-l</option> <replaceable class="parameter">xlogfile</replaceable></arg>
-   <arg choice="plain"><replaceable>datadir</replaceable></arg>
+   <arg choice="opt"><replaceable>datadir</replaceable></arg>
   </cmdsynopsis>
  </refsynopsisdiv>
 
@@ -55,7 +56,8 @@ PostgreSQL documentation
   <para>
    This utility can only be run by the user who installed the server, because
    it requires read/write access to the data directory.
-   For safety reasons, you must specify the data directory on the command line.
+   For safety reasons, you must specify the data directory on the command line
+   (with or without <option>-D</>).
    <command>pg_resetxlog</command> does not use the environment variable
    <envar>PGDATA</>.
   </para>
diff --git a/src/bin/pg_resetxlog/pg_resetxlog.c b/src/bin/pg_resetxlog/pg_resetxlog.c
index 302d005..9364e49 100644
--- a/src/bin/pg_resetxlog/pg_resetxlog.c
+++ b/src/bin/pg_resetxlog/pg_resetxlog.c
@@ -89,7 +89,7 @@ main(int argc, char *argv[])
 	MultiXactId set_oldestmxid = 0;
 	char	   *endptr;
 	char	   *endptr2;
-	char	   *DataDir;
+	char	   *DataDir = NULL;
 	int			fd;
 
 	set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_resetxlog"));
@@ -111,10 +111,14 @@ main(int argc, char *argv[])
 	}
 
 
-	while ((c = getopt(argc, argv, "fl:m:no:O:x:e:")) != -1)
+	while ((c = getopt(argc, argv, "D:fl:m:no:O:x:e:")) != -1)
 	{
 		switch (c)
 		{
+			case 'D':
+				DataDir = optarg;
+				break;
+
 			case 'f':
 				force = true;
 				break;
@@ -233,7 +237,7 @@ main(int argc, char *argv[])
 		}
 	}
 
-	if (optind == argc)
+	if (DataDir == NULL && optind == argc)
 	{
 		fprintf(stderr, _("%s: no data directory specified\n"), progname);
 		fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
@@ -257,7 +261,8 @@ main(int argc, char *argv[])
 	}
 #endif
 
-	DataDir = argv[optind];
+	if (DataDir == NULL)
+		DataDir = argv[optind];
 
 	if (chdir(DataDir) < 0)
 	{
@@ -1077,8 +1082,9 @@ static void
 usage(void)
 {
 	printf(_("%s resets the PostgreSQL transaction log.\n\n"), progname);
-	printf(_("Usage:\n  %s [OPTION]... DATADIR\n\n"), progname);
+	printf(_("Usage:\n  %s [OPTION]... [DATADIR]\n\n"), progname);
 	printf(_("Options:\n"));
+	printf(_("  -D DATADIR       data directory\n"));
 	printf(_("  -e XIDEPOCH      set next transaction ID epoch\n"));
 	printf(_("  -f               force update to be done\n"));
 	printf(_("  -l XLOGFILE      force minimum WAL starting location for new transaction log\n"));
-- 
1.9.1

0003-Use-user-not-env-as-the-default-for-U.patchtext/x-diff; charset=us-asciiDownload
>From 2bf16c3b09faec09120f832a92cc6c2cbe80a30d Mon Sep 17 00:00:00 2001
From: Abhijit Menon-Sen <ams@2ndQuadrant.com>
Date: Wed, 24 Sep 2014 20:15:53 +0530
Subject: Use user, not env, as the default for -U

---
 src/bin/psql/help.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c
index 4d11952..49b2fdd 100644
--- a/src/bin/psql/help.c
+++ b/src/bin/psql/help.c
@@ -132,7 +132,7 @@ usage(unsigned short int pager)
 	env = getenv("PGUSER");
 	if (!env)
 		env = user;
-	fprintf(output, _("  -U, --username=USERNAME  database user name (default: \"%s\")\n"), env);
+	fprintf(output, _("  -U, --username=USERNAME  database user name (default: \"%s\")\n"), user);
 	fprintf(output, _("  -w, --no-password        never prompt for password\n"));
 	fprintf(output, _("  -W, --password           force password prompt (should happen automatically)\n"));
 
-- 
1.9.1

#17Heikki Linnakangas
hlinnakangas@vmware.com
In reply to: Abhijit Menon-Sen (#16)
Re: make pg_controldata accept "-D dirname"

On 09/24/2014 05:48 PM, Abhijit Menon-Sen wrote:

Updated patches attached.

Thanks, applied some version of these.

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#18Michael Paquier
michael.paquier@gmail.com
In reply to: Heikki Linnakangas (#17)
Re: make pg_controldata accept "-D dirname"

On Thu, Sep 25, 2014 at 12:38 PM, Heikki Linnakangas <
hlinnakangas@vmware.com> wrote:

On 09/24/2014 05:48 PM, Abhijit Menon-Sen wrote:

Updated patches attached.

Thanks, applied some version of these.

This set of patches has been applied as b0d81ad but patch 0001 did not make
it in, so pg_controldata is not yet able to accept -D:
$ pg_controldata -D /foo/path
pg_controldata: could not open file "-D/global/pg_control" for reading: No
such file or directory
$ pg_controldata /foo/path
pg_controldata: could not open file "/foo/path/global/pg_control" for
reading: No such file or directory
--
Michael

#19Heikki Linnakangas
hlinnakangas@vmware.com
In reply to: Michael Paquier (#18)
Re: make pg_controldata accept "-D dirname"

On 10/24/2014 11:36 AM, Michael Paquier wrote:

On Thu, Sep 25, 2014 at 12:38 PM, Heikki Linnakangas <
hlinnakangas@vmware.com> wrote:

On 09/24/2014 05:48 PM, Abhijit Menon-Sen wrote:

Updated patches attached.

Thanks, applied some version of these.

This set of patches has been applied as b0d81ad but patch 0001 did not make
it in, so pg_controldata is not yet able to accept -D:
$ pg_controldata -D /foo/path
pg_controldata: could not open file "-D/global/pg_control" for reading: No
such file or directory
$ pg_controldata /foo/path
pg_controldata: could not open file "/foo/path/global/pg_control" for
reading: No such file or directory

Argh, looks like I forgot the actual code changes required.

I just noticed that pg_controldata and pg_resetxlog don't check for
extra arguments:

$ pg_resetxlog data fds sdf sdf
Transaction log reset

Fixed that too.

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#20Michael Paquier
michael.paquier@gmail.com
In reply to: Heikki Linnakangas (#19)
2 attachment(s)
Re: make pg_controldata accept "-D dirname"

On Sat, Oct 25, 2014 at 1:20 AM, Heikki Linnakangas
<hlinnakangas@vmware.com> wrote:

Argh, looks like I forgot the actual code changes required.
I just noticed that pg_controldata and pg_resetxlog don't check for extra
arguments:
$ pg_resetxlog data fds sdf sdf
Transaction log reset

I think that it would be good to add as well a set of TAP tests for
all those things. So attached are two patches, one to complete the
tests of pg_controldata, and a second one to add TAP tests for
pg_resetxlog.
--
Michael

Attachments:

0001-Add-more-TAP-tests-for-pg_controldata.patchtext/x-diff; charset=US-ASCII; name=0001-Add-more-TAP-tests-for-pg_controldata.patchDownload
From b196d4159d7fce4f84222659a3b445c86cd2b5e8 Mon Sep 17 00:00:00 2001
From: Michael Paquier <michael@otacoo.com>
Date: Sun, 26 Oct 2014 13:08:05 +0900
Subject: [PATCH 1/2] Add more TAP tests for pg_controldata

Those checks are related to extra arguments and the newly-introduced
option -D.
---
 src/bin/pg_controldata/t/001_pg_controldata.pl | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/bin/pg_controldata/t/001_pg_controldata.pl b/src/bin/pg_controldata/t/001_pg_controldata.pl
index 35ad10a..f9cdcec 100644
--- a/src/bin/pg_controldata/t/001_pg_controldata.pl
+++ b/src/bin/pg_controldata/t/001_pg_controldata.pl
@@ -1,7 +1,7 @@
 use strict;
 use warnings;
 use TestLib;
-use Test::More tests => 6;
+use Test::More tests => 10;
 
 my $tempdir = TestLib::tempdir;
 
@@ -11,6 +11,14 @@ program_options_handling_ok('pg_controldata');
 command_fails(['pg_controldata'], 'pg_controldata without arguments fails');
 command_fails([ 'pg_controldata', 'nonexistent' ],
 	'pg_controldata with nonexistent directory fails');
+command_fails([ 'pg_controldata', 'arg1', 'arg2', 'arg3' ],
+	'pg_controldata with too many arguments fails');
+command_fails([ 'pg_controldata', '-D' ],
+	'pg_controldata -D with no directory defined fails');
+command_fails([ 'pg_controldata', '-D', 'arg1', 'arg2', 'arg3' ],
+	'pg_controldata -D with too many arguments fails');
 system_or_bail "initdb -D '$tempdir'/data -A trust >/dev/null";
 command_like([ 'pg_controldata', "$tempdir/data" ],
 	qr/checkpoint/, 'pg_controldata produces output');
+command_like([ 'pg_controldata', "-D", "$tempdir/data" ],
+	qr/checkpoint/, 'pg_controldata produces output');
-- 
2.1.2

0002-Add-TAP-tests-for-pg_resetxlog.patchtext/x-diff; charset=US-ASCII; name=0002-Add-TAP-tests-for-pg_resetxlog.patchDownload
From 7d92cbfd0607fbf35902408e3a82bf2ca60bf71f Mon Sep 17 00:00:00 2001
From: Michael Paquier <mpaquier@otacoo.com>
Date: Sat, 25 Oct 2014 08:14:37 +0000
Subject: [PATCH 2/2] Add TAP tests for pg_resetxlog

Those checks are related to extra arguments, the use of option -D with
a data directory as well as the generation of output for this utility.
---
 src/bin/pg_resetxlog/.gitignore            |  1 +
 src/bin/pg_resetxlog/Makefile              |  6 ++++++
 src/bin/pg_resetxlog/t/001_pg_resetxlog.pl | 24 ++++++++++++++++++++++++
 3 files changed, 31 insertions(+)
 create mode 100644 src/bin/pg_resetxlog/t/001_pg_resetxlog.pl

diff --git a/src/bin/pg_resetxlog/.gitignore b/src/bin/pg_resetxlog/.gitignore
index 6b84208..68d8890 100644
--- a/src/bin/pg_resetxlog/.gitignore
+++ b/src/bin/pg_resetxlog/.gitignore
@@ -1 +1,2 @@
 /pg_resetxlog
+/tmp_check/
diff --git a/src/bin/pg_resetxlog/Makefile b/src/bin/pg_resetxlog/Makefile
index 6610690..5ebf8f4 100644
--- a/src/bin/pg_resetxlog/Makefile
+++ b/src/bin/pg_resetxlog/Makefile
@@ -33,3 +33,9 @@ uninstall:
 
 clean distclean maintainer-clean:
 	rm -f pg_resetxlog$(X) $(OBJS)
+
+check: all
+	$(prove_check)
+
+installcheck:
+	$(prove_installcheck)
diff --git a/src/bin/pg_resetxlog/t/001_pg_resetxlog.pl b/src/bin/pg_resetxlog/t/001_pg_resetxlog.pl
new file mode 100644
index 0000000..4e6e0a7
--- /dev/null
+++ b/src/bin/pg_resetxlog/t/001_pg_resetxlog.pl
@@ -0,0 +1,24 @@
+use strict;
+use warnings;
+use TestLib;
+use Test::More tests => 10;
+
+my $tempdir = TestLib::tempdir;
+
+program_help_ok('pg_resetxlog');
+program_version_ok('pg_resetxlog');
+program_options_handling_ok('pg_resetxlog');
+command_fails(['pg_resetxlog'], 'pg_resetxlog without arguments fails');
+command_fails([ 'pg_resetxlog', 'nonexistent' ],
+	'pg_resetxlog with nonexistent directory fails');
+command_fails([ 'pg_resetxlog', 'arg1', 'arg2', 'arg3' ],
+	'pg_resetxlog with too many arguments fails');
+command_fails([ 'pg_resetxlog', '-D' ],
+	'pg_resetxlog -D with no directory defined fails');
+command_fails([ 'pg_resetxlog', '-D', 'arg1', 'arg2', 'arg3' ],
+	'pg_resetxlog -D with too many arguments fails');
+system_or_bail "initdb -D '$tempdir'/data -A trust >/dev/null";
+command_like([ 'pg_resetxlog', "$tempdir/data" ],
+	qr/Transaction/, 'pg_resetxlog produces output');
+command_like([ 'pg_resetxlog', "-D", "$tempdir/data" ],
+	qr/Transaction/, 'pg_resetxlog produces output');
-- 
2.1.2