GIT 0.99.9i aka 1.0rc2

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano
2005-11-14 18:39:18 -08:00
28 changed files with 269 additions and 241 deletions

3
.gitignore vendored
View File

@ -42,7 +42,7 @@ git-index-pack
git-init-db git-init-db
git-local-fetch git-local-fetch
git-log git-log
git-lost+found git-lost-found
git-ls-files git-ls-files
git-ls-remote git-ls-remote
git-ls-tree git-ls-tree
@ -74,7 +74,6 @@ git-read-tree
git-rebase git-rebase
git-receive-pack git-receive-pack
git-relink git-relink
git-rename
git-repack git-repack
git-request-pull git-request-pull
git-reset git-reset

View File

@ -3,11 +3,11 @@ git-branch(1)
NAME NAME
---- ----
git-branch - Create a new branch. git-branch - Create a new branch, or remove an old one.
SYNOPSIS SYNOPSIS
-------- --------
'git-branch' [<branchname> [start-point]] 'git-branch' [-d | -D] [<branchname> [start-point]]
DESCRIPTION DESCRIPTION
----------- -----------
@ -19,11 +19,18 @@ created, otherwise it will be created at the current HEAD.
OPTIONS OPTIONS
------- -------
-d::
Delete a branch. The branch must be fully merged.
-D::
Delete a branch irrespective of its index status.
<branchname>:: <branchname>::
The name of the branch to create. The name of the branch to create or delete.
start-point:: start-point::
Where to create the branch; defaults to HEAD. Where to create the branch; defaults to HEAD. This
option has no meaning with -d and -D.
Author Author
------ ------

View File

@ -18,21 +18,21 @@ Will copy all files listed from the index to the working directory
OPTIONS OPTIONS
------- -------
-u:: -u|--index::
update stat information for the checked out entries in update stat information for the checked out entries in
the index file. the index file.
-q:: -q|--quiet::
be quiet if files exist or are not in the index be quiet if files exist or are not in the index
-f:: -f|--force::
forces overwrite of existing files forces overwrite of existing files
-a:: -a|--all::
checks out all files in the index. Cannot be used checks out all files in the index. Cannot be used
together with explicit filenames. together with explicit filenames.
-n:: -n|--no-create::
Don't checkout new files, only refresh files already checked Don't checkout new files, only refresh files already checked
out. out.

View File

@ -8,7 +8,7 @@ git-commit-tree - Creates a new commit object
SYNOPSIS SYNOPSIS
-------- --------
'git-commit-tree' <tree> [-p <parent commit>]\ < changelog 'git-commit-tree' <tree> [-p <parent commit>]\* < changelog
DESCRIPTION DESCRIPTION
----------- -----------

View File

@ -1,13 +1,13 @@
git-lost+found(1) git-lost-found(1)
================= =================
NAME NAME
---- ----
git-lost+found - Recover lost refs that luckily have not yet been pruned. git-lost-found - Recover lost refs that luckily have not yet been pruned.
SYNOPSIS SYNOPSIS
-------- --------
'git-lost+found' 'git-lost-found'
DESCRIPTION DESCRIPTION
----------- -----------
@ -31,7 +31,7 @@ The ref to your tag is overwritten, but until you run 'git
prune', it is still there. prune', it is still there.
------------ ------------
$ git lost+found $ git lost-found
[1ef2b196d909eed523d4f3c9bf54b78cdd6843c6] GIT 0.99.9c [1ef2b196d909eed523d4f3c9bf54b78cdd6843c6] GIT 0.99.9c
... ...
------------ ------------

View File

@ -23,6 +23,12 @@ compression applied, stored in a single file, with an associated index file.
Packs are used to reduce the load on mirror systems, backup engines, disk storage, etc. Packs are used to reduce the load on mirror systems, backup engines, disk storage, etc.
OPTIONS
-------
-n::
Don't actually remove any objects, only show those that would have been
removed.
Author Author
------ ------
Written by Linus Torvalds <torvalds@osdl.org> Written by Linus Torvalds <torvalds@osdl.org>

View File

@ -30,6 +30,10 @@ OPTIONS
-m:: -m::
Perform a merge, not just a read. Perform a merge, not just a read.
--reset::
Same as -m except that unmerged entries will be silently ignored.
-u:: -u::
After a successful merge, update the files in the work After a successful merge, update the files in the work
tree with the result of the merge. tree with the result of the merge.

View File

@ -1,32 +0,0 @@
git-rename(1)
=============
NAME
----
git-rename - Script used to rename a file, directory or symlink.
SYNOPSIS
--------
'git-rename' <source> <destination>
DESCRIPTION
-----------
This script is used to rename a file, directory or symlink.
The index is updated after successful completion, but the change must still be
committed.
Author
------
Written by Linus Torvalds <torvalds@osdl.org>
Rewritten by Ryan Anderson <ryan@michonline.com>
Documentation
--------------
Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel.org>.
GIT
---
Part of the gitlink:git[7] suite

View File

@ -8,7 +8,7 @@ git-unpack-objects - Unpack objects from a packed archive.
SYNOPSIS SYNOPSIS
-------- --------
'git-unpack-objects' [-q] <pack-file 'git-unpack-objects' [-n] [-q] <pack-file
DESCRIPTION DESCRIPTION
@ -19,6 +19,10 @@ one-object" format in $GIT_OBJECT_DIRECTORY.
OPTIONS OPTIONS
------- -------
-n::
Only list the objects that would be unpacked, don't actually unpack
them.
-q:: -q::
The command usually shows percentage progress. This The command usually shows percentage progress. This
flag suppresses it. flag suppresses it.

