* Re: [PATCH 1/2] t7001: add test for git-mv dir1 dir2/
From: Jon Smirl @ 2006-07-26 20:33 UTC (permalink / raw)
To: Junio C Hamano, Petr Baudis; +Cc: git
In-Reply-To: <7vmzawqi1m.fsf@assigned-by-dhcp.cox.net>
On 7/26/06, Junio C Hamano <junkio@cox.net> wrote:
> Junio C Hamano <junkio@cox.net> writes:
>
> > "Jon Smirl" <jonsmirl@gmail.com> writes:
> >
> >> git diff HEAD makes a much longer patch that deltas out the existing
> >> files and delta in the new file.
> >>
> >> It's applying patches in the extended git format that fails.
> >
> > Thanks.
>
> ... and it turns out that "git apply" (with or without --index)
> groks it just fine. I suspect the fix is quite recent (not in
> v1.4.2-rc1 but in v1.4.2-rc2).
I can confirm that git apply is handling this correctly with code from
the current git tree. cogito is failing this case.
--
Jon Smirl
jonsmirl@gmail.com
^ permalink raw reply
* [PATCH] cvsserver: imitate git-update-ref when committing
From: Johannes Schindelin @ 2006-07-26 20:51 UTC (permalink / raw)
To: git, junkio, Martin Langhoff
git-update-ref writes into the lockfile, and renames it afterwards. Like
commit v1.3.0-rc3~22, it is not only cleaner, but also helps with shared
setups: every developer can have a different primary group; what matters
is that $GIT_DIR/refs/heads has to be writable by a group you are in.
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
---
git-cvsserver.perl | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/git-cvsserver.perl b/git-cvsserver.perl
index 1b70cd9..2c1b0c7 100755
--- a/git-cvsserver.perl
+++ b/git-cvsserver.perl
@@ -1144,9 +1144,7 @@ sub req_ci
exit;
}
- open FILE, ">", "$ENV{GIT_DIR}refs/heads/$state->{module}";
- print FILE $commithash;
- close FILE;
+ print LOCKFILE $commithash;
$updater->update();
@@ -1173,7 +1171,9 @@ sub req_ci
}
close LOCKFILE;
- unlink($lockfile);
+ my $reffile = "$ENV{GIT_DIR}refs/heads/$state->{module}";
+ unlink($reffile);
+ rename($lockfile, $reffile);
chdir "/";
print "ok\n";
--
1.4.2.rc2.g2b3d-dirty
^ permalink raw reply related
* Challenge: Importing Mozilla CVS into git
From: Jon Smirl @ 2006-07-26 21:08 UTC (permalink / raw)
To: git
If anyone is looking for a project, it is still not possible to import
Mozilla CVS into git and then do increment updates. As I recall from
the last time I played with it, cvsps throws away some of the branches
because it thinks they are in a loop. parsecvs is unable to complete
the entire import without getting errors and aborting.
cvs2svn can import the entire Mozilla repository correctly. But it
imports it to svn and does not have incremental support.
Best solution would be to use the parser from parsecvs, apply the
change set detection algorithm from cvs2svn, and then add cvsps'
incremental update.
It's also not reasonable to fork git processes, there are about a
million change sets in Mozilla and it takes days of CPU time to do 1M
forks. The import app needs to use a library version of git. Another
tactic to reduce CPU time is to directly write pack files with the
delta in a first pass, and add the change set index in a later pass.
--
Jon Smirl
jonsmirl@gmail.com
^ permalink raw reply
* [PATCH] instaweb: Be more clear if httpd or the browser fail
From: Johannes Schindelin @ 2006-07-26 21:11 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, Eric Wong
In-Reply-To: <Pine.LNX.4.63.0607262153380.29667@wbgn013.biozentrum.uni-wuerzburg.de>
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
---
On Wed, 26 Jul 2006, Johannes Schindelin wrote:
> Well, the fallback mechanism might not be that useful anyway: if you have
> apache, you have to specify the modules path. I'll do a patch instead
> which exits cleanly if either $httpd or $browser could not be executed,
> okay?
Here you are
git-instaweb.sh | 9 +++++++--
1 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/git-instaweb.sh b/git-instaweb.sh
index 1d3ea73..585ad7c 100755
--- a/git-instaweb.sh
+++ b/git-instaweb.sh
@@ -54,6 +54,10 @@ start_httpd () {
fi
done
fi
+ if test $? != 0; then
+ echo "Could not execute http daemon $httpd."
+ exit 1
+ fi
}
stop_httpd () {
@@ -189,7 +193,7 @@ EOF
else
# plain-old CGI
list_mods=`echo "$httpd" | sed "s/-f$/-l/"`
- $list_mods | grep 'mod_cgi\.c' >/dev/null || \
+ $list_mods | grep 'mod_cgi\.c' >/dev/null 2>&1 || \
echo "LoadModule cgi_module $module_path/mod_cgi.so" >> "$conf"
cat >> "$conf" <<EOF
AddHandler cgi-script .cgi
@@ -239,4 +243,5 @@ esac
start_httpd
test -z "$browser" && browser=echo
-$browser http://127.0.0.1:$port
+url=http://127.0.0.1:$port
+$browser $url || echo $url
--
1.4.2.rc2.g84db
^ permalink raw reply related
* Re: [PATCH 3/5] git-instaweb: store parameters in config
From: Johannes Schindelin @ 2006-07-26 21:13 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, Eric Wong
In-Reply-To: <Pine.LNX.4.63.0607262147280.29667@wbgn013.biozentrum.uni-wuerzburg.de>
Hi,
On Wed, 26 Jul 2006, Johannes Schindelin wrote:
> On Wed, 26 Jul 2006, Junio C Hamano wrote:
>
> > Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> >
> > > It already reads the config for defaults, and now it also stores
> > > the last passed parameters in the config.
> >
> > This might need to be conditional -- usually people override the
> > default from the command line as a one-shot thing, and storing
> > them in the configuration file would upset them.
>
> I agree that this should be conditional, but the other way round, no?
Being bitten by my own words. It is plain dumb to store parameters for
which instaweb fails. And my patch did that. Oh, well.
So, I'd say: just forget about patches [3-5]/5.
Ciao,
Dscho
^ permalink raw reply
* Better Future, world-copied
From: Kristen Santiago @ 2006-07-26 21:34 UTC (permalink / raw)
To: git-commits-head-owner
Your cre dit doesn't matter to us! If you OWN real est ate
and want IMMEDIATE3 cash to spend ANY way you like, or simply wish
to LOWER your monthly paym ents by a third or more, here are the dea ls
we have TODAY (hurry, these ofers will expre TONIGHT):
$488,000.00 at a 3.67,% fixed-rate3
$372,000.00 at a 3.90,% variable-rate7
$492,000.00 at a 3.21,% interest-onlyD
$248,000.00 at a 3.36,% fixed-rate1
$198,000.00 at a 3.55,% variable-rateU
Hurry, when these deals are gone, they are gone Simply fill out this one-min ute form...
Don't worry about approval, your cre dit will not disqualify you!
http://3UPOYVRD.doolies.net
see the downed helicopter some where on his left and the ore flatcars up
over my head. It's never been any other way. Where is all this gunk coming
secondly, he's been kind of strange lately." Arthur laughed and shook his
Since childhood he had relied on nothing but himself. And since childhood
to him, the quagmire had sucked him in up to his knees.
"Glad to meet you, Mr. Schuhart. How are you? You know, we've met
the joints; it seemed to him, through the hot haze that was enveloping his
more, and Throaty's unblinking angelic eyes stared at Redrick, a porcelain
place. Redrick's parboiled hands ached, and the backpack kept bumping into
nothing.
When they finally scrambled out onto dry land that was covered by
^ permalink raw reply
* Re: [PATCH] Eliminate Scalar::Util usage from private-Error.pm
From: Petr Baudis @ 2006-07-26 21:34 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: Junio C Hamano, git
In-Reply-To: <Pine.LNX.4.63.0607260416070.29667@wbgn013.biozentrum.uni-wuerzburg.de>
Hi!
Dear diary, on Wed, Jul 26, 2006 at 04:25:13AM CEST, I got a letter
where Johannes Schindelin <Johannes.Schindelin@gmx.de> said that...
> Nope. The culprit is
>
> use lib (split(/:/, $ENV{GITPERLLIB} || "/Library/Perl/darwin"));
>
> The latter, /Library/Perl/darwin comes from making "instlibdir" in perl/,
> which in turn is generated by "perl Makefile.PL". Calling the latter with
> PREFIX set does not change the output of "instlibdir" in any way.
xpasky@machine[1:0]~/git-pb/perl$ perl Makefile.PL && make instlibdir
Writing Makefile for Git
/usr/lib/perl5/site_perl/5.8.8/i686-linux
xpasky@machine[1:0]~/git-pb/perl$ perl Makefile.PL PREFIX=/home/xpasky && make instlibdir
Writing Makefile for Git
/home/xpasky/lib/perl5/site_perl/5.8.8/i686-linux
But it wouldn't help anyway, you would need to install git "to
itself", which I'm not sure how well works.
I think in previous discussions it was deemed acceptable to require
the user running Git in place to set PERL5LIB so that Git.pm is found.
--
Petr "Pasky" Baudis
Stuff: http://pasky.or.cz/
Snow falling on Perl. White noise covering line noise.
Hides all the bugs too. -- J. Putnam
^ permalink raw reply
* Licensing and the library version of git
From: Jon Smirl @ 2006-07-26 21:36 UTC (permalink / raw)
To: git
Can the library version of git be licensed LGPL instead of GPL? If it
is GPL then it can't be linked into non-GPL projects like Eclipse.
--
Jon Smirl
jonsmirl@gmail.com
^ permalink raw reply
* Re[2]: from Carolina
From: Carito @ 2006-07-26 21:49 UTC (permalink / raw)
To: Felix
Hello, Felix
I want to start my first letter from a question: "Is it possible to be happy without LOVE?"
I think that you will agree with me if the answer will be "NO WAY". Love is the most beautiful and exciting thing
that may happen between man and woman! It inspires us only for doing positive things towards each other.
One very famous writer said: "The beauty will rescue the world" i agree with his words but still i would add :
" LOVE and Beauty will rescure the world".
I hope you agree with me that Love is a big notion.
There's love to God, to Mother, to a child to the country where you were born, and there's love that joins a man
and woman for all their life. That is the LOVE i'm looking for! And i'm seeking for the man who is also eager to have
this life long adventure full of surprises and new experience we can share together! Will you join me for this trip?
I do realise that it should be very difficult to say "Yes" from the first letter having no idea about me.
That's why i just offer to get to know each other better though correspondence that will help us to reveal many things
about each other whether we mach perfectly or not. In addition you can look at my pictures and read some info about me here
http://dating-foryou.com/passion/
I hope you'll like what you see and read there.
Well closing my first letter to you i just want to thank you for reading it and i really hope that you'll share
my point of view on what i said above. I do really hope that you'll answer me soon.
Best regards.....
Carito
If you think that you were subscribed by mistake for this mail
delivery or if your email has been added without your permission,
please, visit http://dating-foryou.com/passion/ and unsubscribe from our mails.
^ permalink raw reply
* [PATCH] Add description on how to use an HTTP proxy with git.
From: Robin Rosenberg @ 2006-07-26 22:23 UTC (permalink / raw)
To: git
From: Robin Rosenberg <robin.rosenberg@dewire.com>
---
Documentation/urls.txt | 9 ++++++++-
1 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/Documentation/urls.txt b/Documentation/urls.txt
index 7477413..fb94162 100644
--- a/Documentation/urls.txt
+++ b/Documentation/urls.txt
@@ -8,6 +8,13 @@ to name the remote repository:
- rsync://host.xz/path/to/repo.git/
- http://host.xz/path/to/repo.git/
- https://host.xz/path/to/repo.git/
+===============================================================
+
+If you need to use an HTTP proxy you can set the `http_proxy`
+environment variable to a suitable value, e.g.
+`proxy.mydomain.com:8080`. This is a libcurl feature.
+
+===============================================================
- git://host.xz/path/to/repo.git/
- git://host.xz/~user/path/to/repo.git/
- ssh://host.xz/path/to/repo.git/
@@ -15,7 +22,7 @@ to name the remote repository:
- ssh://host.xz/~/path/to/repo.git
===============================================================
-SSH Is the default transport protocol and also supports an
+SSH is the default transport protocol and also supports an
scp-like syntax. Both syntaxes support username expansion,
as does the native git protocol. The following three are
identical to the last three above, respectively:
^ permalink raw reply related
* Re: [PATCH 5/5] git-instaweb: If firefox was not found, just print the URL
From: Eric Wong @ 2006-07-26 22:40 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: git, junkio
In-Reply-To: <Pine.LNX.4.63.0607261634200.29667@wbgn013.biozentrum.uni-wuerzburg.de>
Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
>
> Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
> ---
> git-instaweb.sh | 1 +
> 1 files changed, 1 insertions(+), 0 deletions(-)
>
> diff --git a/git-instaweb.sh b/git-instaweb.sh
> index 242b55e..340ab98 100755
> --- a/git-instaweb.sh
> +++ b/git-instaweb.sh
> @@ -245,4 +245,5 @@ esac
>
> start_httpd
> test -z "$browser" && browser=echo
> +which "$browser" >/dev/null 2>&1 || browser=echo
> $browser http://127.0.0.1:$port
>From what I hear, 'which' isn't portable on some platforms.
Now this isn't the only place 'which' is used in instaweb, and I've been
meaning to get rid of the other 'which' call in there for a while, but I
haven't had much time to devote to git the past few weeks. Help here
would be good.
--
Eric Wong
^ permalink raw reply
* Re: [PATCH 0/5] Some git-instaweb enhancements
From: Eric Wong @ 2006-07-26 22:41 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: git, junkio
In-Reply-To: <Pine.LNX.4.63.0607261628020.29667@wbgn013.biozentrum.uni-wuerzburg.de>
Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
> Hi,
>
> these are assorted fixes/features for git-instaweb:
>
> 1) do not mind git being installed somewhere else than /usr/bin
> 2) do not mind some Apache having mod_cgi builtin
> 3) store defaults in config
> 4) fall back to apache if lighttp cannot be found
1-4:
Acked-by: Eric Wong <normalperson@yhbt.net>
--
Eric Wong
^ permalink raw reply
* Re: Moving a directory into another fails
From: Nicolas Vilz @ 2006-07-26 22:34 UTC (permalink / raw)
To: Jon Smirl; +Cc: git
In-Reply-To: <9e4733910607260800v618edf0em7b0f5c3332bf8fc5@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 1887 bytes --]
On Wed, Jul 26, 2006 at 11:00:48AM -0400, Jon Smirl wrote:
> I cloned a git project. Then in the original I did mkdir for a new
> directory and use git mv to move an existing directory into it. I then
> used cg diff to generate a patch for the move.
>
> When I use cg patch to apply this patch to the cloned tree it fails.
> This seems to be a problem in the git code, not cg. It is not picking
> up the creation of the new intervening subdirectory correctly.
>
> I just synced and this does not work in the current code.
I tried to reproduce your scenario and before that I setup a test
repository.
(1) mkdir git_test
(2) cd git_test
(3) git init-db
(4) vim test.txt
# fill in some bogus text
(5) mkdir testing
(6) cd testing
(7) vim test1.txt
# again, fill in some bogus text
(8) cd ..
(9) cg add test.txt testing/test1.txt
(10) cg commit -C
# just give a fancy commit message...
(11) cd ..
(12) mkdir bare_git
(13) cd bare_git
(14) mkdir git_test.git
(15) GIT_DIR=git_test.git git init-db
(16) cd ../git_test
(17) git push ../bare_git/git_test.git --all
(18) cd ../
(19) git clone bare_git/git_test.git git_test2
(20) cd git_test
(21) mkdir blah_test
(22) git mv testing/ blah_test/
(23) cg diff > ../mkdir_patch.diff
(24) cd ..
(25) cd git_test2/
(26) cg patch < ../mkdir_patch.diff
from the last one (26) i get
patching file blah_test/testing/test1.txt
patching file testing/test1.txt
touch: cannot touch `testing/test1.txt': No such file or directory
Adding file blah_test/testing/test1.txt
Removing file testing/test1.txt
but the result is correct. There is no testing-directory in here
anymore, and inside blah_test, there is my testing dir with the file
test1.txt in it...
did I miss something?
I use cogito-0.17.3 with git version 1.4.1
(obviously without that recently rewritten git-mv...)
Nicolas
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply
* Re: Moving a directory into another fails
From: Jon Smirl @ 2006-07-26 23:03 UTC (permalink / raw)
To: Nicolas Vilz; +Cc: git
In-Reply-To: <20060726223459.GA30601@vsectoor.geht-ab-wie-schnitzel.de>
This is a simpler sequence
cg clone git foo
cg clone git foo1
cd foo
mkdir zzz
git mv gitweb zzz
cg diff >patch
cg ../foo1
cg patch <../foo/patch
Fails with these errors. We have determined that git apply patch is ok
and this is a bug in cg patch.
[jonsmirl@jonsmirl foo1]$ cg patch <../foo/patch
mv: cannot move `gitweb/README' to `zzz/gitweb/README': No such file
or directory
mv: cannot move `gitweb/gitweb.cgi' to `zzz/gitweb/gitweb.cgi': No
such file or directory
mv: cannot move `gitweb/gitweb.css' to `zzz/gitweb/gitweb.css': No
such file or directory
mv: cannot stat `"gitweb/test/M\\303\\244rchen"': No such file or directory
mv: cannot move `gitweb/test/file with spaces' to
`zzz/gitweb/test/file with spaces': No such file or directory
mv: cannot move `gitweb/test/file+plus+sign' to
`zzz/gitweb/test/file+plus+sign': No such file or directory
patch: **** Only garbage was found in the patch input.
Removing file gitweb/README
Adding file zzz/gitweb/README
error: zzz/gitweb/README: does not exist and --remove not passed
fatal: Unable to process file zzz/gitweb/README
cg-add: warning: not all items could have been added
Removing file gitweb/gitweb.cgi
Adding file zzz/gitweb/gitweb.cgi
error: zzz/gitweb/gitweb.cgi: does not exist and --remove not passed
fatal: Unable to process file zzz/gitweb/gitweb.cgi
cg-add: warning: not all items could have been added
Removing file gitweb/gitweb.css
Adding file zzz/gitweb/gitweb.css
error: zzz/gitweb/gitweb.css: does not exist and --remove not passed
fatal: Unable to process file zzz/gitweb/gitweb.css
cg-add: warning: not all items could have been added
Removing file "gitweb/test/Märchen"
Adding file "zzz/gitweb/test/Märchen"
error: "zzz/gitweb/test/Märchen": does not exist and --remove not passed
fatal: Unable to process file "zzz/gitweb/test/Märchen"
cg-add: warning: not all items could have been added
Removing file gitweb/test/file with spaces
Adding file zzz/gitweb/test/file with spaces
error: zzz/gitweb/test/file with spaces: does not exist and --remove not passed
fatal: Unable to process file zzz/gitweb/test/file with spaces
cg-add: warning: not all items could have been added
Removing file gitweb/test/file+plus+sign
Adding file zzz/gitweb/test/file+plus+sign
error: zzz/gitweb/test/file+plus+sign: does not exist and --remove not passed
fatal: Unable to process file zzz/gitweb/test/file+plus+sign
cg-add: warning: not all items could have been added
[jonsmirl@jonsmirl foo1]$
--
Jon Smirl
jonsmirl@gmail.com
^ permalink raw reply
* Re: Moving a directory into another fails
From: Nicolas Vilz @ 2006-07-26 23:25 UTC (permalink / raw)
To: Jon Smirl; +Cc: git
In-Reply-To: <9e4733910607261603m6772602cr333d8c58f555edaa@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 509 bytes --]
On Wed, Jul 26, 2006 at 07:03:30PM -0400, Jon Smirl wrote:
> This is a simpler sequence
>
> cg clone git foo
> cg clone git foo1
> cd foo
> mkdir zzz
> git mv gitweb zzz
> cg diff >patch
> cg ../foo1
> cg patch <../foo/patch
>
> Fails with these errors. We have determined that git apply patch is ok
> and this is a bug in cg patch.
Well, perhaps i should react faster and I shouldn't pause my fetchmail
for 2 or 3 hours... this is bad for this list :) You are kind of fast :)
Nicolas
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply
* Re: Slow fetches of tags
From: Junio C Hamano @ 2006-07-26 23:27 UTC (permalink / raw)
To: Ralf Baechle; +Cc: git, Johannes Schindelin, Linus Torvalds
In-Reply-To: <20060525131241.GA8443@linux-mips.org>
Ralf Baechle <ralf@linux-mips.org> writes:
> On Wed, May 24, 2006 at 04:43:02PM -0700, Linus Torvalds wrote:
>
>> Actually, maybe the problem is that Ralf's tree has two roots, because of
>> the old CVS history. It might be following the other root down for the
>> "have" part, since that one doesn't exist at all in the target and the
>> other side will never acknowledge any of it.
>>
>> I'll play with it.
>
> Interesting idea, so I went to play with it, too. I took a copy of the
> tree and deleted all branches except the v2.6.16-stable tracking branch
> which I pruned back to v2.6.16.17, then added a new branch starting at
> the oldest commit, your initial import of the kernel tree:
I've been looking at this issue again...
> $ git branch junk 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2
> $ git checkout junk
> $ seq -f "%05.0f" 1 100 | while read i; do echo $i; echo $i > Makefile;\
> git commit -s -m "Blah $i" Makefile; done
>
> So with this I get:
>
> $ git branch
> * junk
> v2.6.16-stable
> $
>
> If I now run
>
> $ strace git-fetch-pack --thin git://www.kernel.org/pub/scm/linux/kernel/\
> git/stable/linux-2.6.16.y.git \
> refs/heads/master refs/tags/v2.6.16.18 2>&1 | grep have /tmp/xxx
>
> I get:
... 100 newest commits from the junk branch and then all the
tags the downloader has are sent as "have"s.
Now, sending the newest commits before sending the tags is
unavoidable, since the other end does not know where you forked
at (the purpose of the handshake is to find out where to begin
with). But as soon as you send v2.6.16.17 (the latest tag that
you have in common with the other side, _and_ is a proper
ancestor of what you want -- v2.6.16.18 but that fact you do not
know yet), the server end should be able to say "ok, we know
enough". That is not happening.
A few hints for debugging this:
* local test is easier -- fetch-pack spawns upload-pack using
PATH and GIT_EXEC_PATH so set them to point at the updated
upload-pack being tested.
* Passing the standard error from "fetch-pack -v" to "name-rev
--stdin" makes it a bit more pleasant to see what is going on.
With the attached patch, the server side tells the client to
stop immediately after it says it has the commit tagged as
v2.6.16.17 while asking for v2.6.16.18. With your "100 commits
on junk" repository, it does not make much of a difference,
though. The reasons are (1) the 100 commits on "junk" are much
younger than any of the tags, so they are sent anyway, (2) we
have a 32-commit window, and keep one window in flight to make
the protocol stream, which means there will be max 64 "have"
that are in flight unacked, and a clone of linux-2.6.16.y
repository that has up to v2.6.16.17 tag has only 52 tags.
So we end up sending all the tags anyway in this particular
case.
I've thought about sending tags and only _tips_ of branches
first, but I think that would have a grave performance impact on
more normal cases. If you are dealing with a remote repository
with a bunch of tags, your "master" is ahead of the remote
repository, and you do not use tracking branch to track the
remote (pretend you are Linus and pulling from a subsystem
maintainer), then you obviously do not want to send v2.6.12-rc2
tag before you send commits from your "master" branch to get to
where your subsystem maintainer forked from you (otherwise the
remote side would say "I do not know your 'master' commit, but
now we know we have this ancient v2.6.12-rc2 in common, so let's
have a pack between that and the tip of the subsystem tree"), so
I do think sending "100 commits on junk branch" is unavoidable.
I think the attached patch is safe in general, but somebody may
want to give an extra set of eyeballs to double check the logic
is sane.
-- >8 --
upload-pack: squelch downloader more aggressively under multi-ack
When the server side sees "have" line that makes all the "want"
commits somehow reachable from one of the "have" lines so far,
stop responding "continue" to prevent the other end going down
to send too many refs.
---
diff --git a/upload-pack.c b/upload-pack.c
index 617ee46..ac42d0d 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -452,8 +452,13 @@ static int get_common_commits(void)
default:
memcpy(hex, sha1_to_hex(sha1), 41);
if (multi_ack) {
- const char *msg = "ACK %s continue\n";
- packet_write(1, msg, hex);
+ const char *msg = "ACK %s%s\n";
+ const char *cont = " continue";
+ if (ok_to_give_up()) {
+ cont = "";
+ multi_ack = 0;
+ }
+ packet_write(1, msg, hex, cont);
memcpy(last_hex, hex, 41);
}
else if (have_obj.nr == 1)
^ permalink raw reply related
* local clone performance
From: Jon Smirl @ 2006-07-26 23:38 UTC (permalink / raw)
To: git
Comparing git-clone to cg-clone
[jonsmirl@jonsmirl apps]$ time git-clone git foo
......
real 0m5.755s
user 0m4.548s
sys 0m0.512s
[jonsmirl@jonsmirl apps]$ time cg-clone git foo
....
real 0m18.970s
user 0m10.737s
sys 0m1.392s
Why does it take cg clone so long to set up the missing tags?
git-clone is over 3x faster.
--
Jon Smirl
jonsmirl@gmail.com
^ permalink raw reply
* Re: [PATCH] cvsserver: imitate git-update-ref when committing
From: Shawn Pearce @ 2006-07-27 0:21 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: git
In-Reply-To: <Pine.LNX.4.63.0607262249010.29667@wbgn013.biozentrum.uni-wuerzburg.de>
You might want to also consider appending to the reflog, if it
exists/is enabled. I still need to get upload-pack to do this but it
may be useful for some heads for some people... or maybe not. :-)
Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
>
> git-update-ref writes into the lockfile, and renames it afterwards. Like
> commit v1.3.0-rc3~22, it is not only cleaner, but also helps with shared
> setups: every developer can have a different primary group; what matters
> is that $GIT_DIR/refs/heads has to be writable by a group you are in.
>
> Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
> ---
> git-cvsserver.perl | 8 ++++----
> 1 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/git-cvsserver.perl b/git-cvsserver.perl
> index 1b70cd9..2c1b0c7 100755
> --- a/git-cvsserver.perl
> +++ b/git-cvsserver.perl
> @@ -1144,9 +1144,7 @@ sub req_ci
> exit;
> }
>
> - open FILE, ">", "$ENV{GIT_DIR}refs/heads/$state->{module}";
> - print FILE $commithash;
> - close FILE;
> + print LOCKFILE $commithash;
>
> $updater->update();
>
> @@ -1173,7 +1171,9 @@ sub req_ci
> }
>
> close LOCKFILE;
> - unlink($lockfile);
> + my $reffile = "$ENV{GIT_DIR}refs/heads/$state->{module}";
> + unlink($reffile);
> + rename($lockfile, $reffile);
> chdir "/";
>
> print "ok\n";
> --
> 1.4.2.rc2.g2b3d-dirty
--
Shawn.
^ permalink raw reply
* Re: [PATCH 5/5] git-instaweb: If firefox was not found, just print the URL
From: Eric Wong @ 2006-07-27 1:12 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: git, junkio
In-Reply-To: <20060726224049.GA16645@localdomain>
Eric Wong <normalperson@yhbt.net> wrote:
Oops, I forgot to run offlineimap for a few hours and was desynced.
Disregard my messages, thanks.
--
Eric Wong
^ permalink raw reply
* Re: print errors from git-update-ref
From: Shawn Pearce @ 2006-07-27 1:28 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Alex Riesen, Git Mailing List
In-Reply-To: <7vk663h6zi.fsf@assigned-by-dhcp.cox.net>
Junio C Hamano <junkio@cox.net> wrote:
> "Alex Riesen" <raa.lkml@gmail.com> writes:
>
> > ...otherwise it not clear what happened when update-ref fails.
> >
> > E.g., git checkout -b a/b/c HEAD would print nothing if refs/heads/a
> > exists and is a directory (it does return 1, so scripts checking for
> > return code should be ok).
>
> My gut feeling is that complaining from update-ref is fine, but
> I am still tired after a long week and not thinking straight, so
> I will not be applying this tonight.
So I looked into this issue tonight. For starters I can't seem to
reproduce the situtation reported by Alex, and since he didn't
supply new test cases its difficult to actually fix it.
I did however find problems with git-update-ref a/b/c when a is
actually an existing ref. This didn't report any error, so here's
a fix. It may resolve Alex's problem - or maybe not.
-->8--
Display an error from update-ref if target ref name is invalid.
Alex Riesen (raa.lkml@gmail.com) recently observed that git branch
would fail with no error message due to unexpected situations with
regards to refs. For example, if .git/refs/heads/gu is a file but
`git branch -b refs/heads/gu/fixa HEAD` was invoked by the user
it would fail silently due to refs/heads/gu being a file and not
a directory.
This change adds a test for trying to create a ref within a directory
that is actually currently a file, and adds error printing within
the ref locking routine should the resolve operation fail.
The error printing code probably belongs at this level of the library
as other failures within the ref locking, writing and logging code
are also currently at this level of the code.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
refs.c | 33 +++++++++++++++++++++++++++++++++
t/t1400-update-ref.sh | 12 ++++++++++++
2 files changed, 45 insertions(+), 0 deletions(-)
diff --git a/refs.c b/refs.c
index 56db394..e99e9e4 100644
--- a/refs.c
+++ b/refs.c
@@ -290,10 +290,33 @@ static struct ref_lock *verify_lock(stru
return lock;
}
+static char* not_a_directory (const char *orig_path)
+{
+ char *p = strdup(orig_path);
+ struct stat st;
+
+ do {
+ char * s = strrchr(p, '/');
+ if (s) {
+ *s = 0;
+ if (lstat(p, &st) == 0 && S_ISDIR(st.st_mode)) {
+ *s = '/';
+ break;
+ }
+ } else {
+ strcpy(p, orig_path);
+ break;
+ }
+ } while (errno == ENOTDIR);
+
+ return p;
+}
+
static struct ref_lock *lock_ref_sha1_basic(const char *path,
int plen,
const unsigned char *old_sha1, int mustexist)
{
+ const char *orig_path = path;
struct ref_lock *lock;
struct stat st;
@@ -303,7 +326,17 @@ static struct ref_lock *lock_ref_sha1_ba
plen = strlen(path) - plen;
path = resolve_ref(path, lock->old_sha1, mustexist);
if (!path) {
+ int last_errno = errno;
+ if (errno == ENOTDIR) {
+ char* p = not_a_directory(orig_path);
+ error("unable to resolve reference %s: %s",
+ p, strerror(errno));
+ free(p);
+ } else
+ error("unable to resolve reference %s: %s",
+ orig_path, strerror(errno));
unlock_ref(lock);
+ errno = last_errno;
return NULL;
}
lock->lk = xcalloc(1, sizeof(struct lock_file));
diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh
index 04fab26..e73827c 100755
--- a/t/t1400-update-ref.sh
+++ b/t/t1400-update-ref.sh
@@ -14,6 +14,8 @@ D=44444444444444444444444444444444444444
E=5555555555555555555555555555555555555555
F=6666666666666666666666666666666666666666
m=refs/heads/master
+n_dir=refs/heads/gu
+n=$n_dir/fixes
test_expect_success \
"create $m" \
@@ -26,6 +28,16 @@ test_expect_success \
rm -f .git/$m
test_expect_success \
+ "fail to create $n" \
+ 'touch .git/$n_dir
+ git-update-ref $n $A >out 2>err
+ test $? = 1 &&
+ test "" = "$(cat out)" &&
+ grep "error: unable to resolve reference" err &&
+ grep $n_dir err'
+rm -f .git/$n_dir out err
+
+test_expect_success \
"create $m (by HEAD)" \
'git-update-ref HEAD $A &&
test $A = $(cat .git/$m)'
--
1.4.2.rc1.g802da
^ permalink raw reply related
* Re: Licensing and the library version of git
From: Shawn Pearce @ 2006-07-27 1:40 UTC (permalink / raw)
To: Jon Smirl; +Cc: git
In-Reply-To: <9e4733910607261436v4c0802e5v7301e904593f9bab@mail.gmail.com>
Jon Smirl <jonsmirl@gmail.com> wrote:
> Can the library version of git be licensed LGPL instead of GPL? If it
> is GPL then it can't be linked into non-GPL projects like Eclipse.
True. But I have a pure-Java implementation of portions of GIT:
- pack file reader, including delta decompression;
- loose object reader (sans new pack header format);
- loose object writer (blobs, trees, commits, no tags);
- ref reader/basic resolver;
- ref writer;
- new repository creation;
- tree and commit parsing;
- n-way tree structure diff (no blob content diff);
and Eclipse UI for:
- resource decorator showing object state;
- rename tracking (well, automatic delete then add);
- add file/folder to repository;
- delete file/folder from repository;
- save workspace state to a tree;
- periodically flush modified files into blobs;
but I need UI still for creating a commit. I'd like to get that
code finished this week and get the repository posted on the web
for others to start messing around with if they are interested.
This project has just been slow going for me as I'm working looooong
hours at my day job. :-)
--
Shawn.
^ permalink raw reply
* [PATCH] Per branch properties for pull and fetch
From: Santi Béjar @ 2006-07-27 8:14 UTC (permalink / raw)
To: Git Mailing List
It allows to specify on a per branch basis the following:
.- default repository to fetch
.- default branches to merge on a per repository basis
.- default pull.{octopus,twohead}
So if you have this in the config:
[branch "my"]
remote=yours
merge=master
merge=our from theirs
merge=mine from .
and you are in the branch "my":
"git pull": fetch the remote yours and merge the branch master.
"git pull theirs": fetch the remote theirs and merge the branch our.
"git pull .": merge the branch mine from the local repository.
---
Documentation/config.txt | 14 +++++++++++
git-fetch.sh | 13 ++++++----
git-parse-remote.sh | 57 ++++++++++++++++++++++++++++++++++++++++++++++
git-pull.sh | 29 ++++++++++++++++++++---
4 files changed, 104 insertions(+), 9 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 465eb13..f12b595 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -116,6 +116,20 @@ apply.whitespace::
Tells `git-apply` how to handle whitespaces, in the same way
as the '--whitespace' option. See gitlink:git-apply[1].
+branch.<name>.remote::
+ When in branch <name>, it tells `git-fetch` which remote to fetch.
+
+branch.<name>.merge::
+ When in branch <name>, it tells `git-pull` to merge this remote
+ branch of the repository branch.<name>.remote. To specify a different
+ remote repository use the from `<branch> from <repo>`.
+
+branch.<name>.octopus::
+ When in branch <name>, the same as pull.octopus.
+
+branch.<name>.twohead::
+ When in branch <name>, the same as pull.twohead.
+
diff.color::
When true (or `always`), always use colors in patch.
When false (or `never`), never. When set to `auto`, use
diff --git a/git-fetch.sh b/git-fetch.sh
index c2eebee..8129d8a 100755
--- a/git-fetch.sh
+++ b/git-fetch.sh
@@ -68,11 +68,13 @@ done
case "$#" in
0)
- test -f "$GIT_DIR/branches/origin" ||
- test -f "$GIT_DIR/remotes/origin" ||
- git-repo-config --get remote.origin.url >/dev/null ||
- die "Where do you want to fetch from today?"
- set origin ;;
+ curr_branch=$(git-symbolic-ref HEAD)
+ curr_branch=${curr_branch##refs/heads/}
+ origin=$(git-repo-config --get "branch.$curr_branch.remote")
+ origin=${origin:-origin}
+ test -n "$(get_remote_url $origin)" ||
+ die "Where do you want to fetch from today?"
+ set $origin ;;
esac
remote_nick="$1"
@@ -446,3 +448,4 @@ case ",$update_head_ok,$orig_head," in
fi
;;
esac
+echo $remote_nick >"$GIT_DIR/FETCH_REMOTE"
diff --git a/git-parse-remote.sh b/git-parse-remote.sh
index 187f088..fe6c713 100755
--- a/git-parse-remote.sh
+++ b/git-parse-remote.sh
@@ -209,3 +209,60 @@ resolve_alternates () {
esac
done
}
+
+get_head_for_remote_branch () {
+ if [ "$1" == "." ];
+ then
+ git-rev-parse $2 2>/dev/null||
+ die "error: no such ref $2"
+ return
+ fi
+ data_source=$(get_data_source "$1")
+ case "$data_source" in
+ config)
+ refspec=$(git-repo-config --get "remote.$1.fetch" ^$2:) ;;
+ branches)
+ remote_branch=$(sed -ne '/#/s/.*#//p' "$GIT_DIR/branches/$1")
+ case "$remote_branch" in '') remote_branch=master ;; esac
+ [ $remote_branch == $2 ] &&
+ refspec="refs/heads/${remote_branch}:refs/heads/$1"
+ ;;
+ remotes)
+ refspec=$(grep "^Pull: $2:" $GIT_DIR/remotes/$1)
+ refspec=${refspec##Pull: }
+ ;;
+ *)
+ die "internal error: get-head_for_remote_branch" ;;
+ esac
+ [ "$refspec" ] || die "Branch $2 does not exist in the repository: $1."
+ git-rev-parse $(expr "z$refspec" : 'z[^:]*:\(.*\)')
+}
+
+get_heads_to_merge_in_branch () {
+ case "$#" in
+ 2)
+ default=$(git repo-config --get-all "branch.$1.remote")
+ : >"$GIT_DIR/HEADS_TO_MERGE"
+ git repo-config --get-all "branch.$1.merge" |
+ while read ref ; do
+ case $ref in
+ ?*' 'from' '?*)
+ remote=$(expr "z$ref" : 'z.* from \(.*\)')
+ branch=$(expr "z$ref" : 'z\(.*\) from .*');;
+ *)
+ remote=$default
+ branch=$ref;;
+ esac
+ [ "$remote" != "$2" ] && continue
+ headm=$(get_head_for_remote_branch $remote $branch) || exit 1
+ echo $headm
+ remoteurl=$(get_remote_url $remote)
+ remoteurl_1=$(expr "z$remoteurl" : 'z\(.*\)\.git/*$') &&
+ remoteurl=$remoteurl_1
+ echo "$headm branch '$branch' of $remoteurl" \
+ >>"$GIT_DIR/HEADS_TO_MERGE"
+ done
+ ;;
+ *) exit 1
+ esac
+}
diff --git a/git-pull.sh b/git-pull.sh
index f380437..467d9c0 100755
--- a/git-pull.sh
+++ b/git-pull.sh
@@ -7,6 +7,7 @@ # Fetch one or more remote refs and merg
USAGE='[-n | --no-summary] [--no-commit] [-s strategy]... [<fetch-options>] <repo> <head>...'
LONG_USAGE='Fetch one or more remote refs and merge it/them into the current HEAD.'
. git-sh-setup
+. git-parse-remote
strategy_args= no_summary= no_commit= squash=
while case "$#,$1" in 0) break ;; *,-*) ;; *) break ;; esac
@@ -47,6 +48,8 @@ done
orig_head=$(git-rev-parse --verify HEAD) || die "Pulling into a black hole?"
git-fetch --update-head-ok --reflog-action=pull "$@" || exit 1
+curr_branch=$(git-symbolic-ref HEAD)
+curr_branch=${curr_branch##refs/heads/}
curr_head=$(git-rev-parse --verify HEAD)
if test "$curr_head" != "$orig_head"
then
@@ -70,9 +73,18 @@ to recover.'
fi
-merge_head=$(sed -e '/ not-for-merge /d' \
- -e 's/ .*//' "$GIT_DIR"/FETCH_HEAD | \
- tr '\012' ' ')
+remote=$(cat "$GIT_DIR/FETCH_REMOTE")
+merge_head=$(get_heads_to_merge_in_branch "$curr_branch" "$remote" ) || exit
+
+if [ -n "$merge_head" ];
+then
+ merge_name=$(git-fmt-merge-msg <"$GIT_DIR/HEADS_TO_MERGE") || exit
+else
+ merge_head=$(sed -e '/ not-for-merge /d' \
+ -e 's/ .*//' "$GIT_DIR"/FETCH_HEAD | \
+ tr '\012' ' ')
+ merge_name=$(git-fmt-merge-msg <"$GIT_DIR/FETCH_HEAD") || exit
+fi
case "$merge_head" in
'')
@@ -85,6 +97,11 @@ case "$merge_head" in
then
strategy_default_args="-s $var"
fi
+ var=`git-repo-config --get branch.$curr_branch.octopus`
+ if test -n "$var"
+ then
+ strategy_default_args="-s $var"
+ fi
;;
*)
var=`git-repo-config --get pull.twohead`
@@ -92,6 +109,11 @@ case "$merge_head" in
then
strategy_default_args="-s $var"
fi
+ var=`git-repo-config --get branch.$curr_branch.twohead`
+ if test -n "$var"
+ then
+ strategy_default_args="-s $var"
+ fi
;;
esac
@@ -101,7 +123,6 @@ case "$strategy_args" in
;;
esac
-merge_name=$(git-fmt-merge-msg <"$GIT_DIR/FETCH_HEAD") || exit
git-merge "--reflog-action=pull $*" \
$no_summary $no_commit $squash $strategy_args \
"$merge_name" HEAD $merge_head
--
1.4.2.rc2.g1728
^ permalink raw reply related
* Re: [WIP] Status update on merge-recursive in C
From: Junio C Hamano @ 2006-07-27 8:51 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: git, Pavel Roskin
In-Reply-To: <Pine.LNX.4.63.0607091634010.29667@wbgn013.biozentrum.uni-wuerzburg.de>
Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> On Sun, 9 Jul 2006, Pavel Roskin wrote:
>
>> - variable declarations in the middle of the code (allowed by c99 but
>> not by ANSI C) and incomplete function declarations (no "void"). It's
>> not C++, let's stick to the C standards.
>...
>> I'm attaching a patch that fixes everything except variable
>> declarations.
>
> May I ask you a favour? Can you redo the patch in, say, two weeks? Thank
> you!
Now it's about two weeks so maybe we can apply this on top to
clean up and prod you to continue ;-)?
-- >8 --
[PATCH] merge-recursive in C: pedantic.
This just cleans up mixed declaration and code warnings and
incomplete function declarations, as Pavel earlier pointed out.
Signed-off-by: Junio C Hamano <junkio@cox.net>
---
merge-recursive.c | 147 ++++++++++++++++++++++++++++++-----------------------
1 files changed, 83 insertions(+), 64 deletions(-)
diff --git a/merge-recursive.c b/merge-recursive.c
index 8d30519..3735df1 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -25,9 +25,9 @@ #include "path-list.h"
/*#define DEBUG*/
#ifdef DEBUG
-#define debug(args, ...) fprintf(stderr, args, ## __VA_ARGS__)
+#define debug(...) fprintf(stderr, __VA_ARGS__)
#else
-#define debug(args, ...)
+#define debug(...) do { ; /* nothing */ } while (0)
#endif
#ifdef DEBUG
@@ -61,13 +61,14 @@ static void show_ce_entry(const char *ta
fputc('\n', stderr);
}
-static void ls_files() {
+static void ls_files(void) {
int i;
for (i = 0; i < active_nr; i++) {
struct cache_entry *ce = active_cache[i];
show_ce_entry("", ce);
}
fprintf(stderr, "---\n");
+ if (0) ls_files(); /* avoid "unused" warning */
}
#endif
@@ -89,8 +90,8 @@ static const char *commit_title(struct c
s = "(bad commit)";
*len = strlen(s);
} else {
- s = commit->buffer;
char prev = '\0';
+ s = commit->buffer;
while ( *s ) {
if ( '\n' == prev && '\n' == *s ) {
++s;
@@ -207,7 +208,7 @@ static const char *original_index_file;
static const char *temporary_index_file;
static int cache_dirty = 0;
-static int flush_cache()
+static int flush_cache(void)
{
/* flush temporary index */
struct lock_file *lock = xcalloc(1, sizeof(struct lock_file));
@@ -290,11 +291,12 @@ #if 0
getenv("GIT_INDEX_FILE"),
sha1_to_hex(tree->object.sha1));
#endif
+ int rc;
const char *argv[] = { "git-read-tree", NULL, NULL, };
if (cache_dirty)
die("read-tree with dirty cache");
argv[1] = sha1_to_hex(tree->object.sha1);
- int rc = run_command_v(2, argv);
+ rc = run_command_v(2, argv);
return rc < 0 ? -1: rc;
}
@@ -314,6 +316,7 @@ #if 0
sha1_to_hex(head->object.sha1),
sha1_to_hex(merge->object.sha1));
#endif
+ int rc;
const char *argv[] = {
"git-read-tree", NULL, "-m", NULL, NULL, NULL,
NULL,
@@ -324,32 +327,34 @@ #endif
argv[3] = sha1_to_hex(common->object.sha1);
argv[4] = sha1_to_hex(head->object.sha1);
argv[5] = sha1_to_hex(merge->object.sha1);
- int rc = run_command_v(6, argv);
+ rc = run_command_v(6, argv);
return rc < 0 ? -1: rc;
}
/*
* TODO: this can be streamlined by refactoring builtin-write-tree.c
*/
-static struct tree *git_write_tree()
+static struct tree *git_write_tree(void)
{
#if 0
fprintf(stderr, "GIT_INDEX_FILE='%s' git-write-tree\n",
getenv("GIT_INDEX_FILE"));
#endif
- if (cache_dirty)
- flush_cache();
- FILE *fp = popen("git-write-tree 2>/dev/null", "r");
+ FILE *fp;
+ int rc;
char buf[41];
unsigned char sha1[20];
int ch;
unsigned i = 0;
+ if (cache_dirty)
+ flush_cache();
+ fp = popen("git-write-tree 2>/dev/null", "r");
while ( (ch = fgetc(fp)) != EOF )
if ( i < sizeof(buf)-1 && ch >= '0' && ch <= 'f' )
buf[i++] = ch;
else
break;
- int rc = pclose(fp);
+ rc = pclose(fp);
if ( rc == -1 || WEXITSTATUS(rc) )
return NULL;
buf[i] = '\0';
@@ -467,7 +472,7 @@ static void free_index_entries(struct pa
* Create a dictionary mapping file names to CacheEntry objects. The
* dictionary contains one entry for every path with a non-zero stage entry.
*/
-static struct path_list *get_unmerged()
+static struct path_list *get_unmerged(void)
{
struct path_list *unmerged = xcalloc(1, sizeof(struct path_list));
int i;
@@ -479,10 +484,10 @@ static struct path_list *get_unmerged()
}
for (i = 0; i < active_nr; i++) {
struct cache_entry *ce = active_cache[i];
+ struct stage_data *e;
if (!ce_stage(ce))
continue;
-
- struct stage_data *e = index_entry_get(unmerged, ce->name);
+ e = index_entry_get(unmerged, ce->name);
e->stages[ce_stage(ce)].mode = ntohl(ce->ce_mode);
memcpy(e->stages[ce_stage(ce)].sha, ce->sha1, 20);
}
@@ -530,13 +535,16 @@ static struct path_list *get_renames(str
struct tree *bTree,
struct path_list *entries)
{
+ int i;
+ struct path_list *renames;
+ struct diff_options opts;
#ifdef DEBUG
time_t t = time(0);
+
debug("getRenames ...\n");
#endif
- int i;
- struct path_list *renames = xcalloc(1, sizeof(struct path_list));
- struct diff_options opts;
+
+ renames = xcalloc(1, sizeof(struct path_list));
diff_setup(&opts);
opts.recursive = 1;
opts.detect_rename = DIFF_DETECT_RENAME;
@@ -547,6 +555,7 @@ #endif
diffcore_std(&opts);
for (i = 0; i < diff_queued_diff.nr; ++i) {
struct rename *re;
+ struct path_list_item *item;
struct diff_filepair *pair = diff_queued_diff.queue[i];
if (pair->status != 'R') {
diff_free_filepair(pair);
@@ -560,19 +569,17 @@ #endif
if ( !re->src_entry ) {
re->src_entry = index_entry_from_db(re->pair->one->path,
oTree, aTree, bTree);
- struct path_list_item *item =
- path_list_insert(re->pair->one->path, entries);
+ item = path_list_insert(re->pair->one->path, entries);
item->util = re->src_entry;
}
re->dst_entry = index_entry_find(entries, re->pair->two->path);
if ( !re->dst_entry ) {
re->dst_entry = index_entry_from_db(re->pair->two->path,
oTree, aTree, bTree);
- struct path_list_item *item =
- path_list_insert(re->pair->two->path, entries);
+ item = path_list_insert(re->pair->two->path, entries);
item->util = re->dst_entry;
}
- struct path_list_item *item = path_list_insert(pair->one->path, renames);
+ item = path_list_insert(pair->one->path, renames);
item->util = re;
}
opts.output_format = DIFF_FORMAT_NO_OUTPUT;
@@ -613,14 +620,14 @@ int update_stages(const char *path,
*/
static int remove_path(const char *name)
{
- int ret;
- char *slash;
+ int ret, len;
+ char *slash, *dirs;
ret = unlink(name);
if ( ret )
return ret;
- int len = strlen(name);
- char *dirs = malloc(len+1);
+ len = strlen(name);
+ dirs = malloc(len+1);
memcpy(dirs, name, len);
dirs[len] = '\0';
while ( (slash = strrchr(name, '/')) ) {
@@ -664,15 +671,17 @@ int remove_file(int clean, const char *p
static char *unique_path(const char *path, const char *branch)
{
char *newpath = xmalloc(strlen(path) + 1 + strlen(branch) + 8 + 1);
+ char *p;
+ int suffix;
+ struct stat st;
strcpy(newpath, path);
strcat(newpath, "~");
- char *p = newpath + strlen(newpath);
+ p = newpath + strlen(newpath);
strcpy(p, branch);
for ( ; *p; ++p )
if ( '/' == *p )
*p = '_';
- int suffix = 0;
- struct stat st;
+ suffix = 0;
while ( path_list_has_path(¤tFileSet, newpath) ||
path_list_has_path(¤tDirectorySet, newpath) ||
lstat(newpath, &st) == 0 ) {
@@ -754,6 +763,7 @@ void update_file_flags(const unsigned ch
die("blob expected for %s '%s'", sha1_to_hex(sha), path);
if ( S_ISREG(mode) ) {
+ int fd;
if ( mkdir_p(path, 0777, 0 /* don't create last element */) )
die("failed to create path %s: %s", path, strerror(errno));
unlink(path);
@@ -761,7 +771,7 @@ void update_file_flags(const unsigned ch
mode = 0777;
else
mode = 0666;
- int fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, mode);
+ fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, mode);
if ( fd < 0 )
die("failed to open %s: %s", path, strerror(errno));
flush_buffer(fd, buf, size);
@@ -863,17 +873,19 @@ static struct merge_file_info merge_file
char orig[PATH_MAX];
char src1[PATH_MAX];
char src2[PATH_MAX];
-
- git_unpack_file(oSha, orig);
- git_unpack_file(aSha, src1);
- git_unpack_file(bSha, src2);
-
const char *argv[] = {
"merge", "-L", NULL, "-L", NULL, "-L", NULL,
src1, orig, src2,
NULL
};
char *la, *lb, *lo;
+ struct stat st;
+ int fd;
+
+ git_unpack_file(oSha, orig);
+ git_unpack_file(aSha, src1);
+ git_unpack_file(bSha, src2);
+
argv[2] = la = strdup(mkpath("%s/%s", branch1Name, aPath));
argv[6] = lb = strdup(mkpath("%s/%s", branch2Name, bPath));
argv[4] = lo = strdup(mkpath("orig/%s", oPath));
@@ -892,8 +904,7 @@ #endif
die("Failed to execute 'merge'. merge(1) is used as the "
"file-level merge tool. Is 'merge' in your path?");
}
- struct stat st;
- int fd = open(src1, O_RDONLY);
+ fd = open(src1, O_RDONLY);
if (fd < 0 || fstat(fd, &st) < 0 ||
index_fd(result.sha, fd, &st, 1,
"blob"))
@@ -1018,6 +1029,7 @@ static int process_renames(struct path_l
struct path_list *renames1, *renames2, *renames2Dst;
struct rename *ren1, *ren2;
const char *branchName1, *branchName2;
+ const char *ren1_src, *ren1_dst;
ren1 = find_rename_bysrc(renamesA, src);
ren2 = find_rename_bysrc(renamesB, src);
/* TODO: refactor, so that 1/2 are not needed */
@@ -1028,12 +1040,13 @@ static int process_renames(struct path_l
branchName1 = branchNameA;
branchName2 = branchNameB;
} else {
+ struct rename *tmp;
renames1 = renamesB;
renames2 = renamesA;
renames2Dst = &byDstA;
branchName1 = branchNameB;
branchName2 = branchNameA;
- struct rename *tmp = ren2;
+ tmp = ren2;
ren2 = ren1;
ren1 = tmp;
}
@@ -1045,8 +1058,8 @@ static int process_renames(struct path_l
continue;
ren1->processed = 1;
- const char *ren1_src = ren1->pair->one->path;
- const char *ren1_dst = ren1->pair->two->path;
+ ren1_src = ren1->pair->one->path;
+ ren1_dst = ren1->pair->two->path;
if ( ren2 ) {
const char *ren2_src = ren2->pair->one->path;
@@ -1065,8 +1078,8 @@ static int process_renames(struct path_l
src, ren2_dst, branchName2);
conflict_rename_rename(ren1, branchName1, ren2, branchName2);
} else {
- remove_file(1, ren1_src);
struct merge_file_info mfi;
+ remove_file(1, ren1_src);
mfi = merge_file(ren1_src,
ren1->pair->one->sha1,
ren1->pair->one->mode,
@@ -1102,13 +1115,17 @@ static int process_renames(struct path_l
update_file(mfi.clean, mfi.sha, mfi.mode, ren1_dst);
}
} else {
- /* Renamed in 1, maybe changed in 2 */
- remove_file(1, ren1_src);
-
unsigned char srcShaOtherBranch[20], dstShaOtherBranch[20];
unsigned srcModeOtherBranch, dstModeOtherBranch;
- int stage = renamesA == renames1 ? 3: 2;
+ int stage;
+ int tryMerge = 0;
+ char *newPath;
+
+ /* Renamed in 1, maybe changed in 2 */
+ remove_file(1, ren1_src);
+
+ stage = renamesA == renames1 ? 3: 2;
memcpy(srcShaOtherBranch, ren1->src_entry->stages[stage].sha, 20);
srcModeOtherBranch = ren1->src_entry->stages[stage].mode;
@@ -1116,8 +1133,7 @@ static int process_renames(struct path_l
memcpy(dstShaOtherBranch, ren1->dst_entry->stages[stage].sha, 20);
dstModeOtherBranch = ren1->dst_entry->stages[stage].mode;
- int tryMerge = 0;
- char *newPath;
+ tryMerge = 0;
if (path_list_has_path(¤tDirectorySet, ren1_dst)) {
cleanMerge = 0;
@@ -1162,18 +1178,19 @@ static int process_renames(struct path_l
unsigned omode = ren1->pair->one->mode;
unsigned amode = ren1->pair->two->mode;
unsigned bmode = srcModeOtherBranch;
+ const char *aBranch = branchName1;
+ const char *bBranch = branchName2;
+ struct merge_file_info mfi;
+
memcpy(osha, ren1->pair->one->sha1, 20);
memcpy(asha, ren1->pair->two->sha1, 20);
memcpy(bsha, srcShaOtherBranch, 20);
- const char *aBranch = branchName1;
- const char *bBranch = branchName2;
if ( renamesA != renames1 ) {
memswp(&aname, &bname, sizeof(aname));
memswp(asha, bsha, 20);
memswp(&aBranch, &bBranch, sizeof(aBranch));
}
- struct merge_file_info mfi;
mfi = merge_file(oname, osha, omode,
aname, asha, amode,
bname, bsha, bmode,
@@ -1280,8 +1297,9 @@ static int process_entry(const char *pat
conf = "directory/file";
}
if ( path_list_has_path(¤tDirectorySet, path) ) {
+ const char *newPath;
cleanMerge = 0;
- const char *newPath = unique_path(path, addBranch);
+ newPath = unique_path(path, addBranch);
output("CONFLICT (%s): There is a directory with name %s in %s. "
"Adding %s as %s",
conf, path, otherBranch, path, newPath);
@@ -1306,9 +1324,10 @@ static int process_entry(const char *pat
assert(0 && "This case must be handled by git-read-tree");
}
} else {
+ const char *newPath1, *newPath2;
cleanMerge = 0;
- const char *newPath1 = unique_path(path, branch1Name);
- const char *newPath2 = unique_path(path, branch2Name);
+ newPath1 = unique_path(path, branch1Name);
+ newPath2 = unique_path(path, branch2Name);
output("CONFLICT (add/add): File %s added non-identically "
"in both branches. Adding as %s and %s instead.",
path, newPath1, newPath2);
@@ -1319,8 +1338,8 @@ static int process_entry(const char *pat
} else if ( oSha && aSha && bSha ) {
/* case D: Modified in both, but differently. */
- output("Auto-merging %s", path);
struct merge_file_info mfi;
+ output("Auto-merging %s", path);
mfi = merge_file(path, oSha, oMode,
path, aSha, aMode,
path, bSha, bMode,
@@ -1373,19 +1392,19 @@ static struct merge_tree_result merge_tr
result.tree = git_write_tree();
if ( !result.tree ) {
+ struct path_list *entries, *re_head, *re_merge;
+ int i;
path_list_clear(¤tFileSet, 1);
path_list_clear(¤tDirectorySet, 1);
get_files_dirs(head, ¤tFileSet, ¤tDirectorySet);
get_files_dirs(merge, ¤tFileSet, ¤tDirectorySet);
- struct path_list *entries = get_unmerged();
- struct path_list *re_head, *re_merge;
+ entries = get_unmerged();
re_head = get_renames(head, common, head, merge, entries);
re_merge = get_renames(merge, common, head, merge, entries);
result.clean = process_renames(re_head, re_merge,
branch1Name, branch2Name);
debug("\tprocessing entries...\n");
- int i;
for (i = 0; i < entries->nr; i++) {
const char *path = entries->items[i].path;
struct stage_data *e = entries->items[i].util;
@@ -1512,6 +1531,10 @@ int main(int argc, char *argv[])
{
static const char *bases[2];
static unsigned bases_count = 0;
+ int i;
+ const char *branch1, *branch2;
+ struct merge_result result;
+ struct commit *h1, *h2;
original_index_file = getenv("GIT_INDEX_FILE");
@@ -1523,7 +1546,6 @@ int main(int argc, char *argv[])
if (argc < 4)
die("Usage: %s <base>... -- <head> <remote> ...\n", argv[0]);
- int i;
for (i = 1; i < argc; ++i) {
if (!strcmp(argv[i], "--"))
break;
@@ -1533,15 +1555,12 @@ int main(int argc, char *argv[])
if (argc - i != 3) /* "--" "<head>" "<remote>" */
die("Not handling anything other than two heads merge.");
- const char *branch1, *branch2;
-
branch1 = argv[++i];
branch2 = argv[++i];
printf("Merging %s with %s\n", branch1, branch2);
- struct merge_result result;
- struct commit *h1 = get_ref(branch1);
- struct commit *h2 = get_ref(branch2);
+ h1 = get_ref(branch1);
+ h2 = get_ref(branch2);
if (bases_count == 1) {
struct commit *ancestor = get_ref(bases[0]);
--
1.4.2.rc2.g544b
^ permalink raw reply related
* Re: [PATCH] cvsserver: imitate git-update-ref when committing
From: Johannes Schindelin @ 2006-07-27 8:53 UTC (permalink / raw)
To: Shawn Pearce; +Cc: git
In-Reply-To: <20060727002130.GA32492@spearce.org>
Hi,
On Wed, 26 Jul 2006, Shawn Pearce wrote:
> You might want to also consider appending to the reflog, if it exists/is
> enabled.
Given that I do not use it, and do not really understand what it does,
this would be a bad idea ;-)
Ciao,
Dscho
P.S.: How's your Java thing coming along?
^ permalink raw reply
* Re: [PATCH] Per branch properties for pull and fetch
From: Martin Waitz @ 2006-07-27 8:55 UTC (permalink / raw)
To: Santi Béjar; +Cc: Git Mailing List
In-Reply-To: <87lkqfcvm2.fsf@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 590 bytes --]
hoi :)
On Thu, Jul 27, 2006 at 10:14:45AM +0200, Santi Béjar wrote:
> It allows to specify on a per branch basis the following:
> .- default repository to fetch
> .- default branches to merge on a per repository basis
> .- default pull.{octopus,twohead}
>
> So if you have this in the config:
> [branch "my"]
> remote=yours
> merge=master
> merge=our from theirs
> merge=mine from .
could we default the to-be-merged branch to "remotes/$remote/$branch" if
that exists?. That could make life a lot easier when using
clone --use-separate-remote.
--
Martin Waitz
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox