1#!/usr/bin/env python
2# Copyright (c) 2014 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5import sys
6import os
7
8_TOP_PATH = os.path.abspath(os.path.join(
9    os.path.dirname(__file__), '..'))
10
11class Link(object):
12  def __init__(self, dst_path, src_path):
13    self.dst_path = dst_path
14    self.src_path = src_path
15
16  def Update(self):
17    full_src_path = os.path.join(_TOP_PATH, self.src_path)
18    full_dst_path = os.path.join(_TOP_PATH, self.dst_path)
19
20    full_dst_path_dirname = os.path.dirname(full_dst_path)
21
22    src_path_rel = os.path.relpath(full_src_path, full_dst_path_dirname)
23
24    assert os.path.exists(full_src_path)
25    if not os.path.exists(full_dst_path_dirname):
26      sys.stdout.write('ERROR\n\n')
27      sys.stdout.write(' dst dir doesn\'t exist\n' % self.full_dst_path_dirname)
28      sys.stdout.write('\n\n')
29      sys.exit(255)
30
31    if os.path.exists(full_dst_path) or os.path.islink(full_dst_path):
32      if not os.path.islink(full_dst_path):
33        sys.stdout.write('ERROR\n\n')
34        sys.stdout.write('  Cannot install %s, dst already exists:\n  %s\n' % (
35          os.path.basename(self.src_path), full_dst_path))
36        sys.stdout.write('\n\n')
37        sys.exit(255)
38
39      existing_src_path_rel = os.readlink(full_dst_path)
40      if existing_src_path_rel == src_path_rel:
41        return
42      else:
43        sys.stdout.write('ERROR\n\n')
44        sys.stdout.write('  Cannot install %s, because %s is linked elsewhere.\n' % (
45          os.path.basename(self.src_path),
46          os.path.relpath(full_dst_path)))
47        sys.stdout.write('\n\n')
48        sys.exit(255)
49
50    os.symlink(src_path_rel, full_dst_path)
51
52def InstallHooks():
53  if sys.platform == 'win32':
54    return
55
56  # Remove old pre-commit, see https://github.com/google/trace-viewer/issues/932
57  old_precommit = os.path.join(_TOP_PATH, '.git', 'hooks', 'pre-commit')
58  old_precommit_target = os.path.join(_TOP_PATH, 'hooks', 'pre_commit')
59  if (os.path.islink(old_precommit) and
60      os.path.abspath(os.readlink(old_precommit)) == old_precommit_target):
61    os.remove(old_precommit)
62
63  links = []
64  links.append(Link(os.path.join('.git', 'hooks', 'pre-push'),
65                    os.path.join('hooks/pre_push')))
66
67  for l in links:
68    l.Update()
69