Closed Bug 1080302 Opened 5 years ago Closed 5 years ago

Use double-dash options in Firefox's help message

Categories

(Firefox :: General, defect)

defect
Not set

Tracking

()

RESOLVED FIXED
Firefox 36

People

(Reporter: njn, Assigned: njn)

References

(Blocks 1 open bug)

Details

Attachments

(4 files)

Firefox accepts options in:
- single-dash form (e.g. -safe-mode);
- double-dash form (e.g. --safe-mode);
- and on Windows, forward-slash form (e.g. /safe-mode).

This is true for both long options and short options (e.g. -P).

The help message only advertises the single-dash form, though, which is kind of old-fashioned and strange for long options. So we should change the help message to use double-dash form for long options.

And then we should change |mach run| to use double-dash forms for -remote, -foreground, and -noprofile.
In this patch I've taken the aggressive option: I tried to change every -foo
arg to --foo. I used grep heavily for this.

It's possible I've missed some, but in theory that shouldn't
matter since both forms are allowed. Except... there are a few places that
roll their own option parsing, and these places are generally less flexible
than the main option parsing routines. I've fixed all the ones I could find,
but it's possible I missed some.

[Hmm, I just realized I haven't considered .py files. There'll be a bunch more
needed there. Sigh.]

A more conservative option would be to just change -foo options that appear in
printed messages (e.g. help messages, error messages) and comments, but leave
alone -foo options in code.

glandium, I'm asking you for feedback because I figure you'll recognize many of
these obscure options.

I did a full try run yesterday with a patch that 95% matches this one, and it
was all green.

Here is a list of all the options I changed, grouped by how they are
registered. I've attached comments to the notable ones.

> Ones registered with CheckArg():
> -appomni
> -console      * in nsNativeAppSupportWin.cpp I added support for --console
> -createprofile
> -dump-args
> -foreground
> -greomni
> -help
> -install-xpi  * I removed the single reference, which was in a comment
> -install
> -metro-update
> -migration
> -new-instance
> -no-remote
> -offline
> -override
> -process-updates
> -ProfileManager
> -profile     * in gtk/webapprt.cpp I added support for --profile
>              * in win/webapprt.cpp I added support for --profile
>              * in GeckoApp.java, added support for --profile
> -purgecaches
> -register
> -requestPending
> -reset-profile
> -safe-mode
> -UILocale
> -version
> 
> Ones registered with handleFlagWithParam():
> -start-debugger-server
> --runapp            * all uses were already --runapp
> -screen
> -chrom
> -remote
> -new-window
> -new-tab
> -private-window
> -search
> -url                * in MetroContracts.cpp I added support for --url
> -file
> -width
> -height
> -alert
> -webapp
> -recording
> -recording-output
> -reftest
> -tps
> -tpsphase
> -tpslogfile
> -print-xpcom-dir
> -print-xpcom-dirlist
> 
> Ones registered with handleFlag():
> --ignore-unused-engines   * help msg was already double-dash
> -oop
> -browser
> -preferences
> -silent
> -private
> -osint
> -setDefaultBrowser
> -jsconsole          * has two handlers
> -jsdebugger
> -webide
> -reftestnocache
> -reftestskipslowtests
> -marionette
> 
> Other:
> -remove         * in gtk/webapprt.cpp I added support for --remove
> --a11y          * one mention in a comment in testing/mochitest/redirect.html
> -bookmark       * used in several .java files, but I couldn't find a handler
>                   anywhere
> 
> - browser/metro/shell/commandexecutehandler/CommandExecuteHandler.cpp has
> --metro-restart, --metro-update, --desktop-restart, --launchmetro, which are
>  already in double-dash form. Plus -Embedding which is in single-dash and I
>  left alone because it looks system-y.
Attachment #8502940 - Flags: feedback?(mh+mozilla)
Comment on attachment 8502940 [details] [diff] [review]
Convert all --foo options to -foo options (but both are still accepted)

Review of attachment 8502940 [details] [diff] [review]:
-----------------------------------------------------------------

See below for some of the most obvious problems I found. To make this smoother, I think it should be split in several parts:
- First part adds support for double-dash arguments to things that only support single-dash currently.
- Second part changes all help messages to show double-dash arguments
- Third part changes internal option passing to use double-dash arguments. The latter would need to be reviewed by relevant people for the impacted components (e.g. cf. below, Marco Castelluccio for webapprt)

::: browser/components/shell/nsWindowsShellService.cpp
@@ +149,5 @@
>  
>  #define APP_REG_NAME L"Firefox"
>  #define VAL_FILE_ICON "%APPPATH%,1"
> +#define VAL_OPEN "\"%APPPATH%\" --osint --url \"%1\""
> +#define OLD_VAL_OPEN "\"%APPPATH%\" --requestPending --osint --url \"%1\""

You can't change this that way. See changeset 09362c5dceaf that added OLD_VAL_OPEN, it's apparently used for transition from an old value to new one.

::: mobile/android/base/GeckoApp.java
@@ +1146,5 @@
>                          profileName = m.group(1);
>                      }
>                  }
>  
> +                if (args.contains("--profile")) {

args is a string, not a list of strings. So in practice, this means the existing code is going to be happy with --profile. (It also means the existing code is likely very buggy)

::: python/mozbuild/mozbuild/mach_commands.py
@@ +798,2 @@
>          help='Do not pass the -foreground argument by default on Mac.')
> +    @CommandArgument('--noprofile', '-n', action='store_true', group=prog_group,

Those should probably be changed independently.

::: toolkit/components/remote/nsXRemoteService.cpp
@@ +276,5 @@
>      FindExtensionParameterInCommand("DESKTOP_STARTUP_ID",
>                                      cmd, '\n',
>                                      &desktopStartupID);
>  
> +    const char* argv[3] = {"dummyappname", "--remote", aCommand};

I'm killing this :)

::: toolkit/webapps/WebappOSUtils.jsm
@@ +364,5 @@
>        let process = Cc["@mozilla.org/process/util;1"]
>                        .createInstance(Ci.nsIProcess);
>  
>        process.init(exeFile);
> +      process.runAsync(["--remove"], 1, (aSubject, aTopic) => {

This may not work properly and might need to stay -remove forever: I think this can be used to invoke any old version of the webapprt, including those that only support -remove. Better check with Marco Castelluccio.
Attachment #8502940 - Flags: feedback?(mh+mozilla)
I added support for /foo forms where appropriate, except in |mach run|... I
could do it there too if you think it's worthwhile.

I left the horrible -profile handling in GeckoApp.java unchanged, since it will
match -profile or --profile. Let sleeping dogs lie.
Attachment #8503149 - Flags: review?(mh+mozilla)
This is all the safe stuff: help messages, error messages, comments.
Attachment #8503151 - Flags: review?(mh+mozilla)
I'm going to skip the harder stuff (actual code changes) for the moment.
Comment on attachment 8503149 [details] [diff] [review]
(part 1) - Add support for --foo options where it's not already present

Review of attachment 8503149 [details] [diff] [review]:
-----------------------------------------------------------------

::: python/mozbuild/mozbuild/mach_commands.py
@@ +848,5 @@
>  
>          if not background and sys.platform == 'darwin':
>              args.append('-foreground')
>  
> +        if '-profile' not in params and '--profile' not in params and '-P' not in params and not noprofile:

maybe:
  if all(p not in params for p in ('-profile', '--profile', '-P')) and not noprofile:

::: webapprt/win/webapprt.cpp
@@ +447,5 @@
>    // Check if the runtime was executed with the "-profile" argument
>    for (int i = 1; i < argc; i++) {
> +    if (!strcmp(argv[i], "-profile") ||
> +        !strcmp(argv[i], "--profile") ||
> +        !strcmp(argv[i], "/profile")) {

Not sure we need to go all the way to support /arg when it's not currently supported.
Attachment #8503149 - Flags: review?(mh+mozilla) → review+
Comment on attachment 8503151 [details] [diff] [review]
(part 2) - Convert all mentions of -foo options to --foo options in comments, help messages and error messages

Review of attachment 8503151 [details] [diff] [review]:
-----------------------------------------------------------------

::: b2g/gaia/run-b2g.c
@@ +39,3 @@
>      fflush(stdout);
>      fflush(stderr);
>      execle(full_path, full_path, "-profile", full_profile_path, NULL, envp);

Maybe add a comment that the intent is to switch to --args and that for now it keeps using -arg even though it says --arg and that's not an error in the printf, but rather one in the exec.

::: browser/components/nsBrowserContentHandler.js
@@ +419,3 @@
>          // NS_ERROR_ABORT so that the xremote code knows to return a failure
>          // back to the handling code.
>          throw NS_ERROR_ABORT;

I bitrotted you :)

@@ +547,2 @@
>  #endif
> +             "  --search     <term> Search <term> with your default search engine.\n",

Can you remove those spaces between --search and <term> and realign?

::: browser/components/shell/nsWindowsShellService.cpp
@@ +97,5 @@
>  //   as aliases to the class:
>  //
>  //   HKCU\SOFTWARE\Classes\FirefoxHTML\
>  //     DefaultIcon                      (default)         REG_SZ     <apppath>,1
> +//     shell\open\command               (default)         REG_SZ     <apppath> --osint --url "%1"

mmmm changing that without changing the related code kind of makes the comment untruthful as to what the current values are expected to be in the registry.

::: toolkit/xre/nsAppRunner.cpp
@@ +3268,5 @@
>    }
>  
>    ar = CheckArg("safe-mode", true);
>    if (ar == ARG_BAD) {
> +    PR_fprintf(PR_STDERR, "Error: argument --safe-mode is invalid when argument --osint is specified\n");

I wonder why we sometimes use PR_fprintf and sometimes Output. Especially when PR_fprintf will print nothing on non-debug builds because firefox is not attached to a console on windows, and Output does open a message box instead, but that's unrelated to this bug.
Attachment #8503151 - Flags: review?(mh+mozilla) → review+
Attachment #8503155 - Flags: review?(mh+mozilla) → review+
> Not sure we need to go all the way to support /arg when it's not currently supported.

I'll keep it just to make things as consistent as possible with the main option handling code.
Version: 29 Branch → unspecified
Blocks: 1088430
> ::: browser/components/shell/nsWindowsShellService.cpp
> @@ +97,5 @@
> >  //   as aliases to the class:
> >  //
> >  //   HKCU\SOFTWARE\Classes\FirefoxHTML\
> >  //     DefaultIcon                      (default)         REG_SZ     <apppath>,1
> > +//     shell\open\command               (default)         REG_SZ     <apppath> --osint --url "%1"
> 
> mmmm changing that without changing the related code kind of makes the
> comment untruthful as to what the current values are expected to be in the
> registry.

Ok, I'll revert all the changes in this file.
You need to log in before you can comment on or make changes to this bug.