View File

@ -60,7 +60,7 @@ OPTIONS
Directly insert the specified info into the index. Directly insert the specified info into the index.
--index-info:: --index-info::
Read index info from stdin. Read index information from stdin.
--chmod=(+|-)x:: --chmod=(+|-)x::
Set the execute permissions on the updated files. Set the execute permissions on the updated files.

View File

@ -262,9 +262,6 @@ gitlink:git-push[1]::
gitlink:git-rebase[1]:: gitlink:git-rebase[1]::
Rebase local commits to new upstream head. Rebase local commits to new upstream head.
gitlink:git-rename[1]::
Rename files and directories.
gitlink:git-repack[1]:: gitlink:git-repack[1]::
Pack unpacked objects in a repository. Pack unpacked objects in a repository.
@ -309,7 +306,7 @@ gitlink:git-convert-objects[1]::
gitlink:git-cvsimport[1]:: gitlink:git-cvsimport[1]::
Salvage your data out of another SCM people love to hate. Salvage your data out of another SCM people love to hate.
gitlink:git-lost+found[1]:: gitlink:git-lost-found[1]::
Recover lost refs that luckily have not yet been pruned. Recover lost refs that luckily have not yet been pruned.
gitlink:git-merge-one-file[1]:: gitlink:git-merge-one-file[1]::

View File

@ -50,12 +50,14 @@
# Define USE_STDEV below if you want git to care about the underlying device # Define USE_STDEV below if you want git to care about the underlying device
# change being considered an inode change from the update-cache perspective. # change being considered an inode change from the update-cache perspective.
GIT_VERSION = 0.99.9h GIT_VERSION = 0.99.9i
# CFLAGS is for the users to override from the command line. # CFLAGS and LDFLAGS are for the users to override from the command line.
CFLAGS = -g -O2 -Wall CFLAGS = -g -O2 -Wall
LDFLAGS =
ALL_CFLAGS = $(CFLAGS) ALL_CFLAGS = $(CFLAGS)
ALL_LDFLAGS = $(LDFLAGS)
prefix = $(HOME) prefix = $(HOME)
bindir = $(prefix)/bin bindir = $(prefix)/bin
@ -90,11 +92,11 @@ SCRIPT_SH = \
git-applymbox.sh git-applypatch.sh git-am.sh \ git-applymbox.sh git-applypatch.sh git-am.sh \
git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \ git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \
git-merge-resolve.sh git-merge-ours.sh git-grep.sh \ git-merge-resolve.sh git-merge-ours.sh git-grep.sh \
git-lost+found.sh git-lost-found.sh
SCRIPT_PERL = \ SCRIPT_PERL = \
git-archimport.perl git-cvsimport.perl git-relink.perl \ git-archimport.perl git-cvsimport.perl git-relink.perl \
git-rename.perl git-shortlog.perl git-fmt-merge-msg.perl \ git-shortlog.perl git-fmt-merge-msg.perl \
git-svnimport.perl git-mv.perl git-cvsexportcommit.perl git-svnimport.perl git-mv.perl git-cvsexportcommit.perl
SCRIPT_PYTHON = \ SCRIPT_PYTHON = \
@ -187,9 +189,11 @@ ifeq ($(uname_S),Darwin)
NEEDS_SSL_WITH_CRYPTO = YesPlease NEEDS_SSL_WITH_CRYPTO = YesPlease
NEEDS_LIBICONV = YesPlease NEEDS_LIBICONV = YesPlease
## fink ## fink
ALL_CFLAGS += -I/sw/include -L/sw/lib ALL_CFLAGS += -I/sw/include
ALL_LDFLAGS += -L/sw/lib
## darwinports ## darwinports
ALL_CFLAGS += -I/opt/local/include -L/opt/local/lib ALL_CFLAGS += -I/opt/local/include
ALL_LDFLAGS += -L/opt/local/lib
endif endif
ifeq ($(uname_S),SunOS) ifeq ($(uname_S),SunOS)
NEEDS_SOCKET = YesPlease NEEDS_SOCKET = YesPlease
@ -211,7 +215,13 @@ endif
ifeq ($(uname_S),OpenBSD) ifeq ($(uname_S),OpenBSD)
NO_STRCASESTR = YesPlease NO_STRCASESTR = YesPlease
NEEDS_LIBICONV = YesPlease NEEDS_LIBICONV = YesPlease
ALL_CFLAGS += -I/usr/local/include -L/usr/local/lib ALL_CFLAGS += -I/usr/local/include
ALL_LDFLAGS += -L/usr/local/lib
endif
ifeq ($(uname_S),NetBSD)
NEEDS_LIBICONV = YesPlease
ALL_CFLAGS += -I/usr/pkg/include
ALL_LDFLAGS += -L/usr/pkg/lib -Wl,-rpath,/usr/pkg/lib
endif endif
ifneq (,$(findstring arm,$(uname_M))) ifneq (,$(findstring arm,$(uname_M)))
ARM_SHA1 = YesPlease ARM_SHA1 = YesPlease
@ -221,7 +231,7 @@ endif
ifndef NO_CURL ifndef NO_CURL
ifdef CURLDIR ifdef CURLDIR
# This is still problematic -- gcc does not want -R. # This is still problematic -- gcc does not always want -R.
ALL_CFLAGS += -I$(CURLDIR)/include ALL_CFLAGS += -I$(CURLDIR)/include
CURL_LIBCURL = -L$(CURLDIR)/lib -R$(CURLDIR)/lib -lcurl CURL_LIBCURL = -L$(CURLDIR)/lib -R$(CURLDIR)/lib -lcurl
else else
@ -369,12 +379,13 @@ git-cherry-pick: git-revert
$(CC) -o $*.o -c $(ALL_CFLAGS) $< $(CC) -o $*.o -c $(ALL_CFLAGS) $<
git-%$X: %.o $(LIB_FILE) git-%$X: %.o $(LIB_FILE)
$(CC) $(ALL_CFLAGS) -o $@ $(filter %.o,$^) $(LIBS) $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
git-mailinfo$X : SIMPLE_LIB += $(LIB_4_ICONV) git-mailinfo$X : SIMPLE_LIB += $(LIB_4_ICONV)
$(SIMPLE_PROGRAMS) : $(LIB_FILE) $(SIMPLE_PROGRAMS) : $(LIB_FILE)
$(SIMPLE_PROGRAMS) : git-%$X : %.o $(SIMPLE_PROGRAMS) : git-%$X : %.o
$(CC) $(ALL_CFLAGS) -o $@ $(filter %.o,$^) $(LIB_FILE) $(SIMPLE_LIB) $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
$(LIB_FILE) $(SIMPLE_LIB)
git-http-fetch$X: fetch.o git-http-fetch$X: fetch.o
git-local-fetch$X: fetch.o git-local-fetch$X: fetch.o
@ -408,10 +419,10 @@ test: all
$(MAKE) -C t/ all $(MAKE) -C t/ all
test-date$X: test-date.c date.o ctype.o test-date$X: test-date.c date.o ctype.o
$(CC) $(ALL_CFLAGS) -o $@ test-date.c date.o ctype.o $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) test-date.c date.o ctype.o
test-delta$X: test-delta.c diff-delta.o patch-delta.o test-delta$X: test-delta.c diff-delta.o patch-delta.o
$(CC) $(ALL_CFLAGS) -o $@ $^ $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $^
check: check:
for i in *.c; do sparse $(ALL_CFLAGS) $(SPARSE_FLAGS) $$i; done for i in *.c; do sparse $(ALL_CFLAGS) $(SPARSE_FLAGS) $$i; done

View File

@ -370,7 +370,7 @@ static int gitdiff_index(const char *line, struct patch *patch)
int len; int len;
ptr = strchr(line, '.'); ptr = strchr(line, '.');
if (!ptr || ptr[1] != '.' || 40 <= ptr - line) if (!ptr || ptr[1] != '.' || 40 < ptr - line)
return 0; return 0;
len = ptr - line; len = ptr - line;
memcpy(patch->old_sha1_prefix, line, len); memcpy(patch->old_sha1_prefix, line, len);
@ -384,7 +384,7 @@ static int gitdiff_index(const char *line, struct patch *patch)
ptr = eol; ptr = eol;
len = ptr - line; len = ptr - line;
if (40 <= len) if (40 < len)
return 0; return 0;
memcpy(patch->new_sha1_prefix, line, len); memcpy(patch->new_sha1_prefix, line, len);
patch->new_sha1_prefix[len] = 0; patch->new_sha1_prefix[len] = 0;
@ -895,7 +895,8 @@ static int parse_chunk(char *buffer, unsigned long size, struct patch *patch)
static const char binhdr[] = "Binary files "; static const char binhdr[] = "Binary files ";
if (sizeof(binhdr) - 1 < size - offset - hdrsize && if (sizeof(binhdr) - 1 < size - offset - hdrsize &&
!memcmp(binhdr, buffer + hdrsize, sizeof(binhdr)-1)) !memcmp(binhdr, buffer + hdrsize + offset,
sizeof(binhdr)-1))
patch->is_binary = 1; patch->is_binary = 1;
if (patch->is_binary && !apply && !check) if (patch->is_binary && !apply && !check)

View File

