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
commit 60d64db461
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-local-fetch
git-log
git-lost+found
git-lost-found
git-ls-files
git-ls-remote
git-ls-tree
@ -74,7 +74,6 @@ git-read-tree
git-rebase
git-receive-pack
git-relink
git-rename
git-repack
git-request-pull
git-reset

View File

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

View File

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

View File

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

View File

@ -1,13 +1,13 @@
git-lost+found(1)
git-lost-found(1)
=================
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
--------
'git-lost+found'
'git-lost-found'
DESCRIPTION
-----------
@ -31,7 +31,7 @@ The ref to your tag is overwritten, but until you run 'git
prune', it is still there.
------------
$ git lost+found
$ git lost-found
[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.
OPTIONS
-------
-n::
Don't actually remove any objects, only show those that would have been
removed.
Author
------
Written by Linus Torvalds <torvalds@osdl.org>

View File

@ -30,6 +30,10 @@ OPTIONS
-m::
Perform a merge, not just a read.
--reset::
Same as -m except that unmerged entries will be silently ignored.
-u::
After a successful merge, update the files in the work
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
--------
'git-unpack-objects' [-q] <pack-file
'git-unpack-objects' [-n] [-q] <pack-file
DESCRIPTION
@ -19,6 +19,10 @@ one-object" format in $GIT_OBJECT_DIRECTORY.
OPTIONS
-------
-n::
Only list the objects that would be unpacked, don't actually unpack
them.
-q::
The command usually shows percentage progress. This
flag suppresses it.

View File

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

View File

@ -262,9 +262,6 @@ gitlink:git-push[1]::
gitlink:git-rebase[1]::
Rebase local commits to new upstream head.
gitlink:git-rename[1]::
Rename files and directories.
gitlink:git-repack[1]::
Pack unpacked objects in a repository.
@ -309,7 +306,7 @@ gitlink:git-convert-objects[1]::
gitlink:git-cvsimport[1]::
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.
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
# 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
LDFLAGS =
ALL_CFLAGS = $(CFLAGS)
ALL_LDFLAGS = $(LDFLAGS)
prefix = $(HOME)
bindir = $(prefix)/bin
@ -90,11 +92,11 @@ SCRIPT_SH = \
git-applymbox.sh git-applypatch.sh git-am.sh \
git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \
git-merge-resolve.sh git-merge-ours.sh git-grep.sh \
git-lost+found.sh
git-lost-found.sh
SCRIPT_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
SCRIPT_PYTHON = \
@ -187,9 +189,11 @@ ifeq ($(uname_S),Darwin)
NEEDS_SSL_WITH_CRYPTO = YesPlease
NEEDS_LIBICONV = YesPlease
## fink
ALL_CFLAGS += -I/sw/include -L/sw/lib
ALL_CFLAGS += -I/sw/include
ALL_LDFLAGS += -L/sw/lib
## darwinports
ALL_CFLAGS += -I/opt/local/include -L/opt/local/lib
ALL_CFLAGS += -I/opt/local/include
ALL_LDFLAGS += -L/opt/local/lib
endif
ifeq ($(uname_S),SunOS)
NEEDS_SOCKET = YesPlease
@ -211,7 +215,13 @@ endif
ifeq ($(uname_S),OpenBSD)
NO_STRCASESTR = 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
ifneq (,$(findstring arm,$(uname_M)))
ARM_SHA1 = YesPlease
@ -221,7 +231,7 @@ endif
ifndef NO_CURL
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
CURL_LIBCURL = -L$(CURLDIR)/lib -R$(CURLDIR)/lib -lcurl
else
@ -369,12 +379,13 @@ git-cherry-pick: git-revert
$(CC) -o $*.o -c $(ALL_CFLAGS) $<
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)
$(SIMPLE_PROGRAMS) : $(LIB_FILE)
$(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-local-fetch$X: fetch.o
@ -408,10 +419,10 @@ test: all
$(MAKE) -C t/ all
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
$(CC) $(ALL_CFLAGS) -o $@ $^
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $^
check:
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;
ptr = strchr(line, '.');
if (!ptr || ptr[1] != '.' || 40 <= ptr - line)
if (!ptr || ptr[1] != '.' || 40 < ptr - line)
return 0;
len = ptr - line;
memcpy(patch->old_sha1_prefix, line, len);
@ -384,7 +384,7 @@ static int gitdiff_index(const char *line, struct patch *patch)
ptr = eol;
len = ptr - line;
if (40 <= len)
if (40 < len)
return 0;
memcpy(patch->new_sha1_prefix, line, len);
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 ";
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;
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)
{
struct commit_list * next = *list;
struct commit_list * work = NULL;
struct commit_list * work = NULL, **insert;
struct commit_list ** pptr = list;
struct sort_node * 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.
*/
next=*list;
insert = &work;
while (next) {
struct sort_node * node = (struct sort_node *)next->item->object.util;
if (node->indegree == 0) {
commit_list_insert(next->item, &work);
insert = &commit_list_insert(next->item, insert)->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 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
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
* Do not scatter txt and html documentation into feature

4
debian/control vendored
View File

@ -2,7 +2,7 @@ Source: git-core
Section: devel
Priority: optional
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
Package: git-core
@ -48,7 +48,7 @@ Description: The git content addressable filesystem, GNUArch interoperability
Package: git-cvs
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
Description: The git content addressable filesystem, CVS interoperability
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" ||
die "we do not like '$branchname' as a branch name."
leading=`expr "refs/heads/$branchname" : '\(.*\)/'` &&
mkdir -p "$GIT_DIR/$leading" &&
echo $rev > "$GIT_DIR/refs/heads/$branchname"
git update-ref "refs/heads/$branchname" $rev

View File

@ -9,7 +9,7 @@
unset CDPATH
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
}
@ -98,7 +98,7 @@ fi
dir="$2"
# 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')
[ -e "$dir" ] && $(echo "$dir already exists."; usage)
[ -e "$dir" ] && echo "$dir already exists." && usage
mkdir -p "$dir" &&
D=$(
(cd "$dir" && git-init-db && pwd)

View File

@ -7,9 +7,9 @@ License: GPL
Group: Development/Tools
URL: http://kernel.org/pub/software/scm/git/
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)
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
This is a stupid (but extremely fast) directory content manager. It
@ -47,6 +47,13 @@ Requires: git-core = %{version}-%{release}
%description 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
%setup -q
@ -60,9 +67,9 @@ make %{_smp_mflags} DESTDIR=$RPM_BUILD_ROOT WITH_OWN_SUBPROCESS_PY=YesPlease WIT
prefix=%{_prefix} mandir=%{_mandir} \
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
(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
%clean
@ -96,6 +103,13 @@ rm -rf $RPM_BUILD_ROOT
%{!?_without_docs: %{_mandir}/man1/*email*.1*}
%{!?_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
%defattr(-,root,root)
%{_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";
}
return $svnpath
$svnpath =~ s#/+$##;
return $svnpath;
}
sub get_file($$$) {
@ -372,6 +373,10 @@ sub copy_path($$$$$$$$) {
my($newrev,$newbranch,$path,$oldpath,$rev,$node_kind,$new,$parents) = @_;
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 $gitrev = $branches{$srcbranch}{$therev};
unless($gitrev) {

View File

@ -25,7 +25,7 @@
#define PREV_BUF_SIZE 4096
#define RANGE_HEADER_SIZE 30
static int got_alternates = 0;
static int got_alternates = -1;
static int active_requests = 0;
static int data_received;
@ -87,9 +87,19 @@ struct active_request_slot
int done;
CURLcode curl_result;
long http_code;
void *callback_data;
void (*callback_func)(void *data);
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 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_request_queue(void);
#endif
static int fetch_alternates(char *base);
static void fetch_alternates(char *base);
static CURL* get_curl_handle(void)
{
@ -324,6 +334,8 @@ static struct active_request_slot *get_active_slot(void)
slot->in_use = 1;
slot->done = 0;
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, no_range_header);
curl_easy_setopt(slot->curl, CURLOPT_ERRORBUFFER, curl_errorstr);
@ -601,6 +613,12 @@ static void process_curl_messages(void)
} else {
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) {
request->curl_result = curl_result;
request->http_code = slot->http_code;
@ -614,6 +632,8 @@ static void process_curl_messages(void)
request->repo =
request->repo->next;
start_request(request);
} else {
finish_request(request);
}
} else {
finish_request(request);
@ -766,72 +786,51 @@ static int setup_index(struct alt_base *repo, unsigned char *sha1)
return 0;
}
static int fetch_alternates(char *base)
static void process_alternates(void *callback_data)
{
int ret = 0;
struct buffer buffer;
char *url;
struct alt_request *alt_req = (struct alt_request *)callback_data;
struct active_request_slot *slot = alt_req->slot;
struct alt_base *tail = alt;
char *base = alt_req->base;
static const char null_byte = '\0';
char *data;
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)
return 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);
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);
/* Try reusing the slot to get non-http alternates */
alt_req->http_specific = 0;
sprintf(alt_req->url, "%s/objects/info/alternates",
base);
curl_easy_setopt(slot->curl, CURLOPT_URL,
alt_req->url);
active_requests++;
slot->in_use = 1;
slot->done = 0;
if (start_active_slot(slot)) {
run_active_slot(slot);
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;
}
}
}
return;
} else {
free(buffer.buffer);
return 0;
got_alternates = -1;
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);
buffer.posn--;
data = buffer.buffer;
fwrite_buffer_dynamic(&null_byte, 1, 1, alt_req->buffer);
alt_req->buffer->posn--;
data = alt_req->buffer->buffer;
while (i < buffer.posn) {
while (i < alt_req->buffer->posn) {
int posn = i;
while (posn < buffer.posn && data[posn] != '\n')
while (posn < alt_req->buffer->posn && data[posn] != '\n')
posn++;
if (data[posn] == '\n') {
int okay = 0;
@ -855,7 +854,7 @@ static int fetch_alternates(char *base)
// If the server got removed, give up.
okay = strchr(base, ':') - base + 3 <
serverlen;
} else if (http_specific) {
} else if (alt_req->http_specific) {
char *colon = strchr(data + i, ':');
char *slash = strchr(data + i, '/');
if (colon && slash && colon < data + posn &&
@ -881,15 +880,74 @@ static int fetch_alternates(char *base)
while (tail->next != NULL)
tail = tail->next;
tail->next = newalt;
ret++;
}
}
i = posn + 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)

View File

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

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: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: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: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
@ -116,15 +116,15 @@ g0
EOF
test_output_expect_success 'multiple heads' 'git-rev-list --topo-order a3 b3 c3' <<EOF
b3
c3
c2
b2
c1
b1
a3
a2
a1
c3
c2
c1
b3
b2
b1
a0
l2
l1
@ -133,26 +133,26 @@ root
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
a2
c3
c2
c1
b3
b2
b1
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
a2
a1
c3
c2
c1
b3
b2
b1
a0
l2
EOF

View File

@ -6,7 +6,7 @@
#include <sys/time.h>
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. */
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)
{
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];
int fd, written;
@ -49,6 +50,8 @@ int main(int argc, char **argv)
}
path = strdup(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);
if (fd < 0)