* Re: Lack of netiquette, was Re: [PATCH v4 00/13] New remote-hg helper
From: Felipe Contreras @ 2012-11-01 14:34 UTC (permalink / raw)
To: René Scharfe
Cc: Junio C Hamano, Johannes Schindelin, Jonathan Nieder, Jeff King,
git, Michael J Gruber, Sverre Rabbelier, Ilari Liusvaara,
Daniel Barkalow
In-Reply-To: <50927D29.3020703@lsrfire.ath.cx>
On Thu, Nov 1, 2012 at 2:46 PM, René Scharfe
<rene.scharfe@lsrfire.ath.cx> wrote:
> Am 01.11.2012 03:58, schrieb Felipe Contreras:
>
>> On Thu, Nov 1, 2012 at 2:32 AM, Junio C Hamano <gitster@pobox.com> wrote:
>>>
>>> Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
>>>
>>>> On Wed, 31 Oct 2012, Felipe Contreras wrote:
>>>>
>>>>> It doesn't get any more obvious than that. But to each his own.
>>>>
>>>>
>>>> In my opinion, Jonathan does not deserve any of such condescending
>>>> words.
>>>> But maybe the Git maintainers are okay with such a tone on this list?
>>>
>>>
>>> Agreed, and no.
>>>
>>> We've been hoping we can do without a rigid code of conduct written down
>>> to maintain cordial community focused on technical merits, and instead
>>> relied on people's common sense, but sense may not be so common,
>>> unfortunately, so we may have to have one.
>>
>>
>> Just for the record, what exactly is the problem with the above?
>>
>> 1) The fact that I say it's obvious
>> 2) The fact that I say everyone is entitled to their own opinions
>
>
> Obviousness is in the eye of the beholder.
Sometimes. Other times things are obviously obvious, not for the
person uttering the words, but for everyone. But I agree that others
would disagree, which is why I followed that sentence to one making
sure that I understand that there's a disagreement.
> This is a fact that I tend to forget just too easily as well.
I didn't.
And even if I did, what is the problem with saying "this is obvious"?
> You probably didn't intend it, but your sentences at the top can be read
> more like: "This is a logical consequence. If you don't understand that,
> your mental capabilities must be lacking.". That's obviously (ha!) a rude
> thing to say.
People can read things in many ways. If you need to pass every
sentence you write in a *technical* mailing list through a public
relation professional, well, the throughput of such mailing list is
going to suffer.
That being said, I did wonder what must be going through his mind to
not see that as obvious, but I did NOT *say* anything offensive.
Specially because I know people have different perspectives, and the
fact that a perspective doesn't allow you to see something obvious
doesn't say anything about your mental capabilities, only about your
perspectives, biases, or even current mental state. Who knows, maybe
you skipped your coffee.
To assume otherwise is reading too much into things. Read what is
being said, and nothing more. Don't make assumptions.
And a guideline I love from Wikipedia: Always assume *good faith*.
Sometimes, of course, even if you assume good faith things are
offensive. This is not the case here.
> Also, and I'm sure you didn't know that, "Jedem das Seine" (to each his own)
> was the slogan of the Buchenwald concentration camp.
No, I don't know, and frankly, I don't care.
Cultural differences go both ways. You need to assume that whatever
cultural reference you are thinking of, might not be the same for the
other person. Again: assume *good faith*.
And in English, and probably most Latin language countries, "to each
his own" is pretty well understood:
http://en.wiktionary.org/wiki/to_each_his_own
Etymology
A calque of Latin suum cuique, short for suum cuique pulchrum est (“to
each his own is beautiful”).
Proverb
to each his own
Every person is entitled to his or her personal preferences and tastes.
I would never want my bathroom decorated in chartreuse and turquoise,
but to each his own, I suppose.
Synonyms
there's no accounting for taste
> For that reason some
> (including me) hear the unspoken cynical half-sentence "and some people just
> have to be sent to the gas chamber" when someone uses this proverb.
I never said anything of the sort, and assuming otherwise is a mistake.
If you always assume bad faith you will inevitably get offended by
things that were never meant to be offensive. It's not a good
guideline.
> No accusations intended, just trying to answer your question from my point
> of view.
Thanks, but I think if others are thinking along the same lines, this
is not good. Following the guideline of always assuming good faith
makes it easier for people to communicate, and people not getting hurt
when in fact no offense was intended, which it turns out to be most of
the time.
Cheers.
--
Felipe Contreras
^ permalink raw reply
* Re: Lack of netiquette, was Re: [PATCH v4 00/13] New remote-hg helper
From: Martin Langhoff @ 2012-11-01 14:47 UTC (permalink / raw)
To: Felipe Contreras
Cc: René Scharfe, Junio C Hamano, Johannes Schindelin,
Jonathan Nieder, Jeff King, git, Michael J Gruber,
Sverre Rabbelier, Ilari Liusvaara, Daniel Barkalow
In-Reply-To: <CAMP44s0TVQOKc=Ce_k1DTwZHuPUmroOaVMPg4t--bmt=3fDPuQ@mail.gmail.com>
Felipe,
I'll invite you to reread some of your words:
> That being said, I did wonder what must be going through his mind to
> not see that as obvious,
(...)
> Following the guideline of always assuming good faith
So perhaps it does apply that you could try to assume good
intellectual faith in others. When you wonder "what must be going
through his mind to not see it as obvious"... you should consider
"hey, maybe I am missing some aspect of this".
cheers,
m
--
martin.langhoff@gmail.com
martin@laptop.org -- Software Architect - OLPC
- ask interesting questions
- don't get distracted with shiny stuff - working code first
- http://wiki.laptop.org/go/User:Martinlanghoff
^ permalink raw reply
* Re: [git-users] Git clone fails with "bad pack header", how to get remote log
From: kevin molcard @ 2012-11-01 15:38 UTC (permalink / raw)
To: Jeff King; +Cc: Konstantin Khomoutov, git
In-Reply-To: <20121101111544.GA19996@sigill.intra.peff.net>
Hi Peff,
thanks for this information.
I will report the issue to scm-manager. In the meantime I will try to
use ssh protocol to connect to my remote server.
Thanks again,
Kevin
2012/11/1 Jeff King <peff@peff.net>:
> On Wed, Oct 31, 2012 at 03:34:22PM +0100, kevin molcard wrote:
>
>> I forgot to mention that I am using scm manager:
>> https://bitbucket.org/sdorra/scm-manager/wiki/Home
>>
>> So that maybe the " custom layer you are talking about.
>
> Yeah, that is very important. If I am reading the scm-manager code right
> (and I might not be, as I only just looked at it), it is built entirely
> around JGit, and is not calling git-core programs at all. So it is
> either an issue in scm-manager, or in JGit.
>
> Your best bet is probably to report the issue to the scm-manager folks,
> who can probably help you dig into the problem further (it may even have
> more detailed logs of what happened, but I don't know).
>
> -Peff
^ permalink raw reply
* Wrap commit messages on `git commit -m`
From: Ramkumar Ramachandra @ 2012-11-01 16:07 UTC (permalink / raw)
To: Git List
Hi,
Some of my colleagues are lazy to fire up an editor and write proper
commit messages- they often write one-liners using `git commit -m`.
However, that line turns out to be longer than 72 characters, and the
resulting `git log` output is ugly. So, I was wondering if it would
be a good idea to wrap these one-liners to 72 characters
automatically.
Thanks.
Ram
^ permalink raw reply
* Re: Lack of netiquette, was Re: [PATCH v4 00/13] New remote-hg helper
From: Felipe Contreras @ 2012-11-01 17:13 UTC (permalink / raw)
To: Martin Langhoff
Cc: René Scharfe, Junio C Hamano, Johannes Schindelin,
Jonathan Nieder, Jeff King, git, Michael J Gruber,
Sverre Rabbelier, Ilari Liusvaara, Daniel Barkalow
In-Reply-To: <CACPiFCJ2z38jTwrFpQQC08184JB5XkQ4q5c=yXvuGonY5WYKpQ@mail.gmail.com>
On Thu, Nov 1, 2012 at 3:47 PM, Martin Langhoff
<martin.langhoff@gmail.com> wrote:
> Felipe,
>
> I'll invite you to reread some of your words:
>
>> That being said, I did wonder what must be going through his mind to
>> not see that as obvious,
> (...)
>
>> Following the guideline of always assuming good faith
>
> So perhaps it does apply that you could try to assume good
> intellectual faith in others. When you wonder "what must be going
> through his mind to not see it as obvious"... you should consider
> "hey, maybe I am missing some aspect of this".
That's what I did.
But even if I didn't, that's not offensive, that only means I made a
mistake and it is actually not obvious. But that would be a
*technical* mistake.
When I feel something is obvious, I say "I think this is obvious",
when I feel something is obvious to me, but not to others, I say "This
is obvious to me", when I believe with every fiber of my being that
something is obvious with a very low margin of error, not only to me,
but to other people, I say "this is as obvious as it gets". Of course,
there's the possibility that I missed something, there's always that
possibility, but even if I did, that would be a *technical* mistake.
If you want to discuss the technical aspect of whether or not that is
obvious, feel free to comment in the other thread. This one is about
netiquette. And I've yet to see what is wrong with saying "this is
obvious", *specially* if we are assuming good faith from both sides,
and both sides have already agreed that there's a disagreement, no
insults, no name calling, not ad hominem attacks; simply a
disagreement. Nothing wrong with disagreeing, even if it's strongly.
Cheers.
--
Felipe Contreras
^ permalink raw reply
* Re: Wrap commit messages on `git commit -m`
From: Thomas Adam @ 2012-11-01 18:12 UTC (permalink / raw)
To: Ramkumar Ramachandra; +Cc: Git List
In-Reply-To: <CALkWK0kQ+qCsOa87yY4wma279mp+9h+LFv3qCP_qrNdDyGNcsQ@mail.gmail.com>
Hi,
On 1 November 2012 16:07, Ramkumar Ramachandra <artagnon@gmail.com> wrote:
>
> Hi,
>
> Some of my colleagues are lazy to fire up an editor and write proper
> commit messages- they often write one-liners using `git commit -m`.
> However, that line turns out to be longer than 72 characters, and the
> resulting `git log` output is ugly. So, I was wondering if it would
> be a good idea to wrap these one-liners to 72 characters
> automatically.
Can't you do this already? From "git-log(1)":
%w([<w>[,<i1>[,<i2>]]]): switch line wrapping, like the -w
option of git-shortlog(1).
-- Thomas Adam
^ permalink raw reply
* Re: What's cooking in git.git (Oct 2012, #09; Mon, 29)
From: Ramsay Jones @ 2012-11-01 18:40 UTC (permalink / raw)
To: Jeff King; +Cc: git
In-Reply-To: <20121029102114.GA14497@sigill.intra.peff.net>
Jeff King wrote:
> What's cooking in git.git (Oct 2012, #09; Mon, 29)
> --------------------------------------------------
>
[snip]
> * cr/cvsimport-local-zone (2012-10-16) 1 commit
> - git-cvsimport: allow author-specific timezones
>
> Allows "cvsimport" to read per-author timezone from the author info
> file.
>
> Will merge to 'next'.
Just FYI, t9604-cvsimport-timestamps.sh is still failing for me.
I haven't spent too long on this yet, but I had hoped that setting
TZ would sidestep any DST issues. (I have downloaded new tzdata, but
have yet to install - actually I don't really want to!). It is not
clear from the tzset manpage what happens if you use the DST format
for TZ, but you don't provide the start/end date for DST, which is
what this test is doing.
Perhaps the test should use the non-DST format? e.g. "TZ=CST6 git ..."
Does the test really care about DST? (*if* that is indeed the problem).
Also: Note that the first test calls git-cvsimport twice, first *with*
TZ set then again without; I suspect a cut/paste editing error.
I have added the output of "./t9604-cvsimport-timestamps.sh -v" below.
ATB,
Ramsay Jones
ramsay@ramsay-laptop:$ ./t9604-cvsimport-timestamps.sh -v
Initialized empty Git repository in /home/ramsay/git/t/trash directory.t9604-cvsimport-timestamps/.git/
expecting success:
TZ=CST6CDT git cvsimport -p"-x" -C module-1 module &&
git cvsimport -p"-x" -C module-1 module &&
(
cd module-1 &&
git log --format="%s %ai"
) >actual-1 &&
cat >expect-1 <<-EOF &&
Rev 16 2006-10-29 07:00:01 +0000
Rev 15 2006-10-29 06:59:59 +0000
Rev 14 2006-04-02 08:00:01 +0000
Rev 13 2006-04-02 07:59:59 +0000
Rev 12 2005-12-01 00:00:00 +0000
Rev 11 2005-11-01 00:00:00 +0000
Rev 10 2005-10-01 00:00:00 +0000
Rev 9 2005-09-01 00:00:00 +0000
Rev 8 2005-08-01 00:00:00 +0000
Rev 7 2005-07-01 00:00:00 +0000
Rev 6 2005-06-01 00:00:00 +0000
Rev 5 2005-05-01 00:00:00 +0000
Rev 4 2005-04-01 00:00:00 +0000
Rev 3 2005-03-01 00:00:00 +0000
Rev 2 2005-02-01 00:00:00 +0000
Rev 1 2005-01-01 00:00:00 +0000
EOF
test_cmp actual-1 expect-1
Initialized empty Git repository in /home/ramsay/git/t/trash directory.t9604-cvsimport-timestamps/module-1/.git/
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
Already up-to-date.
--- actual-1 2012-10-31 21:20:20.000000000 +0000
+++ expect-1 2012-10-31 21:20:20.000000000 +0000
@@ -13,4 +13,4 @@
Rev 4 2005-04-01 00:00:00 +0000
Rev 3 2005-03-01 00:00:00 +0000
Rev 2 2005-02-01 00:00:00 +0000
-Rev 1 2004-12-31 18:00:00 +0000
+Rev 1 2005-01-01 00:00:00 +0000
not ok 1 - check timestamps are UTC (TZ=CST6CDT)
#
#
# TZ=CST6CDT git cvsimport -p"-x" -C module-1 module &&
# git cvsimport -p"-x" -C module-1 module &&
# (
# cd module-1 &&
# git log --format="%s %ai"
# ) >actual-1 &&
# cat >expect-1 <<-EOF &&
# Rev 16 2006-10-29 07:00:01 +0000
# Rev 15 2006-10-29 06:59:59 +0000
# Rev 14 2006-04-02 08:00:01 +0000
# Rev 13 2006-04-02 07:59:59 +0000
# Rev 12 2005-12-01 00:00:00 +0000
# Rev 11 2005-11-01 00:00:00 +0000
# Rev 10 2005-10-01 00:00:00 +0000
# Rev 9 2005-09-01 00:00:00 +0000
# Rev 8 2005-08-01 00:00:00 +0000
# Rev 7 2005-07-01 00:00:00 +0000
# Rev 6 2005-06-01 00:00:00 +0000
# Rev 5 2005-05-01 00:00:00 +0000
# Rev 4 2005-04-01 00:00:00 +0000
# Rev 3 2005-03-01 00:00:00 +0000
# Rev 2 2005-02-01 00:00:00 +0000
# Rev 1 2005-01-01 00:00:00 +0000
# EOF
# test_cmp actual-1 expect-1
#
expecting success:
cat >cvs-authors <<-EOF &&
user1=User One <user1@domain.org>
user2=User Two <user2@domain.org> CST6CDT
user3=User Three <user3@domain.org> EST5EDT
user4=User Four <user4@domain.org> MST7MDT
EOF
git cvsimport -p"-x" -A cvs-authors -C module-2 module &&
(
cd module-2 &&
git log --format="%s %ai %an"
) >actual-2 &&
cat >expect-2 <<-EOF &&
Rev 16 2006-10-29 01:00:01 -0600 User Two
Rev 15 2006-10-29 01:59:59 -0500 User Two
Rev 14 2006-04-02 03:00:01 -0500 User Two
Rev 13 2006-04-02 01:59:59 -0600 User Two
Rev 12 2005-11-30 17:00:00 -0700 User Four
Rev 11 2005-10-31 19:00:00 -0500 User Three
Rev 10 2005-09-30 19:00:00 -0500 User Two
Rev 9 2005-09-01 00:00:00 +0000 User One
Rev 8 2005-07-31 18:00:00 -0600 User Four
Rev 7 2005-06-30 20:00:00 -0400 User Three
Rev 6 2005-05-31 19:00:00 -0500 User Two
Rev 5 2005-05-01 00:00:00 +0000 User One
Rev 4 2005-03-31 17:00:00 -0700 User Four
Rev 3 2005-02-28 19:00:00 -0500 User Three
Rev 2 2005-01-31 18:00:00 -0600 User Two
Rev 1 2005-01-01 00:00:00 +0000 User One
EOF
test_cmp actual-2 expect-2
Initialized empty Git repository in /home/ramsay/git/t/trash directory.t9604-cvsimport-timestamps/module-2/.git/
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
* UNKNOWN LINE * Branches:
--- actual-2 2012-10-31 21:20:21.000000000 +0000
+++ expect-2 2012-10-31 21:20:21.000000000 +0000
@@ -1,16 +1,16 @@
Rev 16 2006-10-29 01:00:01 -0600 User Two
Rev 15 2006-10-29 01:59:59 -0500 User Two
Rev 14 2006-04-02 03:00:01 -0500 User Two
-Rev 13 2006-04-02 00:59:59 -0600 User Two
-Rev 12 2005-11-30 19:00:00 -0700 User Four
-Rev 11 2005-10-31 18:00:00 -0500 User Three
-Rev 10 2005-10-01 01:00:00 -0500 User Two
-Rev 9 2005-08-31 18:00:00 +0000 User One
-Rev 8 2005-07-31 20:00:00 -0600 User Four
-Rev 7 2005-06-30 19:00:00 -0400 User Three
-Rev 6 2005-06-01 01:00:00 -0500 User Two
-Rev 5 2005-04-30 18:00:00 +0000 User One
-Rev 4 2005-03-31 19:00:00 -0700 User Four
-Rev 3 2005-02-28 18:00:00 -0500 User Three
-Rev 2 2005-02-01 00:00:00 -0600 User Two
+Rev 13 2006-04-02 01:59:59 -0600 User Two
+Rev 12 2005-11-30 17:00:00 -0700 User Four
+Rev 11 2005-10-31 19:00:00 -0500 User Three
+Rev 10 2005-09-30 19:00:00 -0500 User Two
+Rev 9 2005-09-01 00:00:00 +0000 User One
+Rev 8 2005-07-31 18:00:00 -0600 User Four
+Rev 7 2005-06-30 20:00:00 -0400 User Three
+Rev 6 2005-05-31 19:00:00 -0500 User Two
+Rev 5 2005-05-01 00:00:00 +0000 User One
+Rev 4 2005-03-31 17:00:00 -0700 User Four
+Rev 3 2005-02-28 19:00:00 -0500 User Three
+Rev 2 2005-01-31 18:00:00 -0600 User Two
Rev 1 2005-01-01 00:00:00 +0000 User One
not ok 2 - check timestamps with author-specific timezones
#
#
# cat >cvs-authors <<-EOF &&
# user1=User One <user1@domain.org>
# user2=User Two <user2@domain.org> CST6CDT
# user3=User Three <user3@domain.org> EST5EDT
# user4=User Four <user4@domain.org> MST7MDT
# EOF
# git cvsimport -p"-x" -A cvs-authors -C module-2 module &&
# (
# cd module-2 &&
# git log --format="%s %ai %an"
# ) >actual-2 &&
# cat >expect-2 <<-EOF &&
# Rev 16 2006-10-29 01:00:01 -0600 User Two
# Rev 15 2006-10-29 01:59:59 -0500 User Two
# Rev 14 2006-04-02 03:00:01 -0500 User Two
# Rev 13 2006-04-02 01:59:59 -0600 User Two
# Rev 12 2005-11-30 17:00:00 -0700 User Four
# Rev 11 2005-10-31 19:00:00 -0500 User Three
# Rev 10 2005-09-30 19:00:00 -0500 User Two
# Rev 9 2005-09-01 00:00:00 +0000 User One
# Rev 8 2005-07-31 18:00:00 -0600 User Four
# Rev 7 2005-06-30 20:00:00 -0400 User Three
# Rev 6 2005-05-31 19:00:00 -0500 User Two
# Rev 5 2005-05-01 00:00:00 +0000 User One
# Rev 4 2005-03-31 17:00:00 -0700 User Four
# Rev 3 2005-02-28 19:00:00 -0500 User Three
# Rev 2 2005-01-31 18:00:00 -0600 User Two
# Rev 1 2005-01-01 00:00:00 +0000 User One
# EOF
# test_cmp actual-2 expect-2
#
# failed 2 among 2 test(s)
1..2
ramsay@ramsay-laptop:$
^ permalink raw reply
* Re: crash on git diff-tree -Ganything <tree> for new files with textconv filter
From: Ramsay Jones @ 2012-11-01 19:19 UTC (permalink / raw)
To: Jeff King; +Cc: Peter Oberndorfer, git, Junio C Hamano
In-Reply-To: <20121030121747.GA4231@sigill.intra.peff.net>
Jeff King wrote:
> Thinking on it more, my patch, hacky thought it seems, may not be the
> worst solution. Here are the options that I see:
>
> 1. Use a regex library that does not require NUL termination. If we
> are bound by the regular regexec interface, this is not feasible.
> But the GNU implementation works on arbitrary-length buffers (you
> just have to use a slightly different interface), and we already
> carry it in compat. It would mean platforms which provide a working
> but non-GNU regexec would have to start defining NO_REGEX.
I have thought about the possibility of doing this for unrelated reasons
in the past.
On cygwin, there have been two unexpected test passes since about v1.6.0
(I reported it to the list in passing), like so:
[ ... ]
All tests successful.
Test Summary Report
-------------------
t0050-filesystem.sh (Wstat: 0 Tests: 9 Failed: 0)
TODO passed: 5
t7008-grep-binary.sh (Wstat: 0 Tests: 20 Failed: 0)
TODO passed: 12
Files=604, Tests=8439, 11190 wallclock secs ( 2.59 usr 1.59 sys + 7294.86 cusr
3416.65 csys = 10715.70 CPU)
Result: PASS
In particular, t7008.12 passes on cygwin because the regex library apparently
matches '.' to NUL. Indeed if you add a test_pause to the script and execute
"grep .fi a" (note grep *not* git-grep) then "Binary file a matches" on Linux,
cygwin and MinGW. (So I assume the test was added to document a difference in
behaviour to GNU grep).
So, if we use the GNU interface to the regex routines in compat, then we may
specify the "grep syntax" for use in git-grep. (Well that's the theory, I've
not actually tried to code it up, so take this with a pinch of salt! :-P ).
ATB,
Ramsay Jones
^ permalink raw reply
* checkout-index: unable to create file foo (File exists)
From: Brian J. Murrell @ 2012-11-01 20:25 UTC (permalink / raw)
To: git
[-- Attachment #1: Type: text/plain, Size: 2128 bytes --]
When we use git on a network filesystem, occasionally and sporadically
we will see the following from a git checkout command:
error: git checkout-index: unable to create file foo (File exists)
Through a very basic grepping and following of the source it seems that
the core of the error message is coming from write_entry() in entry.c:
fd = open_output_fd(path, ce, to_tempfile);
if (fd < 0) {
free(new);
return error("unable to create file %s (%s)",
path, strerror(errno));
}
So looking into open_output_fd() there is a call to create_file() which
does:
return open(path, O_WRONLY | O_CREAT | O_EXCL, mode);
I am able to prevent the problem from happening with 100% success by
simply giving the git checkout a "-q" argument to prevent it from
emitting progress reports. This would seem to indicate that the problem
likely revolves around the fact that the progress reporting uses SIGALRM.
Given that O_CREAT | O_EXCL are used in the open() call and that SIGALRM
(along with SA_RESTART) is being used frequently to do progress updates,
it seems reasonable to suspect that the problem is that open() is being
interrupted (but only after it creates the file and before completing)
by the progress reporting mechanism's SIGALRM and when the progress
reporting is done, open() is restarted automatically (due to the use of
SA_RESTART) and fails because the file exists and O_CREAT | O_EXCL are
used in the open() call.
Does this seem like a reasonable hypothesis?
If it does, where does the problem lie here? Is it that SA_RESTART
should not be used since it's not safe with open() and O_CREAT | O_EXCL
(and every system call caller should be handling EINTR) or should the
open() be idempotent so that it can be restarted automatically with
SA_RESTART? If open(2) is supposed to be idempotent, it would be most
useful to have a citation to standard where that is specified.
If open() is not required to be idempotent, it's use with O_CREAT |
O_EXCL and SA_RESTART seems fatally flawed.
Any insight or opinions would be much appreciated.
Cheers,
b.
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]
^ permalink raw reply
* Re: Lack of netiquette, was Re: [PATCH v4 00/13] New remote-hg helper
From: Jonathan Nieder @ 2012-11-01 20:46 UTC (permalink / raw)
To: Junio C Hamano
Cc: Johannes Schindelin, Felipe Contreras, Jeff King, git,
Michael J Gruber, Sverre Rabbelier, Ilari Liusvaara,
Daniel Barkalow
In-Reply-To: <bec4d263-b458-4636-9fa6-1c1202416810@email.android.com>
Junio C Hamano wrote:
> We've been hoping we can do without a rigid code of conduct written
> down to maintain cordial community focused on technical merits, and
> instead relied on people's common sense, but sense may not be so
> common, unfortunately, so we may have to have one.
I think that except for occasional lapses this list stays pretty close
to what, for example, the Fedora[1] and Ubuntu[2] codes of conduct
require, and what Emily Postnews's guide[3] explains not to do.
What's the next step?
[1] http://www.ubuntu.com/project/about-ubuntu/conduct
[2] http://www.ubuntu.com/project/about-ubuntu/conduct
[3] http://www.templetons.com/brad/emily.html
^ permalink raw reply
* Re: Wrap commit messages on `git commit -m`
From: James Nylen @ 2012-11-01 21:10 UTC (permalink / raw)
To: Thomas Adam; +Cc: Ramkumar Ramachandra, Git List
In-Reply-To: <CA+39Oz7iuSPh2DqQFoO9o+V3TouMUy8T00KgXEP0vY758=S5gA@mail.gmail.com>
On Thu, Nov 1, 2012 at 2:12 PM, Thomas Adam <thomas@xteddy.org> wrote:
> Hi,
>
> On 1 November 2012 16:07, Ramkumar Ramachandra <artagnon@gmail.com> wrote:
>>
>> Hi,
>>
>> Some of my colleagues are lazy to fire up an editor and write proper
>> commit messages- they often write one-liners using `git commit -m`.
>> However, that line turns out to be longer than 72 characters, and the
>> resulting `git log` output is ugly. So, I was wondering if it would
>> be a good idea to wrap these one-liners to 72 characters
>> automatically.
>
> Can't you do this already? From "git-log(1)":
>
I think he's talking about git-commit wrapping the message as it is
being committed, instead of git-log doing the wrapping as it is being
displayed.
I personally would rather see git-commit refuse to accept messages
wider than 72 characters.
^ permalink raw reply
* Re: [PATCH v2 0/3] Introduce diff.submodule
From: Jens Lehmann @ 2012-11-01 21:10 UTC (permalink / raw)
To: Ramkumar Ramachandra; +Cc: Git List
In-Reply-To: <1351766630-4837-1-git-send-email-artagnon@gmail.com>
Am 01.11.2012 11:43, schrieb Ramkumar Ramachandra:
> Hi,
>
> v1 is here:
> http://mid.gmane.org/1349196670-2844-1-git-send-email-artagnon@gmail.com
>
> I've fixed the issues pointed out in the review by Jens.
Thanks, looking good to me.
^ permalink raw reply
* Re: Wrap commit messages on `git commit -m`
From: Lars Gullik Bjønnes @ 2012-11-01 16:29 UTC (permalink / raw)
To: git
In-Reply-To: <CALkWK0kQ+qCsOa87yY4wma279mp+9h+LFv3qCP_qrNdDyGNcsQ@mail.gmail.com>
Ramkumar Ramachandra <artagnon@gmail.com> writes:
| Hi,
>
| Some of my colleagues are lazy to fire up an editor and write proper
| commit messages- they often write one-liners using `git commit -m`.
| However, that line turns out to be longer than 72 characters, and the
| resulting `git log` output is ugly. So, I was wondering if it would
| be a good idea to wrap these one-liners to 72 characters
| automatically.
git commit -m 'foo: fix this problem
This problem is fixed by doing foo,
bar and baz.
Signed-off-by: me
'
works.
--
Lgb
^ permalink raw reply
* Re: Wrap commit messages on `git commit -m`
From: Kevin @ 2012-11-01 21:52 UTC (permalink / raw)
To: Lars Gullik Bjønnes; +Cc: git
In-Reply-To: <m3a9v170ca.fsf@black.gullik.net>
As I see it, the problem is not the possibility to add new lines, but
colleagues being too lazy to add them.
On Thu, Nov 1, 2012 at 5:29 PM, Lars Gullik Bjønnes <larsbj@gullik.org> wrote:
> Ramkumar Ramachandra <artagnon@gmail.com> writes:
>
> | Hi,
>>
> | Some of my colleagues are lazy to fire up an editor and write proper
> | commit messages- they often write one-liners using `git commit -m`.
> | However, that line turns out to be longer than 72 characters, and the
> | resulting `git log` output is ugly. So, I was wondering if it would
> | be a good idea to wrap these one-liners to 72 characters
> | automatically.
>
> git commit -m 'foo: fix this problem
>
> This problem is fixed by doing foo,
> bar and baz.
>
> Signed-off-by: me
> '
>
> works.
>
> --
> Lgb
>
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Request: git fetch --timeout
From: H. Peter Anvin @ 2012-11-01 21:59 UTC (permalink / raw)
To: Git Mailing List
Right now, there are events which can cause git fetch to hang forever.
This is really problematic in automatic use.
A git fetch --timeout which would exit with a nonzero exit code if no
forward progress is made would be really helpful.
-hpa
^ permalink raw reply
* Re: Wrap commit messages on `git commit -m`
From: Jonathan Nieder @ 2012-11-01 22:12 UTC (permalink / raw)
To: Kevin; +Cc: Ramkumar Ramachandra, Lars Gullik Bjønnes, git
In-Reply-To: <CAO54GHDRBDyQYvo-g_xEvsQJRgtfbbT-4-kop8hoSK1D37G44w@mail.gmail.com>
Kevin wrote:
> As I see it, the problem is not the possibility to add new lines, but
> colleagues being too lazy to add them.
I suspect the underlying problem is that we make it too hard to tell
git which text editor to run.
Ram, what platform do your colleagues use?
Thanks,
Jonathan
^ permalink raw reply
* Re: What's cooking in git.git (Oct 2012, #09; Mon, 29)
From: Chris Rorvick @ 2012-11-02 1:12 UTC (permalink / raw)
To: Ramsay Jones; +Cc: Jeff King, git
In-Reply-To: <5092C234.9000307@ramsay1.demon.co.uk>
On Thu, Nov 1, 2012 at 1:40 PM, Ramsay Jones <ramsay@ramsay1.demon.co.uk> wrote:
> Jeff King wrote:
>> What's cooking in git.git (Oct 2012, #09; Mon, 29)
>> --------------------------------------------------
>>
>
> [snip]
>
>> * cr/cvsimport-local-zone (2012-10-16) 1 commit
>> - git-cvsimport: allow author-specific timezones
>>
>> Allows "cvsimport" to read per-author timezone from the author info
>> file.
>>
>> Will merge to 'next'.
>
> Just FYI, t9604-cvsimport-timestamps.sh is still failing for me.
>
> I haven't spent too long on this yet, but I had hoped that setting
> TZ would sidestep any DST issues. (I have downloaded new tzdata, but
> have yet to install - actually I don't really want to!). It is not
> clear from the tzset manpage what happens if you use the DST format
> for TZ, but you don't provide the start/end date for DST, which is
> what this test is doing.
>
> Perhaps the test should use the non-DST format? e.g. "TZ=CST6 git ..."
> Does the test really care about DST? (*if* that is indeed the problem).
It actually looks like your TZ database is fine and the problem is
with the conversion to a struct tm. In each case, the time is
localized to the previous TZ value while the offset for the current TZ
value. For example, look at the first commit in the first test. It
converted the timestamp to 18:00 (CST6) while all the rest came
through as expected. I suspect the previous version of cvsimport
would exhibit similar behavior with the first imported commit. What
is your platform?
> Also: Note that the first test calls git-cvsimport twice, first *with*
> TZ set then again without; I suspect a cut/paste editing error.
Oops. The second invocation should have no effect on the repo so the
unit test is still valid, but that was a mistake for sure. Thanks.
Chris
^ permalink raw reply
* Overlong lines with git-merge --log
From: Tim Janik @ 2012-11-02 1:30 UTC (permalink / raw)
To: git
Hey all.
Using git-merge --log to merge commit messages that spawn multiple lines
will produce overlong summary lines.
That's because each summary line for a commit includes the entire commit
message (all lines concatenated).
According to git-fmt-merge-msg(1), --log should 'populate the log
message with one-line descriptions' instead of using the entire commit
messages.
Which would make a lot of sense, it's just not working as advertised.
Encountered with git version 1.7.9.5.
--
Yours sincerely,
Tim Janik
---
http://timj.testbit.eu/ - Free software Author
^ permalink raw reply
* [PATCH v4 00/14] fast-export and remote-testgit improvements
From: Felipe Contreras @ 2012-11-02 2:02 UTC (permalink / raw)
To: git
Cc: Junio C Hamano, Jeff King, Johannes Schindelin, Elijah Newren,
Ilari Liusvaara, Sverre Rabbelier, Felipe Contreras
Hi,
I found more issues in fast-export. remote-testgit, and eventually I decided
there's no reason to use this python script, so I wrote a much simpler version
that does the same, and more. I'm not going to list all the reasons because
apparently opinions are not welcome in the list any more. For the actual
differences you can check the patch itself.
The old remote-testgit is now remote-testpy (as it's testing the python
framework, not really remote helpers). The tests are simplified, and exercise
more features of transport-helper, and unsuprisingly, find more bugs.
Some of these bugs are fixed in this patch series as well, for which I already
sent 3 versions, and they come at the end. I was surprised they did fix them,
but hey... good is good.
I know how to fix the rest of the issues, but I'm not going to bother sending a
patch because obvious... er, simple? fixes are not accepted, so there's no
chance of something less... evident? getting through.
Cheers.
Felipe Contreras (14):
fast-export: avoid importing blob marks
remote-testgit: fix direction of marks
Rename git-remote-testgit to git-remote-testpy
Add new simplified git-remote-testgit
remote-testgit: get rid of non-local functionality
remote-testgit: remove irrelevant test
remote-testgit: cleanup tests
remote-testgit: exercise more features
remote-testgit: report success after an import
remote-testgit: make clear the 'done' feature
fast-export: trivial cleanup
fast-export: fix comparison in tests
fast-export: make sure updated refs get updated
fast-export: don't handle uninteresting refs
.gitignore | 2 +-
Documentation/git-remote-testgit.txt | 2 +-
Makefile | 2 +-
builtin/fast-export.c | 20 ++-
git-remote-testgit | 82 +++++++++++
git-remote-testgit.py | 272 -----------------------------------
git-remote-testpy.py | 272 +++++++++++++++++++++++++++++++++++
git_remote_helpers/git/importer.py | 2 +-
t/t5800-remote-helpers.sh | 148 -------------------
t/t5800-remote-testpy.sh | 148 +++++++++++++++++++
t/t5801-remote-helpers.sh | 153 ++++++++++++++++++++
t/t9350-fast-export.sh | 41 +++++-
12 files changed, 712 insertions(+), 432 deletions(-)
create mode 100755 git-remote-testgit
delete mode 100644 git-remote-testgit.py
create mode 100644 git-remote-testpy.py
delete mode 100755 t/t5800-remote-helpers.sh
create mode 100755 t/t5800-remote-testpy.sh
create mode 100644 t/t5801-remote-helpers.sh
--
1.8.0
^ permalink raw reply
* [PATCH v4 01/14] fast-export: avoid importing blob marks
From: Felipe Contreras @ 2012-11-02 2:02 UTC (permalink / raw)
To: git
Cc: Junio C Hamano, Jeff King, Johannes Schindelin, Elijah Newren,
Ilari Liusvaara, Sverre Rabbelier, Felipe Contreras
In-Reply-To: <1351821738-17526-1-git-send-email-felipe.contreras@gmail.com>
We want to be able to import, and then export, using the same marks, so
that we don't push things that the other side already received.
Unfortunately, fast-export doesn't store blobs in the marks, but
fast-import does. This creates a mismatch when fast export is reusing a
mark that were previously stored by fast-import.
There is no point in one tool saving blobs, and the other not, but for
now let's just check in fast-export that the objects are indeed commits.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
builtin/fast-export.c | 4 ++++
t/t9350-fast-export.sh | 14 ++++++++++++++
2 files changed, 18 insertions(+)
diff --git a/builtin/fast-export.c b/builtin/fast-export.c
index 12220ad..a06fe10 100644
--- a/builtin/fast-export.c
+++ b/builtin/fast-export.c
@@ -614,6 +614,10 @@ static void import_marks(char *input_file)
if (object->flags & SHOWN)
error("Object %s already has a mark", sha1_to_hex(sha1));
+ if (object->type != 1)
+ /* only commits */
+ continue;
+
mark_object(object, mark);
if (last_idnum < mark)
last_idnum = mark;
diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh
index 3e821f9..0c8d828 100755
--- a/t/t9350-fast-export.sh
+++ b/t/t9350-fast-export.sh
@@ -440,4 +440,18 @@ test_expect_success 'fast-export quotes pathnames' '
)
'
+test_expect_success 'test biridectionality' '
+ echo -n > marks-cur &&
+ echo -n > marks-new &&
+ git init marks-test &&
+ git fast-export --export-marks=marks-cur --import-marks=marks-cur --branches | \
+ git --git-dir=marks-test/.git fast-import --export-marks=marks-new --import-marks=marks-new &&
+ (cd marks-test &&
+ git reset --hard &&
+ echo Wohlauf > file &&
+ git commit -a -m "back in time") &&
+ git --git-dir=marks-test/.git fast-export --export-marks=marks-new --import-marks=marks-new --branches | \
+ git fast-import --export-marks=marks-cur --import-marks=marks-cur
+'
+
test_done
--
1.8.0
^ permalink raw reply related
* [PATCH v4 02/14] remote-testgit: fix direction of marks
From: Felipe Contreras @ 2012-11-02 2:02 UTC (permalink / raw)
To: git
Cc: Junio C Hamano, Jeff King, Johannes Schindelin, Elijah Newren,
Ilari Liusvaara, Sverre Rabbelier, Felipe Contreras
In-Reply-To: <1351821738-17526-1-git-send-email-felipe.contreras@gmail.com>
Basically this is what we want:
== pull ==
testgit transport-helper
* export -> import
# testgit.marks git.marks
== push ==
testgit transport-helper
* import <- export
# testgit.marks git.marks
Each side should be agnostic of the other side. Because testgit.marks
(our helper marks) could be anything, not necesarily a format parsable
by fast-export or fast-import. In this test hey happen to be compatible,
because we use those tools, but in the real world it would be something
compelely different. For example, they might be mapping marks to
mercurial revisions (certainly not parsable by fast-import/export).
This is what we have:
== pull ==
testgit transport-helper
* export -> import
# testgit.marks git.marks
== push ==
testgit transport-helper
* import <- export
# git.marks testgit.marks
The only reason this is working is that git.marks and testgit.marks are
roughly the same.
This new behavior used to not be possible before due to a bug in
fast-export, but with the bug fixed, it works fine.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
git-remote-testgit.py | 2 +-
git_remote_helpers/git/importer.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/git-remote-testgit.py b/git-remote-testgit.py
index 5f3ebd2..ade797b 100644
--- a/git-remote-testgit.py
+++ b/git-remote-testgit.py
@@ -91,7 +91,7 @@ def do_capabilities(repo, args):
if not os.path.exists(dirname):
os.makedirs(dirname)
- path = os.path.join(dirname, 'testgit.marks')
+ path = os.path.join(dirname, 'git.marks')
print "*export-marks %s" % path
if os.path.exists(path):
diff --git a/git_remote_helpers/git/importer.py b/git_remote_helpers/git/importer.py
index 5c6b595..e28cc8f 100644
--- a/git_remote_helpers/git/importer.py
+++ b/git_remote_helpers/git/importer.py
@@ -39,7 +39,7 @@ class GitImporter(object):
gitdir = self.repo.gitpath
else:
gitdir = os.path.abspath(os.path.join(dirname, '.git'))
- path = os.path.abspath(os.path.join(dirname, 'git.marks'))
+ path = os.path.abspath(os.path.join(dirname, 'testgit.marks'))
if not os.path.exists(dirname):
os.makedirs(dirname)
--
1.8.0
^ permalink raw reply related
* [PATCH v4 03/14] Rename git-remote-testgit to git-remote-testpy
From: Felipe Contreras @ 2012-11-02 2:02 UTC (permalink / raw)
To: git
Cc: Junio C Hamano, Jeff King, Johannes Schindelin, Elijah Newren,
Ilari Liusvaara, Sverre Rabbelier, Felipe Contreras
In-Reply-To: <1351821738-17526-1-git-send-email-felipe.contreras@gmail.com>
This script is not really exercising the remote-helper functionality,
but more the python framework for remote helpers that live in
git_remote_helpers.
It's also not a good example of how to write remote-helpers, unless you
are planning to use python, and even then you might not want to use this
framework.
So let's use a more appropriate name: git-remote-testpy.
A patch that replaces git-remote-testgit with a simpler version is on
the way.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
.gitignore | 2 +-
Makefile | 2 +-
git-remote-testgit.py | 272 ----------------------------------------------
git-remote-testpy.py | 272 ++++++++++++++++++++++++++++++++++++++++++++++
t/t5800-remote-helpers.sh | 148 -------------------------
t/t5800-remote-testpy.sh | 148 +++++++++++++++++++++++++
6 files changed, 422 insertions(+), 422 deletions(-)
delete mode 100644 git-remote-testgit.py
create mode 100644 git-remote-testpy.py
delete mode 100755 t/t5800-remote-helpers.sh
create mode 100755 t/t5800-remote-testpy.sh
diff --git a/.gitignore b/.gitignore
index a188a82..48d1bbb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -124,7 +124,7 @@
/git-remote-ftps
/git-remote-fd
/git-remote-ext
-/git-remote-testgit
+/git-remote-testpy
/git-repack
/git-replace
/git-repo-config
diff --git a/Makefile b/Makefile
index f69979e..e18ee48 100644
--- a/Makefile
+++ b/Makefile
@@ -470,7 +470,7 @@ SCRIPT_PERL += git-relink.perl
SCRIPT_PERL += git-send-email.perl
SCRIPT_PERL += git-svn.perl
-SCRIPT_PYTHON += git-remote-testgit.py
+SCRIPT_PYTHON += git-remote-testpy.py
SCRIPT_PYTHON += git-p4.py
SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \
diff --git a/git-remote-testgit.py b/git-remote-testgit.py
deleted file mode 100644
index ade797b..0000000
--- a/git-remote-testgit.py
+++ /dev/null
@@ -1,272 +0,0 @@
-#!/usr/bin/env python
-
-# This command is a simple remote-helper, that is used both as a
-# testcase for the remote-helper functionality, and as an example to
-# show remote-helper authors one possible implementation.
-#
-# This is a Git <-> Git importer/exporter, that simply uses git
-# fast-import and git fast-export to consume and produce fast-import
-# streams.
-#
-# To understand better the way things work, one can activate debug
-# traces by setting (to any value) the environment variables
-# GIT_TRANSPORT_HELPER_DEBUG and GIT_DEBUG_TESTGIT, to see messages
-# from the transport-helper side, or from this example remote-helper.
-
-# hashlib is only available in python >= 2.5
-try:
- import hashlib
- _digest = hashlib.sha1
-except ImportError:
- import sha
- _digest = sha.new
-import sys
-import os
-import time
-sys.path.insert(0, os.getenv("GITPYTHONLIB","."))
-
-from git_remote_helpers.util import die, debug, warn
-from git_remote_helpers.git.repo import GitRepo
-from git_remote_helpers.git.exporter import GitExporter
-from git_remote_helpers.git.importer import GitImporter
-from git_remote_helpers.git.non_local import NonLocalGit
-
-def get_repo(alias, url):
- """Returns a git repository object initialized for usage.
- """
-
- repo = GitRepo(url)
- repo.get_revs()
- repo.get_head()
-
- hasher = _digest()
- hasher.update(repo.path)
- repo.hash = hasher.hexdigest()
-
- repo.get_base_path = lambda base: os.path.join(
- base, 'info', 'fast-import', repo.hash)
-
- prefix = 'refs/testgit/%s/' % alias
- debug("prefix: '%s'", prefix)
-
- repo.gitdir = os.environ["GIT_DIR"]
- repo.alias = alias
- repo.prefix = prefix
-
- repo.exporter = GitExporter(repo)
- repo.importer = GitImporter(repo)
- repo.non_local = NonLocalGit(repo)
-
- return repo
-
-
-def local_repo(repo, path):
- """Returns a git repository object initalized for usage.
- """
-
- local = GitRepo(path)
-
- local.non_local = None
- local.gitdir = repo.gitdir
- local.alias = repo.alias
- local.prefix = repo.prefix
- local.hash = repo.hash
- local.get_base_path = repo.get_base_path
- local.exporter = GitExporter(local)
- local.importer = GitImporter(local)
-
- return local
-
-
-def do_capabilities(repo, args):
- """Prints the supported capabilities.
- """
-
- print "import"
- print "export"
- print "refspec refs/heads/*:%s*" % repo.prefix
-
- dirname = repo.get_base_path(repo.gitdir)
-
- if not os.path.exists(dirname):
- os.makedirs(dirname)
-
- path = os.path.join(dirname, 'git.marks')
-
- print "*export-marks %s" % path
- if os.path.exists(path):
- print "*import-marks %s" % path
-
- print # end capabilities
-
-
-def do_list(repo, args):
- """Lists all known references.
-
- Bug: This will always set the remote head to master for non-local
- repositories, since we have no way of determining what the remote
- head is at clone time.
- """
-
- for ref in repo.revs:
- debug("? refs/heads/%s", ref)
- print "? refs/heads/%s" % ref
-
- if repo.head:
- debug("@refs/heads/%s HEAD" % repo.head)
- print "@refs/heads/%s HEAD" % repo.head
- else:
- debug("@refs/heads/master HEAD")
- print "@refs/heads/master HEAD"
-
- print # end list
-
-
-def update_local_repo(repo):
- """Updates (or clones) a local repo.
- """
-
- if repo.local:
- return repo
-
- path = repo.non_local.clone(repo.gitdir)
- repo.non_local.update(repo.gitdir)
- repo = local_repo(repo, path)
- return repo
-
-
-def do_import(repo, args):
- """Exports a fast-import stream from testgit for git to import.
- """
-
- if len(args) != 1:
- die("Import needs exactly one ref")
-
- if not repo.gitdir:
- die("Need gitdir to import")
-
- ref = args[0]
- refs = [ref]
-
- while True:
- line = sys.stdin.readline()
- if line == '\n':
- break
- if not line.startswith('import '):
- die("Expected import line.")
-
- # strip of leading 'import '
- ref = line[7:].strip()
- refs.append(ref)
-
- repo = update_local_repo(repo)
- repo.exporter.export_repo(repo.gitdir, refs)
-
- print "done"
-
-
-def do_export(repo, args):
- """Imports a fast-import stream from git to testgit.
- """
-
- if not repo.gitdir:
- die("Need gitdir to export")
-
- update_local_repo(repo)
- changed = repo.importer.do_import(repo.gitdir)
-
- if not repo.local:
- repo.non_local.push(repo.gitdir)
-
- for ref in changed:
- print "ok %s" % ref
- print
-
-
-COMMANDS = {
- 'capabilities': do_capabilities,
- 'list': do_list,
- 'import': do_import,
- 'export': do_export,
-}
-
-
-def sanitize(value):
- """Cleans up the url.
- """
-
- if value.startswith('testgit::'):
- value = value[9:]
-
- return value
-
-
-def read_one_line(repo):
- """Reads and processes one command.
- """
-
- sleepy = os.environ.get("GIT_REMOTE_TESTGIT_SLEEPY")
- if sleepy:
- debug("Sleeping %d sec before readline" % int(sleepy))
- time.sleep(int(sleepy))
-
- line = sys.stdin.readline()
-
- cmdline = line
-
- if not cmdline:
- warn("Unexpected EOF")
- return False
-
- cmdline = cmdline.strip().split()
- if not cmdline:
- # Blank line means we're about to quit
- return False
-
- cmd = cmdline.pop(0)
- debug("Got command '%s' with args '%s'", cmd, ' '.join(cmdline))
-
- if cmd not in COMMANDS:
- die("Unknown command, %s", cmd)
-
- func = COMMANDS[cmd]
- func(repo, cmdline)
- sys.stdout.flush()
-
- return True
-
-
-def main(args):
- """Starts a new remote helper for the specified repository.
- """
-
- if len(args) != 3:
- die("Expecting exactly three arguments.")
- sys.exit(1)
-
- if os.getenv("GIT_DEBUG_TESTGIT"):
- import git_remote_helpers.util
- git_remote_helpers.util.DEBUG = True
-
- alias = sanitize(args[1])
- url = sanitize(args[2])
-
- if not alias.isalnum():
- warn("non-alnum alias '%s'", alias)
- alias = "tmp"
-
- args[1] = alias
- args[2] = url
-
- repo = get_repo(alias, url)
-
- debug("Got arguments %s", args[1:])
-
- more = True
-
- sys.stdin = os.fdopen(sys.stdin.fileno(), 'r', 0)
- while (more):
- more = read_one_line(repo)
-
-if __name__ == '__main__':
- sys.exit(main(sys.argv))
diff --git a/git-remote-testpy.py b/git-remote-testpy.py
new file mode 100644
index 0000000..ade797b
--- /dev/null
+++ b/git-remote-testpy.py
@@ -0,0 +1,272 @@
+#!/usr/bin/env python
+
+# This command is a simple remote-helper, that is used both as a
+# testcase for the remote-helper functionality, and as an example to
+# show remote-helper authors one possible implementation.
+#
+# This is a Git <-> Git importer/exporter, that simply uses git
+# fast-import and git fast-export to consume and produce fast-import
+# streams.
+#
+# To understand better the way things work, one can activate debug
+# traces by setting (to any value) the environment variables
+# GIT_TRANSPORT_HELPER_DEBUG and GIT_DEBUG_TESTGIT, to see messages
+# from the transport-helper side, or from this example remote-helper.
+
+# hashlib is only available in python >= 2.5
+try:
+ import hashlib
+ _digest = hashlib.sha1
+except ImportError:
+ import sha
+ _digest = sha.new
+import sys
+import os
+import time
+sys.path.insert(0, os.getenv("GITPYTHONLIB","."))
+
+from git_remote_helpers.util import die, debug, warn
+from git_remote_helpers.git.repo import GitRepo
+from git_remote_helpers.git.exporter import GitExporter
+from git_remote_helpers.git.importer import GitImporter
+from git_remote_helpers.git.non_local import NonLocalGit
+
+def get_repo(alias, url):
+ """Returns a git repository object initialized for usage.
+ """
+
+ repo = GitRepo(url)
+ repo.get_revs()
+ repo.get_head()
+
+ hasher = _digest()
+ hasher.update(repo.path)
+ repo.hash = hasher.hexdigest()
+
+ repo.get_base_path = lambda base: os.path.join(
+ base, 'info', 'fast-import', repo.hash)
+
+ prefix = 'refs/testgit/%s/' % alias
+ debug("prefix: '%s'", prefix)
+
+ repo.gitdir = os.environ["GIT_DIR"]
+ repo.alias = alias
+ repo.prefix = prefix
+
+ repo.exporter = GitExporter(repo)
+ repo.importer = GitImporter(repo)
+ repo.non_local = NonLocalGit(repo)
+
+ return repo
+
+
+def local_repo(repo, path):
+ """Returns a git repository object initalized for usage.
+ """
+
+ local = GitRepo(path)
+
+ local.non_local = None
+ local.gitdir = repo.gitdir
+ local.alias = repo.alias
+ local.prefix = repo.prefix
+ local.hash = repo.hash
+ local.get_base_path = repo.get_base_path
+ local.exporter = GitExporter(local)
+ local.importer = GitImporter(local)
+
+ return local
+
+
+def do_capabilities(repo, args):
+ """Prints the supported capabilities.
+ """
+
+ print "import"
+ print "export"
+ print "refspec refs/heads/*:%s*" % repo.prefix
+
+ dirname = repo.get_base_path(repo.gitdir)
+
+ if not os.path.exists(dirname):
+ os.makedirs(dirname)
+
+ path = os.path.join(dirname, 'git.marks')
+
+ print "*export-marks %s" % path
+ if os.path.exists(path):
+ print "*import-marks %s" % path
+
+ print # end capabilities
+
+
+def do_list(repo, args):
+ """Lists all known references.
+
+ Bug: This will always set the remote head to master for non-local
+ repositories, since we have no way of determining what the remote
+ head is at clone time.
+ """
+
+ for ref in repo.revs:
+ debug("? refs/heads/%s", ref)
+ print "? refs/heads/%s" % ref
+
+ if repo.head:
+ debug("@refs/heads/%s HEAD" % repo.head)
+ print "@refs/heads/%s HEAD" % repo.head
+ else:
+ debug("@refs/heads/master HEAD")
+ print "@refs/heads/master HEAD"
+
+ print # end list
+
+
+def update_local_repo(repo):
+ """Updates (or clones) a local repo.
+ """
+
+ if repo.local:
+ return repo
+
+ path = repo.non_local.clone(repo.gitdir)
+ repo.non_local.update(repo.gitdir)
+ repo = local_repo(repo, path)
+ return repo
+
+
+def do_import(repo, args):
+ """Exports a fast-import stream from testgit for git to import.
+ """
+
+ if len(args) != 1:
+ die("Import needs exactly one ref")
+
+ if not repo.gitdir:
+ die("Need gitdir to import")
+
+ ref = args[0]
+ refs = [ref]
+
+ while True:
+ line = sys.stdin.readline()
+ if line == '\n':
+ break
+ if not line.startswith('import '):
+ die("Expected import line.")
+
+ # strip of leading 'import '
+ ref = line[7:].strip()
+ refs.append(ref)
+
+ repo = update_local_repo(repo)
+ repo.exporter.export_repo(repo.gitdir, refs)
+
+ print "done"
+
+
+def do_export(repo, args):
+ """Imports a fast-import stream from git to testgit.
+ """
+
+ if not repo.gitdir:
+ die("Need gitdir to export")
+
+ update_local_repo(repo)
+ changed = repo.importer.do_import(repo.gitdir)
+
+ if not repo.local:
+ repo.non_local.push(repo.gitdir)
+
+ for ref in changed:
+ print "ok %s" % ref
+ print
+
+
+COMMANDS = {
+ 'capabilities': do_capabilities,
+ 'list': do_list,
+ 'import': do_import,
+ 'export': do_export,
+}
+
+
+def sanitize(value):
+ """Cleans up the url.
+ """
+
+ if value.startswith('testgit::'):
+ value = value[9:]
+
+ return value
+
+
+def read_one_line(repo):
+ """Reads and processes one command.
+ """
+
+ sleepy = os.environ.get("GIT_REMOTE_TESTGIT_SLEEPY")
+ if sleepy:
+ debug("Sleeping %d sec before readline" % int(sleepy))
+ time.sleep(int(sleepy))
+
+ line = sys.stdin.readline()
+
+ cmdline = line
+
+ if not cmdline:
+ warn("Unexpected EOF")
+ return False
+
+ cmdline = cmdline.strip().split()
+ if not cmdline:
+ # Blank line means we're about to quit
+ return False
+
+ cmd = cmdline.pop(0)
+ debug("Got command '%s' with args '%s'", cmd, ' '.join(cmdline))
+
+ if cmd not in COMMANDS:
+ die("Unknown command, %s", cmd)
+
+ func = COMMANDS[cmd]
+ func(repo, cmdline)
+ sys.stdout.flush()
+
+ return True
+
+
+def main(args):
+ """Starts a new remote helper for the specified repository.
+ """
+
+ if len(args) != 3:
+ die("Expecting exactly three arguments.")
+ sys.exit(1)
+
+ if os.getenv("GIT_DEBUG_TESTGIT"):
+ import git_remote_helpers.util
+ git_remote_helpers.util.DEBUG = True
+
+ alias = sanitize(args[1])
+ url = sanitize(args[2])
+
+ if not alias.isalnum():
+ warn("non-alnum alias '%s'", alias)
+ alias = "tmp"
+
+ args[1] = alias
+ args[2] = url
+
+ repo = get_repo(alias, url)
+
+ debug("Got arguments %s", args[1:])
+
+ more = True
+
+ sys.stdin = os.fdopen(sys.stdin.fileno(), 'r', 0)
+ while (more):
+ more = read_one_line(repo)
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv))
diff --git a/t/t5800-remote-helpers.sh b/t/t5800-remote-helpers.sh
deleted file mode 100755
index e7dc668..0000000
--- a/t/t5800-remote-helpers.sh
+++ /dev/null
@@ -1,148 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2010 Sverre Rabbelier
-#
-
-test_description='Test remote-helper import and export commands'
-
-. ./test-lib.sh
-
-if ! test_have_prereq PYTHON ; then
- skip_all='skipping git-remote-hg tests, python not available'
- test_done
-fi
-
-"$PYTHON_PATH" -c '
-import sys
-if sys.hexversion < 0x02040000:
- sys.exit(1)
-' || {
- skip_all='skipping git-remote-hg tests, python version < 2.4'
- test_done
-}
-
-compare_refs() {
- git --git-dir="$1/.git" rev-parse --verify $2 >expect &&
- git --git-dir="$3/.git" rev-parse --verify $4 >actual &&
- test_cmp expect actual
-}
-
-test_expect_success 'setup repository' '
- git init --bare server/.git &&
- git clone server public &&
- (cd public &&
- echo content >file &&
- git add file &&
- git commit -m one &&
- git push origin master)
-'
-
-test_expect_success 'cloning from local repo' '
- git clone "testgit::${PWD}/server" localclone &&
- test_cmp public/file localclone/file
-'
-
-test_expect_success 'cloning from remote repo' '
- git clone "testgit::file://${PWD}/server" clone &&
- test_cmp public/file clone/file
-'
-
-test_expect_success 'create new commit on remote' '
- (cd public &&
- echo content >>file &&
- git commit -a -m two &&
- git push)
-'
-
-test_expect_success 'pulling from local repo' '
- (cd localclone && git pull) &&
- test_cmp public/file localclone/file
-'
-
-test_expect_success 'pulling from remote remote' '
- (cd clone && git pull) &&
- test_cmp public/file clone/file
-'
-
-test_expect_success 'pushing to local repo' '
- (cd localclone &&
- echo content >>file &&
- git commit -a -m three &&
- git push) &&
- compare_refs localclone HEAD server HEAD
-'
-
-# Generally, skip this test. It demonstrates a now-fixed race in
-# git-remote-testgit, but is too slow to leave in for general use.
-: test_expect_success 'racily pushing to local repo' '
- test_when_finished "rm -rf server2 localclone2" &&
- cp -R server server2 &&
- git clone "testgit::${PWD}/server2" localclone2 &&
- (cd localclone2 &&
- echo content >>file &&
- git commit -a -m three &&
- GIT_REMOTE_TESTGIT_SLEEPY=2 git push) &&
- compare_refs localclone2 HEAD server2 HEAD
-'
-
-test_expect_success 'synch with changes from localclone' '
- (cd clone &&
- git pull)
-'
-
-test_expect_success 'pushing remote local repo' '
- (cd clone &&
- echo content >>file &&
- git commit -a -m four &&
- git push) &&
- compare_refs clone HEAD server HEAD
-'
-
-test_expect_success 'fetch new branch' '
- (cd public &&
- git checkout -b new &&
- echo content >>file &&
- git commit -a -m five &&
- git push origin new
- ) &&
- (cd localclone &&
- git fetch origin new
- ) &&
- compare_refs public HEAD localclone FETCH_HEAD
-'
-
-test_expect_success 'fetch multiple branches' '
- (cd localclone &&
- git fetch
- ) &&
- compare_refs server master localclone refs/remotes/origin/master &&
- compare_refs server new localclone refs/remotes/origin/new
-'
-
-test_expect_success 'push when remote has extra refs' '
- (cd clone &&
- echo content >>file &&
- git commit -a -m six &&
- git push
- ) &&
- compare_refs clone master server master
-'
-
-test_expect_success 'push new branch by name' '
- (cd clone &&
- git checkout -b new-name &&
- echo content >>file &&
- git commit -a -m seven &&
- git push origin new-name
- ) &&
- compare_refs clone HEAD server refs/heads/new-name
-'
-
-test_expect_failure 'push new branch with old:new refspec' '
- (cd clone &&
- git push origin new-name:new-refspec
- ) &&
- compare_refs clone HEAD server refs/heads/new-refspec
-'
-
-test_done
diff --git a/t/t5800-remote-testpy.sh b/t/t5800-remote-testpy.sh
new file mode 100755
index 0000000..927eef1
--- /dev/null
+++ b/t/t5800-remote-testpy.sh
@@ -0,0 +1,148 @@
+#!/bin/sh
+#
+# Copyright (c) 2010 Sverre Rabbelier
+#
+
+test_description='Test python remote-helper framework'
+
+. ./test-lib.sh
+
+if ! test_have_prereq PYTHON ; then
+ skip_all='skipping git-remote-hg tests, python not available'
+ test_done
+fi
+
+"$PYTHON_PATH" -c '
+import sys
+if sys.hexversion < 0x02040000:
+ sys.exit(1)
+' || {
+ skip_all='skipping git-remote-hg tests, python version < 2.4'
+ test_done
+}
+
+compare_refs() {
+ git --git-dir="$1/.git" rev-parse --verify $2 >expect &&
+ git --git-dir="$3/.git" rev-parse --verify $4 >actual &&
+ test_cmp expect actual
+}
+
+test_expect_success 'setup repository' '
+ git init --bare server/.git &&
+ git clone server public &&
+ (cd public &&
+ echo content >file &&
+ git add file &&
+ git commit -m one &&
+ git push origin master)
+'
+
+test_expect_success 'cloning from local repo' '
+ git clone "testpy::${PWD}/server" localclone &&
+ test_cmp public/file localclone/file
+'
+
+test_expect_success 'cloning from remote repo' '
+ git clone "testpy::file://${PWD}/server" clone &&
+ test_cmp public/file clone/file
+'
+
+test_expect_success 'create new commit on remote' '
+ (cd public &&
+ echo content >>file &&
+ git commit -a -m two &&
+ git push)
+'
+
+test_expect_success 'pulling from local repo' '
+ (cd localclone && git pull) &&
+ test_cmp public/file localclone/file
+'
+
+test_expect_success 'pulling from remote remote' '
+ (cd clone && git pull) &&
+ test_cmp public/file clone/file
+'
+
+test_expect_success 'pushing to local repo' '
+ (cd localclone &&
+ echo content >>file &&
+ git commit -a -m three &&
+ git push) &&
+ compare_refs localclone HEAD server HEAD
+'
+
+# Generally, skip this test. It demonstrates a now-fixed race in
+# git-remote-testpy, but is too slow to leave in for general use.
+: test_expect_success 'racily pushing to local repo' '
+ test_when_finished "rm -rf server2 localclone2" &&
+ cp -R server server2 &&
+ git clone "testpy::${PWD}/server2" localclone2 &&
+ (cd localclone2 &&
+ echo content >>file &&
+ git commit -a -m three &&
+ GIT_REMOTE_TESTGIT_SLEEPY=2 git push) &&
+ compare_refs localclone2 HEAD server2 HEAD
+'
+
+test_expect_success 'synch with changes from localclone' '
+ (cd clone &&
+ git pull)
+'
+
+test_expect_success 'pushing remote local repo' '
+ (cd clone &&
+ echo content >>file &&
+ git commit -a -m four &&
+ git push) &&
+ compare_refs clone HEAD server HEAD
+'
+
+test_expect_success 'fetch new branch' '
+ (cd public &&
+ git checkout -b new &&
+ echo content >>file &&
+ git commit -a -m five &&
+ git push origin new
+ ) &&
+ (cd localclone &&
+ git fetch origin new
+ ) &&
+ compare_refs public HEAD localclone FETCH_HEAD
+'
+
+test_expect_success 'fetch multiple branches' '
+ (cd localclone &&
+ git fetch
+ ) &&
+ compare_refs server master localclone refs/remotes/origin/master &&
+ compare_refs server new localclone refs/remotes/origin/new
+'
+
+test_expect_success 'push when remote has extra refs' '
+ (cd clone &&
+ echo content >>file &&
+ git commit -a -m six &&
+ git push
+ ) &&
+ compare_refs clone master server master
+'
+
+test_expect_success 'push new branch by name' '
+ (cd clone &&
+ git checkout -b new-name &&
+ echo content >>file &&
+ git commit -a -m seven &&
+ git push origin new-name
+ ) &&
+ compare_refs clone HEAD server refs/heads/new-name
+'
+
+test_expect_failure 'push new branch with old:new refspec' '
+ (cd clone &&
+ git push origin new-name:new-refspec
+ ) &&
+ compare_refs clone HEAD server refs/heads/new-refspec
+'
+
+test_done
--
1.8.0
^ permalink raw reply related
* [PATCH v4 05/14] remote-testgit: get rid of non-local functionality
From: Felipe Contreras @ 2012-11-02 2:02 UTC (permalink / raw)
To: git
Cc: Junio C Hamano, Jeff King, Johannes Schindelin, Elijah Newren,
Ilari Liusvaara, Sverre Rabbelier, Felipe Contreras
In-Reply-To: <1351821738-17526-1-git-send-email-felipe.contreras@gmail.com>
This only makes sense for the python remote helpers framework.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
git-remote-testgit | 3 ---
t/t5801-remote-helpers.sh | 46 +++++++++++++++++-----------------------------
2 files changed, 17 insertions(+), 32 deletions(-)
diff --git a/git-remote-testgit b/git-remote-testgit
index 6650402..b9810fd 100755
--- a/git-remote-testgit
+++ b/git-remote-testgit
@@ -4,9 +4,6 @@
alias="$1"
url="$2"
-# huh?
-url="${url#file://}"
-
dir="$GIT_DIR/testgit/$alias"
prefix="refs/testgit/$alias"
refspec="refs/heads/*:${prefix}/heads/*"
diff --git a/t/t5801-remote-helpers.sh b/t/t5801-remote-helpers.sh
index 67bc8eb..2eca42e 100755
--- a/t/t5801-remote-helpers.sh
+++ b/t/t5801-remote-helpers.sh
@@ -28,11 +28,6 @@ test_expect_success 'cloning from local repo' '
test_cmp public/file localclone/file
'
-test_expect_success 'cloning from remote repo' '
- git clone "testgit::file://${PWD}/server" clone &&
- test_cmp public/file clone/file
-'
-
test_expect_success 'create new commit on remote' '
(cd public &&
echo content >>file &&
@@ -45,11 +40,6 @@ test_expect_success 'pulling from local repo' '
test_cmp public/file localclone/file
'
-test_expect_success 'pulling from remote remote' '
- (cd clone && git pull) &&
- test_cmp public/file clone/file
-'
-
test_expect_success 'pushing to local repo' '
(cd localclone &&
echo content >>file &&
@@ -71,19 +61,6 @@ test_expect_success 'pushing to local repo' '
compare_refs localclone2 HEAD server2 HEAD
'
-test_expect_success 'synch with changes from localclone' '
- (cd clone &&
- git pull)
-'
-
-test_expect_success 'pushing remote local repo' '
- (cd clone &&
- echo content >>file &&
- git commit -a -m four &&
- git push) &&
- compare_refs clone HEAD server HEAD
-'
-
test_expect_success 'fetch new branch' '
(cd public &&
git checkout -b new &&
@@ -97,6 +74,16 @@ test_expect_success 'fetch new branch' '
compare_refs public HEAD localclone FETCH_HEAD
'
+test_expect_success 'bump commit in public' '
+ (cd public &&
+ git checkout master &&
+ git pull &&
+ echo content >>file &&
+ git commit -a -m four &&
+ git push) &&
+ compare_refs public HEAD server HEAD
+'
+
test_expect_success 'fetch multiple branches' '
(cd localclone &&
git fetch
@@ -106,29 +93,30 @@ test_expect_success 'fetch multiple branches' '
'
test_expect_success 'push when remote has extra refs' '
- (cd clone &&
+ (cd localclone &&
+ git reset --hard origin/master &&
echo content >>file &&
git commit -a -m six &&
git push
) &&
- compare_refs clone master server master
+ compare_refs localclone master server master
'
test_expect_success 'push new branch by name' '
- (cd clone &&
+ (cd localclone &&
git checkout -b new-name &&
echo content >>file &&
git commit -a -m seven &&
git push origin new-name
) &&
- compare_refs clone HEAD server refs/heads/new-name
+ compare_refs localclone HEAD server refs/heads/new-name
'
test_expect_failure 'push new branch with old:new refspec' '
- (cd clone &&
+ (cd localclone &&
git push origin new-name:new-refspec
) &&
- compare_refs clone HEAD server refs/heads/new-refspec
+ compare_refs localclone HEAD server refs/heads/new-refspec
'
test_done
--
1.8.0
^ permalink raw reply related
* [PATCH v4 04/14] Add new simplified git-remote-testgit
From: Felipe Contreras @ 2012-11-02 2:02 UTC (permalink / raw)
To: git
Cc: Junio C Hamano, Jeff King, Johannes Schindelin, Elijah Newren,
Ilari Liusvaara, Sverre Rabbelier, Felipe Contreras
In-Reply-To: <1351821738-17526-1-git-send-email-felipe.contreras@gmail.com>
It's way simpler. It exerceises the same features of remote helpers.
It's easy to read and understand. It doesn't depend on python.
It does _not_ exercise the python remote helper framework; there's
another tool and another test for that.
For now let's just copy the old remote-helpers test script, although
some of those tests don't make sense for this testgit (they still pass).
In addition, this script would be able to test other features not
currently being tested.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
Documentation/git-remote-testgit.txt | 2 +-
git-remote-testgit | 62 ++++++++++++++++
t/t5801-remote-helpers.sh | 134 +++++++++++++++++++++++++++++++++++
3 files changed, 197 insertions(+), 1 deletion(-)
create mode 100755 git-remote-testgit
create mode 100755 t/t5801-remote-helpers.sh
diff --git a/Documentation/git-remote-testgit.txt b/Documentation/git-remote-testgit.txt
index 2a67d45..612a625 100644
--- a/Documentation/git-remote-testgit.txt
+++ b/Documentation/git-remote-testgit.txt
@@ -19,7 +19,7 @@ testcase for the remote-helper functionality, and as an example to
show remote-helper authors one possible implementation.
The best way to learn more is to read the comments and source code in
-'git-remote-testgit.py'.
+'git-remote-testgit'.
SEE ALSO
--------
diff --git a/git-remote-testgit b/git-remote-testgit
new file mode 100755
index 0000000..6650402
--- /dev/null
+++ b/git-remote-testgit
@@ -0,0 +1,62 @@
+#!/bin/bash
+# Copyright (c) 2012 Felipe Contreras
+
+alias="$1"
+url="$2"
+
+# huh?
+url="${url#file://}"
+
+dir="$GIT_DIR/testgit/$alias"
+prefix="refs/testgit/$alias"
+refspec="refs/heads/*:${prefix}/heads/*"
+
+gitmarks="$dir/git.marks"
+testgitmarks="$dir/testgit.marks"
+
+export GIT_DIR="$url/.git"
+
+mkdir -p "$dir"
+
+test -e "$gitmarks" || echo -n > "$gitmarks"
+test -e "$testgitmarks" || echo -n > "$testgitmarks"
+
+while read line; do
+ case "$line" in
+ capabilities)
+ echo 'import'
+ echo 'export'
+ echo "refspec $refspec"
+ echo "*import-marks $gitmarks"
+ echo "*export-marks $gitmarks"
+ echo
+ ;;
+ list)
+ git for-each-ref --format='? %(refname)' 'refs/heads/'
+ head=$(git symbolic-ref HEAD)
+ echo "@$head HEAD"
+ echo
+ ;;
+ import*)
+ # read all import lines
+ while true; do
+ ref="${line#* }"
+ refs="$refs $ref"
+ read line
+ test "${line%% *}" != "import" && break
+ done
+
+ echo "feature import-marks=$gitmarks"
+ echo "feature export-marks=$gitmarks"
+ git fast-export --use-done-feature --{import,export}-marks="$testgitmarks" $refs | \
+ sed -e "s#refs/heads/#${prefix}/heads/#g"
+ ;;
+ export)
+ git fast-import --{import,export}-marks="$testgitmarks" --quiet
+ echo
+ ;;
+ '')
+ exit
+ ;;
+ esac
+done
diff --git a/t/t5801-remote-helpers.sh b/t/t5801-remote-helpers.sh
new file mode 100755
index 0000000..67bc8eb
--- /dev/null
+++ b/t/t5801-remote-helpers.sh
@@ -0,0 +1,134 @@
+#!/bin/sh
+#
+# Copyright (c) 2010 Sverre Rabbelier
+#
+
+test_description='Test remote-helper import and export commands'
+
+. ./test-lib.sh
+
+compare_refs() {
+ git --git-dir="$1/.git" rev-parse --verify $2 >expect &&
+ git --git-dir="$3/.git" rev-parse --verify $4 >actual &&
+ test_cmp expect actual
+}
+
+test_expect_success 'setup repository' '
+ git init --bare server/.git &&
+ git clone server public &&
+ (cd public &&
+ echo content >file &&
+ git add file &&
+ git commit -m one &&
+ git push origin master)
+'
+
+test_expect_success 'cloning from local repo' '
+ git clone "testgit::${PWD}/server" localclone &&
+ test_cmp public/file localclone/file
+'
+
+test_expect_success 'cloning from remote repo' '
+ git clone "testgit::file://${PWD}/server" clone &&
+ test_cmp public/file clone/file
+'
+
+test_expect_success 'create new commit on remote' '
+ (cd public &&
+ echo content >>file &&
+ git commit -a -m two &&
+ git push)
+'
+
+test_expect_success 'pulling from local repo' '
+ (cd localclone && git pull) &&
+ test_cmp public/file localclone/file
+'
+
+test_expect_success 'pulling from remote remote' '
+ (cd clone && git pull) &&
+ test_cmp public/file clone/file
+'
+
+test_expect_success 'pushing to local repo' '
+ (cd localclone &&
+ echo content >>file &&
+ git commit -a -m three &&
+ git push) &&
+ compare_refs localclone HEAD server HEAD
+'
+
+# Generally, skip this test. It demonstrates a now-fixed race in
+# git-remote-testgit, but is too slow to leave in for general use.
+: test_expect_success 'racily pushing to local repo' '
+ test_when_finished "rm -rf server2 localclone2" &&
+ cp -R server server2 &&
+ git clone "testgit::${PWD}/server2" localclone2 &&
+ (cd localclone2 &&
+ echo content >>file &&
+ git commit -a -m three &&
+ GIT_REMOTE_TESTGIT_SLEEPY=2 git push) &&
+ compare_refs localclone2 HEAD server2 HEAD
+'
+
+test_expect_success 'synch with changes from localclone' '
+ (cd clone &&
+ git pull)
+'
+
+test_expect_success 'pushing remote local repo' '
+ (cd clone &&
+ echo content >>file &&
+ git commit -a -m four &&
+ git push) &&
+ compare_refs clone HEAD server HEAD
+'
+
+test_expect_success 'fetch new branch' '
+ (cd public &&
+ git checkout -b new &&
+ echo content >>file &&
+ git commit -a -m five &&
+ git push origin new
+ ) &&
+ (cd localclone &&
+ git fetch origin new
+ ) &&
+ compare_refs public HEAD localclone FETCH_HEAD
+'
+
+test_expect_success 'fetch multiple branches' '
+ (cd localclone &&
+ git fetch
+ ) &&
+ compare_refs server master localclone refs/remotes/origin/master &&
+ compare_refs server new localclone refs/remotes/origin/new
+'
+
+test_expect_success 'push when remote has extra refs' '
+ (cd clone &&
+ echo content >>file &&
+ git commit -a -m six &&
+ git push
+ ) &&
+ compare_refs clone master server master
+'
+
+test_expect_success 'push new branch by name' '
+ (cd clone &&
+ git checkout -b new-name &&
+ echo content >>file &&
+ git commit -a -m seven &&
+ git push origin new-name
+ ) &&
+ compare_refs clone HEAD server refs/heads/new-name
+'
+
+test_expect_failure 'push new branch with old:new refspec' '
+ (cd clone &&
+ git push origin new-name:new-refspec
+ ) &&
+ compare_refs clone HEAD server refs/heads/new-refspec
+'
+
+test_done
--
1.8.0
^ permalink raw reply related
* [PATCH v4 06/14] remote-testgit: remove irrelevant test
From: Felipe Contreras @ 2012-11-02 2:02 UTC (permalink / raw)
To: git
Cc: Junio C Hamano, Jeff King, Johannes Schindelin, Elijah Newren,
Ilari Liusvaara, Sverre Rabbelier, Felipe Contreras
In-Reply-To: <1351821738-17526-1-git-send-email-felipe.contreras@gmail.com>
Only makes sense for remote-testpy.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
t/t5801-remote-helpers.sh | 13 -------------
1 file changed, 13 deletions(-)
diff --git a/t/t5801-remote-helpers.sh b/t/t5801-remote-helpers.sh
index 2eca42e..a03d087 100755
--- a/t/t5801-remote-helpers.sh
+++ b/t/t5801-remote-helpers.sh
@@ -48,19 +48,6 @@ test_expect_success 'pushing to local repo' '
compare_refs localclone HEAD server HEAD
'
-# Generally, skip this test. It demonstrates a now-fixed race in
-# git-remote-testgit, but is too slow to leave in for general use.
-: test_expect_success 'racily pushing to local repo' '
- test_when_finished "rm -rf server2 localclone2" &&
- cp -R server server2 &&
- git clone "testgit::${PWD}/server2" localclone2 &&
- (cd localclone2 &&
- echo content >>file &&
- git commit -a -m three &&
- GIT_REMOTE_TESTGIT_SLEEPY=2 git push) &&
- compare_refs localclone2 HEAD server2 HEAD
-'
-
test_expect_success 'fetch new branch' '
(cd public &&
git checkout -b new &&
--
1.8.0
^ permalink raw reply related
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