@ -536,7 +536,7 @@ int count_parents(struct commit * commit)
void sort_in_topological_order(struct commit_list ** list) void sort_in_topological_order(struct commit_list ** list)
{ {
struct commit_list * next = *list; struct commit_list * next = *list;
struct commit_list * work = NULL; struct commit_list * work = NULL, **insert;
struct commit_list ** pptr = list; struct commit_list ** pptr = list;
struct sort_node * nodes; struct sort_node * nodes;
struct sort_node * next_nodes; struct sort_node * next_nodes;
@ -580,11 +580,12 @@ void sort_in_topological_order(struct commit_list ** list)
* the tips serve as a starting set for the work queue. * the tips serve as a starting set for the work queue.
*/ */
next=*list; next=*list;
insert = &work;
while (next) { while (next) {
struct sort_node * node = (struct sort_node *)next->item->object.util; struct sort_node * node = (struct sort_node *)next->item->object.util;
if (node->indegree == 0) { if (node->indegree == 0) {
commit_list_insert(next->item, &work); insert = &commit_list_insert(next->item, insert)->next;
} }
next=next->next; next=next->next;
} }

12
debian/changelog vendored
View File

@ -1,3 +1,9 @@
git-core (0.99.9i-0) unstable; urgency=low
* GIT 0.99.9i aka 1.0rc2
-- Junio C Hamano <junkio@cox.net> Mon, 14 Nov 2005 18:38:27 -0800
git-core (0.99.9h-0) unstable; urgency=low git-core (0.99.9h-0) unstable; urgency=low
* GIT 0.99.9h * GIT 0.99.9h
@ -46,6 +52,12 @@ git-core (0.99.9a-0) unstable; urgency=low
-- Junio C Hamano <junkio@cox.net> Sun, 30 Oct 2005 15:03:32 -0800 -- Junio C Hamano <junkio@cox.net> Sun, 30 Oct 2005 15:03:32 -0800
git-core (0.99.9.GIT-2) unstable; urgency=low
* Build Dependency did not include libexpat-dev.
-- Junio C Hamano <junkio@cox.net> Sun, 13 Nov 2005 01:55:34 -0800
git-core (0.99.9.GIT-1) unstable; urgency=low git-core (0.99.9.GIT-1) unstable; urgency=low
* Do not scatter txt and html documentation into feature * Do not scatter txt and html documentation into feature

4
debian/control vendored
View File

@ -2,7 +2,7 @@ Source: git-core
Section: devel Section: devel
Priority: optional Priority: optional
Maintainer: Junio C Hamano <junkio@cox.net> Maintainer: Junio C Hamano <junkio@cox.net>
Build-Depends-Indep: libz-dev, libssl-dev, libcurl3-dev|libcurl3-gnutls-dev|libcurl3-openssl-dev, asciidoc (>= 6.0.3), xmlto, debhelper (>= 4.0.0), bc Build-Depends-Indep: libz-dev, libssl-dev, libcurl3-dev|libcurl3-gnutls-dev|libcurl3-openssl-dev, asciidoc (>= 7), xmlto, debhelper (>= 4.0.0), bc, libexpat-dev
Standards-Version: 3.6.1 Standards-Version: 3.6.1
Package: git-core Package: git-core
@ -48,7 +48,7 @@ Description: The git content addressable filesystem, GNUArch interoperability
Package: git-cvs Package: git-cvs
Architecture: all Architecture: all
Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}, git-core Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}, git-core, cvsps (>= 2.1)
Suggests: cvs Suggests: cvs
Description: The git content addressable filesystem, CVS interoperability Description: The git content addressable filesystem, CVS interoperability
This package contains 'git-cvsimport', to import development history from This package contains 'git-cvsimport', to import development history from

View File

@ -102,6 +102,5 @@ rev=$(git-rev-parse --verify "$head") || exit
git-check-ref-format "heads/$branchname" || git-check-ref-format "heads/$branchname" ||
die "we do not like '$branchname' as a branch name." die "we do not like '$branchname' as a branch name."
leading=`expr "refs/heads/$branchname" : '\(.*\)/'` && git update-ref "refs/heads/$branchname" $rev
mkdir -p "$GIT_DIR/$leading" &&
echo $rev > "$GIT_DIR/refs/heads/$branchname"

View File

@ -9,7 +9,7 @@
unset CDPATH unset CDPATH
usage() { usage() {
echo >&2 "* git clone [-l [-s]] [-q] [-u <upload-pack>] [-n] <repo> <dir>" echo >&2 "* git clone [-l [-s]] [-q] [-u <upload-pack>] [-n] <repo> [<dir>]"
exit 1 exit 1
} }
@ -98,7 +98,7 @@ fi
dir="$2" dir="$2"
# Try using "humanish" part of source repo if user didn't specify one # Try using "humanish" part of source repo if user didn't specify one
[ -z "$dir" ] && dir=$(echo "$repo" | sed -e 's|/$||' -e 's|:*/*\.git$||' -e 's|.*/||g') [ -z "$dir" ] && dir=$(echo "$repo" | sed -e 's|/$||' -e 's|:*/*\.git$||' -e 's|.*/||g')
[ -e "$dir" ] && $(echo "$dir already exists."; usage) [ -e "$dir" ] && echo "$dir already exists." && usage
mkdir -p "$dir" && mkdir -p "$dir" &&
D=$( D=$(
(cd "$dir" && git-init-db && pwd) (cd "$dir" && git-init-db && pwd)

View File

@ -7,9 +7,9 @@ License: GPL
Group: Development/Tools Group: Development/Tools
URL: http://kernel.org/pub/software/scm/git/ URL: http://kernel.org/pub/software/scm/git/
Source: http://kernel.org/pub/software/scm/git/%{name}-%{version}.tar.gz Source: http://kernel.org/pub/software/scm/git/%{name}-%{version}.tar.gz
BuildRequires: zlib-devel >= 1.2, openssl-devel, curl-devel %{!?_without_docs:, xmlto, asciidoc > 6.0.3} BuildRequires: zlib-devel >= 1.2, openssl-devel, curl-devel, expat-devel %{!?_without_docs:, xmlto, asciidoc > 6.0.3}
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
Requires: zlib >= 1.2, rsync, rcs, curl, less, openssh-clients, python >= 2.3, tk >= 8.4 Requires: zlib >= 1.2, rsync, rcs, curl, less, openssh-clients, python >= 2.3, expat
%description %description
This is a stupid (but extremely fast) directory content manager. It This is a stupid (but extremely fast) directory content manager. It
@ -47,6 +47,13 @@ Requires: git-core = %{version}-%{release}
%description email %description email
Git tools for sending email. Git tools for sending email.
%package tk
Summary: Git revision tree visualiser ('gitk')
Group: Development/Tools
Requires: git-core = %{version}-%{release}, tk >= 8.4
%description tk
Git revision tree visualiser ('gitk')
%prep %prep
%setup -q %setup -q
@ -60,9 +67,9 @@ make %{_smp_mflags} DESTDIR=$RPM_BUILD_ROOT WITH_OWN_SUBPROCESS_PY=YesPlease WIT
prefix=%{_prefix} mandir=%{_mandir} \ prefix=%{_prefix} mandir=%{_mandir} \
install %{!?_without_docs: install-doc} install %{!?_without_docs: install-doc}
(find $RPM_BUILD_ROOT%{_bindir} -type f | grep -vE "arch|svn|cvs|email" | sed -e s@^$RPM_BUILD_ROOT@@) > bin-man-doc-files (find $RPM_BUILD_ROOT%{_bindir} -type f | grep -vE "arch|svn|cvs|email|gitk" | sed -e s@^$RPM_BUILD_ROOT@@) > bin-man-doc-files
%if %{!?_without_docs:1}0 %if %{!?_without_docs:1}0
(find $RPM_BUILD_ROOT%{_mandir} $RPM_BUILD_ROOT/Documentation -type f | grep -vE "arch|svn|git-cvs|email" | sed -e s@^$RPM_BUILD_ROOT@@ -e 's/$/*/' ) >> bin-man-doc-files (find $RPM_BUILD_ROOT%{_mandir} $RPM_BUILD_ROOT/Documentation -type f | grep -vE "arch|svn|git-cvs|email|gitk" | sed -e s@^$RPM_BUILD_ROOT@@ -e 's/$/*/' ) >> bin-man-doc-files
%endif %endif
%clean %clean
@ -96,6 +103,13 @@ rm -rf $RPM_BUILD_ROOT
%{!?_without_docs: %{_mandir}/man1/*email*.1*} %{!?_without_docs: %{_mandir}/man1/*email*.1*}
%{!?_without_docs: %doc Documentation/*email*.html } %{!?_without_docs: %doc Documentation/*email*.html }
%files tk
%defattr(-,root,root)
%doc Documentation/*gitk*.txt
%{_bindir}/*gitk*
%{!?_without_docs: %{_mandir}/man1/*gitk*.1*}
%{!?_without_docs: %doc Documentation/*gitk*.html }
%files -f bin-man-doc-files %files -f bin-man-doc-files
%defattr(-,root,root) %defattr(-,root,root)
%{_datadir}/git-core/ %{_datadir}/git-core/

View File

@ -1,70 +0,0 @@
#!/usr/bin/perl
#
# Copyright 2005, Ryan Anderson <ryan@michonline.com>
#
# This file is licensed under the GPL v2, or a later version
# at the discretion of Linus Torvalds.
use warnings;
use strict;
sub usage($);
# Sanity checks:
my $GIT_DIR = $ENV{'GIT_DIR'} || ".git";
unless ( -d $GIT_DIR && -d $GIT_DIR . "/objects" &&
-d $GIT_DIR . "/objects/" && -d $GIT_DIR . "/refs") {
usage("Git repository not found.");
}
usage("") if scalar @ARGV != 2;
my ($src,$dst) = @ARGV;
unless (-f $src || -l $src || -d $src) {
usage("git rename: bad source '$src'");
}
if (-e $dst) {
usage("git rename: destinations '$dst' already exists");
}
my (@allfiles,@srcfiles,@dstfiles);
$/ = "\0";
open(F,"-|","git-ls-files","-z")
or die "Failed to open pipe from git-ls-files: " . $!;
@allfiles = map { chomp; $_; } <F>;
close(F);
my $safesrc = quotemeta($src);
@srcfiles = grep /^$safesrc/, @allfiles;
@dstfiles = @srcfiles;
s#^$safesrc(/|$)#$dst$1# for @dstfiles;
rename($src,$dst)
or die "rename failed: $!";
my $rc = system("git-update-index","--add","--",@dstfiles);
die "git-update-index failed to add new name with code $?\n" if $rc;
$rc = system("git-update-index","--remove","--",@srcfiles);
die "git-update-index failed to remove old name with code $?\n" if $rc;
sub usage($) {
my $s = shift;
print $s, "\n" if (length $s != 0);
print <<EOT;
$0 <source> <dest>
source must exist and be either a file, symlink or directory.
dest must NOT exist.
Renames source to dest, and updates the git cache to reflect the change.
Use "git commit" to make record the change permanently.
EOT
exit(1);
}

View File

@ -280,7 +280,8 @@ sub revert_split_path($$) {
$svnpath = "$branch_name/$branch/$path"; $svnpath = "$branch_name/$branch/$path";
} }
return $svnpath $svnpath =~ s#/+$##;
return $svnpath;
} }
sub get_file($$$) { sub get_file($$$) {
@ -372,6 +373,10 @@ sub copy_path($$$$$$$$) {
my($newrev,$newbranch,$path,$oldpath,$rev,$node_kind,$new,$parents) = @_; my($newrev,$newbranch,$path,$oldpath,$rev,$node_kind,$new,$parents) = @_;
my($srcbranch,$srcpath) = split_path($rev,$oldpath); my($srcbranch,$srcpath) = split_path($rev,$oldpath);
unless(defined $srcbranch) {
print "Path not found when copying from $oldpath @ $rev\n";
return;
}
my $therev = branch_rev($srcbranch, $rev); my $therev = branch_rev($srcbranch, $rev);
my $gitrev = $branches{$srcbranch}{$therev}; my $gitrev = $branches{$srcbranch}{$therev};
unless($gitrev) { unless($gitrev) {

View File

@ -25,7 +25,7 @@
#define PREV_BUF_SIZE 4096 #define PREV_BUF_SIZE 4096
#define RANGE_HEADER_SIZE 30 #define RANGE_HEADER_SIZE 30
static int got_alternates = 0; static int got_alternates = -1;
static int active_requests = 0; static int active_requests = 0;
static int data_received; static int data_received;
@ -87,9 +87,19 @@ struct active_request_slot
int done; int done;
CURLcode curl_result; CURLcode curl_result;
long http_code; long http_code;
void *callback_data;
void (*callback_func)(void *data);
struct active_request_slot *next; struct active_request_slot *next;
}; };
struct alt_request {
char *base;
char *url;
struct buffer *buffer;
struct active_request_slot *slot;
int http_specific;
};
static struct transfer_request *request_queue_head = NULL; static struct transfer_request *request_queue_head = NULL;
static struct active_request_slot *active_queue_head = NULL; static struct active_request_slot *active_queue_head = NULL;
@ -237,7 +247,7 @@ static size_t fwrite_sha1_file(void *ptr, size_t eltsize, size_t nmemb,
static void process_curl_messages(void); static void process_curl_messages(void);
static void process_request_queue(void); static void process_request_queue(void);
#endif #endif
static int fetch_alternates(char *base); static void fetch_alternates(char *base);
static CURL* get_curl_handle(void) static CURL* get_curl_handle(void)
{ {
@ -324,6 +334,8 @@ static struct active_request_slot *get_active_slot(void)
slot->in_use = 1; slot->in_use = 1;
slot->done = 0; slot->done = 0;
slot->local = NULL; slot->local = NULL;
slot->callback_data = NULL;
slot->callback_func = NULL;
curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, pragma_header); curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, pragma_header);
curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, no_range_header); curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, no_range_header);
curl_easy_setopt(slot->curl, CURLOPT_ERRORBUFFER, curl_errorstr); curl_easy_setopt(slot->curl, CURLOPT_ERRORBUFFER, curl_errorstr);
@ -601,6 +613,12 @@ static void process_curl_messages(void)
} else { } else {
fprintf(stderr, "Received DONE message for unknown request!\n"); fprintf(stderr, "Received DONE message for unknown request!\n");
} }
/* Process slot callback if appropriate */
if (slot->callback_func != NULL) {
slot->callback_func(slot->callback_data);
}
if (request != NULL) { if (request != NULL) {
request->curl_result = curl_result; request->curl_result = curl_result;
request->http_code = slot->http_code; request->http_code = slot->http_code;
@ -614,6 +632,8 @@ static void process_curl_messages(void)
request->repo = request->repo =
request->repo->next; request->repo->next;
start_request(request); start_request(request);
} else {
finish_request(request);
} }
} else { } else {
finish_request(request); finish_request(request);
@ -766,72 +786,51 @@ static int setup_index(struct alt_base *repo, unsigned char *sha1)
return 0; return 0;
} }
static int fetch_alternates(char *base) static void process_alternates(void *callback_data)
{ {
int ret = 0; struct alt_request *alt_req = (struct alt_request *)callback_data;
struct buffer buffer; struct active_request_slot *slot = alt_req->slot;
char *url; struct alt_base *tail = alt;
char *base = alt_req->base;
static const char null_byte = '\0';
char *data; char *data;
int i = 0; int i = 0;
int http_specific = 1;
struct alt_base *tail = alt;
static const char null_byte = '\0';
struct active_request_slot *slot; if (alt_req->http_specific) {
if (slot->curl_result != CURLE_OK ||
!alt_req->buffer->posn) {
if (got_alternates) /* Try reusing the slot to get non-http alternates */
return 0; alt_req->http_specific = 0;
sprintf(alt_req->url, "%s/objects/info/alternates",
data = xmalloc(4096); base);
buffer.size = 4096; curl_easy_setopt(slot->curl, CURLOPT_URL,
buffer.posn = 0; alt_req->url);
buffer.buffer = data; active_requests++;
slot->in_use = 1;
if (get_verbosely) slot->done = 0;
fprintf(stderr, "Getting alternates list for %s\n", base);
url = xmalloc(strlen(base) + 31);
sprintf(url, "%s/objects/info/http-alternates", base);
slot = get_active_slot();
curl_easy_setopt(slot->curl, CURLOPT_FILE, &buffer);
curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION,
fwrite_buffer_dynamic);
curl_easy_setopt(slot->curl, CURLOPT_URL, url);
if (start_active_slot(slot)) { if (start_active_slot(slot)) {
run_active_slot(slot); return;
if (slot->curl_result != CURLE_OK || !buffer.posn) {
http_specific = 0;
sprintf(url, "%s/objects/info/alternates", base);
slot = get_active_slot();
curl_easy_setopt(slot->curl, CURLOPT_FILE, &buffer);
curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION,
fwrite_buffer_dynamic);
curl_easy_setopt(slot->curl, CURLOPT_URL, url);
if (start_active_slot(slot)) {
run_active_slot(slot);
if (slot->curl_result != CURLE_OK) {
free(buffer.buffer);
if (slot->http_code == 404)
got_alternates = 1;
return 0;
}
}
}
} else { } else {
free(buffer.buffer); got_alternates = -1;
return 0; slot->done = 1;
return;
}
}
} else if (slot->curl_result != CURLE_OK) {
if (slot->http_code != 404) {
got_alternates = -1;
return;
}
} }
fwrite_buffer_dynamic(&null_byte, 1, 1, &buffer); fwrite_buffer_dynamic(&null_byte, 1, 1, alt_req->buffer);
buffer.posn--; alt_req->buffer->posn--;
data = buffer.buffer; data = alt_req->buffer->buffer;
while (i < buffer.posn) { while (i < alt_req->buffer->posn) {
int posn = i; int posn = i;
while (posn < buffer.posn && data[posn] != '\n') while (posn < alt_req->buffer->posn && data[posn] != '\n')
posn++; posn++;
if (data[posn] == '\n') { if (data[posn] == '\n') {
int okay = 0; int okay = 0;
@ -855,7 +854,7 @@ static int fetch_alternates(char *base)
// If the server got removed, give up. // If the server got removed, give up.
okay = strchr(base, ':') - base + 3 < okay = strchr(base, ':') - base + 3 <
serverlen; serverlen;
} else if (http_specific) { } else if (alt_req->http_specific) {
char *colon = strchr(data + i, ':'); char *colon = strchr(data + i, ':');
char *slash = strchr(data + i, '/'); char *slash = strchr(data + i, '/');
if (colon && slash && colon < data + posn && if (colon && slash && colon < data + posn &&
@ -881,15 +880,74 @@ static int fetch_alternates(char *base)
while (tail->next != NULL) while (tail->next != NULL)
tail = tail->next; tail = tail->next;
tail->next = newalt; tail->next = newalt;
ret++;
} }
} }
i = posn + 1; i = posn + 1;
} }
got_alternates = 1; got_alternates = 1;
free(buffer.buffer); }
return ret;
static void fetch_alternates(char *base)
{
struct buffer buffer;
char *url;
char *data;
struct active_request_slot *slot;
static struct alt_request alt_req;
int num_transfers;
/* If another request has already started fetching alternates,
wait for them to arrive and return to processing this request's
curl message */
while (got_alternates == 0) {
curl_multi_perform(curlm, &num_transfers);
process_curl_messages();
process_request_queue();
}
/* Nothing to do if they've already been fetched */
if (got_alternates == 1)
return;
/* Start the fetch */
got_alternates = 0;
data = xmalloc(4096);
buffer.size = 4096;
buffer.posn = 0;
buffer.buffer = data;
if (get_verbosely)
fprintf(stderr, "Getting alternates list for %s\n", base);
url = xmalloc(strlen(base) + 31);
sprintf(url, "%s/objects/info/http-alternates", base);
/* Use a callback to process the result, since another request
may fail and need to have alternates loaded before continuing */
slot = get_active_slot();
slot->callback_func = process_alternates;
slot->callback_data = &alt_req;
curl_easy_setopt(slot->curl, CURLOPT_FILE, &buffer);
curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION,
fwrite_buffer_dynamic);
curl_easy_setopt(slot->curl, CURLOPT_URL, url);
alt_req.base = base;
alt_req.url = url;
alt_req.buffer = &buffer;
alt_req.http_specific = 1;
alt_req.slot = slot;
if (start_active_slot(slot))
run_active_slot(slot);
else
got_alternates = -1;
free(data);
free(url);
} }
static int fetch_indices(struct alt_base *repo) static int fetch_indices(struct alt_base *repo)

