提交 694a88a3 编写于 作者: J Junio C Hamano

Merge branch 'jn/scripts-updates'

* jn/scripts-updates:
  remove #!interpreter line from shell libraries
  test: replace shebangs with descriptions in shell libraries
  test: make FILEMODE a lazy prereq
  contrib: remove git-p4import
  mark contributed hooks executable
  mark perl test scripts executable
  mark Windows build scripts executable
文件模式从 100644 更改为 100755
文件模式从 100644 更改为 100755
文件模式从 100644 更改为 100755
文件模式从 100644 更改为 100755
文件模式从 100644 更改为 100755
#!bash
#
# bash/zsh completion support for core Git.
#
# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
......
#!tcsh
#
# tcsh completion support for core Git.
#
# Copyright (C) 2012 Marc Khouzam <marc.khouzam@gmail.com>
......
......@@ -22,7 +22,6 @@
# For example, on debian the hook is stored in
# /usr/share/git-core/contrib/hooks/post-receive-email:
#
# chmod a+x post-receive-email
# cd /path/to/your/repository.git
# ln -sf /usr/share/git-core/contrib/hooks/post-receive-email hooks/post-receive
#
......
......@@ -13,7 +13,6 @@
# For example, if the hook is stored in
# /usr/share/git-core/contrib/hooks/pre-auto-gc-battery:
#
# chmod a+x pre-auto-gc-battery
# cd /path/to/your/repository.git
# ln -sf /usr/share/git-core/contrib/hooks/pre-auto-gc-battery \
# hooks/pre-auto-gc
......
文件模式从 100644 更改为 100755
文件模式从 100644 更改为 100755
Please see contrib/fast-import/git-p4 for a better Perforce importer.
#!/usr/bin/env python
#
# This tool is copyright (c) 2006, Sean Estabrooks.
# It is released under the Gnu Public License, version 2.
#
# Import Perforce branches into Git repositories.
# Checking out the files is done by calling the standard p4
# client which you must have properly configured yourself
#
import marshal
import os
import sys
import time
import getopt
if sys.hexversion < 0x02020000:
# The behavior of the marshal module changed significantly in 2.2
sys.stderr.write("git-p4import.py: requires Python 2.2 or later.\n")
sys.exit(1)
from signal import signal, \
SIGPIPE, SIGINT, SIG_DFL, \
default_int_handler
signal(SIGPIPE, SIG_DFL)
s = signal(SIGINT, SIG_DFL)
if s != default_int_handler:
signal(SIGINT, s)
def die(msg, *args):
for a in args:
msg = "%s %s" % (msg, a)
print "git-p4import fatal error:", msg
sys.exit(1)
def usage():
print "USAGE: git-p4import [-q|-v] [--authors=<file>] [-t <timezone>] [//p4repo/path <branch>]"
sys.exit(1)
verbosity = 1
logfile = "/dev/null"
ignore_warnings = False
stitch = 0
tagall = True
def report(level, msg, *args):
global verbosity
global logfile
for a in args:
msg = "%s %s" % (msg, a)
fd = open(logfile, "a")
fd.writelines(msg)
fd.close()
if level <= verbosity:
print msg
class p4_command:
def __init__(self, _repopath):
try:
global logfile
self.userlist = {}
if _repopath[-1] == '/':
self.repopath = _repopath[:-1]
else:
self.repopath = _repopath
if self.repopath[-4:] != "/...":
self.repopath= "%s/..." % self.repopath
f=os.popen('p4 -V 2>>%s'%logfile, 'rb')
a = f.readlines()
if f.close():
raise
except:
die("Could not find the \"p4\" command")
def p4(self, cmd, *args):
global logfile
cmd = "%s %s" % (cmd, ' '.join(args))
report(2, "P4:", cmd)
f=os.popen('p4 -G %s 2>>%s' % (cmd,logfile), 'rb')
list = []
while 1:
try:
list.append(marshal.load(f))
except EOFError:
break
self.ret = f.close()
return list
def sync(self, id, force=False, trick=False, test=False):
if force:
ret = self.p4("sync -f %s@%s"%(self.repopath, id))[0]
elif trick:
ret = self.p4("sync -k %s@%s"%(self.repopath, id))[0]
elif test:
ret = self.p4("sync -n %s@%s"%(self.repopath, id))[0]
else:
ret = self.p4("sync %s@%s"%(self.repopath, id))[0]
if ret['code'] == "error":
data = ret['data'].upper()
if data.find('VIEW') > 0:
die("Perforce reports %s is not in client view"% self.repopath)
elif data.find('UP-TO-DATE') < 0:
die("Could not sync files from perforce", self.repopath)
def changes(self, since=0):
try:
list = []
for rec in self.p4("changes %s@%s,#head" % (self.repopath, since+1)):
list.append(rec['change'])
list.reverse()
return list
except:
return []
def authors(self, filename):
f=open(filename)
for l in f.readlines():
self.userlist[l[:l.find('=')].rstrip()] = \
(l[l.find('=')+1:l.find('<')].rstrip(),l[l.find('<')+1:l.find('>')])
f.close()
for f,e in self.userlist.items():
report(2, f, ":", e[0], " <", e[1], ">")
def _get_user(self, id):
if not self.userlist.has_key(id):
try:
user = self.p4("users", id)[0]
self.userlist[id] = (user['FullName'], user['Email'])
except:
self.userlist[id] = (id, "")
return self.userlist[id]
def _format_date(self, ticks):
symbol='+'
name = time.tzname[0]
offset = time.timezone
if ticks[8]:
name = time.tzname[1]
offset = time.altzone
if offset < 0:
offset *= -1
symbol = '-'
localo = "%s%02d%02d %s" % (symbol, offset / 3600, offset % 3600, name)
tickso = time.strftime("%a %b %d %H:%M:%S %Y", ticks)
return "%s %s" % (tickso, localo)
def where(self):
try:
return self.p4("where %s" % self.repopath)[-1]['path']
except:
return ""
def describe(self, num):
desc = self.p4("describe -s", num)[0]
self.msg = desc['desc']
self.author, self.email = self._get_user(desc['user'])
self.date = self._format_date(time.localtime(long(desc['time'])))
return self
class git_command:
def __init__(self):
try:
self.version = self.git("--version")[0][12:].rstrip()
except:
die("Could not find the \"git\" command")
try:
self.gitdir = self.get_single("rev-parse --git-dir")
report(2, "gdir:", self.gitdir)
except:
die("Not a git repository... did you forget to \"git init\" ?")
try:
self.cdup = self.get_single("rev-parse --show-cdup")
if self.cdup != "":
os.chdir(self.cdup)
self.topdir = os.getcwd()
report(2, "topdir:", self.topdir)
except:
die("Could not find top git directory")
def git(self, cmd):
global logfile
report(2, "GIT:", cmd)
f=os.popen('git %s 2>>%s' % (cmd,logfile), 'rb')
r=f.readlines()
self.ret = f.close()
return r
def get_single(self, cmd):
return self.git(cmd)[0].rstrip()
def current_branch(self):
try:
testit = self.git("rev-parse --verify HEAD")[0]
return self.git("symbolic-ref HEAD")[0][11:].rstrip()
except:
return None
def get_config(self, variable):
try:
return self.git("config --get %s" % variable)[0].rstrip()
except:
return None
def set_config(self, variable, value):
try:
self.git("config %s %s"%(variable, value) )
except:
die("Could not set %s to " % variable, value)
def make_tag(self, name, head):
self.git("tag -f %s %s"%(name,head))
def top_change(self, branch):
try:
a=self.get_single("name-rev --tags refs/heads/%s" % branch)
loc = a.find(' tags/') + 6
if a[loc:loc+3] != "p4/":
raise
return int(a[loc+3:][:-2])
except:
return 0
def update_index(self):
self.git("ls-files -m -d -o -z | git update-index --add --remove -z --stdin")
def checkout(self, branch):
self.git("checkout %s" % branch)
def repoint_head(self, branch):
self.git("symbolic-ref HEAD refs/heads/%s" % branch)
def remove_files(self):
self.git("ls-files | xargs rm")
def clean_directories(self):
self.git("clean -d")
def fresh_branch(self, branch):
report(1, "Creating new branch", branch)
self.git("ls-files | xargs rm")
os.remove(".git/index")
self.repoint_head(branch)
self.git("clean -d")
def basedir(self):
return self.topdir
def commit(self, author, email, date, msg, id):
self.update_index()
fd=open(".msg", "w")
fd.writelines(msg)
fd.close()
try:
current = self.get_single("rev-parse --verify HEAD")
head = "-p HEAD"
except:
current = ""
head = ""
tree = self.get_single("write-tree")
for r,l in [('DATE',date),('NAME',author),('EMAIL',email)]:
os.environ['GIT_AUTHOR_%s'%r] = l
os.environ['GIT_COMMITTER_%s'%r] = l
commit = self.get_single("commit-tree %s %s < .msg" % (tree,head))
os.remove(".msg")
self.make_tag("p4/%s"%id, commit)
self.git("update-ref HEAD %s %s" % (commit, current) )
try:
opts, args = getopt.getopt(sys.argv[1:], "qhvt:",
["authors=","help","stitch=","timezone=","log=","ignore","notags"])
except getopt.GetoptError:
usage()
for o, a in opts:
if o == "-q":
verbosity = 0
if o == "-v":
verbosity += 1
if o in ("--log"):
logfile = a
if o in ("--notags"):
tagall = False
if o in ("-h", "--help"):
usage()
if o in ("--ignore"):
ignore_warnings = True
git = git_command()
branch=git.current_branch()
for o, a in opts:
if o in ("-t", "--timezone"):
git.set_config("perforce.timezone", a)
if o in ("--stitch"):
git.set_config("perforce.%s.path" % branch, a)
stitch = 1
if len(args) == 2:
branch = args[1]
git.checkout(branch)
if branch == git.current_branch():
die("Branch %s already exists!" % branch)
report(1, "Setting perforce to ", args[0])
git.set_config("perforce.%s.path" % branch, args[0])
elif len(args) != 0:
die("You must specify the perforce //depot/path and git branch")
p4path = git.get_config("perforce.%s.path" % branch)
if p4path == None:
die("Do not know Perforce //depot/path for git branch", branch)
p4 = p4_command(p4path)
for o, a in opts:
if o in ("-a", "--authors"):
p4.authors(a)
localdir = git.basedir()
if p4.where()[:len(localdir)] != localdir:
report(1, "**WARNING** Appears p4 client is misconfigured")
report(1, " for sync from %s to %s" % (p4.repopath, localdir))
if ignore_warnings != True:
die("Reconfigure or use \"--ignore\" on command line")
if stitch == 0:
top = git.top_change(branch)
else:
top = 0
changes = p4.changes(top)
count = len(changes)
if count == 0:
report(1, "Already up to date...")
sys.exit(0)
ptz = git.get_config("perforce.timezone")
if ptz:
report(1, "Setting timezone to", ptz)
os.environ['TZ'] = ptz
time.tzset()
if stitch == 1:
git.remove_files()
git.clean_directories()
p4.sync(changes[0], force=True)
elif top == 0 and branch != git.current_branch():
p4.sync(changes[0], test=True)
report(1, "Creating new initial commit");
git.fresh_branch(branch)
p4.sync(changes[0], force=True)
else:
p4.sync(changes[0], trick=True)
report(1, "processing %s changes from p4 (%s) to git (%s)" % (count, p4.repopath, branch))
for id in changes:
report(1, "Importing changeset", id)
change = p4.describe(id)
p4.sync(id)
if tagall :
git.commit(change.author, change.email, change.date, change.msg, id)
else:
git.commit(change.author, change.email, change.date, change.msg, "import")
if stitch == 1:
git.clean_directories()
stitch = 0
git-p4import(1)
===============
NAME
----
git-p4import - Import a Perforce repository into git
SYNOPSIS
--------
[verse]
`git-p4import` [-q|-v] [--notags] [--authors <file>] [-t <timezone>]
<//p4repo/path> <branch>
`git-p4import` --stitch <//p4repo/path>
`git-p4import`
DESCRIPTION
-----------
Import a Perforce repository into an existing git repository. When
a <//p4repo/path> and <branch> are specified a new branch with the
given name will be created and the initial import will begin.
Once the initial import is complete you can do an incremental import
of new commits from the Perforce repository. You do this by checking
out the appropriate git branch and then running `git-p4import` without
any options.
The standard p4 client is used to communicate with the Perforce
repository; it must be configured correctly in order for `git-p4import`
to operate (see below).
OPTIONS
-------
-q::
Do not display any progress information.
-v::
Give extra progress information.
\--authors::
Specify an authors file containing a mapping of Perforce user
ids to full names and email addresses (see Notes below).
\--notags::
Do not create a tag for each imported commit.
\--stitch::
Import the contents of the given perforce branch into the
currently checked out git branch.
\--log::
Store debugging information in the specified file.
-t::
Specify that the remote repository is in the specified timezone.
Timezone must be in the format "US/Pacific" or "Europe/London"
etc. You only need to specify this once, it will be saved in
the git config file for the repository.
<//p4repo/path>::
The Perforce path that will be imported into the specified branch.
<branch>::
The new branch that will be created to hold the Perforce imports.
P4 Client
---------
You must make the `p4` client command available in your $PATH and
configure it to communicate with the target Perforce repository.
Typically this means you must set the "$P4PORT" and "$P4CLIENT"
environment variables.
You must also configure a `p4` client "view" which maps the Perforce
branch into the top level of your git repository, for example:
------------
Client: myhost
Root: /home/sean/import
Options: noallwrite clobber nocompress unlocked modtime rmdir
View:
//public/jam/... //myhost/jam/...
------------
With the above `p4` client setup, you could import the "jam"
perforce branch into a branch named "jammy", like so:
------------
$ mkdir -p /home/sean/import/jam
$ cd /home/sean/import/jam
$ git init
$ git p4import //public/jam jammy
------------
Multiple Branches
-----------------
Note that by creating multiple "views" you can use `git-p4import`
to import additional branches into the same git repository.
However, the `p4` client has a limitation in that it silently
ignores all but the last "view" that maps into the same local
directory. So the following will *not* work:
------------
View:
//public/jam/... //myhost/jam/...
//public/other/... //myhost/jam/...
//public/guest/... //myhost/jam/...
------------
If you want more than one Perforce branch to be imported into the
same directory you must employ a workaround. A simple option is
to adjust your `p4` client before each import to only include a
single view.
Another option is to create multiple symlinks locally which all
point to the same directory in your git repository and then use
one per "view" instead of listing the actual directory.
Tags
----
A git tag of the form p4/xx is created for every change imported from
the Perforce repository where xx is the Perforce changeset number.
Therefore after the import you can use git to access any commit by its
Perforce number, e.g. git show p4/327.
The tag associated with the HEAD commit is also how `git-p4import`
determines if there are new changes to incrementally import from the
Perforce repository.
If you import from a repository with many thousands of changes
you will have an equal number of p4/xxxx git tags. Git tags can
be expensive in terms of disk space and repository operations.
If you don't need to perform further incremental imports, you
may delete the tags.
Notes
-----
You can interrupt the import (e.g. ctrl-c) at any time and restart it
without worry.
Author information is automatically determined by querying the
Perforce "users" table using the id associated with each change.
However, if you want to manually supply these mappings you can do
so with the "--authors" option. It accepts a file containing a list
of mappings with each line containing one mapping in the format:
------------
perforce_id = Full Name <email@address.com>
------------
Author
------
Written by Sean Estabrooks <seanlkml@sympatico.ca>
GIT
---
Part of the gitlink:git[7] suite
#!/bin/sh
# git-mergetool--lib is a library for common merge tool functions
# git-mergetool--lib is a shell library for common merge tool functions
: ${MERGE_TOOLS_DIR=$(git --exec-path)/mergetools}
......
#!/bin/sh
# This is a shell library to calculate the remote repository and
# upstream branch that should be pulled by "git pull" from the current
# branch.
# git-ls-remote could be called from outside a git managed repository;
# this would fail in that case and would issue an error message.
......
#!/bin/sh
# This shell script fragment is sourced by git-rebase to implement
# its default, fast, patch-based, non-interactive mode.
#
# Copyright (c) 2010 Junio C Hamano.
#
......
#!/bin/sh
# This shell script fragment is sourced by git-rebase to implement
# its interactive mode. "git rebase --interactive" makes it easy
# to fix up commits in the middle of a series and rearrange commits.
#
# Copyright (c) 2006 Johannes E. Schindelin
# SHORT DESCRIPTION
#
# This script makes it easy to fix up commits in the middle of a series,
# and rearrange commits.
#
# The original idea comes from Eric W. Biederman, in
# http://article.gmane.org/gmane.comp.version-control.git/22407
......
#!/bin/sh
# This shell script fragment is sourced by git-rebase to implement
# its merge-based non-interactive mode that copes well with renamed
# files.
#
# Copyright (c) 2010 Junio C Hamano.
#
......
#!/bin/sh
# This shell library is Git's interface to gettext.sh. See po/README
# for usage instructions.
#
# Copyright (c) 2010 Ævar Arnfjörð Bjarmason
#
# This is Git's interface to gettext.sh. See po/README for usage
# instructions.
# Export the TEXTDOMAIN* data that we need for Git
TEXTDOMAIN=git
......
#!/bin/sh
#
# This is included in commands that either have to be run from the toplevel
# of the repository, or with GIT_DIR environment variable properly.
# If the GIT_DIR does not look like the right correct git-repository,
# it dies.
# This shell scriplet is meant to be included by other shell scripts
# to set up some variables pointing at the normal git directories and
# a few helper shell functions.
# Having this variable in your environment would break scripts because
# you would cause "cd" to be taken to unexpected places. If you
......
文件模式从 100644 更改为 100755
文件模式从 100644 更改为 100755
文件模式从 100644 更改为 100755
文件模式从 100644 更改为 100755
文件模式从 100644 更改为 100755
文件模式从 100644 更改为 100755
文件模式从 100644 更改为 100755
#!/bin/sh
# Initialization and helpers for Gitweb tests, which source this
# shell library instead of test-lib.sh.
#
# Copyright (c) 2007 Jakub Narebski
#
......
#!/bin/sh
#
# Ensures that tests are run under Bash; primarily intended for running tests
# of the completion script.
# Shell library sourced instead of ./test-lib.sh by tests that need
# to run under Bash; primarily intended for tests of the completion
# script.
if test -n "$BASH" && test -z "$POSIXLY_CORRECT"; then
# we are in full-on bash mode
......
#!/bin/sh
# Shell library sourced instead of ./test-lib.sh by cvsimport tests.
. ./test-lib.sh
......
#!/bin/sh
# Helpers shared by the test scripts for diff algorithms (patience,
# histogram, etc).
test_diff_frobnitz() {
cat >file1 <<\EOF
......
#!/bin/sh
# Initialization and Icelandic locale for basic git i18n tests,
# which source this scriptlet instead of ./test-lib.sh.
#
# Copyright (c) 2010 Ævar Arnfjörð Bjarmason
#
......
#!/bin/sh
# Shell library to run git-daemon in tests. Ends the test early if
# GIT_TEST_GIT_DAEMON is not set.
#
# Usage:
#
# . ./test-lib.sh
# . "$TEST_DIRECTORY"/lib-git-daemon.sh
# start_git_daemon
#
# test_expect_success '...' '
# ...
# '
#
# test_expect_success ...
#
# stop_git_daemon
# test_done
if test -z "$GIT_TEST_GIT_DAEMON"
then
......
#!/bin/sh
# Shell library to run an HTTP server for use in tests.
# Ends the test early if httpd tests should not be run,
# for example because the user has not enabled them.
#
# Usage:
#
# . ./test-lib.sh
# . "$TEST_DIRECTORY"/lib-httpd.sh
# start_httpd
#
# test_expect_success '...' '
# ...
# '
#
# test_expect_success ...
#
# stop_httpd
# test_done
#
# Can be configured using the following variables.
#
# GIT_TEST_HTTPD enable HTTPD tests
# LIB_HTTPD_PATH web server path
# LIB_HTTPD_MODULE_PATH web server modules path
# LIB_HTTPD_PORT listening port
# LIB_HTTPD_DAV enable DAV
# LIB_HTTPD_SVN enable SVN
# LIB_HTTPD_SSL enable SSL
#
# Copyright (c) 2008 Clemens Buchacher <drizzd@aon.at>
#
......
#!/bin/sh
#
# Support routines for hand-crafting weird or malicious packs.
#
# You can make a complete pack like:
......
#!/bin/sh
# Helpers for tests of git's choice of pager.
test_expect_success 'determine default pager' '
test_might_fail git config --unset core.pager &&
......
#!/bin/sh
#
# Copyright (c) 2010 Ævar Arnfjörð Bjarmason
#
if test "$(git config --bool core.filemode)" = false
then
say 'filemode disabled on the filesystem'
else
test_set_prereq FILEMODE
fi
#!/bin/sh
#
# Helper functions to check if read-tree would succeed/fail as expected with
# and without the dry-run option. They also test that the dry-run does not
# write the index and that together with -u it doesn't touch the work tree.
......
#!/bin/sh
# Helper functions used by interactive rebase tests.
# After setting the fake editor with this function, you can
#
......
#!/bin/sh
# Helpers for terminal output tests.
test_expect_success PERL 'set up terminal for tests' '
# Reading from the pty master seems to get stuck _sometimes_
......
#!/bin/sh
# Performance testing framework. Each perf script starts much like
# a normal test script, except it sources this library instead of
# test-lib.sh. See t/perf/README for documentation.
#
# Copyright (c) 2011 Thomas Rast
#
......
文件模式从 100644 更改为 100755
......@@ -2,7 +2,6 @@
test_description='add -i basic tests'
. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh
if ! test_have_prereq PERL
then
......
......@@ -7,7 +7,6 @@ test_description='git apply handling copy/rename patch.
'
. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh
# setup
......
......@@ -6,7 +6,6 @@
test_description='git apply -p handling.'
. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh
test_expect_success setup '
mkdir sub &&
......
......@@ -3,7 +3,6 @@
test_description='applying patch with mode bits'
. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh
test_expect_success setup '
echo original >file &&
......
......@@ -2,7 +2,6 @@
test_description='merge-recursive: handle file mode'
. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh
test_expect_success 'mode change in one branch: keep changed version' '
: >file1 &&
......
文件模式从 100644 更改为 100755
文件模式从 100644 更改为 100755
......@@ -5,7 +5,6 @@
test_description='Test export of commits to CVS'
. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh
if ! test_have_prereq PERL; then
skip_all='skipping git cvsexportcommit tests, perl not available'
......
#!/bin/sh
# Library of functions shared by all tests scripts, included by
# test-lib.sh.
#
# Copyright (c) 2005 Junio C Hamano
#
......
#!/bin/sh
# Test framework for git. See t/README for usage.
#
# Copyright (c) 2005 Junio C Hamano
#
......@@ -577,11 +577,9 @@ then
make_valgrind_symlink () {
# handle only executables, unless they are shell libraries that
# need to be in the exec-path. We will just use "#!" as a
# guess for a shell-script, since we have no idea what the user
# may have configured as the shell path.
# need to be in the exec-path.
test -x "$1" ||
test "#!" = "$(head -c 2 <"$1")" ||
test "# " = "$(head -c 2 <"$1")" ||
return;
base=$(basename "$1")
......@@ -834,6 +832,10 @@ test_lazy_prereq SYMLINKS '
ln -s x y && test -h y
'
test_lazy_prereq FILEMODE '
test "$(git config --bool core.filemode)" = true
'
test_lazy_prereq CASE_INSENSITIVE_FS '
echo good >CamelCase &&
echo bad >camelcase &&
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册