Commit ba551776 authored by maruel@chromium.org's avatar maruel@chromium.org

Fix licensing headers and move most third party code to third_party/

Moved tests/pymox to third_party/pymox
Moved upload.py to third_party/upload.py
Fixed tests so they can run standalone
Fixed the executable bit on some scripts

TEST=none
BUG=34376
Review URL: http://codereview.chromium.org/562031

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@37987 0039d316-1c4b-4281-b951-d872f2087c98
parent d4fd8823
#!/usr/bin/python
# Copyright (c) 2009 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
......
......@@ -7,10 +7,6 @@ the latest versions of these tools as found at:
This package contains:
change-svn-wc-format.py
Tool to convert from a svn checkout format to another. Fetched from
http://svn.collab.net/repos/svn/trunk/tools/client-side/change-svn-wc-format.py
chrome-update-create-task.bat
Creates a scheduled task to do an automatic local chromium build every day.
......@@ -22,7 +18,7 @@ This package contains:
A tool for uploading and managing code reviews on the Chromium
project, using the Rietveld code review tool. More info at:
http://code.google.com/p/rietveld/
gclient
A script for managing a workspace with modular dependencies that
are each checked out independently from different repositories.
......@@ -34,9 +30,6 @@ This package contains:
construction tool. More info at:
http://www.scons.org/
revert
A small tool to quickly revert a change.
Note: svn and python will be installed automatically if not accessible (on
Windows only).
......
# git-cl -- a git-command for integrating reviews on Rietveld
# Copyright (C) 2008 Evan Martin <martine@danga.com>
== Background
Rietveld, also known as http://codereview.appspot.com, is a nice tool
for code reviews. You upload a patch (and some other data) and it lets
others comment on your patch.
For more on how this all works conceptually, please see README.codereview.
The remainder of this document is the nuts and bolts of using git-cl.
== Install
Copy (symlink) it into your path somewhere, along with Rietveld
upload.py.
== Setup
Run this from your git checkout and answer some questions:
$ git cl config
== How to use it
Make a new branch. Write some code. Commit it locally. Send it for
review:
$ git cl upload
By default, it diffs against whatever branch the current branch is
tracking (see "git checkout --track"). An optional last argument is
passed to "git diff", allowing reviews against other heads.
You'll be asked some questions, and the review issue number will be
associated with your current git branch, so subsequent calls to upload
will update that review rather than making a new one.
== git-svn integration
Review looks good? Commit the code:
$ git cl dcommit
This does a git-svn dcommit, with a twist: all changes in the diff
will be squashed into a single commit, and the description of the commit
is taken directly from the Rietveld description. This command also accepts
arguments to "git diff", much like upload.
Try "git cl dcommit --help" for more options.
== Extra commands
Print some status info:
$ git cl status
Edit the issue association on the current branch:
$ git cl issue 1234
Patch in a review:
$ git cl patch <url to full patch>
Try "git cl patch --help" for more options.
vim: tw=72 :
The git-cl README describes the git-cl command set. This document
describes how code review and git work together in general, intended
for people familiar with git but unfamiliar with the code review
process supported by Rietveld.
== Concepts and terms
A Rietveld review is for discussion of a single change or patch. You
upload a proposed change, the reviewer comments on your change, and
then you can upload a revised version of your change. Rietveld stores
the history of uploaded patches as well as the comments, and can
compute diffs in between these patches. The history of a patch is
very much like a small branch in git, but since Rietveld is
VCS-agnostic the concepts don't map perfectly. The identifier for a
single review+patches+comments in Rietveld is called an "issue".
Rietveld provides a basic uploader that understands git. This program
is used by git-cl, and is included in the git-cl repo as upload.py.
== Basic interaction with git
The fundamental problem you encounter when you try to mix git and code
review is that with git it's nice to commit code locally, while during
a code review you're often requested to change something about your
code. There are a few different ways you can handle this workflow
with git:
1) Rewriting a single commit. Say the origin commit is O, and you
commit your initial work in a commit A, making your history like
O--A. After review comments, you commit --amend, effectively
erasing A and making a new commit A', so history is now O--A'.
(Equivalently, you can use git reset --soft or git rebase -i.)
2) Writing follow-up commits. Initial work is again in A, and after
review comments, you write a new commit B so your history looks
like O--A--B. When you upload the revised patch, you upload the
diff of O..B, not A..B; you always upload the full diff of what
you're proposing to change.
The Rietveld patch uploader just takes arguments to "git diff", so
either of the above workflows work fine. If all you want to do is
upload a patch, you can use the upload.py provided by Rietveld with
arguments like this:
upload.py --server server.com <args to "git diff">
The first time you upload, it creates a new issue; for follow-ups on
the same issue, you need to provide the issue number:
upload.py --server server.com --issue 1234 <args to "git diff">
== git-cl to the rescue
git-cl simplifies the above in the following ways:
1) "git cl config" puts a persistent --server setting in your .git/config.
2) The first time you upload an issue, the issue number is associated with
the current *branch*. If you upload again, it will upload on the same
issue. (Note that this association is tied to a branch, not a commit,
which means you need a separate branch per review.)
3) If your branch is "tracking" (in the "git checkout --track" sense)
another one (like origin/master), calls to "git cl upload" will
diff against that branch by default. (You can still pass arguments
to "git diff" on the command line, if necessary.)
In the common case, this means that calling simply "git cl upload"
will always upload the correct diff to the correct place.
== Patch series
The above is all you need to know for working on a single patch.
Things get much more complicated when you have a series of commits
that you want to get reviewed. Say your history looks like
O--A--B--C. If you want to upload that as a single review, everything
works just as above.
But what if you upload each of A, B, and C as separate reviews?
What if you then need to change A?
1) One option is rewriting history: write a new commit A', then use
git rebase -i to insert that diff in as O--A--A'--B--C as well as
squash it. This is sometimes not possible if B and C have touched
some lines affected by A'.
2) Another option, and the one espoused by software like topgit, is for
you to have separate branches for A, B, and C, and after writing A'
you merge it into each of those branches. (topgit automates this
merging process.) This is also what is recommended by git-cl, which
likes having different branch identifiers to hang the issue number
off of. Your history ends up looking like:
O---A---B---C
\ \ \
A'--B'--C'
Which is ugly, but it accurately tracks the real history of your work, can
be thrown away at the end by committing A+A' as a single "squash" commit.
In practice, this comes up pretty rarely. Suggestions for better workflows
are welcome.
#!/usr/bin/python
# Copyright (c) 2009 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
......@@ -554,4 +555,4 @@ if __name__ == "__main__":
option_parser.error("--merge requires a --branch")
sys.exit(1)
sys.exit(main(options, args))
\ No newline at end of file
sys.exit(main(options, args))
......@@ -15,7 +15,7 @@ import string
import subprocess
import sys
import tempfile
import upload
from third_party import upload
import urllib2
import breakpad
......
#!/usr/bin/python
#
# Copyright 2008 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Copyright (c) 2010 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""A wrapper script to manage a set of client modules in different SCM.
......
#!/usr/bin/python
# Copyright (c) 2009 The Chromium Authors. All rights reserved.
# Copyright (c) 2010 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Wrapper for trychange.py for git checkout."""
......@@ -7,10 +7,7 @@
import logging
import sys
try:
import breakpad
except ImportError:
pass
import breakpad
from scm import GIT
import trychange
......
#!/usr/bin/env python
# Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
# Copyright (c) 2010 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
......
# Copyright 2008-2009, Google Inc.
To run the gclient's unit tests, you need to checkout pymox and install it:
svn co http://pymox.googlecode.com/svn/trunk pymox
cd pymox
python setup.py install
#!/usr/bin/python
# Copyright (c) 2009 The Chromium Authors. All rights reserved.
# Copyright (c) 2010 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for gcl.py."""
# Local imports
import gcl
# Fixes include path.
from super_mox import mox, SuperMoxTestBase
import gcl
class GclTestsBase(SuperMoxTestBase):
"""Setups and tear downs the mocks but doesn't test anything as-is."""
......
#!/usr/bin/python
#
# Copyright 2008-2009 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Copyright (c) 2010 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for gclient_scm.py."""
import os
import shutil
# Import it before super_mox to keep a valid reference.
# Import before super_mox to keep valid references.
from os import rename
from shutil import rmtree
from subprocess import Popen, PIPE, STDOUT
import tempfile
# Fixes include path.
from super_mox import mox, SuperMoxBaseTestBase
import gclient_scm
from gclient_test import BaseTestCase as GCBaseTestCase
from super_mox import mox, SuperMoxBaseTestBase
class BaseTestCase(GCBaseTestCase):
......@@ -373,7 +364,7 @@ from :3
def tearDown(self):
SuperMoxBaseTestBase.tearDown(self)
shutil.rmtree(self.root_dir)
rmtree(self.root_dir)
def testDir(self):
members = [
......@@ -503,7 +494,7 @@ from :3
self.assertEquals(scm.revinfo(options, (), None),
'069c602044c5388d2d15c3f875b057c852003458')
finally:
shutil.rmtree(root_dir)
rmtree(root_dir)
def testUpdateUpdate(self):
if not self.enabled:
......@@ -549,7 +540,7 @@ from :3
scm = gclient_scm.CreateSCM(url=self.url, root_dir=self.root_dir,
relpath=self.relpath)
git_path = gclient_scm.os.path.join(self.base_path, '.git')
os.rename(git_path, git_path + 'foo')
rename(git_path, git_path + 'foo')
exception = \
'\n____ .\n' \
'\tPath is not a git repo. No .git dir.\n' \
......
#!/usr/bin/python
#
# Copyright 2008-2009 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Copyright (c) 2010 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for gclient.py."""
__author__ = 'stephen5.ng@gmail.com (Stephen Ng)'
import __builtin__
import StringIO
# Fixes include path.
from super_mox import mox, IsOneOf, SuperMoxTestBase
import gclient
from super_mox import mox, IsOneOf, SuperMoxTestBase
class BaseTestCase(SuperMoxTestBase):
......
#!/usr/bin/python
# Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
# Copyright (c) 2010 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import re
import StringIO
import gclient_utils
# Fixes include path.
from super_mox import SuperMoxTestBase
import gclient_utils
class GclientUtilsUnittest(SuperMoxTestBase):
"""General gclient_utils.py tests."""
......@@ -82,7 +83,7 @@ class SubprocessCallAndFilterTestCase(SuperMoxTestBase):
stdout=gclient_utils.subprocess.PIPE,
stderr=gclient_utils.subprocess.STDOUT).AndReturn(kid)
self.mox.ReplayAll()
compiled_pattern = re.compile(pattern)
compiled_pattern = gclient_utils.re.compile(pattern)
line_list = []
capture_list = []
def FilterLines(line):
......
#!/usr/bin/python
# Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
# Copyright (c) 2010 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
......@@ -7,10 +7,12 @@
import StringIO
# Fixes include path.
from super_mox import mox, SuperMoxTestBase
import presubmit_support as presubmit
# Shortcut.
from presubmit_support import presubmit_canned_checks
from super_mox import mox, SuperMoxTestBase
presubmit_canned_checks = presubmit.presubmit_canned_checks
class PresubmitTestsBase(SuperMoxTestBase):
......
#!/usr/bin/python
# Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
# Copyright (c) 2010 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for scm.py."""
import shutil
from shutil import rmtree
import tempfile
# Fixes include path.
from super_mox import mox, SuperMoxBaseTestBase
from gclient_test import BaseTestCase
import scm
from super_mox import mox, SuperMoxBaseTestBase
class BaseSCMTestCase(BaseTestCase):
......@@ -110,7 +112,7 @@ from :3
self.fake_root = self.Dir()
def tearDown(self):
shutil.rmtree(self.root_dir)
rmtree(self.root_dir)
SuperMoxBaseTestBase.tearDown(self)
def testMembersChanged(self):
......
#!/usr/bin/python
# Copyright (c) 2009 The Chromium Authors. All rights reserved.
# Copyright (c) 2010 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
......@@ -8,10 +8,13 @@
import __builtin__
import os
import random
import shutil
import string
import subprocess
import sys
from pymox import mox
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
from third_party.pymox import mox
class IsOneOf(mox.Comparator):
......@@ -96,6 +99,7 @@ class SuperMoxTestBase(SuperMoxBaseTestBase):
os_path_to_mock = ('abspath', 'exists', 'getsize', 'isdir', 'isfile',
'islink', 'ismount', 'lexists', 'realpath', 'samefile', 'walk')
self.MockList(os.path, os_path_to_mock)
self.MockList(shutil, ('rmtree'))
self.MockList(subprocess, ('call', 'Popen'))
# Don't mock stderr since it confuses unittests.
self.MockList(sys, ('stdin', 'stdout'))
......@@ -105,4 +109,7 @@ class SuperMoxTestBase(SuperMoxBaseTestBase):
# Skip over items not present because of OS-specific implementation,
# implemented only in later python version, etc.
if hasattr(parent, item):
self.mox.StubOutWithMock(parent, item)
try:
self.mox.StubOutWithMock(parent, item)
except TypeError:
raise TypeError('Couldn\'t mock %s in %s' % (item, parent.__name__))
#!/usr/bin/python
# Copyright (c) 2009 The Chromium Authors. All rights reserved.
# Copyright (c) 2010 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for trychange.py."""
import optparse
# Fixes include path.
from super_mox import mox, SuperMoxTestBase
# Local imports
import trychange
from super_mox import mox, SuperMoxTestBase
class TryChangeTestsBase(SuperMoxTestBase):
......@@ -28,7 +27,7 @@ class TryChangeTestsBase(SuperMoxTestBase):
self.mox.StubOutWithMock(trychange.scm.SVN, 'GetEmail')
self.fake_root = self.Dir()
self.expected_files = ['foo.txt', 'bar.txt']
self.options = optparse.Values()
self.options = trychange.optparse.Values()
self.options.files = self.expected_files
self.options.diff = None
self.options.name = None
......
# Copyright (c) 2010 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""File to enable importing from third_party."""
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment