3
.gitignore
vendored
3
.gitignore
vendored
@ -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
|
||||||
|
@ -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
|
||||||
------
|
------
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
@ -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
|
||||||
-----------
|
-----------
|
||||||
|
@ -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
|
||||||
...
|
...
|
||||||
------------
|
------------
|
@ -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>
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
|
||||||
|
|
@ -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.
|
||||||
|
@ -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.
|
||||||
|
@ -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]::
|
||||||
|
35
Makefile
35
Makefile
@ -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
|
||||||
|
7
apply.c
7
apply.c
@ -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)
|
||||||
|
5
commit.c
5
commit.c
@ -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
12
debian/changelog
vendored
@ -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
4
debian/control
vendored
@ -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
|
||||||
|
@ -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"
|
|
||||||
|
@ -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)
|
||||||
|
@ -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/
|
||||||
|
@ -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);
|
|
||||||
}
|
|
@ -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) {
|
||||||
|
180
http-fetch.c
180
http-fetch.c
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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];
|
||||||
|
@ -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)
|
||||||
|
Reference in New Issue
Block a user