Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / v8 / tools / push-to-trunk / git_recipes.py
1 #!/usr/bin/env python
2 # Copyright 2014 the V8 project authors. All rights reserved.
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions are
5 # met:
6 #
7 #     * Redistributions of source code must retain the above copyright
8 #       notice, this list of conditions and the following disclaimer.
9 #     * Redistributions in binary form must reproduce the above
10 #       copyright notice, this list of conditions and the following
11 #       disclaimer in the documentation and/or other materials provided
12 #       with the distribution.
13 #     * Neither the name of Google Inc. nor the names of its
14 #       contributors may be used to endorse or promote products derived
15 #       from this software without specific prior written permission.
16 #
17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29 import re
30
31
32 class GitFailedException(Exception):
33   pass
34
35
36 def Strip(f):
37   def new_f(*args, **kwargs):
38     return f(*args, **kwargs).strip()
39   return new_f
40
41
42 def MakeArgs(l):
43   """['-a', '', 'abc', ''] -> '-a abc'"""
44   return " ".join(filter(None, l))
45
46
47 def Quoted(s):
48   return "\"%s\"" % s
49
50
51 class GitRecipesMixin(object):
52   def GitIsWorkdirClean(self):
53     return self.Git("status -s -uno").strip() == ""
54
55   @Strip
56   def GitBranch(self):
57     return self.Git("branch")
58
59   def GitCreateBranch(self, name, branch=""):
60     assert name
61     self.Git(MakeArgs(["checkout -b", name, branch]))
62
63   def GitDeleteBranch(self, name):
64     assert name
65     self.Git(MakeArgs(["branch -D", name]))
66
67   def GitReset(self, name):
68     assert name
69     self.Git(MakeArgs(["reset --hard", name]))
70
71   def GitStash(self):
72     self.Git(MakeArgs(["stash"]))
73
74   def GitRemotes(self):
75     return map(str.strip, self.Git(MakeArgs(["branch -r"])).splitlines())
76
77   def GitCheckout(self, name):
78     assert name
79     self.Git(MakeArgs(["checkout -f", name]))
80
81   def GitCheckoutFile(self, name, branch_or_hash):
82     assert name
83     assert branch_or_hash
84     self.Git(MakeArgs(["checkout -f", branch_or_hash, "--", name]))
85
86   def GitCheckoutFileSafe(self, name, branch_or_hash):
87     try:
88       self.GitCheckoutFile(name, branch_or_hash)
89     except GitFailedException:  # pragma: no cover
90       # The file doesn't exist in that revision.
91       return False
92     return True
93
94   def GitChangedFiles(self, git_hash):
95     assert git_hash
96     try:
97       files = self.Git(MakeArgs(["diff --name-only",
98                                  git_hash,
99                                  "%s^" % git_hash]))
100       return map(str.strip, files.splitlines())
101     except GitFailedException:  # pragma: no cover
102       # Git fails using "^" at branch roots.
103       return []
104
105
106   @Strip
107   def GitCurrentBranch(self):
108     for line in self.Git("status -s -b -uno").strip().splitlines():
109       match = re.match(r"^## (.+)", line)
110       if match: return match.group(1)
111     raise Exception("Couldn't find curent branch.")  # pragma: no cover
112
113   @Strip
114   def GitLog(self, n=0, format="", grep="", git_hash="", parent_hash="",
115              branch="", reverse=False):
116     assert not (git_hash and parent_hash)
117     args = ["log"]
118     if n > 0:
119       args.append("-%d" % n)
120     if format:
121       args.append("--format=%s" % format)
122     if grep:
123       args.append("--grep=\"%s\"" % grep.replace("\"", "\\\""))
124     if reverse:
125       args.append("--reverse")
126     if git_hash:
127       args.append(git_hash)
128     if parent_hash:
129       args.append("%s^" % parent_hash)
130     args.append(branch)
131     return self.Git(MakeArgs(args))
132
133   def GitGetPatch(self, git_hash):
134     assert git_hash
135     return self.Git(MakeArgs(["log", "-1", "-p", git_hash]))
136
137   # TODO(machenbach): Unused? Remove.
138   def GitAdd(self, name):
139     assert name
140     self.Git(MakeArgs(["add", Quoted(name)]))
141
142   def GitApplyPatch(self, patch_file, reverse=False):
143     assert patch_file
144     args = ["apply --index --reject"]
145     if reverse:
146       args.append("--reverse")
147     args.append(Quoted(patch_file))
148     self.Git(MakeArgs(args))
149
150   def GitUpload(self, reviewer="", author="", force=False, cq=False,
151                 bypass_hooks=False):
152     args = ["cl upload --send-mail"]
153     if author:
154       args += ["--email", Quoted(author)]
155     if reviewer:
156       args += ["-r", Quoted(reviewer)]
157     if force:
158       args.append("-f")
159     if cq:
160       args.append("--use-commit-queue")
161     if bypass_hooks:
162       args.append("--bypass-hooks")
163     # TODO(machenbach): Check output in forced mode. Verify that all required
164     # base files were uploaded, if not retry.
165     self.Git(MakeArgs(args), pipe=False)
166
167   def GitCommit(self, message="", file_name=""):
168     assert message or file_name
169     args = ["commit"]
170     if file_name:
171       args += ["-aF", Quoted(file_name)]
172     if message:
173       args += ["-am", Quoted(message)]
174     self.Git(MakeArgs(args))
175
176   def GitPresubmit(self):
177     self.Git("cl presubmit", "PRESUBMIT_TREE_CHECK=\"skip\"")
178
179   def GitDCommit(self):
180     self.Git("cl dcommit -f --bypass-hooks", retry_on=lambda x: x is None)
181
182   def GitDiff(self, loc1, loc2):
183     return self.Git(MakeArgs(["diff", loc1, loc2]))
184
185   def GitPull(self):
186     self.Git("pull")
187
188   def GitSVNFetch(self):
189     self.Git("svn fetch")
190
191   def GitSVNRebase(self):
192     self.Git("svn rebase")
193
194   # TODO(machenbach): Unused? Remove.
195   @Strip
196   def GitSVNLog(self):
197     return self.Git("svn log -1 --oneline")
198
199   @Strip
200   def GitSVNFindGitHash(self, revision, branch=""):
201     assert revision
202     return self.Git(MakeArgs(["svn find-rev", "r%s" % revision, branch]))
203
204   @Strip
205   def GitSVNFindSVNRev(self, git_hash, branch=""):
206     return self.Git(MakeArgs(["svn find-rev", git_hash, branch]))
207
208   def GitSVNDCommit(self):
209     return self.Git("svn dcommit 2>&1", retry_on=lambda x: x is None)
210
211   def GitSVNTag(self, version):
212     self.Git(("svn tag %s -m \"Tagging version %s\"" % (version, version)),
213              retry_on=lambda x: x is None)