View File

@ -593,19 +593,20 @@ int main(int argc, char **argv)
minimize(&min); minimize(&min);
if (verbose) { if (verbose) {
fprintf(stderr, "There are %ld packs available in alt-odbs.\n", fprintf(stderr, "There are %lu packs available in alt-odbs.\n",
pack_list_size(altodb_packs)); (unsigned long)pack_list_size(altodb_packs));
fprintf(stderr, "The smallest (bytewise) set of packs is:\n"); fprintf(stderr, "The smallest (bytewise) set of packs is:\n");
pl = min; pl = min;
while (pl) { while (pl) {
fprintf(stderr, "\t%s\n", pl->pack->pack_name); fprintf(stderr, "\t%s\n", pl->pack->pack_name);
pl = pl->next; pl = pl->next;
} }
fprintf(stderr, "containing %ld duplicate objects " fprintf(stderr, "containing %lu duplicate objects "
"with a total size of %ldkb.\n", "with a total size of %lukb.\n",
get_pack_redundancy(min), pack_set_bytecount(min)/1024); (unsigned long)get_pack_redundancy(min),
fprintf(stderr, "A total of %ld unique objects were considered.\n", (unsigned long)pack_set_bytecount(min)/1024);
all_objects->size); fprintf(stderr, "A total of %lu unique objects were considered.\n",
(unsigned long)all_objects->size);
fprintf(stderr, "Redundant packs (with indexes):\n"); fprintf(stderr, "Redundant packs (with indexes):\n");
} }
pl = red = pack_list_difference(local_packs, min); pl = red = pack_list_difference(local_packs, min);

