summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/git-annotate.txt44
-rw-r--r--Documentation/git-blame.txt42
-rw-r--r--Documentation/git.txt6
-rwxr-xr-xGIT-VERSION-GEN2
-rw-r--r--Makefile3
-rw-r--r--combine-diff.c12
-rw-r--r--commit.c6
-rw-r--r--config.c39
-rw-r--r--connect.c18
-rw-r--r--exec_cmd.c4
-rwxr-xr-xgit-svnimport.perl18
-rwxr-xr-xgitk5
-rw-r--r--http-push.c10
-rw-r--r--quote.c2
-rw-r--r--rev-list.c6
-rw-r--r--revision.c29
-rw-r--r--revision.h3
-rw-r--r--sha1_file.c6
-rw-r--r--t/Makefile2
19 files changed, 205 insertions, 52 deletions
diff --git a/Documentation/git-annotate.txt b/Documentation/git-annotate.txt
new file mode 100644
index 0000000..7baf731
--- /dev/null
+++ b/Documentation/git-annotate.txt
@@ -0,0 +1,44 @@
+git-annotate(1)
+===============
+
+NAME
+----
+git-annotate - Annotate file lines with commit info
+
+SYNOPSIS
+--------
+git-annotate [options] file [revision]
+
+DESCRIPTION
+-----------
+Annotates each line in the given file with information from the commit
+which introduced the line. Optionally annotate from a given revision.
+
+OPTIONS
+-------
+-l, --long::
+ Show long rev (Defaults off).
+
+-t, --time::
+ Show raw timestamp (Defaults off).
+
+-r, --rename::
+ Follow renames (Defaults on).
+
+-S, --rev-file <revs-file>::
+ Use revs from revs-file instead of calling git-rev-list.
+
+-h, --help::
+ Show help message.
+
+SEE ALSO
+--------
+gitlink:git-blame[1]
+
+AUTHOR
+------
+Written by Ryan Anderson <ryan@michonline.com>.
+
+GIT
+---
+Part of the gitlink:git[7] suite
diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt
new file mode 100644
index 0000000..5189878
--- /dev/null
+++ b/Documentation/git-blame.txt
@@ -0,0 +1,42 @@
+git-blame(1)
+============
+
+NAME
+----
+git-blame - Blame file lines on commits
+
+SYNOPSIS
+--------
+git-blame file [options] file [revision]
+
+DESCRIPTION
+-----------
+Annotates each line in the given file with information from the commit
+which introduced the line. Start annotation from the given revision.
+
+OPTIONS
+-------
+-c, --compability::
+ Use the same output mode as git-annotate (Default: off).
+
+-l, --long::
+ Show long rev (Defaults off).
+
+-S, --rev-file <revs-file>::
+ Use revs from revs-file instead of calling git-rev-list.
+
+-h, --help::
+ Show help message.
+
+
+SEE ALSO
+--------
+gitlink:git-annotate[1]
+
+AUTHOR
+------
+Written by Fredrik Kuivinen <freku045@student.liu.se>.
+
+GIT
+---
+Part of the gitlink:git[7] suite
diff --git a/Documentation/git.txt b/Documentation/git.txt
index 03d860b..24ca55d 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -399,6 +399,12 @@ gitlink:git-update-ref[1]::
Interrogators:
+gitlink:git-annotate[1]::
+ Annotate file lines with commit info.
+
+gitlink:git-blame[1]::
+ Blame file lines on commits.
+
gitlink:git-check-ref-format[1]::
Make sure ref name is well formed.
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index e88fe5a..7fcefcd 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
#!/bin/sh
GVF=GIT-VERSION-FILE
-DEF_VER=v1.3-rc4.GIT
+DEF_VER=v1.3.GIT
# First try git-describe, then see if there is a version file
# (included in release tarballs), then default
diff --git a/Makefile b/Makefile
index 1130af4..8aed3af 100644
--- a/Makefile
+++ b/Makefile
@@ -653,7 +653,7 @@ rpm: dist
clean:
rm -f *.o mozilla-sha1/*.o arm/*.o ppc/*.o compat/*.o xdiff/*.o \
$(LIB_FILE) $(XDIFF_LIB)
- rm -f $(ALL_PROGRAMS) git$X
+ rm -f $(ALL_PROGRAMS) $(BUILT_INS) git$X
rm -f *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h TAGS tags
rm -rf $(GIT_TARNAME)
rm -f $(GIT_TARNAME).tar.gz git-core_$(GIT_VERSION)-*.tar.gz
@@ -671,7 +671,6 @@ check-docs::
@for v in $(ALL_PROGRAMS) $(BUILT_INS) git$X gitk; \
do \
case "$$v" in \
- git-annotate | git-blame | \
git-merge-octopus | git-merge-ours | git-merge-recursive | \
git-merge-resolve | git-merge-stupid | \
git-ssh-pull | git-ssh-push ) continue ;; \
diff --git a/combine-diff.c b/combine-diff.c
index 27f6f57..ca36f5d 100644
--- a/combine-diff.c
+++ b/combine-diff.c
@@ -600,7 +600,7 @@ static int show_patch_diff(struct combine_diff_path *elem, int num_parent,
{
struct diff_options *opt = &rev->diffopt;
unsigned long result_size, cnt, lno;
- char *result, *cp, *ep;
+ char *result, *cp;
struct sline *sline; /* survived lines */
int mode_differs = 0;
int i, show_hunks, shown_header = 0;
@@ -652,7 +652,6 @@ static int show_patch_diff(struct combine_diff_path *elem, int num_parent,
cnt++; /* incomplete line */
sline = xcalloc(cnt+2, sizeof(*sline));
- ep = result;
sline[0].bol = result;
for (lno = 0; lno <= cnt + 1; lno++) {
sline[lno].lost_tail = &sline[lno].lost_head;
@@ -759,7 +758,7 @@ static int show_patch_diff(struct combine_diff_path *elem, int num_parent,
static void show_raw_diff(struct combine_diff_path *p, int num_parent, struct rev_info *rev)
{
struct diff_options *opt = &rev->diffopt;
- int i, offset, mod_type = 'A';
+ int i, offset;
const char *prefix;
int line_termination, inter_name_termination;
@@ -771,13 +770,6 @@ static void show_raw_diff(struct combine_diff_path *p, int num_parent, struct re
if (rev->loginfo)
show_log(rev, rev->loginfo, "\n");
- for (i = 0; i < num_parent; i++) {
- if (p->parent[i].mode)
- mod_type = 'M';
- }
- if (!p->mode)
- mod_type = 'D';
-
if (opt->output_format == DIFF_FORMAT_RAW) {
offset = strlen(COLONS) - num_parent;
if (offset < 0)
diff --git a/commit.c b/commit.c
index ca25574..2717dd8 100644
--- a/commit.c
+++ b/commit.c
@@ -160,8 +160,8 @@ struct commit_graft *read_graft_line(char *buf, int len)
if (buf[len-1] == '\n')
buf[--len] = 0;
- if (buf[0] == '#')
- return 0;
+ if (buf[0] == '#' || buf[0] == '\0')
+ return NULL;
if ((len + 1) % 41) {
bad_graft_data:
error("bad graft data: %s", buf);
@@ -192,6 +192,8 @@ int read_graft_file(const char *graft_file)
/* The format is just "Commit Parent1 Parent2 ...\n" */
int len = strlen(buf);
struct commit_graft *graft = read_graft_line(buf, len);
+ if (!graft)
+ continue;
if (register_commit_graft(graft, 1))
error("duplicate graft data: %s", buf);
}
diff --git a/config.c b/config.c
index 95ec349..7ea8a73 100644
--- a/config.c
+++ b/config.c
@@ -420,6 +420,7 @@ int git_config_set_multivar(const char* key, const char* value,
{
int i;
int fd, in_fd;
+ int ret;
char* config_filename = strdup(git_path("config"));
char* lock_file = strdup(git_path("config.lock"));
const char* last_dot = strrchr(key, '.');
@@ -429,9 +430,10 @@ int git_config_set_multivar(const char* key, const char* value,
* key name separated by a dot, we have to know where the dot is.
*/
- if (last_dot == NULL) {
+ if (last_dot == NULL) {
fprintf(stderr, "key does not contain a section: %s\n", key);
- return 2;
+ ret = 2;
+ goto out_free;
}
store.baselen = last_dot - key;
@@ -447,7 +449,8 @@ int git_config_set_multivar(const char* key, const char* value,
(i == store.baselen+1 && !isalpha(key[i])))) {
fprintf(stderr, "invalid key: %s\n", key);
free(store.key);
- return 1;
+ ret = 1;
+ goto out_free;
} else
store.key[i] = tolower(key[i]);
store.key[i] = 0;
@@ -460,7 +463,8 @@ int git_config_set_multivar(const char* key, const char* value,
if (fd < 0) {
fprintf(stderr, "could not lock config file\n");
free(store.key);
- return -1;
+ ret = -1;
+ goto out_free;
}
/*
@@ -475,13 +479,15 @@ int git_config_set_multivar(const char* key, const char* value,
strerror(errno));
close(fd);
unlink(lock_file);
- return 3; /* same as "invalid config file" */
+ ret = 3; /* same as "invalid config file" */
+ goto out_free;
}
/* if nothing to unset, error out */
if (value == NULL) {
close(fd);
unlink(lock_file);
- return 5;
+ ret = 5;
+ goto out_free;
}
store.key = (char*)key;
@@ -507,7 +513,8 @@ int git_config_set_multivar(const char* key, const char* value,
fprintf(stderr, "Invalid pattern: %s\n",
value_regex);
free(store.value_regex);
- return 6;
+ ret = 6;
+ goto out_free;
}
}
@@ -528,7 +535,8 @@ int git_config_set_multivar(const char* key, const char* value,
regfree(store.value_regex);
free(store.value_regex);
}
- return 3;
+ ret = 3;
+ goto out_free;
}
free(store.key);
@@ -542,7 +550,8 @@ int git_config_set_multivar(const char* key, const char* value,
(store.seen > 1 && multi_replace == 0)) {
close(fd);
unlink(lock_file);
- return 5;
+ ret = 5;
+ goto out_free;
}
fstat(in_fd, &st);
@@ -593,10 +602,18 @@ int git_config_set_multivar(const char* key, const char* value,
if (rename(lock_file, config_filename) < 0) {
fprintf(stderr, "Could not rename the lock file?\n");
- return 4;
+ ret = 4;
+ goto out_free;
}
- return 0;
+ ret = 0;
+
+out_free:
+ if (config_filename)
+ free(config_filename);
+ if (lock_file)
+ free(lock_file);
+ return ret;
}
diff --git a/connect.c b/connect.c
index 3f2d65c..6a8f8a6 100644
--- a/connect.c
+++ b/connect.c
@@ -74,7 +74,7 @@ int get_ack(int fd, unsigned char *result_sha1)
line[--len] = 0;
if (!strcmp(line, "NAK"))
return 0;
- if (!strncmp(line, "ACK ", 3)) {
+ if (!strncmp(line, "ACK ", 4)) {
if (!get_sha1_hex(line+4, result_sha1)) {
if (strstr(line+45, "continue"))
return 2;
@@ -567,6 +567,7 @@ int git_connect(int fd[2], char *url, const char *prog)
int pipefd[2][2];
pid_t pid;
enum protocol protocol = PROTO_LOCAL;
+ int free_path = 0;
host = strstr(url, "://");
if(host) {
@@ -610,16 +611,23 @@ int git_connect(int fd[2], char *url, const char *prog)
char *ptr = path;
if (path[1] == '~')
path++;
- else
+ else {
path = strdup(ptr);
+ free_path = 1;
+ }
*ptr = '\0';
}
if (protocol == PROTO_GIT) {
+ int ret;
if (git_use_proxy(host))
- return git_proxy_connect(fd, prog, host, path);
- return git_tcp_connect(fd, prog, host, path);
+ ret = git_proxy_connect(fd, prog, host, path);
+ else
+ ret = git_tcp_connect(fd, prog, host, path);
+ if (free_path)
+ free(path);
+ return ret;
}
if (pipe(pipefd[0]) < 0 || pipe(pipefd[1]) < 0)
@@ -659,6 +667,8 @@ int git_connect(int fd[2], char *url, const char *prog)
fd[1] = pipefd[1][1];
close(pipefd[0][1]);
close(pipefd[1][0]);
+ if (free_path)
+ free(path);
return pid;
}
diff --git a/exec_cmd.c b/exec_cmd.c
index 590e738..44bb2f2 100644
--- a/exec_cmd.c
+++ b/exec_cmd.c
@@ -32,7 +32,7 @@ const char *git_exec_path(void)
int execv_git_cmd(const char **argv)
{
char git_command[PATH_MAX + 1];
- int len, err, i;
+ int len, i;
const char *paths[] = { current_exec_path,
getenv("GIT_EXEC_PATH"),
builtin_exec_path };
@@ -85,8 +85,6 @@ int execv_git_cmd(const char **argv)
/* execve() can only ever return if it fails */
execve(git_command, (char **)argv, environ);
- err = errno;
-
argv[0] = tmp;
}
return -1;
diff --git a/git-svnimport.perl b/git-svnimport.perl
index 4d5371c..60ed7ae 100755
--- a/git-svnimport.perl
+++ b/git-svnimport.perl
@@ -98,6 +98,7 @@ package SVNconn;
use File::Spec;
use File::Temp qw(tempfile);
use POSIX qw(strftime dup2);
+use Fcntl qw(SEEK_SET);
sub new {
my($what,$repo) = @_;
@@ -143,9 +144,22 @@ sub file {
}
my $mode;
if (exists $properties->{'svn:executable'}) {
- $mode = '0755';
+ $mode = '100755';
+ } elsif (exists $properties->{'svn:special'}) {
+ my ($special_content, $filesize);
+ $filesize = tell $fh;
+ seek $fh, 0, SEEK_SET;
+ read $fh, $special_content, $filesize;
+ if ($special_content =~ s/^link //) {
+ $mode = '120000';
+ seek $fh, 0, SEEK_SET;
+ truncate $fh, 0;
+ print $fh $special_content;
+ } else {
+ die "unexpected svn:special file encountered";
+ }
} else {
- $mode = '0644';
+ $mode = '100644';
}
close ($fh);
diff --git a/gitk b/gitk
index f88c06e..87e7162 100755
--- a/gitk
+++ b/gitk
@@ -1116,11 +1116,12 @@ proc layoutrows {row endrow last} {
proc addextraid {id row} {
global displayorder commitrow commitinfo
- global commitidx
+ global commitidx commitlisted
global parentlist childlist children
incr commitidx
lappend displayorder $id
+ lappend commitlisted 0
lappend parentlist {}
set commitrow($id) $row
readcommit $id
@@ -1500,7 +1501,7 @@ proc drawcmittext {id row col rmx} {
proc drawcmitrow {row} {
global displayorder rowidlist
global idrowranges idrangedrawn iddrawn
- global commitinfo commitlisted parentlist numcommits
+ global commitinfo parentlist numcommits
if {$row >= $numcommits} return
foreach id [lindex $rowidlist $row] {
diff --git a/http-push.c b/http-push.c
index 4a9dcf2..b4327d9 100644
--- a/http-push.c
+++ b/http-push.c
@@ -60,12 +60,12 @@ enum XML_Status {
#define LOCK_TIME 600
#define LOCK_REFRESH 30
-/* bits #0-6 in revision.h */
+/* bits #0-15 in revision.h */
-#define LOCAL (1u << 7)
-#define REMOTE (1u << 8)
-#define FETCHING (1u << 9)
-#define PUSHING (1u << 10)
+#define LOCAL (1u<<16)
+#define REMOTE (1u<<17)
+#define FETCHING (1u<<18)
+#define PUSHING (1u<<19)
/* We allow "recursive" symbolic refs. Only within reason, though */
#define MAXDEPTH 5
diff --git a/quote.c b/quote.c
index 7218a70..06792d4 100644
--- a/quote.c
+++ b/quote.c
@@ -144,8 +144,6 @@ static int quote_c_style_counted(const char *name, int namelen,
case '\\': /* fallthru */
case '"': EMITQ(); break;
- case ' ':
- break;
default:
/* octal */
EMITQ();
diff --git a/rev-list.c b/rev-list.c
index a4d72af..8b0ec38 100644
--- a/rev-list.c
+++ b/rev-list.c
@@ -8,9 +8,9 @@
#include "diff.h"
#include "revision.h"
-/* bits #0-6 in revision.h */
+/* bits #0-15 in revision.h */
-#define COUNTED (1u<<7)
+#define COUNTED (1u<<16)
static const char rev_list_usage[] =
"git-rev-list [OPTION] <commit-id>... [ -- paths... ]\n"
@@ -341,6 +341,8 @@ int main(int argc, const char **argv)
save_commit_buffer = revs.verbose_header;
track_object_refs = 0;
+ if (bisect_list)
+ revs.limited = 1;
prepare_revision_walk(&revs);
if (revs.tree_objects)
diff --git a/revision.c b/revision.c
index 4d2a64e..dbd54da 100644
--- a/revision.c
+++ b/revision.c
@@ -851,6 +851,17 @@ static void rewrite_parents(struct rev_info *revs, struct commit *commit)
}
}
+static void mark_boundary_to_show(struct commit *commit)
+{
+ struct commit_list *p = commit->parents;
+ while (p) {
+ commit = p->item;
+ p = p->next;
+ if (commit->object.flags & BOUNDARY)
+ commit->object.flags |= BOUNDARY_SHOW;
+ }
+}
+
struct commit *get_revision(struct rev_info *revs)
{
struct commit_list *list = revs->commits;
@@ -888,8 +899,20 @@ struct commit *get_revision(struct rev_info *revs)
}
if (commit->object.flags & SHOWN)
continue;
- if (!(commit->object.flags & BOUNDARY) &&
- (commit->object.flags & UNINTERESTING))
+
+ /* We want to show boundary commits only when their
+ * children are shown. When path-limiter is in effect,
+ * rewrite_parents() drops some commits from getting shown,
+ * and there is no point showing boundary parents that
+ * are not shown. After rewrite_parents() rewrites the
+ * parents of a commit that is shown, we mark the boundary
+ * parents with BOUNDARY_SHOW.
+ */
+ if (commit->object.flags & BOUNDARY_SHOW) {
+ commit->object.flags |= SHOWN;
+ return commit;
+ }
+ if (commit->object.flags & UNINTERESTING)
continue;
if (revs->min_age != -1 && (commit->date > revs->min_age))
continue;
@@ -902,6 +925,8 @@ struct commit *get_revision(struct rev_info *revs)
if (revs->parents)
rewrite_parents(revs, commit);
}
+ if (revs->boundary)
+ mark_boundary_to_show(commit);
commit->object.flags |= SHOWN;
return commit;
} while (revs->commits);
diff --git a/revision.h b/revision.h
index 05f658a..48d7b4c 100644
--- a/revision.h
+++ b/revision.h
@@ -7,7 +7,8 @@
#define SHOWN (1u<<3)
#define TMP_MARK (1u<<4) /* for isolated cases; clean after use */
#define BOUNDARY (1u<<5)
-#define ADDED (1u<<6) /* Parents already parsed and added? */
+#define BOUNDARY_SHOW (1u<<6)
+#define ADDED (1u<<7) /* Parents already parsed and added? */
struct rev_info;
struct log_info;
diff --git a/sha1_file.c b/sha1_file.c
index e3d0113..f2d33af 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -874,17 +874,19 @@ void packed_object_info_detail(struct pack_entry *e,
unsigned char *base_sha1)
{
struct packed_git *p = e->p;
- unsigned long offset, left;
+ unsigned long offset;
unsigned char *pack;
enum object_type kind;
offset = unpack_object_header(p, e->offset, &kind, size);
pack = p->pack_base + offset;
- left = p->pack_size - offset;
if (kind != OBJ_DELTA)
*delta_chain_length = 0;
else {
unsigned int chain_length = 0;
+ if (p->pack_size <= offset + 20)
+ die("pack file %s records an incomplete delta base",
+ p->pack_name);
memcpy(base_sha1, pack, 20);
do {
struct pack_entry base_ent;
diff --git a/t/Makefile b/t/Makefile
index fe65f53..5495985 100644
--- a/t/Makefile
+++ b/t/Makefile
@@ -25,5 +25,5 @@ clean:
rm -fr trash
.PHONY: $(T) clean
-.NOPARALLEL:
+.NOTPARALLEL: