mkdir repo.git
cd repo.git
git --bare init
- echo -e "%s" > hooks/pre-receive
- chmod +x hooks/pre-receive
REPO=$PWD
cd ..
mkdir www
mkdir working
cd working
git init
+ mkdir www
+
+ # Commit something to www directory in repo without the activated hook
+ echo 'Bye' > www/first.html
+ git add www/first.html
+ commit_push 'Added first.html'
+
+ # Activate the hook and commit a non-mirrored file
+ echo "%s" > $REPO/hooks/post-receive
+ chmod +x $REPO/hooks/post-receive
echo 'abc' > non-mirrored-file
git add non-mirrored-file
commit_push 'Added non-mirrored-file'
- mkdir www
+
+ # Check that the first commit appears in www even if the hook was
+ # activated later (only for local sync)
+ grep -q PASSWORD $REPO/hooks/post-receive || test -f ../www/first.html
+
cd www
echo 'Hello' > index.html
git add index.html
cd ..
git rm www/index2.html
commit_push 'Removed index2'
+ git rm www/first.html
+ commit_push 'Removed first.html'
cd $REPO/..
rm -rf working repo.git www
"""
os.makedirs("refs/remotes/"+remote)
file("refs/remotes/"+remote+"/"+branch, "w").write(newrev+"\n")
-def build_change_list(changes, oldrev, newrev):
+def add_to_change_list(changes, git_command):
# Read changes
- gitdiff = Popen("/usr/bin/git diff --name-status %s %s"%(oldrev, newrev),
+ gitdiff = Popen(git_command,
stdout=PIPE, stderr=PIPE, close_fds=True, shell=True)
change_re = re.compile("(\S+)\s+(.*)$");
for line in gitdiff.stdout:
if change.inDir(options.repodir):
changes.append(change)
-
-
# Parse command line options
(options, args) = opt_parser.parse_args()
if refname == "refs/heads/master":
try:
oldrev=file("refs/remotes/ftp/master").readline().strip();
+ git_command = "/usr/bin/git diff --name-status %s %s"%(oldrev, newrev)
except IOError:
- pass
- build_change_list(changes, oldrev, newrev)
+ # We are run for the first time, so (A)dd all files in the repo.
+ git_command = r"git ls-tree -r --name-only %s | sed -e 's/\(.*\)/A \1/'"%(newrev);
+
+ add_to_change_list(changes, git_command)
if not changes:
perror("No changes to sync")