mirror of
https://gerrit.googlesource.com/git-repo
synced 2025-07-04 20:17:16 +00:00
Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
9fa44db94b | |||
c9ef744c7b | |||
438ee1cad9 |
2
error.py
2
error.py
@ -64,3 +64,5 @@ class RepoChangedException(Exception):
|
|||||||
repo or manifest repositories. In this special case we must
|
repo or manifest repositories. In this special case we must
|
||||||
use exec to re-execute repo with the new code and manifest.
|
use exec to re-execute repo with the new code and manifest.
|
||||||
"""
|
"""
|
||||||
|
def __init__(self, extra_args=[]):
|
||||||
|
self.extra_args = extra_args
|
||||||
|
44
hooks/pre-auto-gc
Executable file
44
hooks/pre-auto-gc
Executable file
@ -0,0 +1,44 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# An example hook script to verify if you are on battery, in case you
|
||||||
|
# are running Linux or OS X. Called by git-gc --auto with no arguments.
|
||||||
|
# The hook should exit with non-zero status after issuing an appropriate
|
||||||
|
# message if it wants to stop the auto repacking.
|
||||||
|
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
if test -x /sbin/on_ac_power && /sbin/on_ac_power
|
||||||
|
then
|
||||||
|
exit 0
|
||||||
|
elif test "$(cat /sys/class/power_supply/AC/online 2>/dev/null)" = 1
|
||||||
|
then
|
||||||
|
exit 0
|
||||||
|
elif grep -q 'on-line' /proc/acpi/ac_adapter/AC/state 2>/dev/null
|
||||||
|
then
|
||||||
|
exit 0
|
||||||
|
elif grep -q '0x01$' /proc/apm 2>/dev/null
|
||||||
|
then
|
||||||
|
exit 0
|
||||||
|
elif grep -q "AC Power \+: 1" /proc/pmu/info 2>/dev/null
|
||||||
|
then
|
||||||
|
exit 0
|
||||||
|
elif test -x /usr/bin/pmset && /usr/bin/pmset -g batt |
|
||||||
|
grep -q "Currently drawing from 'AC Power'"
|
||||||
|
then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Auto packing deferred; not on AC"
|
||||||
|
exit 1
|
8
main.py
8
main.py
@ -186,11 +186,13 @@ def _Main(argv):
|
|||||||
repo._Run(argv)
|
repo._Run(argv)
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
except RepoChangedException:
|
except RepoChangedException, rce:
|
||||||
# If the repo or manifest changed, re-exec ourselves.
|
# If repo changed, re-exec ourselves.
|
||||||
#
|
#
|
||||||
|
argv = list(sys.argv)
|
||||||
|
argv.extend(rce.extra_args)
|
||||||
try:
|
try:
|
||||||
os.execv(__file__, sys.argv)
|
os.execv(__file__, argv)
|
||||||
except OSError, e:
|
except OSError, e:
|
||||||
print >>sys.stderr, 'fatal: cannot restart repo after upgrade'
|
print >>sys.stderr, 'fatal: cannot restart repo after upgrade'
|
||||||
print >>sys.stderr, 'fatal: %s' % e
|
print >>sys.stderr, 'fatal: %s' % e
|
||||||
|
89
project.py
89
project.py
@ -12,6 +12,7 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
import errno
|
||||||
import filecmp
|
import filecmp
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
@ -45,6 +46,32 @@ def _info(fmt, *args):
|
|||||||
def not_rev(r):
|
def not_rev(r):
|
||||||
return '^' + r
|
return '^' + r
|
||||||
|
|
||||||
|
|
||||||
|
hook_list = None
|
||||||
|
def repo_hooks():
|
||||||
|
global hook_list
|
||||||
|
if hook_list is None:
|
||||||
|
d = os.path.abspath(os.path.dirname(__file__))
|
||||||
|
d = os.path.join(d , 'hooks')
|
||||||
|
hook_list = map(lambda x: os.path.join(d, x), os.listdir(d))
|
||||||
|
return hook_list
|
||||||
|
|
||||||
|
def relpath(dst, src):
|
||||||
|
src = os.path.dirname(src)
|
||||||
|
top = os.path.commonprefix([dst, src])
|
||||||
|
if top.endswith('/'):
|
||||||
|
top = top[:-1]
|
||||||
|
else:
|
||||||
|
top = os.path.dirname(top)
|
||||||
|
|
||||||
|
tmp = src
|
||||||
|
rel = ''
|
||||||
|
while top != tmp:
|
||||||
|
rel += '../'
|
||||||
|
tmp = os.path.dirname(tmp)
|
||||||
|
return rel + dst[len(top) + 1:]
|
||||||
|
|
||||||
|
|
||||||
class DownloadedChange(object):
|
class DownloadedChange(object):
|
||||||
_commit_cache = None
|
_commit_cache = None
|
||||||
|
|
||||||
@ -472,6 +499,9 @@ class Project(object):
|
|||||||
self._InitMRef()
|
self._InitMRef()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def PostRepoUpgrade(self):
|
||||||
|
self._InitHooks()
|
||||||
|
|
||||||
def _CopyFiles(self):
|
def _CopyFiles(self):
|
||||||
for file in self.copyfiles:
|
for file in self.copyfiles:
|
||||||
file._Copy()
|
file._Copy()
|
||||||
@ -680,6 +710,22 @@ class Project(object):
|
|||||||
else:
|
else:
|
||||||
raise GitError('%s checkout %s ' % (self.name, rev))
|
raise GitError('%s checkout %s ' % (self.name, rev))
|
||||||
|
|
||||||
|
def AbandonBranch(self, name):
|
||||||
|
"""Destroy a local topic branch.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
tip_rev = self.bare_git.rev_parse(R_HEADS + name)
|
||||||
|
except GitError:
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.CurrentBranch == name:
|
||||||
|
self._Checkout(
|
||||||
|
self.GetRemote(self.remote.name).ToLocal(self.revision),
|
||||||
|
quiet=True)
|
||||||
|
|
||||||
|
cmd = ['branch', '-D', name]
|
||||||
|
GitCommand(self, cmd, capture_stdout=True).Wait()
|
||||||
|
|
||||||
def PruneHeads(self):
|
def PruneHeads(self):
|
||||||
"""Prune any topic branches already merged into upstream.
|
"""Prune any topic branches already merged into upstream.
|
||||||
"""
|
"""
|
||||||
@ -794,14 +840,29 @@ class Project(object):
|
|||||||
to_rm = []
|
to_rm = []
|
||||||
for old_hook in to_rm:
|
for old_hook in to_rm:
|
||||||
os.remove(os.path.join(hooks, old_hook))
|
os.remove(os.path.join(hooks, old_hook))
|
||||||
|
self._InitHooks()
|
||||||
# TODO(sop) install custom repo hooks
|
|
||||||
|
|
||||||
m = self.manifest.manifestProject.config
|
m = self.manifest.manifestProject.config
|
||||||
for key in ['user.name', 'user.email']:
|
for key in ['user.name', 'user.email']:
|
||||||
if m.Has(key, include_defaults = False):
|
if m.Has(key, include_defaults = False):
|
||||||
self.config.SetString(key, m.GetString(key))
|
self.config.SetString(key, m.GetString(key))
|
||||||
|
|
||||||
|
def _InitHooks(self):
|
||||||
|
hooks = self._gitdir_path('hooks')
|
||||||
|
if not os.path.exists(hooks):
|
||||||
|
os.makedirs(hooks)
|
||||||
|
for stock_hook in repo_hooks():
|
||||||
|
dst = os.path.join(hooks, os.path.basename(stock_hook))
|
||||||
|
try:
|
||||||
|
os.symlink(relpath(stock_hook, dst), dst)
|
||||||
|
except OSError, e:
|
||||||
|
if e.errno == errno.EEXIST:
|
||||||
|
pass
|
||||||
|
elif e.errno == errno.EPERM:
|
||||||
|
raise GitError('filesystem must support symlinks')
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
|
||||||
def _InitRemote(self):
|
def _InitRemote(self):
|
||||||
if self.remote.fetchUrl:
|
if self.remote.fetchUrl:
|
||||||
remote = self.GetRemote(self.remote.name)
|
remote = self.GetRemote(self.remote.name)
|
||||||
@ -841,19 +902,6 @@ class Project(object):
|
|||||||
if not os.path.exists(dotgit):
|
if not os.path.exists(dotgit):
|
||||||
os.makedirs(dotgit)
|
os.makedirs(dotgit)
|
||||||
|
|
||||||
topdir = os.path.commonprefix([self.gitdir, dotgit])
|
|
||||||
if topdir.endswith('/'):
|
|
||||||
topdir = topdir[:-1]
|
|
||||||
else:
|
|
||||||
topdir = os.path.dirname(topdir)
|
|
||||||
|
|
||||||
tmpdir = dotgit
|
|
||||||
relgit = ''
|
|
||||||
while topdir != tmpdir:
|
|
||||||
relgit += '../'
|
|
||||||
tmpdir = os.path.dirname(tmpdir)
|
|
||||||
relgit += self.gitdir[len(topdir) + 1:]
|
|
||||||
|
|
||||||
for name in ['config',
|
for name in ['config',
|
||||||
'description',
|
'description',
|
||||||
'hooks',
|
'hooks',
|
||||||
@ -864,8 +912,15 @@ class Project(object):
|
|||||||
'refs',
|
'refs',
|
||||||
'rr-cache',
|
'rr-cache',
|
||||||
'svn']:
|
'svn']:
|
||||||
os.symlink(os.path.join(relgit, name),
|
try:
|
||||||
os.path.join(dotgit, name))
|
src = os.path.join(self.gitdir, name)
|
||||||
|
dst = os.path.join(dotgit, name)
|
||||||
|
os.symlink(relpath(src, dst), dst)
|
||||||
|
except OSError, e:
|
||||||
|
if e.errno == errno.EPERM:
|
||||||
|
raise GitError('filesystem must support symlinks')
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
|
||||||
rev = self.GetRemote(self.remote.name).ToLocal(self.revision)
|
rev = self.GetRemote(self.remote.name).ToLocal(self.revision)
|
||||||
rev = self.bare_git.rev_parse('%s^0' % rev)
|
rev = self.bare_git.rev_parse('%s^0' % rev)
|
||||||
|
42
subcmds/abandon.py
Normal file
42
subcmds/abandon.py
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2008 The Android Open Source Project
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from command import Command
|
||||||
|
from git_command import git
|
||||||
|
|
||||||
|
class Abandon(Command):
|
||||||
|
common = True
|
||||||
|
helpSummary = "Permanently abandon a development branch"
|
||||||
|
helpUsage = """
|
||||||
|
%prog <branchname> [<project>...]
|
||||||
|
|
||||||
|
This subcommand permanently abandons a development branch by
|
||||||
|
deleting it (and all its history) from your local repository.
|
||||||
|
|
||||||
|
It is equivalent to "git branch -D <branchname>".
|
||||||
|
"""
|
||||||
|
|
||||||
|
def Execute(self, opt, args):
|
||||||
|
if not args:
|
||||||
|
self.Usage()
|
||||||
|
|
||||||
|
nb = args[0]
|
||||||
|
if not git.check_ref_format('heads/%s' % nb):
|
||||||
|
print >>sys.stderr, "error: '%s' is not a valid name" % nb
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
for project in self.GetProjects(args[1:]):
|
||||||
|
project.AbandonBranch(nb)
|
@ -49,6 +49,9 @@ the manifest.
|
|||||||
p.add_option('--no-repo-verify',
|
p.add_option('--no-repo-verify',
|
||||||
dest='no_repo_verify', action='store_true',
|
dest='no_repo_verify', action='store_true',
|
||||||
help='do not verify repo source code')
|
help='do not verify repo source code')
|
||||||
|
p.add_option('--repo-upgraded',
|
||||||
|
dest='repo_upgraded', action='store_true',
|
||||||
|
help='perform additional actions after a repo upgrade')
|
||||||
|
|
||||||
def _Fetch(self, *projects):
|
def _Fetch(self, *projects):
|
||||||
fetched = set()
|
fetched = set()
|
||||||
@ -67,6 +70,11 @@ the manifest.
|
|||||||
mp = self.manifest.manifestProject
|
mp = self.manifest.manifestProject
|
||||||
mp.PreSync()
|
mp.PreSync()
|
||||||
|
|
||||||
|
if opt.repo_upgraded:
|
||||||
|
for project in self.manifest.projects.values():
|
||||||
|
if project.Exists:
|
||||||
|
project.PostRepoUpgrade()
|
||||||
|
|
||||||
all = self.GetProjects(args, missing_ok=True)
|
all = self.GetProjects(args, missing_ok=True)
|
||||||
fetched = self._Fetch(rp, mp, *all)
|
fetched = self._Fetch(rp, mp, *all)
|
||||||
|
|
||||||
@ -77,7 +85,7 @@ the manifest.
|
|||||||
if not rp.Sync_LocalHalf():
|
if not rp.Sync_LocalHalf():
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
print >>sys.stderr, 'info: Restarting repo with latest version'
|
print >>sys.stderr, 'info: Restarting repo with latest version'
|
||||||
raise RepoChangedException()
|
raise RepoChangedException(['--repo-upgraded'])
|
||||||
else:
|
else:
|
||||||
print >>sys.stderr, 'warning: Skipped upgrade to unverified version'
|
print >>sys.stderr, 'warning: Skipped upgrade to unverified version'
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user