prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  exp save: Short option for --message is -M, but for dvc exp run it is -m
  It would be nice if the short options of `dvc exp run` and `dvc exp save` for specifying a commit message would be identical. Also, best to use the same options as one would use for `git commit`, i.e., `-m` instead of `-M`.
  
  ```
  usage: dvc experiments save [-h] [-q | -v] [-f] [--json] [-n <name>] [-I <path>] [-M MESSAGE]
  
  Save current workspace as an experiment.
  Documentation: <https://man.dvc.org/exp/save>
  
  options:
    -h, --help            show this help message and exit
    -q, --quiet           Be quiet.
    -v, --verbose         Be verbose.
    -f, --force           Replace experiment if it already exists.
    --json                Show output in JSON format.
    -n <name>, --name <name>
                          Human-readable experiment name. If not specified, a name will be auto-generated.
    -I <path>, --include-untracked <path>
                          List of untracked paths to include in the experiment.
    -M MESSAGE, --message MESSAGE
                          Custom commit message to use when committing the experiment.
  ```
  
  DVC CLI v3.22.1
  
  </issue>
  <code>
  [start of dvc/commands/experiments/save.py]
  1 import argparse
  2 import logging
  3 
  4 from dvc.cli.command import CmdBase
  5 from dvc.cli.utils import append_doc_link
  6 from dvc.exceptions import DvcException
  7 from dvc.ui import ui
  8 
  9 logger = logging.getLogger(__name__)
  10 
  11 
  12 class CmdExperimentsSave(CmdBase):
  13     def run(self):
  14         try:
  15             ref = self.repo.experiments.save(
  16                 name=self.args.name,
  17                 force=self.args.force,
  18                 include_untracked=self.args.include_untracked,
  19                 message=self.args.message,
  20             )
  21         except DvcException:
  22             logger.exception("failed to save experiment")
  23             return 1
  24 
  25         if self.args.json:
  26             ui.write_json({"ref": ref})
  27         else:
  28             name = self.repo.experiments.get_exact_name([ref])[ref]
  29             ui.write(f"Experiment has been saved as: {name}")
  30 
  31         return 0
  32 
  33 
  34 def add_parser(experiments_subparsers, parent_parser):
  35     EXPERIMENTS_SAVE_HELP = "Save current workspace as an experiment."
  36     save_parser = experiments_subparsers.add_parser(
  37         "save",
  38         parents=[parent_parser],
  39         description=append_doc_link(EXPERIMENTS_SAVE_HELP, "exp/save"),
  40         help=EXPERIMENTS_SAVE_HELP,
  41         formatter_class=argparse.RawDescriptionHelpFormatter,
  42     )
  43     save_parser.add_argument(
  44         "-f",
  45         "--force",
  46         action="store_true",
  47         default=False,
  48         help="Replace experiment if it already exists.",
  49     )
  50     save_parser.add_argument(
  51         "--json",
  52         action="store_true",
  53         default=False,
  54         help="Show output in JSON format.",
  55     )
  56     save_parser.add_argument(
  57         "-n",
  58         "--name",
  59         default=None,
  60         help=(
  61             "Human-readable experiment name. If not specified, a name will "
  62             "be auto-generated."
  63         ),
  64         metavar="<name>",
  65     )
  66     save_parser.add_argument(
  67         "-I",
  68         "--include-untracked",
  69         action="append",
  70         default=[],
  71         help="List of untracked paths to include in the experiment.",
  72         metavar="<path>",
  73     )
  74     save_parser.add_argument(
  75         "-M",
  76         "--message",
  77         type=str,
  78         default=None,
  79         help="Custom commit message to use when committing the experiment.",
  80     )
  81     save_parser.set_defaults(func=CmdExperimentsSave)
  82
  [end of dvc/commands/experiments/save.py]
  [start of dvc/commands/experiments/exec_run.py]
  1 import logging
  2 
  3 from dvc.cli.command import CmdBaseNoRepo
  4 
  5 logger = logging.getLogger(__name__)
  6 
  7 
  8 class CmdExecutorRun(CmdBaseNoRepo):
  9     """Run an experiment executor."""
  10 
  11     def run(self):
  12         from dvc.repo.experiments.executor.base import BaseExecutor, ExecutorInfo
  13         from dvc.utils.serialize import load_json
  14 
  15         info = ExecutorInfo.from_dict(load_json(self.args.infofile))
  16         BaseExecutor.reproduce(
  17             info=info,
  18             rev="",
  19             queue=None,
  20             log_level=logger.getEffectiveLevel(),
  21             infofile=self.args.infofile,
  22             copy_paths=self.args.copy_paths,
  23             message=self.args.message,
  24         )
  25         return 0
  26 
  27 
  28 def add_parser(experiments_subparsers, parent_parser):
  29     EXEC_RUN_HELP = "Run an experiment executor."
  30     exec_run_parser = experiments_subparsers.add_parser(
  31         "exec-run",
  32         parents=[parent_parser],
  33         description=EXEC_RUN_HELP,
  34         add_help=False,
  35     )
  36     exec_run_parser.add_argument(
  37         "--infofile",
  38         help="Path to executor info file",
  39         default=None,
  40     )
  41     exec_run_parser.add_argument(
  42         "-C",
  43         "--copy-paths",
  44         action="append",
  45         default=[],
  46         help=(
  47             "List of ignored or untracked paths to copy into the temp directory."
  48             " Only used if `--temp` or `--queue` is specified."
  49         ),
  50     )
  51     exec_run_parser.add_argument(
  52         "-M",
  53         "--message",
  54         type=str,
  55         default=None,
  56         help="Custom commit message to use when committing the experiment.",
  57     )
  58     exec_run_parser.set_defaults(func=CmdExecutorRun)
  59
  [end of dvc/commands/experiments/exec_run.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/dvc/commands/experiments/exec_run.py b/dvc/commands/experiments/exec_run.py
  --- a/dvc/commands/experiments/exec_run.py
  +++ b/dvc/commands/experiments/exec_run.py
  @@ -49,7 +49,7 @@
           ),
       )
       exec_run_parser.add_argument(
  -        "-M",
  +        "-m",
           "--message",
           type=str,
           default=None,
  diff --git a/dvc/commands/experiments/save.py b/dvc/commands/experiments/save.py
  --- a/dvc/commands/experiments/save.py
  +++ b/dvc/commands/experiments/save.py
  @@ -72,7 +72,7 @@
           metavar="<path>",
       )
       save_parser.add_argument(
  -        "-M",
  +        "-m",
           "--message",
           type=str,
           default=None,
  
verification_info: {"golden_diff": "diff --git a/dvc/commands/experiments/exec_run.py b/dvc/commands/experiments/exec_run.py\n--- a/dvc/commands/experiments/exec_run.py\n+++ b/dvc/commands/experiments/exec_run.py\n@@ -49,7 +49,7 @@\n         ),\n     )\n     exec_run_parser.add_argument(\n-        \"-M\",\n+        \"-m\",\n         \"--message\",\n         type=str,\n         default=None,\ndiff --git a/dvc/commands/experiments/save.py b/dvc/commands/experiments/save.py\n--- a/dvc/commands/experiments/save.py\n+++ b/dvc/commands/experiments/save.py\n@@ -72,7 +72,7 @@\n         metavar=\"<path>\",\n     )\n     save_parser.add_argument(\n-        \"-M\",\n+        \"-m\",\n         \"--message\",\n         type=str,\n         default=None,\n", "issue": "exp save: Short option for --message is -M, but for dvc exp run it is -m\nIt would be nice if the short options of `dvc exp run` and `dvc exp save` for specifying a commit message would be identical. Also, best to use the same options as one would use for `git commit`, i.e., `-m` instead of `-M`.\r\n\r\n```\r\nusage: dvc experiments save [-h] [-q | -v] [-f] [--json] [-n <name>] [-I <path>] [-M MESSAGE]\r\n\r\nSave current workspace as an experiment.\r\nDocumentation: <https://man.dvc.org/exp/save>\r\n\r\noptions:\r\n  -h, --help            show this help message and exit\r\n  -q, --quiet           Be quiet.\r\n  -v, --verbose         Be verbose.\r\n  -f, --force           Replace experiment if it already exists.\r\n  --json                Show output in JSON format.\r\n  -n <name>, --name <name>\r\n                        Human-readable experiment name. If not specified, a name will be auto-generated.\r\n  -I <path>, --include-untracked <path>\r\n                        List of untracked paths to include in the experiment.\r\n  -M MESSAGE, --message MESSAGE\r\n                        Custom commit message to use when committing the experiment.\r\n```\r\n\r\nDVC CLI v3.22.1\n", "before_files": [{"content": "import argparse\nimport logging\n\nfrom dvc.cli.command import CmdBase\nfrom dvc.cli.utils import append_doc_link\nfrom dvc.exceptions import DvcException\nfrom dvc.ui import ui\n\nlogger = logging.getLogger(__name__)\n\n\nclass CmdExperimentsSave(CmdBase):\n    def run(self):\n        try:\n            ref = self.repo.experiments.save(\n                name=self.args.name,\n                force=self.args.force,\n                include_untracked=self.args.include_untracked,\n                message=self.args.message,\n            )\n        except DvcException:\n            logger.exception(\"failed to save experiment\")\n            return 1\n\n        if self.args.json:\n            ui.write_json({\"ref\": ref})\n        else:\n            name = self.repo.experiments.get_exact_name([ref])[ref]\n            ui.write(f\"Experiment has been saved as: {name}\")\n\n        return 0\n\n\ndef add_parser(experiments_subparsers, parent_parser):\n    EXPERIMENTS_SAVE_HELP = \"Save current workspace as an experiment.\"\n    save_parser = experiments_subparsers.add_parser(\n        \"save\",\n        parents=[parent_parser],\n        description=append_doc_link(EXPERIMENTS_SAVE_HELP, \"exp/save\"),\n        help=EXPERIMENTS_SAVE_HELP,\n        formatter_class=argparse.RawDescriptionHelpFormatter,\n    )\n    save_parser.add_argument(\n        \"-f\",\n        \"--force\",\n        action=\"store_true\",\n        default=False,\n        help=\"Replace experiment if it already exists.\",\n    )\n    save_parser.add_argument(\n        \"--json\",\n        action=\"store_true\",\n        default=False,\n        help=\"Show output in JSON format.\",\n    )\n    save_parser.add_argument(\n        \"-n\",\n        \"--name\",\n        default=None,\n        help=(\n            \"Human-readable experiment name. If not specified, a name will \"\n            \"be auto-generated.\"\n        ),\n        metavar=\"<name>\",\n    )\n    save_parser.add_argument(\n        \"-I\",\n        \"--include-untracked\",\n        action=\"append\",\n        default=[],\n        help=\"List of untracked paths to include in the experiment.\",\n        metavar=\"<path>\",\n    )\n    save_parser.add_argument(\n        \"-M\",\n        \"--message\",\n        type=str,\n        default=None,\n        help=\"Custom commit message to use when committing the experiment.\",\n    )\n    save_parser.set_defaults(func=CmdExperimentsSave)\n", "path": "dvc/commands/experiments/save.py"}, {"content": "import logging\n\nfrom dvc.cli.command import CmdBaseNoRepo\n\nlogger = logging.getLogger(__name__)\n\n\nclass CmdExecutorRun(CmdBaseNoRepo):\n    \"\"\"Run an experiment executor.\"\"\"\n\n    def run(self):\n        from dvc.repo.experiments.executor.base import BaseExecutor, ExecutorInfo\n        from dvc.utils.serialize import load_json\n\n        info = ExecutorInfo.from_dict(load_json(self.args.infofile))\n        BaseExecutor.reproduce(\n            info=info,\n            rev=\"\",\n            queue=None,\n            log_level=logger.getEffectiveLevel(),\n            infofile=self.args.infofile,\n            copy_paths=self.args.copy_paths,\n            message=self.args.message,\n        )\n        return 0\n\n\ndef add_parser(experiments_subparsers, parent_parser):\n    EXEC_RUN_HELP = \"Run an experiment executor.\"\n    exec_run_parser = experiments_subparsers.add_parser(\n        \"exec-run\",\n        parents=[parent_parser],\n        description=EXEC_RUN_HELP,\n        add_help=False,\n    )\n    exec_run_parser.add_argument(\n        \"--infofile\",\n        help=\"Path to executor info file\",\n        default=None,\n    )\n    exec_run_parser.add_argument(\n        \"-C\",\n        \"--copy-paths\",\n        action=\"append\",\n        default=[],\n        help=(\n            \"List of ignored or untracked paths to copy into the temp directory.\"\n            \" Only used if `--temp` or `--queue` is specified.\"\n        ),\n    )\n    exec_run_parser.add_argument(\n        \"-M\",\n        \"--message\",\n        type=str,\n        default=None,\n        help=\"Custom commit message to use when committing the experiment.\",\n    )\n    exec_run_parser.set_defaults(func=CmdExecutorRun)\n", "path": "dvc/commands/experiments/exec_run.py"}]}