Changeset 92660 in webkit


Ignore:
Timestamp:
Aug 8, 2011 6:26:30 PM (13 years ago)
Author:
abarth@webkit.org
Message:

Chromium Windows bots can't figure out what SVN revision they're running
https://bugs.webkit.org/show_bug.cgi?id=65893

Reviewed by Eric Seidel.

The comment in _engage_awesome_windows_hacks explains why we're making
this change. It's ugly and rediculous, but this approach seems better
than using shell=True when calling popen.

  • Scripts/webkitpy/common/checkout/scm/svn.py:
  • Scripts/webkitpy/layout_tests/port/chromium_win.py:
Location:
trunk/Tools
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r92656 r92660  
     12011-08-08  Adam Barth  <abarth@webkit.org>
     2
     3        Chromium Windows bots can't figure out what SVN revision they're running
     4        https://bugs.webkit.org/show_bug.cgi?id=65893
     5
     6        Reviewed by Eric Seidel.
     7
     8        The comment in _engage_awesome_windows_hacks explains why we're making
     9        this change.  It's ugly and rediculous, but this approach seems better
     10        than using shell=True when calling popen.
     11
     12        * Scripts/webkitpy/common/checkout/scm/svn.py:
     13        * Scripts/webkitpy/layout_tests/port/chromium_win.py:
     14
    1152011-08-08  Adam Barth  <abarth@webkit.org>
    216
  • trunk/Tools/Scripts/webkitpy/common/checkout/scm/svn.py

    r92655 r92660  
    6969    svn_server_realm = "<http://svn.webkit.org:80> Mac OS Forge"
    7070
     71    executable_name = "svn"
     72
    7173    _svn_metadata_files = frozenset(['.svn', '_svn'])
    7274
     
    9496    @classmethod
    9597    def value_from_svn_info(cls, path, field_name):
    96         svn_info_args = ['svn', 'info']
     98        svn_info_args = [cls.executable_name, 'info']
    9799        # FIXME: This method should use a passed in executive or be made an instance method and use self._executive.
    98100        info_output = Executive().run_command(svn_info_args, cwd=path).rstrip()
     
    122124        return "^Committed revision (?P<svn_revision>\d+)\.$"
    123125
     126    def _run_svn(self, args, **kwargs):
     127        return self.run([self.executable_name] + args, **kwargs)
     128
    124129    @memoized
    125130    def svn_version(self):
    126         return self.run(['svn', '--version', '--quiet'])
     131        return self._run_svn(['--version', '--quiet'])
    127132
    128133    def working_directory_is_clean(self):
    129         return self.run(["svn", "diff"], cwd=self.checkout_root, decode_output=False) == ""
     134        return self._run_svn(["diff"], cwd=self.checkout_root, decode_output=False) == ""
    130135
    131136    def clean_working_directory(self):
     
    134139        # on this checkout at the same time.  However, it's much more likely that we're running
    135140        # under windows and svn just sucks (or the user interrupted svn and it failed to clean up).
    136         self.run(["svn", "cleanup"], cwd=self.checkout_root)
     141        self._run_svn(["cleanup"], cwd=self.checkout_root)
    137142
    138143        # svn revert -R is not as awesome as git reset --hard.
     
    143148        # added_files() returns directories for SVN, we walk the files in reverse path
    144149        # length order so that we remove files before we try to remove the directories.
    145         self.run(["svn", "revert", "-R", "."], cwd=self.checkout_root)
     150        self._run_svn(["revert", "-R", "."], cwd=self.checkout_root)
    146151        for path in added_files:
    147152            # This is robust against cwd != self.checkout_root
     
    154159
    155160    def status_command(self):
    156         return ['svn', 'status']
     161        return [self.executable_name, 'status']
    157162
    158163    def _status_regexp(self, expected_types):
     
    172177    def add(self, path, return_exit_code=False):
    173178        self._add_parent_directories(os.path.dirname(os.path.abspath(path)))
    174         return self.run(["svn", "add", path], return_exit_code=return_exit_code)
     179        return self._run_svn(["add", path], return_exit_code=return_exit_code)
    175180
    176181    def _delete_parent_directories(self, path):
     
    187192        abs_path = os.path.abspath(path)
    188193        parent, base = os.path.split(abs_path)
    189         result = self.run(["svn", "delete", "--force", base], cwd=parent)
     194        result = self._run_svn(["delete", "--force", base], cwd=parent)
    190195        self._delete_parent_directories(os.path.dirname(abs_path))
    191196        return result
    192197
    193198    def exists(self, path):
    194         return not self.run(["svn", "info", path], return_exit_code=True, decode_output=False)
     199        return not self._run_svn(["info", path], return_exit_code=True, decode_output=False)
    195200
    196201    def changed_files(self, git_commit=None):
    197         status_command = ["svn", "status"]
     202        status_command = [self.executable_name, "status"]
    198203        status_command.extend(self._patch_directories)
    199204        # ACDMR: Addded, Conflicted, Deleted, Modified or Replaced
     
    203208        # As far as I can tell svn diff --summarize output looks just like svn status output.
    204209        # No file contents printed, thus utf-8 auto-decoding in self.run is fine.
    205         status_command = ["svn", "diff", "--summarize", "-c", revision]
     210        status_command = [self.executable_name, "diff", "--summarize", "-c", revision]
    206211        return self.run_status_and_extract_filenames(status_command, self._status_regexp("ACDMR"))
    207212
     
    209214        revisions = []
    210215        # svn log will exit(1) (and thus self.run will raise) if the path does not exist.
    211         log_command = ['svn', 'log', '--quiet', '--limit=%s' % limit, path]
    212         for line in self.run(log_command, cwd=self.checkout_root).splitlines():
     216        log_command = ['log', '--quiet', '--limit=%s' % limit, path]
     217        for line in self._run_svn(log_command, cwd=self.checkout_root).splitlines():
    213218            match = re.search('^r(?P<revision>\d+) ', line)
    214219            if not match:
     
    234239
    235240    def head_svn_revision(self):
    236         _log.debug('Temporary logging to debug bot...')
    237         _log.debug(self.checkout_root)
    238         _log.debug(os.getcwd())
    239241        return self.value_from_svn_info(self.checkout_root, 'Revision')
    240242
     
    253255
    254256    def committer_email_for_revision(self, revision):
    255         return self.run(["svn", "propget", "svn:author", "--revprop", "-r", revision]).rstrip()
     257        return self._run_svn(["propget", "svn:author", "--revprop", "-r", revision]).rstrip()
    256258
    257259    def contents_at_revision(self, path, revision):
     
    259261        of path @ revision in the repository."""
    260262        remote_path = "%s/%s" % (self._repository_url(), path)
    261         return self.run(["svn", "cat", "-r", revision, remote_path], decode_output=False)
     263        return self._run_svn(["cat", "-r", revision, remote_path], decode_output=False)
    262264
    263265    def diff_for_revision(self, revision):
    264266        # FIXME: This should probably use cwd=self.checkout_root
    265         return self.run(['svn', 'diff', '-c', revision])
     267        return self._run_svn(['diff', '-c', revision])
    266268
    267269    def _bogus_dir_name(self):
     
    292294        self._setup_bogus_dir(log)
    293295        try:
    294             args = ['svn', 'diff']
     296            args = ['diff']
    295297            if self._bogus_dir:
    296298                args += ['--config-dir', self._bogus_dir]
    297299            args.append(path)
    298             return self.run(args, cwd=self.checkout_root)
     300            return self._run_svn(args, cwd=self.checkout_root)
    299301        finally:
    300302            self._teardown_bogus_dir(log)
    301303
    302304    def show_head(self, path):
    303         return self.run(['svn', 'cat', '-r', 'BASE', path], decode_output=False)
     305        return self._run_svn(['cat', '-r', 'BASE', path], decode_output=False)
    304306
    305307    def _repository_url(self):
     
    308310    def apply_reverse_diff(self, revision):
    309311        # '-c -revision' applies the inverse diff of 'revision'
    310         svn_merge_args = ['svn', 'merge', '--non-interactive', '-c', '-%s' % revision, self._repository_url()]
     312        svn_merge_args = ['merge', '--non-interactive', '-c', '-%s' % revision, self._repository_url()]
    311313        log("WARNING: svn merge has been known to take more than 10 minutes to complete.  It is recommended you use git for rollouts.")
    312         log("Running '%s'" % " ".join(svn_merge_args))
     314        log("Running 'svn %s'" % " ".join(svn_merge_args))
    313315        # FIXME: Should this use cwd=self.checkout_root?
    314         self.run(svn_merge_args)
     316        self._run_svn(svn_merge_args)
    315317
    316318    def revert_files(self, file_paths):
    317319        # FIXME: This should probably use cwd=self.checkout_root.
    318         self.run(['svn', 'revert'] + file_paths)
     320        self._run_svn(['revert'] + file_paths)
    319321
    320322    def commit_with_message(self, message, username=None, password=None, git_commit=None, force_squash=False, changed_files=None):
    321323        # git-commit and force are not used by SVN.
    322         svn_commit_args = ["svn", "commit"]
     324        svn_commit_args = ["commit"]
    323325
    324326        if not username and not self.has_authorization_for_realm(self.svn_server_realm):
     
    338340            return "Dry run, no commit.\nCommitted revision 0."
    339341
    340         return self.run(svn_commit_args, cwd=self.checkout_root, error_handler=commit_error_handler)
     342        return self._run_svn(svn_commit_args, cwd=self.checkout_root, error_handler=commit_error_handler)
    341343
    342344    def svn_commit_log(self, svn_revision):
    343345        svn_revision = self.strip_r_from_svn_revision(svn_revision)
    344         return self.run(['svn', 'log', '--non-interactive', '--revision', svn_revision])
     346        return self._run_svn(['log', '--non-interactive', '--revision', svn_revision])
    345347
    346348    def last_svn_commit_log(self):
     
    351353    def propset(self, pname, pvalue, path):
    352354        dir, base = os.path.split(path)
    353         return self.run(['svn', 'pset', pname, pvalue, base], cwd=dir)
     355        return self._run_svn(['pset', pname, pvalue, base], cwd=dir)
    354356
    355357    def propget(self, pname, path):
    356358        dir, base = os.path.split(path)
    357         return self.run(['svn', 'pget', pname, base], cwd=dir).encode('utf-8').rstrip("\n")
     359        return self._run_svn(['pget', pname, base], cwd=dir).encode('utf-8').rstrip("\n")
  • trunk/Tools/Scripts/webkitpy/layout_tests/port/chromium_win.py

    r91315 r92660  
    9898            assert self._version in self.SUPPORTED_VERSIONS, "%s is not in %s" % (self._version, self.SUPPORTED_VERSIONS)
    9999        self._operating_system = 'win'
     100        self._engage_awesome_windows_hacks()
     101
     102    def _engage_awesome_windows_hacks(self):
     103        try:
     104            self._executive.run_command(['svn', 'help'])
     105        except OSError, e:
     106            try:
     107                self._executive.run_command(['svn.bat', 'help'])
     108                # Chromium Win uses the depot_tools package, which contains a number
     109                # of development tools, including Python and svn. Instead of using a
     110                # real svn executable, depot_tools indirects via a batch file, called
     111                # svn.bat. This batch file allows depot_tools to auto-update the real
     112                # svn executable, which is contained in a subdirectory.
     113                #
     114                # That's all fine and good, except that subprocess.popen can detect
     115                # the difference between a real svn executable and batch file when we
     116                # don't provide use shell=True. Rather than use shell=True on Windows,
     117                # We hack the svn.bat name into the SVN class.
     118                _log.debug('Engaging svn.bat Windows hack.')
     119                from webkitpy.common.checkout.scm.svn import SVN
     120                SVN.executable_name = 'svn.bat'
     121            except OSError, e:
     122                _log.debug('Failed to engage svn.bat Windows hack.')
    100123
    101124    def setup_environ_for_server(self, server_name=None):
Note: See TracChangeset for help on using the changeset viewer.