On 26 Jan 2021, Daniel Shahaf wrote:
>+1 to using sys.executable.  Fixing the quoting while in there would be
>nice to have, but as it's not a regression it's not a blocker either.
>Happy to leave the details to you.

Well, things turn out to be a bit more complicated than I thought.

My original patch was just to replace

  svneditor_script = os.path.join(sys.path[0], 'svneditor.py')

with

  svneditor_script =  sys.executable + " " + \
                      os.path.join(sys.path[0], 'svneditor.py')

in subversion/tests/cmdline/svntest/main.py.  Unfortunately, exactly one
test still fails with that:

  FAIL: update_tests.py 38: update --accept automatic conflict resolution

See [1] for details.

So then I tried a slightly fancier and experimental change.  I'll
present it in straight-code form here, instead of patch, but it's just
replacing the same line as before:

  # Create a shell script that invokes the Python executable (the
  # one that the test suite is using) on svneditor.py and its args.
  svneditor_script = os.path.join(sys.path[0], 'svneditor.sh')
  with open(svneditor_script, 'w') as fp:
     fp.write("#!/bin/sh\n\n")
     fp.write("'%s' '%s' $@\n" % (sys.executable,
                                  os.path.join(sys.path[0], 'svneditor.py')))
  svneditor_script_st = os.stat(svneditor_script)
  os.chmod(svneditor_script, svneditor_script_st.st_mode | stat.S_IEXEC)

Pretty straightforward, right?  I know, I know: it doesn't clean up the
shell script afterwards or anything yet.  I'm just experimenting.

To my surprise, this still fails on the same update test, but in a
different way!  [2] gives the details.  I haven't figured out yet why
it's getting that "usage" error.  I mean, it should be straightforward
replacement of the original Python script with a shell script that
invokes the Python script, and just passes along all the rest of the
arguments.  I expected it to work.

I guess my next step is to install the dang 'python-is-python3' package
on my Debian box and see if the test passes then without any changes?

Anyway, I'm posting this now in case you or anyone spots the problem,
and/or comes up with a better solution.

Responding to James McCoy:
>Thanks for the patch!  I have a hacky patch to just force the #! line to
>a Python version in the Debian packaging currently.  I had meant to
>follow up about this, and propose a patch similar to yours, but ran into
>other unrelated issues at the time and the forgot about it.

Well, looks like we're not quite there yet, but getting closer maybe.

Best regards,
-Karl

[1] Failure with the first attempted patch:

    W: The external merge tool '"/usr/bin/python2" 
/home/kfogel/src/subversion/subversion/tests/cmdline/svneditor.py' exited with 
exit code 255.
    W: svn: warning: apr_err=SVN_ERR_EXTERNAL_PROGRAM
    W: svn: warning: W200012: The external merge tool '"/usr/bin/python2" 
/home/kfogel/src/subversion/subversion/tests/cmdline/svneditor.py' exited with 
exit code 255.
    W: subversion/svn/update-cmd.c:188,
    W: subversion/svn/resolve-cmd.c:157: 
(apr_err=SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE)
    W: svn: E155027: Failure occurred resolving one or more conflicts
    W: CWD: /home/kfogel/src/subversion/subversion/tests/cmdline
    W: EXCEPTION: Failure: Command failed: 
"/home/kfogel/src/subversion/subversion/svn/svn update --accept=launch 
--force-interactive ..."; exit code 1
    Traceback (most recent call last):
      File 
"/home/kfogel/src/subversion/subversion/tests/cmdline/svntest/main.py", line 
1930, in run
        rc = self.pred.run(sandbox)
      File 
"/home/kfogel/src/subversion/subversion/tests/cmdline/svntest/testcase.py", 
line 178, in run
        result = self.func(sandbox)
      File 
"/home/kfogel/src/subversion/subversion/tests/cmdline/update_tests.py", line 
3774, in update_accept_conflicts
        rho_path_backup)
      File 
"/home/kfogel/src/subversion/subversion/tests/cmdline/svntest/actions.py", line 
340, in run_and_verify_svn
        expected_exit, *varargs)
      File 
"/home/kfogel/src/subversion/subversion/tests/cmdline/svntest/actions.py", line 
378, in run_and_verify_svn2
        exit_code, out, err = main.run_svn(want_err, *varargs)
      File 
