Skip to content

Commit

Permalink
Merge branch 'fixes'
Browse files Browse the repository at this point in the history
  • Loading branch information
Junio C Hamano committed Oct 5, 2005
2 parents 4514385 + 1290563 commit 64a2228
Show file tree
Hide file tree
Showing 6 changed files with 145 additions and 77 deletions.
52 changes: 52 additions & 0 deletions Documentation/git-symbolic-ref.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
git-symbolic-ref(1)
===================

NAME
----
git-symbolic-ref - read and modify symbolic refs

SYNOPSIS
--------
'git-symbolic-ref' <name> [<ref>]

DESCRIPTION
-----------
Given one argument, reads which branch head the given symbolic
ref refers to and outputs its path, relative to the `.git/`
directory. Typically you would give `HEAD` as the <name>
argument to see on which branch your working tree is on.

Give two arguments, create or update a symbolic ref <name> to
point at the given branch <ref>.

Traditionally, `.git/HEAD` is a symlink pointing at
`refs/heads/master`. When we want to switch to another branch,
we did `ln -sf refs/heads/newbranch .git/HEAD`, and when we want
to find out which branch we are on, we did `readlink .git/HEAD`.
This was fine, and internally that is what still happens by
default, but on platforms that does not have working symlinks,
or that does not have the `readlink(1)` command, this was a bit
cumbersome. On some platforms, `ln -sf` does not even work as
advertised (horrors).

A symbolic ref can be a regular file that stores a string that
begins with `ref: refs/`. For example, your `.git/HEAD` *can*
be a regular file whose contents is `ref: refs/heads/master`.
This can be used on a filesystem that does not support symbolic
links. Instead of doing `readlink .git/HEAD`, `git-symbolic-ref
HEAD` can be used to find out which branch we are on. To point
the HEAD to `newbranch`, instead of `ln -sf refs/heads/newbranch
.git/HEAD`, `git-symbolic-ref HEAD refs/heads/newbranch` can be
used.

Currently, .git/HEAD uses a regular file symbolic ref on Cygwin,
and everywhere else it is implemented as a symlink. This can be
changed at compilation time.

Author
------
Written by Junio C Hamano <junkio@cox.net>

GIT
---
Part of the gitlink:git[7] suite
58 changes: 58 additions & 0 deletions Documentation/git-update-ref.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
git-update-ref(1)
=================

NAME
----
git-update-ref - update the object name stored in a ref safely

SYNOPSIS
--------
`git-update-ref` <ref> <newvalue> [<oldvalue>]

DESCRIPTION
-----------
Given two arguments, stores the <newvalue> in the <ref>, possibly
dereferencing the symbolic refs. E.g. `git-update-ref HEAD
<newvalue>` updates the current branch head to the new object.

Given three arguments, stores the <newvalue> in the <ref>,
possibly dereferencing the symbolic refs, after verifying that
the current value of the <ref> matches <oldvalue>.
E.g. `git-update-ref refs/heads/master <newvalue> <oldvalue>`
updates the master branch head to <newvalue> only if its current
value is <oldvalue>.

It also allows a "ref" file to be a symbolic pointer to another
ref file by starting with the four-byte header sequence of
"ref:".

More importantly, it allows the update of a ref file to follow
these symbolic pointers, whether they are symlinks or these
"regular file symbolic refs". It follows *real* symlinks only
if they start with "refs/": otherwise it will just try to read
them and update them as a regular file (i.e. it will allow the
filesystem to follow them, but will overwrite such a symlink to
somewhere else with a regular filename).

In general, using

git-update-ref HEAD "$head"

should be a _lot_ safer than doing

echo "$head" > "$GIT_DIR/HEAD"

both from a symlink following standpoint *and* an error checking
standpoint. The "refs/" rule for symlinks means that symlinks
that point to "outside" the tree are safe: they'll be followed
for reading but not for writing (so we'll never write through a
ref symlink to some other tree, if you have copied a whole
archive by creating a symlink tree).

Author
------
Written by Linus Torvalds <torvalds@osdl.org>.

GIT
---
Part of the gitlink:git[7] suite
11 changes: 7 additions & 4 deletions git-commit.sh
Original file line number Diff line number Diff line change
Expand Up @@ -133,10 +133,13 @@ fi | git-stripspace >.editmsg

case "$signoff" in
t)
git-var GIT_COMMITTER_IDENT | sed -e '
s/>.*/>/
s/^/Signed-off-by: /
' >>.editmsg
{
echo
git-var GIT_COMMITTER_IDENT | sed -e '
s/>.*/>/
s/^/Signed-off-by: /
'
} >>.editmsg
;;
esac

Expand Down
67 changes: 0 additions & 67 deletions git-external-diff-script

This file was deleted.

6 changes: 1 addition & 5 deletions git-format-patch.sh
Original file line number Diff line number Diff line change
Expand Up @@ -128,10 +128,6 @@ whosepatchScript='
q
}'

_x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
stripCommitHead='/^'"$_x40"' (from '"$_x40"')$/d'

git-cherry -v "$rev1" "$rev2" |
while read sign rev comment
do
Expand Down Expand Up @@ -216,7 +212,7 @@ Date: '"$ad"
echo
git-diff-tree -p $diff_opts "$commit" | git-apply --stat --summary
echo
git-diff-tree -p $diff_opts "$commit" | sed -e "$stripCommitHead"
git-diff-tree -p $diff_opts "$commit"

case "$mbox" in
t)
Expand Down
28 changes: 27 additions & 1 deletion ssh-fetch.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,26 @@ static ssize_t force_write(int fd, void *buffer, size_t length)
return ret;
}

static int prefetches = 0;

static struct object_list *in_transit = NULL;
static struct object_list **end_of_transit = &in_transit;

void prefetch(unsigned char *sha1)
{
char type = 'o';
struct object_list *node;
if (prefetches > 100) {
fetch(in_transit->item->sha1);
}
node = xmalloc(sizeof(struct object_list));
node->next = NULL;
node->item = lookup_unknown_object(sha1);
*end_of_transit = node;
end_of_transit = &node->next;
force_write(fd_out, &type, 1);
force_write(fd_out, sha1, 20);
//memcpy(requested + 20 * prefetches++, sha1, 20);
prefetches++;
}

static char conn_buf[4096];
Expand All @@ -51,6 +65,18 @@ int fetch(unsigned char *sha1)
{
int ret;
signed char remote;
struct object_list *temp;

if (memcmp(sha1, in_transit->item->sha1, 20)) {
// we must have already fetched it to clean the queue
return has_sha1_file(sha1) ? 0 : -1;
}
prefetches--;
temp = in_transit;
in_transit = in_transit->next;
if (!in_transit)
end_of_transit = &in_transit;
free(temp);

if (conn_buf_posn) {
remote = conn_buf[0];
Expand Down

0 comments on commit 64a2228

Please sign in to comment.