From cd5320f25228b4c3bbef2391df2696dca09d3d46 Mon Sep 17 00:00:00 2001 From: Stephan Beyer Date: Sun, 22 Jun 2008 16:07:02 +0200 Subject: [PATCH 1/5] git-rebase.sh: Add check if rebase is in progress "git rebase --continue" and friends gave nonsense errors when there is no rebase in progress. Signed-off-by: Stephan Beyer Signed-off-by: Junio C Hamano --- git-rebase.sh | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/git-rebase.sh b/git-rebase.sh index dd7dfe123c..e2d85eeeab 100755 --- a/git-rebase.sh +++ b/git-rebase.sh @@ -150,6 +150,9 @@ while test $# != 0 do case "$1" in --continue) + test -d "$dotest" -o -d .dotest || + die "No rebase in progress?" + git diff-files --quiet --ignore-submodules || { echo "You must edit all merge conflicts and then" echo "mark them as resolved using git add" @@ -178,6 +181,9 @@ do exit ;; --skip) + test -d "$dotest" -o -d .dotest || + die "No rebase in progress?" + git reset --hard HEAD || exit $? if test -d "$dotest" then @@ -203,16 +209,16 @@ do exit ;; --abort) + test -d "$dotest" -o -d .dotest || + die "No rebase in progress?" + git rerere clear if test -d "$dotest" then move_to_original_branch - elif test -d .dotest - then + else dotest=.dotest move_to_original_branch - else - die "No rebase in progress?" fi git reset --hard $(cat "$dotest/orig-head") rm -r "$dotest" From 87412ec1f17bc2705595ebabc010d94cb46478b7 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Wed, 25 Jun 2008 12:08:15 -0400 Subject: [PATCH 2/5] for-each-ref: implement missing tag values The "type" and "object" fields for tags were accepted as valid atoms, but never implemented. Consequently, they simply returned the empty string, even for valid tags. Noticed by Lea Wiemann. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- builtin-for-each-ref.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/builtin-for-each-ref.c b/builtin-for-each-ref.c index 07d9c57212..fef93d7488 100644 --- a/builtin-for-each-ref.c +++ b/builtin-for-each-ref.c @@ -234,6 +234,13 @@ static void grab_tag_values(struct atom_value *val, int deref, struct object *ob name++; if (!strcmp(name, "tag")) v->s = tag->tag; + else if (!strcmp(name, "type") && tag->tagged) + v->s = typename(tag->tagged->type); + else if (!strcmp(name, "object") && tag->tagged) { + char *s = xmalloc(41); + strcpy(s, sha1_to_hex(tag->tagged->sha1)); + v->s = s; + } } } From 2beebd22f4af8788eaf19d811de03191ae6f7c42 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Wed, 25 Jun 2008 01:41:34 -0400 Subject: [PATCH 3/5] clone: create intermediate directories of destination repo The shell version used to use "mkdir -p" to create the repo path, but the C version just calls "mkdir". Let's replicate the old behavior. We have to create the git and worktree leading dirs separately; while most of the time, the worktree dir contains the git dir (as .git), the user can override this using GIT_WORK_TREE. We can reuse safe_create_leading_directories, but we need to make a copy of our const buffer to do so. Since merge-recursive uses the same pattern, we can factor this out into a global function. This has two other cleanup advantages for merge-recursive: 1. mkdir_p wasn't a very good name. "mkdir -p foo/bar" actually creates bar, but this function just creates the leading directories. 2. mkdir_p took a mode argument, but it was completely ignored. Acked-by: Daniel Barkalow Signed-off-by: Junio C Hamano --- builtin-clone.c | 5 +++++ builtin-merge-recursive.c | 13 ++----------- cache.h | 1 + sha1_file.c | 9 +++++++++ t/t5601-clone.sh | 22 ++++++++++++++++++++++ 5 files changed, 39 insertions(+), 11 deletions(-) diff --git a/builtin-clone.c b/builtin-clone.c index 7190952071..b2dfe1ab5c 100644 --- a/builtin-clone.c +++ b/builtin-clone.c @@ -400,6 +400,9 @@ int cmd_clone(int argc, const char **argv, const char *prefix) if (!option_bare) { junk_work_tree = work_tree; + if (safe_create_leading_directories_const(work_tree) < 0) + die("could not create leading directories of '%s'", + work_tree); if (mkdir(work_tree, 0755)) die("could not create work tree dir '%s'.", work_tree); set_git_work_tree(work_tree); @@ -410,6 +413,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix) setenv(CONFIG_ENVIRONMENT, xstrdup(mkpath("%s/config", git_dir)), 1); + if (safe_create_leading_directories_const(git_dir) < 0) + die("could not create leading directories of '%s'", git_dir); set_git_dir(make_absolute_path(git_dir)); fprintf(stderr, "Initialize %s\n", git_dir); diff --git a/builtin-merge-recursive.c b/builtin-merge-recursive.c index 4aa28a1bab..43bf6aa45e 100644 --- a/builtin-merge-recursive.c +++ b/builtin-merge-recursive.c @@ -481,15 +481,6 @@ static char *unique_path(const char *path, const char *branch) return newpath; } -static int mkdir_p(const char *path, unsigned long mode) -{ - /* path points to cache entries, so xstrdup before messing with it */ - char *buf = xstrdup(path); - int result = safe_create_leading_directories(buf); - free(buf); - return result; -} - static void flush_buffer(int fd, const char *buf, unsigned long size) { while (size > 0) { @@ -512,7 +503,7 @@ static int make_room_for_path(const char *path) int status; const char *msg = "failed to create path '%s'%s"; - status = mkdir_p(path, 0777); + status = safe_create_leading_directories_const(path); if (status) { if (status == -3) { /* something else exists */ @@ -583,7 +574,7 @@ static void update_file_flags(const unsigned char *sha, close(fd); } else if (S_ISLNK(mode)) { char *lnk = xmemdupz(buf, size); - mkdir_p(path, 0777); + safe_create_leading_directories_const(path); unlink(path); symlink(lnk, path); free(lnk); diff --git a/cache.h b/cache.h index 56ac6e7f47..ca382d4622 100644 --- a/cache.h +++ b/cache.h @@ -518,6 +518,7 @@ enum sharedrepo { int git_config_perm(const char *var, const char *value); int adjust_shared_perm(const char *path); int safe_create_leading_directories(char *path); +int safe_create_leading_directories_const(const char *path); char *enter_repo(char *path, int strict); static inline int is_absolute_path(const char *path) { diff --git a/sha1_file.c b/sha1_file.c index 92299ed622..d1c406081e 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -116,6 +116,15 @@ int safe_create_leading_directories(char *path) return 0; } +int safe_create_leading_directories_const(const char *path) +{ + /* path points to cache entries, so xstrdup before messing with it */ + char *buf = xstrdup(path); + int result = safe_create_leading_directories(buf); + free(buf); + return result; +} + char *sha1_to_hex(const unsigned char *sha1) { static int bufno; diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh index 593d1a3877..b642fb260b 100755 --- a/t/t5601-clone.sh +++ b/t/t5601-clone.sh @@ -30,4 +30,26 @@ test_expect_success 'clone checks out files' ' ' +test_expect_success 'clone respects GIT_WORK_TREE' ' + + GIT_WORK_TREE=worktree git clone src bare && + test -f bare/config && + test -f worktree/file + +' + +test_expect_success 'clone creates intermediate directories' ' + + git clone src long/path/to/dst && + test -f long/path/to/dst/file + +' + +test_expect_success 'clone creates intermediate directories for bare repo' ' + + git clone --bare src long/path/to/bare/dst && + test -f long/path/to/bare/dst/config + +' + test_done From df79b9fdb863648fe27771ac373adb665cab066e Mon Sep 17 00:00:00 2001 From: Dmitry Potapov Date: Wed, 25 Jun 2008 12:26:55 +0400 Subject: [PATCH 4/5] fix update-hook-example to work with packed tag references The update-hook-example used 'test -f' to check the tag present, which does not work if the checked reference is packed. This check has been changed to use 'git rev-parse $tag' instead. Signed-off-by: Dmitry Potapov Signed-off-by: Junio C Hamano --- Documentation/howto/update-hook-example.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/howto/update-hook-example.txt b/Documentation/howto/update-hook-example.txt index 88765b5575..a8d3bae408 100644 --- a/Documentation/howto/update-hook-example.txt +++ b/Documentation/howto/update-hook-example.txt @@ -68,7 +68,7 @@ function info { # - Branches should only be fast-forwarded. case "$1" in refs/tags/*) - [ -f "$GIT_DIR/$1" ] && + git rev-parse --verify -q "$1" && deny >/dev/null "You can't overwrite an existing tag" ;; refs/heads/*) From e636106c76e0273334940d899de1c928d08b29e8 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Wed, 25 Jun 2008 17:09:40 -0700 Subject: [PATCH 5/5] GIT 1.5.6.1 Signed-off-by: Junio C Hamano --- Documentation/RelNotes-1.5.6.1.txt | 28 ++++++++++++++++++++++++++++ Documentation/git.txt | 11 ++++++----- RelNotes | 2 +- 3 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 Documentation/RelNotes-1.5.6.1.txt diff --git a/Documentation/RelNotes-1.5.6.1.txt b/Documentation/RelNotes-1.5.6.1.txt new file mode 100644 index 0000000000..4864b16445 --- /dev/null +++ b/Documentation/RelNotes-1.5.6.1.txt @@ -0,0 +1,28 @@ +GIT v1.5.6.1 Release Notes +========================== + +Fixes since v1.5.6 +------------------ + +* Last minute change broke loose object creation on AIX. + +* (performance fix) We used to make $GIT_DIR absolute path early in the + programs but keeping it relative to the current directory internally + gives 1-3 per-cent performance boost. + +* bash completion knows the new --graph option to git-log family. + + +* git-diff -c/--cc showed unnecessary "deletion" lines at the context + boundary. + +* git-for-each-ref ignored %(object) and %(type) requests for tag + objects. + +* git-merge usage had a typo. + +* Rebuilding of git-svn metainfo database did not take rewriteRoot + option into account. + +* Running "git-rebase --continue/--skip/--abort" before starting a + rebase gave nonsense error messages. diff --git a/Documentation/git.txt b/Documentation/git.txt index 7414238fe5..85468a154d 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -43,12 +43,13 @@ unreleased) version of git, that is available from 'master' branch of the `git.git` repository. Documentation for older releases are available here: -* link:v1.5.6/git.html[documentation for release 1.5.6] +* link:v1.5.6.1/git.html[documentation for release 1.5.6.1] * release notes for - link:RelNotes-1.5.6.txt[1.5.6], + link:RelNotes-1.5.6.1.txt[1.5.6.1]. + link:RelNotes-1.5.6.txt[1.5.6]. -* link:v1.5.5/git.html[documentation for release 1.5.5] +* link:v1.5.5.4/git.html[documentation for release 1.5.5.4] * release notes for link:RelNotes-1.5.5.4.txt[1.5.5.4], @@ -57,8 +58,6 @@ Documentation for older releases are available here: link:RelNotes-1.5.5.1.txt[1.5.5.1], link:RelNotes-1.5.5.txt[1.5.5]. -* link:v1.5.5.4/git.html[documentation for release 1.5.5.4] - * link:v1.5.4.5/git.html[documentation for release 1.5.4.5] * release notes for @@ -82,6 +81,8 @@ Documentation for older releases are available here: link:RelNotes-1.5.3.1.txt[1.5.3.1], link:RelNotes-1.5.3.txt[1.5.3]. +* link:v1.5.2.5/git.html[documentation for release 1.5.2.5] + * release notes for link:RelNotes-1.5.2.5.txt[1.5.2.5], link:RelNotes-1.5.2.4.txt[1.5.2.4], diff --git a/RelNotes b/RelNotes index e29d6504d9..ebc4b20148 120000 --- a/RelNotes +++ b/RelNotes @@ -1 +1 @@ -Documentation/RelNotes-1.5.6.txt \ No newline at end of file +Documentation/RelNotes-1.5.6.1.txt \ No newline at end of file