View File

@ -24,4 +24,12 @@ test_expect_failure \
'git branch --help should not have created a bogus branch' \ 'git branch --help should not have created a bogus branch' \
'test -f .git/refs/heads/--help' 'test -f .git/refs/heads/--help'
test_expect_success \
'git branch abc should create a branch' \
'git-branch abc && test -f .git/refs/heads/abc'
test_expect_success \
'git branch a/b/c should create a branch' \
'git-branch a/b/c && test -f .git/refs/heads/a/b/c'
test_done test_done

View File

@ -25,7 +25,7 @@ on_committer_date "1971-08-16 00:00:05" save_tag a1 unique_commit a1 tree -p a0
on_committer_date "1971-08-16 00:00:06" save_tag b1 unique_commit b1 tree -p a0 on_committer_date "1971-08-16 00:00:06" save_tag b1 unique_commit b1 tree -p a0
on_committer_date "1971-08-16 00:00:07" save_tag c1 unique_commit c1 tree -p b1 on_committer_date "1971-08-16 00:00:07" save_tag c1 unique_commit c1 tree -p b1
on_committer_date "1971-08-16 00:00:08" as_author foobar@example.com save_tag b2 unique_commit b2 tree -p b1 on_committer_date "1971-08-16 00:00:08" as_author foobar@example.com save_tag b2 unique_commit b2 tree -p b1
on_committer_date "1971-08-16 00:00:09" save_tag b3 unique_commit b2 tree -p b2 on_committer_date "1971-08-16 00:00:09" save_tag b3 unique_commit b3 tree -p b2
on_committer_date "1971-08-16 00:00:10" save_tag c2 unique_commit c2 tree -p c1 -p b2 on_committer_date "1971-08-16 00:00:10" save_tag c2 unique_commit c2 tree -p c1 -p b2
on_committer_date "1971-08-16 00:00:11" save_tag c3 unique_commit c3 tree -p c2 on_committer_date "1971-08-16 00:00:11" save_tag c3 unique_commit c3 tree -p c2
on_committer_date "1971-08-16 00:00:12" save_tag a2 unique_commit a2 tree -p a1 on_committer_date "1971-08-16 00:00:12" save_tag a2 unique_commit a2 tree -p a1
@ -116,15 +116,15 @@ g0
EOF EOF
test_output_expect_success 'multiple heads' 'git-rev-list --topo-order a3 b3 c3' <<EOF test_output_expect_success 'multiple heads' 'git-rev-list --topo-order a3 b3 c3' <<EOF
b3
c3
c2
b2
c1
b1
a3 a3
a2 a2
a1 a1
c3
c2
c1
b3
b2
b1
a0 a0
l2 l2
l1 l1
@ -133,26 +133,26 @@ root
EOF EOF
test_output_expect_success 'multiple heads, prune at a1' 'git-rev-list --topo-order a3 b3 c3 ^a1' <<EOF test_output_expect_success 'multiple heads, prune at a1' 'git-rev-list --topo-order a3 b3 c3 ^a1' <<EOF
b3
c3
c2
b2
c1
b1
a3 a3
a2 a2
c3
c2
c1
b3
b2
b1
EOF EOF
test_output_expect_success 'multiple heads, prune at l1' 'git-rev-list --topo-order a3 b3 c3 ^l1' <<EOF test_output_expect_success 'multiple heads, prune at l1' 'git-rev-list --topo-order a3 b3 c3 ^l1' <<EOF
b3
c3
c2
b2
c1
b1
a3 a3
a2 a2
a1 a1
c3
c2
c1
b3
b2
b1
a0 a0
l2 l2
EOF EOF

View File

@ -6,7 +6,7 @@
#include <sys/time.h> #include <sys/time.h>
static int dry_run, quiet; static int dry_run, quiet;
static const char unpack_usage[] = "git-unpack-objects [-q] < pack-file"; static const char unpack_usage[] = "git-unpack-objects [-n] [-q] < pack-file";
/* We always read in 4kB chunks. */ /* We always read in 4kB chunks. */
static unsigned char buffer[4096]; static unsigned char buffer[4096];

View File

@ -19,7 +19,8 @@ static int re_verify(const char *path, unsigned char *oldsha1, unsigned char *cu
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
char *hex; char *hex;
const char *refname, *value, *oldval, *path, *lockpath; const char *refname, *value, *oldval, *path;
char *lockpath;
unsigned char sha1[20], oldsha1[20], currsha1[20]; unsigned char sha1[20], oldsha1[20], currsha1[20];
int fd, written; int fd, written;
@ -49,6 +50,8 @@ int main(int argc, char **argv)
} }
path = strdup(path); path = strdup(path);
lockpath = mkpath("%s.lock", path); lockpath = mkpath("%s.lock", path);
if (safe_create_leading_directories(lockpath) < 0)
die("Unable to create all of %s", lockpath);
fd = open(lockpath, O_CREAT | O_EXCL | O_WRONLY, 0666); fd = open(lockpath, O_CREAT | O_EXCL | O_WRONLY, 0666);
if (fd < 0) if (fd < 0)