"/home/kfogel/src/subversion/subversion/tests/cmdline/svntest/main.py", line 
821, in run_svn
        *(_with_auth(_with_config_dir(varargs))))
      File 
"/home/kfogel/src/subversion/subversion/tests/cmdline/svntest/main.py", line 
448, in run_command
        None, *varargs)
      File 
"/home/kfogel/src/subversion/subversion/tests/cmdline/svntest/main.py", line 
669, in run_command_stdin
        '"; exit code ' + str(exit_code))
    Failure: Command failed: "/home/kfogel/src/subversion/subversion/svn/svn 
update --accept=launch --force-interactive ..."; exit code 1
    FAIL:  update_tests.py 38: update --accept automatic conflict resolution

[2] Failure with the 2nd attempted patch:

    W: Unexpected output
    W: EXPECTED STDOUT (match_all=True):
    W: | Updating 'svn-test-work/working_copies/update_tests-38.backup/A/D/G/p; 
i':
    W: | C    svn-test-work/working_copies/update_tests-38.backup/A/D/G/p; i
    W: | Updated to revision 3.
    W: | Merge conflicts in 
'svn-test-work/working_copies/update_tests-38.backup/A/D/G/p; i' marked as 
resolved.
    W: | Summary of conflicts:
    W: |   Text conflicts: 0 remaining (and 1 already resolved)
    W: ACTUAL STDOUT:
    W: | Updating 'svn-test-work/working_copies/update_tests-38.backup/A/D/G/p; 
i':
    W: | C    svn-test-work/working_copies/update_tests-38.backup/A/D/G/p; i
    W: | Updated to revision 3.
    W: | usage: svneditor.py file
    W: |        svneditor.py base theirs mine merged wc_path
    W: | arguments passed were: 
['/home/kfogel/src/subversion/subversion/tests/cmdline/svneditor.py', 'p;', 'i']
    W: | Merge conflicts in 
'svn-test-work/working_copies/update_tests-38.backup/A/D/G/p; i' marked as 
resolved.
    W: | Summary of conflicts:
    W: |   Text conflicts: 0 remaining (and 1 already resolved)
    W: DIFF STDOUT (match_all=True):
    W: | --- EXPECTED STDOUT (match_all=True)
    W: | +++ ACTUAL STDOUT
    W: | @@ -1,6 +1,9 @@
    W: |  Updating 
'svn-test-work/working_copies/update_tests-38.backup/A/D/G/p; i':
    W: |  C    svn-test-work/working_copies/update_tests-38.backup/A/D/G/p; i
    W: |  Updated to revision 3.
    W: | +usage: svneditor.py file
    W: | +       svneditor.py base theirs mine merged wc_path
    W: | +arguments passed were: 
['/home/kfogel/src/subversion/subversion/tests/cmdline/svneditor.py', 'p;', 'i']
    W: |  Merge conflicts in 
'svn-test-work/working_copies/update_tests-38.backup/A/D/G/p; i' marked as 
resolved.
    W: |  Summary of conflicts:
    W: |    Text conflicts: 0 remaining (and 1 already resolved)
    W: CWD: /home/kfogel/src/subversion/subversion/tests/cmdline
    W: EXCEPTION: SVNLineUnequal
    Traceback (most recent call last):
      File 
"/home/kfogel/src/subversion/subversion/tests/cmdline/svntest/main.py", line 
1935, in run
        rc = self.pred.run(sandbox)
      File 
"/home/kfogel/src/subversion/subversion/tests/cmdline/svntest/testcase.py", 
line 178, in run
        result = self.func(sandbox)
      File 
"/home/kfogel/src/subversion/subversion/tests/cmdline/update_tests.py", line 
3765, in update_accept_conflicts
        p_i_path_backup)
      File 
"/home/kfogel/src/subversion/subversion/tests/cmdline/svntest/actions.py", line 
380, in run_and_verify_svn2
        expected_stdout, expected_stderr)
      File 
"/home/kfogel/src/subversion/subversion/tests/cmdline/svntest/verify.py", line 
531, in verify_outputs
        compare_and_display_lines(message, label, expected, actual, raisable)
      File 
"/home/kfogel/src/subversion/subversion/tests/cmdline/svntest/verify.py", line 
504, in compare_and_display_lines
        raise raisable
    SVNLineUnequal
    FAIL:  update_tests.py 38: update --accept automatic conflict resolution

Reply via email to