From: Paul Smith <paul@mad-scientist.net>
To: git@vger.kernel.org
Subject: [PATCH] git-new-workdir: Don't fail if the target directory is empty
Date: Sat, 15 Nov 2014 12:49:20 -0500 [thread overview]
Message-ID: <1416073760.9305.174.camel@homebase> (raw)
>From 545c0d526eaa41f9306b567275a7d53799987482 Mon Sep 17 00:00:00 2001
From: Paul Smith <paul@mad-scientist.net>
Date: Fri, 14 Nov 2014 17:11:19 -0500
Subject: [PATCH] git-new-workdir: Don't fail if the target directory is empty
Also provide more error checking and clean up on failure.
Signed-off-by: Paul Smith <paul@mad-scientist.net>
---
Thanks Junio. I've reworked the change so it will automatically succeed
if the directory does not exists or exists but is empty, and fail
otherwise, which as far as I can tell is the behavior "git clone" uses
as well. I removed the -f flag as no longer needed. I also added some
cleanup that is performed if the new-workdir operation fails for any
reason so you don't get partly-constructed workdirs. I also added more
error checking so that we immediately stop if any step fails. Some may
suggest "set -e" but that flag can be tricky... I preferred to make the
failure explicit.
contrib/workdir/git-new-workdir | 54 +++++++++++++++++++++++++++++------------
1 file changed, 39 insertions(+), 15 deletions(-)
diff --git a/contrib/workdir/git-new-workdir b/contrib/workdir/git-new-workdir
index 75e8b25..c402000 100755
--- a/contrib/workdir/git-new-workdir
+++ b/contrib/workdir/git-new-workdir
@@ -10,6 +10,10 @@ die () {
exit 128
}
+failed () {
+ die "unable to create new workdir \"$new_workdir\"!"
+}
+
if test $# -lt 2 || test $# -gt 3
then
usage "$0 <repository> <new_workdir> [<branch>]"
@@ -48,35 +52,55 @@ then
"a complete repository."
fi
-# don't recreate a workdir over an existing repository
-if test -e "$new_workdir"
+# make sure the links use full paths
+git_dir=$(cd "$git_dir"; pwd)
+
+# don't recreate a workdir over an existing directory unless it's empty
+if test -d "$new_workdir"
then
- die "destination directory '$new_workdir' already exists."
+ if test $(ls -a1 "$new_workdir/." | wc -l) -ne 2
+ then
+ die "destination directory '$new_workdir' is not empty."
+ fi
+ was_existing=true
+else
+ mkdir -p "$new_workdir" || failed
+ was_existing=false
fi
-# make sure the links use full paths
-git_dir=$(cd "$git_dir"; pwd)
+cleanup () {
+ if $was_existing
+ then
+ rm -rf "$new_workdir"/* "$new_workdir"/.[!.] "$new_workdir"/.??*
+ else
+ rm -rf "$new_workdir"
+ fi
+}
+siglist="0 1 2 15"
+trap cleanup $siglist
-# create the workdir
-mkdir -p "$new_workdir/.git" || die "unable to create \"$new_workdir\"!"
+# create embedded directories
+for x in logs
+do
+ mkdir -p "$new_workdir/.git/$x" || failed
+done
# create the links to the original repo. explicitly exclude index, HEAD and
# logs/HEAD from the list since they are purely related to the current working
# directory, and should not be shared.
for x in config refs logs/refs objects info hooks packed-refs remotes rr-cache svn
do
- case $x in
- */*)
- mkdir -p "$(dirname "$new_workdir/.git/$x")"
- ;;
- esac
- ln -s "$git_dir/$x" "$new_workdir/.git/$x"
+ ln -s "$git_dir/$x" "$new_workdir/.git/$x" || failed
done
# now setup the workdir
-cd "$new_workdir"
+cd "$new_workdir" || failed
# copy the HEAD from the original repository as a default branch
-cp "$git_dir/HEAD" .git/HEAD
+cp "$git_dir/HEAD" .git/HEAD || failed
+
+# don't delete the new workdir on exit
+trap - $siglist
+
# checkout the branch (either the same as HEAD from the original repository, or
# the one that was asked for)
git checkout -f $branch
--
1.8.5.3
next reply other threads:[~2014-11-15 17:56 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-15 17:49 Paul Smith [this message]
2014-11-17 17:22 ` [PATCH] git-new-workdir: Don't fail if the target directory is empty Junio C Hamano
2014-11-18 17:46 ` Paul Smith
2014-11-18 19:32 ` Junio C Hamano
2014-11-18 20:54 ` Paul Smith
2014-11-18 20:58 ` Junio C Hamano
2014-11-18 22:25 ` Paul Smith
2014-11-18 22:51 ` Junio C Hamano
2014-11-19 0:57 ` Paul Smith
-- strict thread matches above, loose matches on Subject: below --
2014-11-18 19:36 Paul Smith
2014-11-18 20:15 ` Junio C Hamano
2014-11-19 17:32 ` Junio C Hamano
2014-11-20 15:41 ` Paul Smith
2014-11-20 15:46 Paul Smith
2014-11-20 17:13 ` Junio C Hamano
2014-11-21 15:08 ` Paul Smith
2014-11-21 17:33 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1416073760.9305.174.camel@homebase \
--to=paul@mad-scientist.net \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.