Git development
 help / color / mirror / Atom feed
* Re: [PATCH v4] git remote: Separate usage strings for subcommands
From: Tim Henigan @ 2009-11-19 14:51 UTC (permalink / raw)
  To: Nanako Shiraishi; +Cc: Junio C Hamano, jrnieder, git
In-Reply-To: <20091119124040.6117@nanako3.lavabit.com>

On Wed, Nov 18, 2009 at 10:40 PM, Nanako Shiraishi <nanako3@lavabit.com> wrote:
> Quoting Tim Henigan <tim.henigan@gmail.com>
>
>> When the usage string for a subcommand must be printed,
>> only print the information relevant to that command.
>
> I think this is a huge improvement.
>
> Often people look at this part of the manual page to quickly remind
> themselves what options are available, and it is better to keep the
> current text. Some manual pages have to use [options...] when there
> are too many to list, but each subcommand of git-remote doesn't have
> that many options.

... snip ...

> For the same reason, I don't think this is a good change, if these
> lines are used to show the first lines of 'git-remote -h' output.

The original version of this patch [1] left the contents of the usage
strings intact.  However, Junio expressed a preference to change
them to use the generic <options>.  See this thread for the
discussion [2].

[1] http://article.gmane.org/gmane.comp.version-control.git/133048/
[2] http://thread.gmane.org/gmane.comp.version-control.git/132968/focus=133050

^ permalink raw reply

* Re: [ANNOUNCE] codeBeamer MR - Easy ACL for Git
From: Intland Software @ 2009-11-19 15:22 UTC (permalink / raw)
  To: Thomas Rast; +Cc: Petr Baudis, git
In-Reply-To: <4B05588B.5080501@intland.com>

 > Thomas Rast wrote:
 >> Intland Software wrote:
 >>> * MR against GitHub & Gitorious
 >>> Probably the most significant difference is that MR is available as
 >>> free download
 >>
 >> Umm... unlike Gitorious, you mean:
 >>
 >>   http://gitorious.org/gitorious
 >>   http://gitorious.org/gitorious/mainline/blobs/master/LICENSE
I'm sorry, you're right: Gitorious is also available as download.
Thanks for spotting it, Thomas.
---
Intland

^ permalink raw reply

* [PATCH] expand_user_path: expand ~ to $HOME, not to the actual homedir.
From: Matthieu Moy @ 2009-11-19 15:21 UTC (permalink / raw)
  To: git, gitster; +Cc: Matthieu Moy
In-Reply-To: <1258534693-7220-1-git-send-email-Matthieu.Moy@imag.fr>

In 395de250d (Expand ~ and ~user in core.excludesfile, commit.template),
we introduced the mechanism. But expanding ~ using getpw is not what
people overriding $HOME would usually expect. In particular, git looks
for the user's .gitconfig using $HOME, so it's better to be consistent.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
This is basically my patch v4, but since an earlier version is already
in next, I resend the last bits of it, based on next.

 Documentation/config.txt |    9 +++++----
 path.c                   |   13 +++++++++----
 2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/Documentation/config.txt b/Documentation/config.txt
index 468e285..39d1226 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -381,9 +381,9 @@ Common unit suffixes of 'k', 'm', or 'g' are supported.
 core.excludesfile::
 	In addition to '.gitignore' (per-directory) and
 	'.git/info/exclude', git looks into this file for patterns
-	of files which are not meant to be tracked.  "~/" and "~user/"
-	are expanded to the specified user's home directory.  See
-	linkgit:gitignore[5].
+	of files which are not meant to be tracked.  "~/" is expanded
+	to the value of `$HOME` and "~user/" to the specified user's
+	home directory.  See linkgit:gitignore[5].
 
 core.editor::
 	Commands such as `commit` and `tag` that lets you edit
@@ -683,7 +683,8 @@ color.ui::
 
 commit.template::
 	Specify a file to use as the template for new commit messages.
-	"~/" and "~user/" are expanded to the specified user's home directory.
+	"~/" is expanded to the value of `$HOME` and "~user/" to the
+	specified user's home directory.
 
 diff.autorefreshindex::
 	When using 'git-diff' to compare with work tree
diff --git a/path.c b/path.c
index b4a8075..2ec950b 100644
--- a/path.c
+++ b/path.c
@@ -235,10 +235,15 @@ char *expand_user_path(const char *path)
 	if (path[0] == '~') {
 		const char *username = path + 1;
 		size_t username_len = first_slash - username;
-		struct passwd *pw = getpw_str(username, username_len);
-		if (!pw)
-			goto return_null;
-		strbuf_add(&user_path, pw->pw_dir, strlen(pw->pw_dir));
+		if (username_len == 0) {
+			const char *home = getenv("HOME");
+			strbuf_add(&user_path, home, strlen(home));
+		} else {
+			struct passwd *pw = getpw_str(username, username_len);
+			if (!pw)
+				goto return_null;
+			strbuf_add(&user_path, pw->pw_dir, strlen(pw->pw_dir));
+		}
 		to_copy = first_slash;
 	}
 	strbuf_add(&user_path, to_copy, strlen(to_copy));
-- 
1.6.5.2.152.gbbe9e

^ permalink raw reply related

* Re: [PATCH 2/2] diffcore-break: save cnt_data for other phases
From: Jeff King @ 2009-11-19 15:22 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git
In-Reply-To: <7vvdhanp4v.fsf@alter.siamese.dyndns.org>

On Mon, Nov 16, 2009 at 01:20:00PM -0800, Junio C Hamano wrote:

> The change looks correct, but I initially got worried about your change
> interacts badly with this part in estimate_similarity() around line 176:
> 
> 	if (!src->cnt_data && diff_populate_filespec(src, 0))
> 		return 0;
> 	if (!dst->cnt_data && diff_populate_filespec(dst, 0))
> 		return 0;
> 
> I think the reason why it (not your patch but the original code) felt a
> bit brittle is because the above if() statements know too much about the
> internal of d-c-c (namely, it never looks at src->data when src->cnt_data
> is already available, so it is safe to leave src->data NULL).

No, I am counting on those lines to actually optimize out the count
later on. But I agree it is a bit brittle. Probably a better design
would have been for diffcore_count_changes to simply call a new
"diff_filespec_hash", which would assign to the cnt_data member and
perform any optimizations, just as we do already with
diff_populate_filespec and the actual blob contents.

I don't know if it is worth refactoring though. This is a pretty static
part of the code these days, and what is there now is working.

> The same logic suggests that the loop to build the matrix in
> diffcore_rename() could free two->data at the end of the innermost loop.
> 
> We currently loop this way (around ll. 505-530):
> 
> 	for each two (i.e. rename destination candidate):
>         	for each one (i.e. rename source candidate):
>                 	compute and record how similar one and two are
> 			free one->data
> 		free two->data
> 
> After computing how similar "one" and something else is only once, we have
> one->cnt_data so we won't need one->data (the same fact is exploited by
> your patch for optimization), and that is why freeing one->data in the
> innermost loop does not result in constant re-reading of the same blob
> data when we iterate more than one rename destination.  But the same logic
> applies to "two" and we should be able to free the blob data early to
> reduce the memory pressure.
> 
> I dunno if it would give us measurable performance benefit, though.
> 
> Here is the idea on top of your patch, but I think it can be applied
> independently.

With your patch, I shaved 0.2 seconds off of a 46-second rename
detection (one of my pathological "rename and tweak the tags on a bunch
of photos" commits). To be fair, though, that commit is now quite old,
so some of that CPU time was spent assembling delta chains.

It should also relieve memory pressure for large repositories, though
that is not nearly as big an issue for renames as for breaks, as we tend
to have many fewer candidates.

I think it is worth applying.  Though perhaps the free-ing should simply
happen in estimate_similarity, which is the function that actually
populates the filespec.

Also, I don't see where we ever actually free the cnt_data. After we run
the whole O(n^2) loop, we should be able to drop cnt_data entirely. I
think in practice it doesn't matter all that much, since it isn't that
big, and afterwards we just generate the patch and exit (unless we are
doing diffcore-break, too, which will actually free all of the data).

-Peff

^ permalink raw reply

* Re: [PATCH] expand_user_path: expand ~ to $HOME, not to the actual homedir.
From: Jeff King @ 2009-11-19 15:23 UTC (permalink / raw)
  To: Matthieu Moy; +Cc: git, gitster
In-Reply-To: <1258644075-16191-1-git-send-email-Matthieu.Moy@imag.fr>

On Thu, Nov 19, 2009 at 04:21:15PM +0100, Matthieu Moy wrote:

> -	of files which are not meant to be tracked.  "~/" and "~user/"
> -	are expanded to the specified user's home directory.  See
> -	linkgit:gitignore[5].
> +	of files which are not meant to be tracked.  "~/" is expanded
> +	to the value of `$HOME` and "~user/" to the specified user's
> +	home directory.  See linkgit:gitignore[5].

Thanks. As a side effect, this wording change addresses my original
ambiguity concern (and I also think using $HOME is the right thing to
do).

-Peff

^ permalink raw reply

* Re: [PATCH v2] git am/mailinfo: Don't look at in-body headers when rebasing
From: Jeff King @ 2009-11-19 15:36 UTC (permalink / raw)
  To: Lukas Sandström; +Cc: Philip Hofstetter, Junio C Hamano, git
In-Reply-To: <4B050718.8070506@gmail.com>

On Thu, Nov 19, 2009 at 09:51:36AM +0100, Lukas Sandström wrote:

> When we are rebasing we know that the header lines in the
> patch are good and that we don't need to pick up any headers
> from the body of the patch.
> 
> This makes it possible to rebase commits whose commit message
> start with "From" or "Date".
> 
> Test vectors by Jeff King.

Thanks, it did end up being a pretty small change. Though I think we may
be better off with _both_ patches. Your patch protects the message
absolutely during rebasing, and my patch improves the heuristic when
applying non-rebase patches.

> @@ -771,6 +772,8 @@ static int handle_commit_msg(struct strbuf *line)
>  		return 0;
> 
>  	if (still_looking) {
> +		if (!use_inbody_headers)
> +			still_looking = 0;
>  		strbuf_ltrim(line);
>  		if (!line->len)
>  			return 0;

Hmm. But we still end up in this conditional for the very first line.
Which I guess happens to work because the first line we feed is
presumably the empty blank line (but I didn't check). Still, wouldn't it
be more clear as:

  if (use_inbody_headers && still_looking) {
     ...

in which case still_looking simply becomes irrelevant when the feature
is disabled?

> +From nobody Mon Sep 17 00:00:00 2001
> +From: A U Thor <a.u.thor@example.com>
> +Subject: check bogus body header (from)
> +Date: Fri, 9 Jun 2006 00:44:16 -0700
> +
> +From: bogosity
> +  - a list
> +  - of stuff
> +---

Since your feature is meant to prevent us looking at inbody headers no
matter if they are valid-looking or not, wouldn't a better test be to
actually have:

  From: Other Author <other@example.com>

Otherwise, you don't know if it is your feature blocking it, or my patch
(if it gets applied on top).

> +From nobody Mon Sep 17 00:00:00 2001
> +From: A U Thor <a.u.thor@example.com>
> +Subject: check bogus body header (date)
> +Date: Fri, 9 Jun 2006 00:44:16 -0700
> +
> +Date: bogus
> +
> +and some content
> +

And ditto for the Date here.

-Peff

^ permalink raw reply

* Re: [PATCH] expand_user_path: expand ~ to $HOME, not to the actual homedir.
From: Matthieu Moy @ 2009-11-19 16:32 UTC (permalink / raw)
  To: Jeff King; +Cc: git, gitster
In-Reply-To: <20091119152359.GB6877@coredump.intra.peff.net>

Jeff King <peff@peff.net> writes:

> On Thu, Nov 19, 2009 at 04:21:15PM +0100, Matthieu Moy wrote:
>
>> -	of files which are not meant to be tracked.  "~/" and "~user/"
>> -	are expanded to the specified user's home directory.  See
>> -	linkgit:gitignore[5].
>> +	of files which are not meant to be tracked.  "~/" is expanded
>> +	to the value of `$HOME` and "~user/" to the specified user's
>> +	home directory.  See linkgit:gitignore[5].
>
> Thanks. As a side effect, this wording change addresses my original
> ambiguity concern (and I also think using $HOME is the right thing to
> do).

Not a pure coincidence indeed ;-). In this new version, ~ and ~foo do
actually different things so they definitely deserve the heaviness of
a few extra words.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/

^ permalink raw reply

* git-cvsserver and (edit|watch) support?
From: david.hagood @ 2009-11-19 17:31 UTC (permalink / raw)
  To: git

I have an application that, unfortunately, is both closed source and does
not support GIT natively. However, it DOES support CVS. It also makes
heavy use of CVS's locking features (watch/edit).

git-cvsserver (or at least the version I have, 1.5.6.5), does not seem to
support "cvs watch" or "cvs edit".

Attempting to do a "cvs watch" results in:

cvs watch on *xml
server doesn't support gzip-file-contents
Unknown command watch-on at /usr/bin/git-cvsserver line 198, <STDIN> line 49.
cvs [watch aborted]: end of file from server (consult above messages if any)

Likewise:
cvs edit *xml
server doesn't support gzip-file-contents
Unknown command Notify 7200.xml at /usr/bin/git-cvsserver line 198,
<STDIN> line 6.
cvs [edit aborted]: end of file from server (consult above messages if any)


Are there any plans on supporting these functions?

^ permalink raw reply

* Using `git tag -l` to get non-matching tags
From: Tim Visher @ 2009-11-19 17:49 UTC (permalink / raw)
  To: Git Mailing List

Hello Everyone,

I'm trying to use `git tag -l` to get non-matching tags.  I can't find
anywhere in the documentation describing what is allowed in the tag
pattern.  Brief testing leads me to believe that it's only basic bash
like pattern support.

Thoughts?

-- 

In Christ,

Timmy V.

http://burningones.com/
http://five.sentenc.es/ - Spend less time on e-mail

^ permalink raw reply

* Re: [PATCH v4] git remote: Separate usage strings for subcommands
From: Junio C Hamano @ 2009-11-19 18:10 UTC (permalink / raw)
  To: Tim Henigan; +Cc: Nanako Shiraishi, jrnieder, git
In-Reply-To: <32c343770911190651w3f1ac9b6i2d3b1a62a032489f@mail.gmail.com>

Tim Henigan <tim.henigan@gmail.com> writes:

> The original version of this patch [1] left the contents of the usage
> strings intact.  However, Junio expressed a preference to change
> them to use the generic <options>.  See this thread for the
> discussion [2].
>
> [1] http://article.gmane.org/gmane.comp.version-control.git/133048/
> [2] http://thread.gmane.org/gmane.comp.version-control.git/132968/focus=133050

Sorry, but I think you misunderstood what I meant, then.  in [2], I said...

    > ... hunk to remove literal strings from builtin_remote_usage[] 
    > ... and replace them with REMOTE_BARE_USAGE, REMOTE_ADD_USAGE

    I am not sure about the value of reusing option string like this, and for

Here, please note that I was objecting to the use of _the same string_ in
both contexts ("reusing").

    all other subcommands the same comment applies.  For example, in the case
    of "remote add -h", you would use

    "git remote add [-t <branch>] [-m <master>] [-f] [--mirror] <name> <url>"

    from REMOTE_ADD_USAGE, but ...

    > ... hunk to give the builtin_remote_add_usage[] that  uses the same
    > ... REMOTE_ADD_USAGE to parse_options() 

    ... the options list is used to reproduce the information in a major part
    of that string already.  So I would prefer builtin_remote_add_usage[] to
    be something like:

        "git remote add [<options>...] <name> <url>"

I meant that we want to change "remote add -h" to show this here; and the
reason why I doubted "the value of reusing option string" was because I
wanted to do so without touching the concise list of the subcommands and
their options given by "remote -h".  Otherwise, it would have made perfect
sense to use preprocessor macros to share the two identical strings.

In your response to my above comment, you indicated that you wanted to do
the [<options>] thing as a separate patch (your original patch spelled
options in full).  I took it to mean that you would do that only for the
subcommand help, and did not respond, because

 (1) doing that to the subcommand help would be a good idea anyway; and

 (2) you will realize what I said in the message about "the value of
     reusing option string" was correct when you see the end result, which
     will regress "remote -h" output.

In this case, unfortunately (2) didn't happen before Nana pointed it out.

^ permalink raw reply

* Re: What's cooking in git.git (Nov 2009, #04; Tue, 17)
From: Junio C Hamano @ 2009-11-19 18:11 UTC (permalink / raw)
  To: Johannes Sixt; +Cc: Junio C Hamano, git
In-Reply-To: <4B03B315.2080407@viscovery.net>

Johannes Sixt <j.sixt@viscovery.net> writes:

> Ramsay suggested to drop the one at the tip, and I agree. The other two
> patches are good.

Thanks; will drop one and queue the rest to 'next'.

^ permalink raw reply

* Re: [PATCH v4] Expand ~ and ~user in core.excludesfile, commit.template
From: Junio C Hamano @ 2009-11-19 18:12 UTC (permalink / raw)
  To: Matthieu Moy; +Cc: git, gitster, Karl Chen
In-Reply-To: <1258534693-7220-1-git-send-email-Matthieu.Moy@imag.fr>

Oops; last night I wrote

    Thanks; v3 was already in next so I'll make an interdiff into a separate
    "fix-up" commit.

but didn't send it out.  Thanks for rerolling the patch.

^ permalink raw reply

* Re: Using `git tag -l` to get non-matching tags
From: Junio C Hamano @ 2009-11-19 18:18 UTC (permalink / raw)
  To: Tim Visher; +Cc: Git Mailing List
In-Reply-To: <c115fd3c0911190949x2f32d1cbw26f3260f12d43a6e@mail.gmail.com>

Tim Visher <tim.visher@gmail.com> writes:

> I'm trying to use `git tag -l` to get non-matching tags.  I can't find
> anywhere in the documentation describing what is allowed in the tag
> pattern.

As a general guideline, refs are matched using glob not regexp and given
to fnmatch(3).

Who are you in your first sentence?

If you are an end user typing from the terminal trying to list tags
excluding some, the answer would be "piping to 'grep -v'".

If you are writing a tool that uses git, the tool uses a part of tag
namespace for its own use, and the tool is trying to enumerate end-user
tags by excluding the ones it uses for its own use, then the answer would
be "do not use 'git tag' in Porcelain---use 'git for-each-ref' and filter
its output yourself".

^ permalink raw reply

* Re: [PATCH v4] git remote: Separate usage strings for subcommands
From: Tim Henigan @ 2009-11-19 18:58 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Nanako Shiraishi, jrnieder, git
In-Reply-To: <7vlji2bd23.fsf@alter.siamese.dyndns.org>

On Thu, Nov 19, 2009 at 1:10 PM, Junio C Hamano <gitster@pobox.com> wrote:
> Tim Henigan <tim.henigan@gmail.com> writes:
>
>> The original version of this patch [1] left the contents of the usage
>> strings intact.  However, Junio expressed a preference to change
>> them to use the generic <options>.  See this thread for the
>> discussion [2].
>>
>> [1] http://article.gmane.org/gmane.comp.version-control.git/133048/
>> [2] http://thread.gmane.org/gmane.comp.version-control.git/132968/focus=133050
>
> Sorry, but I think you misunderstood what I meant, then.  in [2], I said...

... snip ...

>    ... the options list is used to reproduce the information in a major part
>    of that string already.  So I would prefer builtin_remote_add_usage[] to
>    be something like:
>
>        "git remote add [<options>...] <name> <url>"
>
> I meant that we want to change "remote add -h" to show this here; and the
> reason why I doubted "the value of reusing option string" was because I
> wanted to do so without touching the concise list of the subcommands and
> their options given by "remote -h".  Otherwise, it would have made perfect
> sense to use preprocessor macros to share the two identical strings.

Okay, I believe I understand now, but let's test that theory ;)

Using the 'add' subcommand as an example, the desired output is:

Output of 'git remote -h':
    "git remote [-v | --verbose]"
    "git remote add [-t <branch>] [-m <master>] [-f] [--mirror] <name> <url>"
    etc.

Output of 'git remote add -h':
    "git remote add [<options>...] <name> <url>"
    followed by the detailed description given by 'parse_options()'.

Text in 'man git-remote':
    "git remote add [-t <branch>] [-m <master>] [-f] [--mirror] <name> <url>"
    with the options explained in detail later in the file.

Thanks for your patience,
Tim

^ permalink raw reply

* [PATCH] t9700-perl-git.sh: Fix a test failure on Cygwin
From: Ramsay Jones @ 2009-11-19 18:41 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: GIT Mailing-list


The t/t9700/test.pl script uses method invocation syntax when
using the Cwd module to determine the current working directory.
This fails on cygwin, since cygwin perl specifically checks for
any arguments to the cwd() function and croak()'s with the message
"Usage: Cwd::cwd()". (In perl v5.8.8 distribution, see the file
perl-5.8.8/cygwin/cygwin.c lines 139-157)

In order to avoid the problem, we replace the method invocation
syntax with a simple function call.

Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
---
 t/t9700/test.pl |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/t/t9700/test.pl b/t/t9700/test.pl
index 6c70aec..666722d 100755
--- a/t/t9700/test.pl
+++ b/t/t9700/test.pl
@@ -13,7 +13,7 @@ use File::Basename;
 BEGIN { use_ok('Git') }
 
 # set up
-our $abs_repo_dir = Cwd->cwd;
+our $abs_repo_dir = cwd();
 ok(our $r = Git->repository(Directory => "."), "open repository");
 
 # config
-- 
1.6.5

^ permalink raw reply related

* [PATCH] git-count-objects: Fix a disk-space under-estimate on Cygwin
From: Ramsay Jones @ 2009-11-19 18:46 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: GIT Mailing-list


Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
---

Whilst testing an msvc-built git on cygwin, I noticed that
git-count-objects was producing different results to the
cygwin version, viz:

    $ ./git --version
    git version 1.6.5.4.gf034d.MSVC
    $ git --version
    git version 1.6.5

    $ ./git-count-objects
    60 objects, 283 kilobytes

    $ git count-objects
    60 objects, 210 kilobytes

    $ git config core.filemode false

    $ git count-objects
    60 objects, 297 kilobytes
    $ 

Note also that the cygwin version of git gives two different
answers, in the *same* repository, depending on the setting
of core.filemode. (since the "win32 stat() functions" in
compat/cygwin.c are used when core.filemode is false)

Having looked at the msvc code-path, I also noticed something
else a bit odd; the value printed by the msvc version should
be a *lower bound* for the amount of disk-space used (since
it simply totals the actual file sizes). However, as you can
see from the above, when core.filemode is true, the cygwin
version of git is *underestimating* even this (210Kb vs 283kb).

A quick trip to the debugger confirmed that (st.st_blocks * 512)
is less than st.st_size for several files. So, it looked like
the block-size was not in units of 512 bytes; so if we look at
/usr/include/sys/param.h we find:

    #define DEV_BSIZE  1024

and in /usr/include/sys/stat.h we find:

    #define S_BLKSIZE  1024

which seems to indicate a 1K block-size instead. Also, different
filesystem types may use different block-sizes, which is why an
st.st_blksize was added to struct stat; it seems that the Cygwin
struct stat contains the st_blksize field, so lets try a quick
test program:

    $ cat junk.c

    #include <stdio.h>
    #include <sys/stat.h>
    
    int main(int argc, char *argv[])
    {
    	int i, bytes = 0, tot_5 = 0, tot_b = 0;
    
    	for (i=1; i< argc; i++) {
    		struct stat st;
    		if (lstat(argv[i], &st))
    			printf("can't lstat '%s'\n", argv[i]);
    		else {
    			int s = (int)st.st_size;
    			int b = (int)st.st_blocks;
    			int f = (int)st.st_blksize;
    			int d = (b * 512);
    			int e = (b * f);
    
    			printf("%8d, ", s);
    			printf("%2d*512=%-6d (%6d), ", b, d, d-s);
    			printf("%2d*%d=%-6d (%6d)\n", b, f, e, e-s);
    
    			bytes += s;
    			tot_5 += d;
    			tot_b += e;
    		}
    	}
    	printf("total bytes: %6d\n", bytes);
    	printf("b * 512:     %6d  (%d)\n", tot_5, tot_5 - bytes);
    	printf("b * blksize: %6d  (%d)\n", tot_b, tot_b - bytes);
    	exit(0);
    }
    
    $ ls .git/objects/??/* | xargs ./junk.exe
         148,  1*512=512    (   364),  1*1024=1024   (   876)
       10058, 12*512=6144   ( -3914), 12*1024=12288  (  2230)
        3701,  4*512=2048   ( -1653),  4*1024=4096   (   395)
         463,  4*512=2048   (  1585),  4*1024=4096   (  3633)
         148,  1*512=512    (   364),  1*1024=1024   (   876)
       10056, 12*512=6144   ( -3912), 12*1024=12288  (  2232)
         198,  1*512=512    (   314),  1*1024=1024   (   826)
        1782,  4*512=2048   (   266),  4*1024=4096   (  2314)
         192,  1*512=512    (   320),  1*1024=1024   (   832)
        3801,  4*512=2048   ( -1753),  4*1024=4096   (   295)
       14851, 16*512=8192   ( -6659), 16*1024=16384  (  1533)
        3761,  4*512=2048   ( -1713),  4*1024=4096   (   335)
          52,  1*512=512    (   460),  1*1024=1024   (   972)
         956,  4*512=2048   (  1092),  4*1024=4096   (  3140)
         956,  4*512=2048   (  1092),  4*1024=4096   (  3140)
        3703,  4*512=2048   ( -1655),  4*1024=4096   (   393)
       10055, 12*512=6144   ( -3911), 12*1024=12288  (  2233)
    total bytes:  64881
    b * 512:      45568  (-19313)
    b * blksize:  91136  (26255)
    $ 

Note that, in addition to confirming the 1K block-size, it appears
that (on NTFS) files less than 1K are allocated a single block
whereas larger files use a multiple of 4 blocks. Well, that is only
a guess but it at least sounds plausible! ;-)

This patch implements a simple solution which has the useful property
of returning a single answer, irrespective of the core.filemode setting.

ATB,
Ramsay Jones

 Makefile |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/Makefile b/Makefile
index 5d5976f..5624563 100644
--- a/Makefile
+++ b/Makefile
@@ -783,6 +783,10 @@ ifeq ($(uname_O),Cygwin)
 	NO_FAST_WORKING_DIRECTORY = UnfortunatelyYes
 	NO_TRUSTABLE_FILEMODE = UnfortunatelyYes
 	OLD_ICONV = UnfortunatelyYes
+	# The st_blocks field is not in units of 512 bytes, as the code
+	# expects, which leads to an under-estimate of the disk space used.
+	# In order to use an alternate algorithm, we claim to lack st_blocks.
+	NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
 	# There are conflicting reports about this.
 	# On some boxes NO_MMAP is needed, and not so elsewhere.
 	# Try commenting this out if you suspect MMAP is more efficient
-- 
1.6.5

^ permalink raw reply related

* [RFC/PATCH] Add an implementation of uname(1) for Windows
From: Ramsay Jones @ 2009-11-19 19:00 UTC (permalink / raw)
  To: GIT Mailing-list


Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
---

While changing the Makefile recently, to fix-up the msvc build on
cygwin, I thought it may be useful to have a uname(1) command on
Windows. Well, it isn't actually needed, but it got me thinking
about how I would implement it...

I started off with some assembler to access the cpuid instruction
on x86 machines... but I soon discarded that, since all the information
I needed was already available via an WIN32 API or from the registry.

So, this is not a serious patch and is not meant for application.
However, some Windows users may find it useful... ;-)

ATB,
Ramsay Jones

 compat/vcbuild/uname.c |  475 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 475 insertions(+), 0 deletions(-)
 create mode 100644 compat/vcbuild/uname.c

diff --git a/compat/vcbuild/uname.c b/compat/vcbuild/uname.c
new file mode 100644
index 0000000..7ca6cdd
--- /dev/null
+++ b/compat/vcbuild/uname.c
@@ -0,0 +1,475 @@
+
+/*
+ * uname(1) for Windows
+ *
+ * This program is licensed under the GPL v2.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ */
+
+/*
+ * MSVC:         cl uname.c advapi32.lib
+ *
+ * Open Watcom:  wcl386 uname.c
+ *
+ * Cygwin gcc:   gcc -mno-cygwin -o uname uname.c
+ *
+ */
+
+#ifndef _WIN32_WINNT
+#define _WIN32_WINNT 0x0500
+#endif
+
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+
+#define VERSION_STR "0.1"
+
+static char *prog;
+
+static int all       = 0;
+static int kernel    = 0;
+static int host      = 0;
+static int release   = 0;
+static int version   = 0;
+static int machine   = 0;
+static int processor = 0;
+static int hardware  = 0;
+static int os        = 0;
+
+static void set_program_name(char *argv0, char *def)
+{
+	static char name[256];
+	char *slash;
+	int len;
+
+	if (!argv0 || !*argv0) {
+		prog = def;
+		return;
+	}
+
+	/* get last path component */
+	if ((slash = strrchr(argv0, '/')) == NULL)
+		prog = argv0;
+	else
+		prog = slash+1;
+
+	/* check for win32 separator */
+	if ((slash = strrchr(prog, '\\')) != NULL)
+		prog = slash+1;
+
+	/* strip '.exe' suffix, if any */
+	len = strlen(prog);
+	if (len > 4 && strcmp(&prog[len-4], ".exe") == 0) {
+		if (len < sizeof(name)) {
+			strcpy(name, prog);
+			name[len-4] = '\0';
+			prog = name;
+		}
+	}
+}
+
+static void die(const char *fmt, ...)
+{
+	va_list ap;
+
+	if (prog)
+		fprintf(stderr, "%s: ", prog);
+	va_start(ap, fmt);
+	vfprintf(stderr, fmt, ap);
+	va_end(ap);
+	fprintf(stderr, "\n");
+	exit(1);
+}
+
+static void usage(void)
+{
+	printf("usage: %s [OPTION]...\n\n", prog);
+	printf("  -a, --all                "
+		      "print all information, except -p and -i\n");
+	printf("  -s, --kernel-name        "
+		      "print the kernel name\n");
+	printf("  -n, --nodename           "
+		      "print the network node hostname\n");
+	printf("  -r, --kernel-release     "
+		      "print the kernel release\n");
+	printf("  -v, --kernel-version     "
+		      "print the kernel version\n");
+	printf("  -m, --machine            "
+		      "print the machine hardware name\n");
+	printf("  -p, --processor          "
+		      "print the processor type\n");
+	printf("  -i, --hardware-platform  "
+		      "print the hardware platform\n");
+	printf("  -o, --operating-system   "
+		      "print the operating system\n");
+	printf("      --help               "
+		      "print this help and exit\n");
+	printf("      --version            "
+		      "print version information and exit\n");
+	printf("\n");
+	exit(0);
+}
+
+static void print_version(void)
+{
+	printf("%s version %s\n", prog, VERSION_STR);
+	exit(0);
+}
+
+static void do_long_option(char *opt)
+{
+	static struct { char *name; int *option; } tab[] = {
+		{ "--all",               &all       },
+		{ "--kernel-name",       &kernel    },
+		{ "--nodename",          &host      },
+		{ "--kernel-release",    &release   },
+		{ "--kernel-version",    &version   },
+		{ "--machine",           &machine   },
+		{ "--processor",         &processor },
+		{ "--hardware-platform", &hardware  },
+		{ "--operating-system",  &os        },
+		{ NULL,                  NULL       }
+	};
+	int i;
+
+	if (!opt || !*opt)
+		die("internal error: !opt || !*opt");
+
+	for (i = 0; tab[i].name; i++) {
+		if (strcmp(opt, tab[i].name) == 0) {
+			*tab[i].option = 1;
+			return;
+		}
+	}
+
+	if (strcmp(opt, "--help") == 0)
+		usage();          /* does not return */
+
+	if (strcmp(opt, "--version") == 0)
+		print_version();  /* does not return */
+
+	die("unknown option: '%s', try --help", opt);
+}
+
+static void do_short_options(char *opts)
+{
+	char *a = &opts[1];
+
+	while (*a) {
+		switch (*a) {
+			case 'a': all = 1;       break;
+			case 's': kernel = 1;    break;
+			case 'n': host = 1;      break;
+			case 'r': release = 1;   break;
+			case 'v': version = 1;   break;
+			case 'm': machine = 1;   break;
+			case 'p': processor = 1; break;
+			case 'i': hardware = 1;  break;
+			case 'o': os = 1;        break;
+			default:
+				  die("unknown option: '%c', try --help", *a);
+				  break;
+		}
+		++a;
+	}
+}
+
+static void process_args(int argc, char *argv[])
+{
+	int argpos = 1;
+
+	if (argc == 1)    /* no options... */
+		kernel = 1;  /* same as -s */
+
+	/* check for [OPTIONS]... */
+	while (argpos < argc) {
+		if (argv[argpos][0] != '-')  /* no option */
+			break;
+		if (argv[argpos][1] == '-')  /* --long option */
+			do_long_option(argv[argpos]);
+		else                         /* -short option(s) */
+			do_short_options(argv[argpos]);
+		argpos++;
+	}
+
+	/* no other args allowed */
+	if (argpos != argc)
+		die("unexpected argument: '%s', try --help", argv[argpos]);
+
+	if (all)
+		kernel = host = release = version = machine = os = 1;
+}
+
+static char *get_kernel(void)
+{
+	return "Windows";
+}
+
+static char *get_hostname(void)
+{
+	static char name[256];
+	unsigned long len = sizeof(name)-1;
+
+	if (GetComputerNameExA(ComputerNameDnsHostname, name, &len))
+		return name;
+	return "unknown";
+}
+
+static OSVERSIONINFO *get_version_info(void)
+{
+	static OSVERSIONINFO ver;
+	static int called;
+
+	if (!called) {
+		ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+		GetVersionEx(&ver);
+		++called;
+	}
+	return &ver;
+}
+static char *get_release(void)
+{
+	static char str[256];
+	OSVERSIONINFO *v = get_version_info();
+	_snprintf(str, sizeof(str)-1, "%d.%d",
+			v->dwMajorVersion, v->dwMinorVersion);
+	return str;
+}
+
+static char *get_version(void)
+{
+	static char str[256];
+	OSVERSIONINFO *v = get_version_info();
+	_snprintf(str, sizeof(str)-1, "%d(%s)",
+			v->dwBuildNumber, v->szCSDVersion);
+	return str;
+}
+
+static SYSTEM_INFO *get_system_info(void)
+{
+	static SYSTEM_INFO sys;
+	static int called;
+
+	if (!called) {
+		GetSystemInfo(&sys);
+		++called;
+	}
+	return &sys;
+}
+
+static char *get_arch(int arch)
+{
+	static struct { int arch_enum; char *name; } tab[] = {
+		{ PROCESSOR_ARCHITECTURE_INTEL,   "INTEL"    },
+		{ PROCESSOR_ARCHITECTURE_MIPS,    "MIPS"     },
+		{ PROCESSOR_ARCHITECTURE_ALPHA,   "ALPHA"    },
+		{ PROCESSOR_ARCHITECTURE_PPC,     "PPC"      },
+		{ PROCESSOR_ARCHITECTURE_SHX,     "SHX"      },
+		{ PROCESSOR_ARCHITECTURE_ARM,     "ARM"      },
+		{ PROCESSOR_ARCHITECTURE_IA64,    "IA-64"    },
+		{ PROCESSOR_ARCHITECTURE_ALPHA64, "ALPHA-64" },
+		{ PROCESSOR_ARCHITECTURE_AMD64,   "AMD-64"   },
+		{ PROCESSOR_ARCHITECTURE_UNKNOWN, NULL       }
+	};
+	int i;
+
+	for (i = 0; tab[i].name; i++)
+		if (tab[i].arch_enum == arch)
+			return tab[i].name;
+	return NULL;
+}
+
+static char *get_x86_machine(int family)
+{
+	static char m[256];
+
+	switch (family) {
+		case 3: case 4: case 5: case 6:
+			_snprintf(m, sizeof(m)-1, "i%c86", family+'0');
+			break;
+		case 15: /* pentium 4 */
+			strcpy(m, "i686");
+			break;
+		default:
+			_snprintf(m, sizeof(m)-1, "x86 Family %d", family);
+			break;
+	}
+	return m;
+}
+
+static char *get_machine(void)
+{
+	SYSTEM_INFO *s = get_system_info();
+	char *arch = get_arch(s->wProcessorArchitecture);
+
+	if (arch) {
+		if (strcmp(arch, "INTEL") == 0)
+			return get_x86_machine(s->wProcessorLevel);
+		return arch;
+	}
+	return "unknown";
+}
+
+static char cpuinfo_key[] =
+	"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0";
+
+static char *get_processor_name(void)
+{
+	static char cpu[256];
+	DWORD t, len = sizeof(cpu)-1;
+	LONG l;
+	HKEY key;
+
+	l = RegOpenKeyA(HKEY_LOCAL_MACHINE, cpuinfo_key, &key);
+	if (l != ERROR_SUCCESS)
+		return NULL;
+
+	l = RegQueryValueExA(key, "ProcessorNameString", NULL, &t, cpu, &len);
+	if (l != ERROR_SUCCESS)
+		l = RegQueryValueExA(key, "Identifier", NULL, &t, cpu, &len);
+
+	RegCloseKey(key);
+
+	if (l != ERROR_SUCCESS)
+		return NULL;
+
+	return cpu;
+}
+
+static char *map_sysinfo_to_cpu(void)
+{
+	static char cpu[256];
+	size_t n = sizeof(cpu)-1;
+	SYSTEM_INFO *s = get_system_info();
+	char *arch = get_arch(s->wProcessorArchitecture);
+
+	if (arch && (strcmp(arch, "INTEL") == 0)) {
+		int family = s->wProcessorLevel;
+		int model = (((s->wProcessorRevision) >> 8) & 0xff);
+		int stepping = ((s->wProcessorRevision) & 0xff);
+
+		_snprintf(cpu, n, "x86 Family %d Model %d Stepping %d",
+				family, model, stepping);
+		return cpu;
+	}
+	return NULL;
+}
+
+static char *get_processor(void)
+{
+	char *cpu = get_processor_name();
+
+	if (cpu || (cpu = map_sysinfo_to_cpu()))
+		return cpu;
+
+	return "unknown";
+}
+
+static char *get_hardware(void)
+{
+	return "unknown";
+}
+
+static char osinfo_key[] =
+	"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
+
+static char *get_product_name(void)
+{
+	static char product[256];
+	DWORD type, len = sizeof(product)-1;
+	LONG l;
+	HKEY key;
+
+	l = RegOpenKeyA(HKEY_LOCAL_MACHINE, osinfo_key, &key);
+	if (l != ERROR_SUCCESS)
+		return NULL;
+
+	l = RegQueryValueExA(key, "ProductName", NULL, &type, product, &len);
+
+	RegCloseKey(key);
+
+	if (l != ERROR_SUCCESS)
+		return NULL;
+
+	return product;
+}
+
+/*
+ * The OS version does not provide a unique mapping to OS product name.
+ * So, use this function only as a last resort.
+ */
+static char *map_version_to_os(void)
+{
+	static struct { int version; char *os_name; } tab[] = {
+		{ 0x500, "Windows 2000"        },
+		{ 0x501, "Windows XP"          },
+		{ 0x502, "Windows Server 2003" }, /* also Server 2003 R2 */
+		{ 0x600, "Windows Vista"       }, /* also Server 2008    */
+		{ 0x601, "Windows 7"           }, /* also Server 2008 R2 */
+		{ 0,     NULL                  }
+	};
+	OSVERSIONINFO *v = get_version_info();
+	int i, version = (v->dwMajorVersion << 8) + v->dwMinorVersion;
+
+	for (i = 0; tab[i].version != 0; i++) {
+		if (version == tab[i].version)
+			return tab[i].os_name;
+	}
+
+	return NULL;
+}
+
+static char *get_os(void)
+{
+	char *os_name = get_product_name();
+
+	if (os_name || (os_name = map_version_to_os()))
+		return os_name;
+
+	return "Windows";
+}
+
+static void print_info(void)
+{
+	static struct { int *opt; char *(*get)(void); } info[] = {
+		{ &kernel,    get_kernel    },
+		{ &host,      get_hostname  },
+		{ &release,   get_release   },
+		{ &version,   get_version   },
+		{ &machine,   get_machine   },
+		{ &processor, get_processor },
+		{ &hardware,  get_hardware  },
+		{ &os,        get_os        },
+		{ NULL,       0             }
+	};
+	char *pad = "";
+	int i;
+
+	for (i = 0; info[i].opt; i++) {
+		if (*(info[i].opt)) {
+			printf("%s%s", pad, (info[i].get)());
+			pad = " ";
+		}
+	}
+	printf("\n");
+}
+
+int main(int argc, char *argv[])
+{
+	set_program_name(argv[0], "uname");
+	process_args(argc,argv);
+	print_info();
+	return 0;
+}
-- 
1.6.5

^ permalink raw reply related

* Re: [PATCH] gitk: Use git-difftool for external diffs
From: David Aguilar @ 2009-11-19 19:39 UTC (permalink / raw)
  To: Paul Mackerras; +Cc: peff, sam, git
In-Reply-To: <19205.2531.205062.980468@cargo.ozlabs.ibm.com>

On Thu, Nov 19, 2009 at 08:03:31PM +1100, Paul Mackerras wrote:
> David Aguilar writes:
> 
> > This teaches gitk about git-difftool.  A benefit of this change is
> > that gitk's external diff now works with read-only repositories.
> 
> What version of git does git difftool first appear in?  I prefer not
> to introduce hard requirements on very recent versions of git into
> gitk.
> 
> Paul.

git-difftool appeared in git 1.6.3.

If this patch is not going in then how do you suggest we fix the
read-only repository bug?

My immediate thought is to harden the $TMPDIR patch so that the
filenames used by gitk are much less predictable (I bailed on it
once Peff noted the $TMPDIR vulnerabilities and used
git-difftool instead since it is known to be safe).

Does hardening the $TMPDIR patch have a better chance of
being accepted?


In defense of difftool: there are more benefits to using
git-difftool than just read-only repositories.
The current external diff code does not work if 'meld'
is not installed whereas using git-difftool works by default
in more environments.  It also makes things match users'
expectations when they have already gone through the trouble
of configuring a diff or merge tool.

Is there a particular time frame in which such a patch could go
in?


My primary concern is getting gitk to work with read-only
repositories.  git-difftool was just one way of getting there.
If keeping backwards compatibility is a must-have then I can
hold onto the git-difftool patch until some time in the future
when it is more appropriate.  Hopefully something along the
lines of a hardened $TMPDIR patch can stand in for the final
fix in the meantime.

What do you think?

-- 
		David

^ permalink raw reply

* [PATCH 0/2] jn/gitweb-blame fixes
From: Stephen Boyd @ 2009-11-19 19:44 UTC (permalink / raw)
  To: git; +Cc: Jakub Narebski

This series is based on next's jn/gitweb-blame branch.

I was trying out the incremental blame and noticed it didn't work each 
time. The first patch fixes the crashing I experience when blaming
gitweb.perl (ironic ;-)

The second patch fixes a visible bug I see in Firefox. Although I assume
on other browsers it's not a problem? I haven't tested it on others so I
can't be sure.

Stephen Boyd (2):
  gitweb.js: fix null object exception in initials calculation
  gitweb.js: use unicode encoding for nbsp instead of html entity

 gitweb/gitweb.js |   15 +++++++++------
 1 files changed, 9 insertions(+), 6 deletions(-)

^ permalink raw reply

* [PATCH 1/2] gitweb.js: fix null object exception in initials calculation
From: Stephen Boyd @ 2009-11-19 19:44 UTC (permalink / raw)
  To: git; +Cc: Jakub Narebski
In-Reply-To: <1258659887-5244-1-git-send-email-bebarino@gmail.com>

Currently handleLine() assumes that a commit author name will always
start with a capital letter. It's possible that the author name is
user@example.com and therefore calling a match() on the name will fail
to return any matches. Subsequently joining these matches will cause an
exception. Fix by checking that we have a match before trying to join
the results into a set of initials for the author.

Signed-off-by: Stephen Boyd <bebarino@gmail.com>
---
 gitweb/gitweb.js |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/gitweb/gitweb.js b/gitweb/gitweb.js
index 22570f5..02454d8 100644
--- a/gitweb/gitweb.js
+++ b/gitweb/gitweb.js
@@ -532,8 +532,11 @@ function handleLine(commit, group) {
 			if (group.numlines >= 2) {
 				var fragment = document.createDocumentFragment();
 				var br   = document.createElement("br");
-				var text = document.createTextNode(
-					commit.author.match(/\b([A-Z])\B/g).join(''));
+				var match = commit.author.match(/\b([A-Z])\B/g);
+				if (match) {
+					var text = document.createTextNode(
+							match.join(''));
+				}
 				if (br && text) {
 					var elem = fragment || td_sha1;
 					elem.appendChild(br);
-- 
1.6.5.3.433.g11067

^ permalink raw reply related

* [PATCH 2/2] gitweb.js: use unicode encoding for nbsp instead of html entity
From: Stephen Boyd @ 2009-11-19 19:44 UTC (permalink / raw)
  To: git; +Cc: Jakub Narebski
In-Reply-To: <1258659887-5244-1-git-send-email-bebarino@gmail.com>

It seems that in Firefox-3.5 inserting nbsp with javascript inserts the
literal nbsp; instead of a space. Fix this by inserting the unicode
representation for nbsp instead.

Signed-off-by: Stephen Boyd <bebarino@gmail.com>
---
 gitweb/gitweb.js |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/gitweb/gitweb.js b/gitweb/gitweb.js
index 02454d8..30597dd 100644
--- a/gitweb/gitweb.js
+++ b/gitweb/gitweb.js
@@ -31,12 +31,12 @@
 
 /**
  * pad number N with nonbreakable spaces on the left, to WIDTH characters
- * example: padLeftStr(12, 3, '&nbsp;') == '&nbsp;12'
- *          ('&nbsp;' is nonbreakable space)
+ * example: padLeftStr(12, 3, '\u00A0') == '\u00A012'
+ *          ('\u00A0' is nonbreakable space)
  *
  * @param {Number|String} input: number to pad
  * @param {Number} width: visible width of output
- * @param {String} str: string to prefix to string, e.g. '&nbsp;'
+ * @param {String} str: string to prefix to string, e.g. '\u00A0'
  * @returns {String} INPUT prefixed with (WIDTH - INPUT.length) x STR
  */
 function padLeftStr(input, width, str) {
@@ -158,7 +158,7 @@ function updateProgressInfo() {
 
 	if (div_progress_info) {
 		div_progress_info.firstChild.data  = blamedLines + ' / ' + totalLines +
-			' (' + padLeftStr(percentage, 3, '&nbsp;') + '%)';
+			' (' + padLeftStr(percentage, 3, '\u00A0') + '%)';
 	}
 
 	if (div_progress_bar) {
-- 
1.6.5.3.433.g11067

^ permalink raw reply related

* Re: gitk : french translation
From: Emmanuel Trillaud @ 2009-11-19 19:47 UTC (permalink / raw)
  To: Nicolas Sebrecht
  Cc: Maximilien Noal, Matthieu Moy, Nicolas Pitre, Thomas Moulard,
	Guy Brand, Git Mailing List
In-Reply-To: <20091111001050.GC27518@vidovic>

I finally took some time to improve the gitk french translation V2. The
V3 address most of the comments of Nicolas. I respond to this message
with the actual V3.

> 
> Line wraping error; configure your mail user agent to not wrap lines,
> please.
> 
> > +#FIXME : améliorer la traduction de 'file limite'
> 
> If you add some FIXME (which is good), you also should mark the
> translation as "fuzzy" like this:
In those cases, I either improve the translations or mark them fuzzy

> 
> 
> > +#: gitk:1793 gitk:1817 gitk:3916 gitk:8786 gitk:10322 gitk:10498
> > +msgid "OK"
> > +msgstr "OK"
> 
> This one should not be required.
Those strings are already "translated", so I see no reason to
remove the translation (if the strings change !? we'll have translate
them anyway)

> > +#: gitk:2713
> > +msgid "/\t\tFocus the search box"
> > +msgstr "/"
...


> > +# FIXME : traduction de "skip"
> 
> "éviter"?
> 
> > +#: gitk:3697
> > +msgid "Limit and/or skip a number of revisions (positive integer):"
> > +msgstr "Limiter et/ou sauter un certain nombre (entier positif) de révision :"
...

> > +#FIXME : traduction de "branch sides"
> > +#: gitk:3702
> 
> #, fuzzy
> 
> > +msgid "Mark branch sides"
> > +msgstr "Marquer le flanc des branches"
> 
> What about "côté"?
I choose "extrémités" but I let the string fuzzy

 
> > +#FIXME : plutôt traduire par "pas un descendant"
> > +#: gitk:4606
> 
> #, fuzzy
> 
> > +msgid "Not descendant"
> > +msgstr "Non descendant"
I use "Pas un descendant"

> > +#FIXME : plutôt traduire par "pas un ancêtre"
> > +#: gitk:4614
> 
> #, fuzzy
> 
> > +msgid "Not ancestor"
> > +msgstr "Non ancêtre"
I use "Pas un ancêtre"
 

> > +#: gitk:9257
> > +msgid ""
> > +"Error reading commit topology information; branch and preceding/following "
> > +"tag information will be incomplete."
> > +msgstr ""
> > +"Erreur à la lecture des informations sur la topology des commits. "
> 
> s/topology/topologie/
> s/./ ;/
I use "," instead. We don't use the ";" often in french.

> > +#: gitk:10441
> > +msgid "Support per-file encodings"
> > +msgstr "Support pour un encodage de caractère par fichier"
> 
> s/de caractère/ des caractères/
> 

> -- 
> Nicolas Sebrecht


-- 
Emmanuel Trillaud <etrillaud@gmail.com>

^ permalink raw reply

* Re: gitk : french translation
From: Emmanuel Trillaud @ 2009-11-19 20:01 UTC (permalink / raw)
  To: Emmanuel Trillaud
  Cc: Nicolas Sebrecht, Maximilien Noal, Matthieu Moy, Nicolas Pitre,
	Thomas Moulard, Guy Brand, Git Mailing List
In-Reply-To: <20091119204753.85765c5d.etrillaud@gmail.com>

This new version of the gitk french translation address the comment
from Nicolas. There is still some fuzzy translation but I think this
version is good enough to be submitted to the gitk Maintainer. If you
think it's not ready, please send me your suggestion.

Best regards

Emmanuel Trillaud

---8<---

Subject : [PATCHv3] French translation of gitk

Signed-off-by: Emmanuel Trillaud <etrillaud@gmail.com>
Signed-off-by: Thomas Moulard <thomas.moulard@gmail.com>
Signed-off-by: Guy Brand <gb@unistra.fr>
diff --git a/gitk-git/po/fr.po b/gitk-git/po/fr.po
new file mode 100644
index 0000000..e33733b
--- /dev/null
+++ b/gitk-git/po/fr.po
@@ -0,0 +1,1242 @@
+
+# French translation of the gitk package
+# Copyright (C) 2005-2008 Paul Mackerras.  All rights reserved.
+# This file is distributed under the same license as the gitk package.
+# Translators:
+# Emmanuel Trillaud <etrillaud@gmail.com>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gitk\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-10-05 15:16+0200\n"
+"PO-Revision-Date: 2009-11-19 20:38+0100\n"
+"Last-Translator: YOUR NAME <E-MAIL@ADDRESS>\n"
+"Language-Team: FRENCH\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: French\n"
+"X-Poedit-Country: FRANCE\n"
+
+#: gitk:113
+msgid "Couldn't get list of unmerged files:"
+msgstr "Impossible de récupérer la liste des fichiers non fusionnés :"
+
+#: gitk:269
+msgid "Error parsing revisions:"
+msgstr "Erreur lors du parcours des révisions :"
+
+#: gitk:324
+msgid "Error executing --argscmd command:"
+msgstr "Erreur à l'exécution de la commande --argscmd :"
+
+#: gitk:337
+msgid "No files selected: --merge specified but no files are unmerged."
+msgstr "Aucun fichier sélectionné : --merge précisé, mais tous les" 
+"fichiers sont fusionnés."
+
+#FIXME : améliorer la traduction de 'file limite'
+#: gitk:340
+#, fuzzy
+msgid ""
+"No files selected: --merge specified but no unmerged files are within
file " +"limit."
+msgstr "Aucun fichier sélectionné : --merge précisé mais aucun fichier
non " +"fusionné n'est dans la limite des fichiers."
+
+#: gitk:362 gitk:509
+msgid "Error executing git log:"
+msgstr "Erreur à l'exécution de git log :"
+
+#: gitk:380 gitk:525
+msgid "Reading"
+msgstr "Lecture en cours"
+
+#: gitk:440 gitk:4123
+msgid "Reading commits..."
+msgstr "Lecture des commits..."
+
+#: gitk:443 gitk:1561 gitk:4126
+msgid "No commits selected"
+msgstr "Aucun commit sélectionné"
+
+#: gitk:1437
+msgid "Can't parse git log output:"
+msgstr "Impossible de lire la sortie de git log :"
+
+#: gitk:1657
+msgid "No commit information available"
+msgstr "Aucune information disponible sur le commit"
+
+#: gitk:1793 gitk:1817 gitk:3916 gitk:8786 gitk:10322 gitk:10498
+msgid "OK"
+msgstr "OK"
+
+#: gitk:1819 gitk:3918 gitk:8383 gitk:8457 gitk:8567 gitk:8616
gitk:8788 +#: gitk:10323 gitk:10499
+msgid "Cancel"
+msgstr "Annuler"
+
+#: gitk:1919
+msgid "Update"
+msgstr "Mise à jour"
+
+#: gitk:1920
+msgid "Reload"
+msgstr "Recharger"
+
+#: gitk:1921
+msgid "Reread references"
+msgstr "Relire les références"
+
+#: gitk:1922
+msgid "List references"
+msgstr "Lister les références"
+
+#: gitk:1924
+msgid "Start git gui"
+msgstr "Démarrer git gui"
+
+#: gitk:1926
+msgid "Quit"
+msgstr "Quitter"
+
+#: gitk:1918
+msgid "File"
+msgstr "Fichier"
+
+#: gitk:1930
+msgid "Preferences"
+msgstr "Préférences"
+
+#: gitk:1929
+msgid "Edit"
+msgstr "Éditer"
+
+#: gitk:1934
+msgid "New view..."
+msgstr "Nouvelle vue..."
+
+#: gitk:1935
+msgid "Edit view..."
+msgstr "Éditer la vue..."
+
+#: gitk:1936
+msgid "Delete view"
+msgstr "Supprimer la vue"
+
+#: gitk:1938
+msgid "All files"
+msgstr "Tous les fichiers"
+
+#: gitk:1933 gitk:3670
+msgid "View"
+msgstr "Vue"
+
+#: gitk:1943 gitk:1953 gitk:2654
+msgid "About gitk"
+msgstr "À propos de gitk"
+
+#: gitk:1944 gitk:1958
+msgid "Key bindings"
+msgstr "Raccourcis clavier"
+
+#: gitk:1942 gitk:1957
+msgid "Help"
+msgstr "Aide"
+
+#: gitk:2018
+msgid "SHA1 ID: "
+msgstr "ID SHA1 :"
+
+#: gitk:2049
+msgid "Row"
+msgstr "Colonne"
+
+#: gitk:2080
+msgid "Find"
+msgstr "Recherche"
+
+#: gitk:2081
+msgid "next"
+msgstr "suivant"
+
+#: gitk:2082
+msgid "prev"
+msgstr "précédent"
+
+#: gitk:2083
+msgid "commit"
+msgstr "commit"
+
+#: gitk:2086 gitk:2088 gitk:4284 gitk:4307 gitk:4331 gitk:6272
gitk:6344 +#: gitk:6428
+msgid "containing:"
+msgstr "contient :"
+
+#: gitk:2089 gitk:3162 gitk:3167 gitk:4359
+msgid "touching paths:"
+msgstr "chemins modifiés :"
+
+#: gitk:2090 gitk:4364
+msgid "adding/removing string:"
+msgstr "ajoute/supprime la chaîne :"
+
+#: gitk:2099 gitk:2101
+msgid "Exact"
+msgstr "Exact"
+
+#: gitk:2101 gitk:4439 gitk:6240
+msgid "IgnCase"
+msgstr "Ignorer la casse"
+
+#: gitk:2101 gitk:4333 gitk:4437 gitk:6236
+msgid "Regexp"
+msgstr "Expression régulière"
+
+#: gitk:2103 gitk:2104 gitk:4458 gitk:4488 gitk:4495 gitk:6364
gitk:6432 +msgid "All fields"
+msgstr "Tous les champs"
+
+#: gitk:2104 gitk:4456 gitk:4488 gitk:6303
+msgid "Headline"
+msgstr "Surligner"
+
+#: gitk:2105 gitk:4456 gitk:6303 gitk:6432 gitk:6866
+msgid "Comments"
+msgstr "Commentaires"
+
+#: gitk:2105 gitk:4456 gitk:4460 gitk:4495 gitk:6303 gitk:6801
gitk:8063 +#: gitk:8078
+msgid "Author"
+msgstr "Auteur"
+
+#: gitk:2105 gitk:4456 gitk:6303 gitk:6803
+msgid "Committer"
+msgstr "Auteur du commit"
+
+#: gitk:2134
+msgid "Search"
+msgstr "Rechercher"
+
+#: gitk:2141
+msgid "Diff"
+msgstr "Différences"
+
+#: gitk:2143
+msgid "Old version"
+msgstr "Ancienne version"
+
+#: gitk:2145
+msgid "New version"
+msgstr "Nouvelle version"
+
+#: gitk:2147
+msgid "Lines of context"
+msgstr "Lignes de contexte"
+
+#: gitk:2157
+msgid "Ignore space change"
+msgstr "Ignorer les modifications d'espace"
+
+#: gitk:2215
+msgid "Patch"
+msgstr "Patch"
+
+#: gitk:2217
+msgid "Tree"
+msgstr "Arbre"
+
+#: gitk:2361 gitk:2378
+msgid "Diff this -> selected"
+msgstr "Différences entre ceci et la séléction"
+
+#: gitk:2362 gitk:2379
+msgid "Diff selected -> this"
+msgstr "Différence entre séléction et ceci"
+
+#: gitk:2363 gitk:2380
+msgid "Make patch"
+msgstr "Créer patch"
+
+#: gitk:2364 gitk:8441
+msgid "Create tag"
+msgstr "Créer tag"
+
+#: gitk:2365 gitk:8547
+msgid "Write commit to file"
+msgstr "Écrire le commit dans un fichier"
+
+#: gitk:2366 gitk:8604
+msgid "Create new branch"
+msgstr "Créer une nouvelle branche"
+
+#: gitk:2367
+msgid "Cherry-pick this commit"
+msgstr "Cueillir (cherry-pick) ce commit"
+
+#: gitk:2368
+msgid "Reset HEAD branch to here"
+msgstr "Réinitialiser la branche HEAD vers cet état"
+
+#: gitk:2369
+msgid "Mark this commit"
+msgstr "Marquer ce commit"
+
+#: gitk:2370
+msgid "Return to mark"
+msgstr "Retourner à la marque"
+
+#: gitk:2371
+msgid "Find descendant of this and mark"
+msgstr "Chercher le descendant de ceci et le marquer"
+
+#: gitk:2372
+msgid "Compare with marked commit"
+msgstr "Comparer avec le commit marqué"
+
+#: gitk:2386
+msgid "Check out this branch"
+msgstr "Récupérer cette branche"
+
+#: gitk:2387
+msgid "Remove this branch"
+msgstr "Supprimer cette branche"
+
+#: gitk:2394
+msgid "Highlight this too"
+msgstr "Surligner également ceci"
+
+#: gitk:2395
+msgid "Highlight this only"
+msgstr "Surligner seulement ceci"
+
+# FIXME: changed for consistency but a better translation is required.
+#: gitk:2396
+msgid "External diff"
+msgstr "Différences externe"
+
+#: gitk:2397
+msgid "Blame parent commit"
+msgstr "Blâmer le commit parent"
+
+#: gitk:2404
+msgid "Show origin of this line"
+msgstr "Montrer l'origine de cette ligne"
+
+#: gitk:2405
+msgid "Run git gui blame on this line"
+msgstr "Exécuter git gui blame sur cette ligne"
+
+#: gitk:2656
+msgid ""
+"\n"
+"Gitk - a commit viewer for git\n"
+"\n"
+"Copyright © 2005-2008 Paul Mackerras\n"
+"\n"
+"Use and redistribute under the terms of the GNU General Public
License" +msgstr ""
+"\n"
+"Gitk - visualisateur de commit pour git\n"
+"\n"
+"Copyright © 2005-2008 Paul Mackerras\n"
+"\n"
+"Utilisation et redistribution soumises aux termes de la GNU General
Public License" +
+#: gitk:2664 gitk:2726 gitk:8969
+msgid "Close"
+msgstr "Fermer"
+
+#: gitk:2683
+msgid "Gitk key bindings"
+msgstr "Raccourcis clavier de Gitk"
+
+#: gitk:2686
+msgid "Gitk key bindings:"
+msgstr "Raccourcis clavier de Gitk :"
+
+#: gitk:2688
+#, tcl-format
+msgid "<%s-Q>\t\tQuit"
+msgstr "<%s-Q>\t\tQuitter"
+
+#: gitk:2689
+msgid "<Home>\t\tMove to first commit"
+msgstr "<Début>\t\tAller au premier commit"
+
+#: gitk:2690
+msgid "<End>\t\tMove to last commit"
+msgstr "<Fin>\t\tAller au dernier commit"
+
+#: gitk:2691
+msgid "<Up>, p, i\tMove up one commit"
+msgstr "<Haut>, p, i\t Aller au commit suivant"
+
+#: gitk:2692
+msgid "<Down>, n, k\tMove down one commit"
+msgstr "<Bas>, n, k\t Aller au commit précédent"
+
+#: gitk:2693
+msgid "<Left>, z, j\tGo back in history list"
+msgstr "<Gauche>, z, j\tReculer dans l'historique"
+
+#: gitk:2694
+msgid "<Right>, x, l\tGo forward in history list"
+msgstr "<Droite>, x, l\tAvancer dans l'historique"
+
+#: gitk:2695
+msgid "<PageUp>\tMove up one page in commit list"
+msgstr "<PageUp>\tMonter d'une page dans la liste des commits"
+
+#: gitk:2696
+msgid "<PageDown>\tMove down one page in commit list"
+msgstr "<PageDown>\tDescendre d'une page dans la liste des commits"
+
+#: gitk:2697
+#, tcl-format
+msgid "<%s-Home>\tScroll to top of commit list"
+msgstr "<%s-Début>\tAller en haut de la liste des commits"
+
+#: gitk:2698
+#, tcl-format
+msgid "<%s-End>\tScroll to bottom of commit list"
+msgstr "<%s-End>\tAller en bas de la liste des commits"
+
+#: gitk:2699
+#, tcl-format
+msgid "<%s-Up>\tScroll commit list up one line"
+msgstr "<%s-Up>\tMonter d'une ligne dans la liste des commits"
+
+#: gitk:2700
+#, tcl-format
+msgid "<%s-Down>\tScroll commit list down one line"
+msgstr "<%s-Down>\tDescendre d'une ligne dans la liste des commits"
+
+#: gitk:2701
+#, tcl-format
+msgid "<%s-PageUp>\tScroll commit list up one page"
+msgstr "<%s-PageUp>\tMonter d'une page dans la liste des commits"
+
+#: gitk:2702
+#, tcl-format
+msgid "<%s-PageDown>\tScroll commit list down one page"
+msgstr "<%s-PageDown>\tDescendre d'une page dans la liste des commits"
+
+#: gitk:2703
+msgid "<Shift-Up>\tFind backwards (upwards, later commits)"
+msgstr "<Shift-Up>\tRecherche en arrière (vers l'avant, commits les
plus anciens)" +
+#: gitk:2704
+msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)"
+msgstr "<Shift-Down>\tRecherche en avant (vers l'arrière, commit les
plus récents)" +
+#: gitk:2705
+msgid "<Delete>, b\tScroll diff view up one page"
+msgstr "<Supprimer>, b\tMonter d'une page dans la vue des différences"
+
+#: gitk:2706
+msgid "<Backspace>\tScroll diff view up one page"
+msgstr "<Backspace>\tMonter d'une page dans la vue des différences"
+
+#: gitk:2707
+msgid "<Space>\t\tScroll diff view down one page"
+msgstr "<Espace>\t\tDescendre d'une page dans la vue des différences"
+
+#: gitk:2708
+msgid "u\t\tScroll diff view up 18 lines"
+msgstr "u\t\tMonter de 18 lignes dans la vue des différences"
+
+#: gitk:2709
+msgid "d\t\tScroll diff view down 18 lines"
+msgstr "d\t\tDescendre de 18 lignes dans la vue des différences"
+
+#: gitk:2710
+#, tcl-format
+msgid "<%s-F>\t\tFind"
+msgstr "<%s-F>\t\tRechercher"
+
+#: gitk:2711
+#, tcl-format
+msgid "<%s-G>\t\tMove to next find hit"
+msgstr "<%s-G>\t\tAller au résultat de recherche suivant"
+
+#: gitk:2712
+msgid "<Return>\tMove to next find hit"
+msgstr "<Return>\t\tAller au résultat de recherche suivant"
+
+#: gitk:2713
+msgid "/\t\tFocus the search box"
+msgstr "/"
+
+#: gitk:2714
+msgid "?\t\tMove to previous find hit"
+msgstr "?\t\tAller au résultat de recherche précédent"
+
+#: gitk:2715
+msgid "f\t\tScroll diff view to next file"
+msgstr "f\t\tAller au prochain fichier dans la vue des différences"
+
+#: gitk:2716
+#, tcl-format
+msgid "<%s-S>\t\tSearch for next hit in diff view"
+msgstr "<%s-S>\t\tAller au résultat suivant dans la vue des
différences" +
+#: gitk:2717
+#, tcl-format
+msgid "<%s-R>\t\tSearch for previous hit in diff view"
+msgstr "<%s-R>\t\tAller au résultat précédent dans la vue des
différences" +
+#: gitk:2718
+#, tcl-format
+msgid "<%s-KP+>\tIncrease font size"
+msgstr "<%s-KP+>\tAugmenter la taille de la police"
+
+#: gitk:2719
+#, tcl-format
+msgid "<%s-plus>\tIncrease font size"
+msgstr "<%s-plus>\tAugmenter la taille de la police"
+
+#: gitk:2720
+#, tcl-format
+msgid "<%s-KP->\tDecrease font size"
+msgstr "<%s-KP->\tDiminuer la taille de la police"
+
+#: gitk:2721
+#, tcl-format
+msgid "<%s-minus>\tDecrease font size"
+msgstr "<%s-minus>\tDiminuer la taille de la police"
+
+#: gitk:2722
+msgid "<F5>\t\tUpdate"
+msgstr "<F5>\t\tMise à jour"
+
+#: gitk:3177
+#, tcl-format
+msgid "Error getting \"%s\" from %s:"
+msgstr "Erreur en obtenant \"%s\" de %s:"
+
+#: gitk:3234 gitk:3243
+#, tcl-format
+msgid "Error creating temporary directory %s:"
+msgstr "Erreur lors de la création du répertoire temporaire %s :"
+
+#: gitk:3255
+msgid "command failed:"
+msgstr "échec de la commande :"
+
+#: gitk:3401
+msgid "No such commit"
+msgstr "Commit inexistant"
+
+#: gitk:3415
+msgid "git gui blame: command failed:"
+msgstr "git gui blame : échec de la commande :"
+
+#: gitk:3446
+#, tcl-format
+msgid "Couldn't read merge head: %s"
+msgstr "Impossible de lire le head de la fusion : %s"
+
+#: gitk:3454
+#, tcl-format
+msgid "Error reading index: %s"
+msgstr "Erreur à la lecture de l'index : %s"
+
+#: gitk:3479
+#, tcl-format
+msgid "Couldn't start git blame: %s"
+msgstr "Impossible de démarrer git blame : %s"
+
+#: gitk:3482 gitk:6271
+msgid "Searching"
+msgstr "Recherche en cours"
+
+#: gitk:3514
+#, tcl-format
+msgid "Error running git blame: %s"
+msgstr "Erreur à l'exécution de git blame : %s"
+
+#: gitk:3542
+#, tcl-format
+msgid "That line comes from commit %s,  which is not in this view"
+msgstr "Cette ligne est issue du commit %s, qui n'est pas dans cette
vue" +
+#: gitk:3556
+msgid "External diff viewer failed:"
+msgstr "Échec de l'outil externe de visualisation des différences"
+
+#: gitk:3674
+msgid "Gitk view definition"
+msgstr "Définition des vues de Gitk"
+
+#: gitk:3678
+msgid "Remember this view"
+msgstr "Se souvenir de cette vue"
+
+#: gitk:3679
+msgid "References (space separated list):"
+msgstr "Références (liste d'éléments séparés par des espaces) :"
+
+#: gitk:3680
+msgid "Branches & tags:"
+msgstr "Branches & tags :"
+
+#: gitk:3681
+msgid "All refs"
+msgstr "Toutes les références"
+
+#: gitk:3682
+msgid "All (local) branches"
+msgstr "Toutes les branches (locales)"
+
+#: gitk:3683
+msgid "All tags"
+msgstr "Tous les tags"
+
+#: gitk:3684
+msgid "All remote-tracking branches"
+msgstr "Toutes les branches de suivi distante"
+
+#: gitk:3685
+msgid "Commit Info (regular expressions):"
+msgstr "Info sur les commits (expressions régulières) :"
+
+#: gitk:3686
+msgid "Author:"
+msgstr "Auteur :"
+
+#: gitk:3687
+msgid "Committer:"
+msgstr "Commiteur :"
+
+#: gitk:3688
+msgid "Commit Message:"
+msgstr "Message de commit :"
+
+#: gitk:3689
+msgid "Matches all Commit Info criteria"
+msgstr "Correspond à tous les critères d'Info sur les commits"
+
+#: gitk:3690
+msgid "Changes to Files:"
+msgstr "Changements des fichiers :"
+
+#: gitk:3691
+msgid "Fixed String"
+msgstr "Chaîne Figée"
+
+#: gitk:3692
+msgid "Regular Expression"
+msgstr "Expression Régulière"
+
+#: gitk:3693
+msgid "Search string:"
+msgstr "Recherche de la chaîne :"
+
+#: gitk:3694
+msgid ""
+"Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17,
2009 " +"15:27:38\"):"
+msgstr ""
+"Dates des commits (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March
17, " +"2009 15:27:38\") :"
+
+#: gitk:3695
+msgid "Since:"
+msgstr "De :"
+
+#: gitk:3696
+msgid "Until:"
+msgstr "Jusqu'au :"
+
+#: gitk:3697
+msgid "Limit and/or skip a number of revisions (positive integer):"
+msgstr "Limiter et/ou sauter un certain nombre (entier positif) de
révision :" +
+#: gitk:3698
+msgid "Number to show:"
+msgstr "Nombre à afficher :"
+
+#: gitk:3699
+msgid "Number to skip:"
+msgstr "Nombre à sauter :"
+
+#: gitk:3700
+msgid "Miscellaneous options:"
+msgstr "Options diverses"
+
+#: gitk:3701
+msgid "Strictly sort by date"
+msgstr "Trier par date"
+
+#FIXME : traduction de "branch sides" 
+#: gitk:3702
+#, fuzzy
+msgid "Mark branch sides"
+msgstr "Marquer les extrémités des branches"
+
+#: gitk:3703
+msgid "Limit to first parent"
+msgstr "Limiter au premier ancêtre"
+
+#: gitk:3704
+msgid "Simple history"
+msgstr "Historique simple"
+
+#: gitk:3705
+msgid "Additional arguments to git log:"
+msgstr "Arguments supplémentaires de git log :"
+
+#: gitk:3706
+msgid "Enter files and directories to include, one per line:"
+msgstr "Saisir les fichiers et répertoires à inclure, un par ligne :"
+
+#: gitk:3707
+msgid "Command to generate more commits to include:"
+msgstr "Commande pour générer plus de commits à inclure :"
+
+#: gitk:3829
+msgid "Gitk: edit view"
+msgstr "Gitk : éditer la vue"
+
+#: gitk:3837
+msgid "-- criteria for selecting revisions"
+msgstr "-- critère pour la sélection des révisions"
+
+#: gitk:3842
+msgid "View Name:"
+msgstr "Nom de la vue :"
+
+#: gitk:3917
+msgid "Apply (F5)"
+msgstr "Appliquer (F5)"
+
+#: gitk:3955
+msgid "Error in commit selection arguments:"
+msgstr "Erreur dans les arguments de sélection des commits :"
+
+#: gitk:4008 gitk:4060 gitk:4508 gitk:4522 gitk:5783 gitk:11196
gitk:11197 +msgid "None"
+msgstr "Aucun"
+
+#: gitk:4456 gitk:6303 gitk:8065 gitk:8080
+msgid "Date"
+msgstr "Date"
+
+#: gitk:4456 gitk:6303
+msgid "CDate"
+msgstr "CDate"
+
+#: gitk:4605 gitk:4610
+msgid "Descendant"
+msgstr "Descendant"
+
+#: gitk:4606
+msgid "Not descendant"
+msgstr "Pas un descendant"
+
+#: gitk:4613 gitk:4618
+msgid "Ancestor"
+msgstr "Ancêtre"
+
+#: gitk:4614
+msgid "Not ancestor"
+msgstr "Pas un ancêtre"
+
+#: gitk:4904
+msgid "Local changes checked in to index but not committed"
+msgstr "Modifications locales enregistrées dans l'index mais non
commitées" +
+#: gitk:4940
+msgid "Local uncommitted changes, not checked in to index"
+msgstr "Modifications locales non enregistrées dans l'index et non
commitées" +
+#: gitk:6621
+msgid "many"
+msgstr "nombreux"
+
+#: gitk:6805
+msgid "Tags:"
+msgstr "Tags :"
+
+#: gitk:6822 gitk:6828 gitk:8058
+msgid "Parent"
+msgstr "Parent"
+
+#: gitk:6833
+msgid "Child"
+msgstr "Enfant"
+
+#: gitk:6842
+msgid "Branch"
+msgstr "Branche"
+
+#: gitk:6845
+msgid "Follows"
+msgstr "Suit"
+
+#: gitk:6848
+msgid "Precedes"
+msgstr "Précède"
+
+#: gitk:7346
+#, tcl-format
+msgid "Error getting diffs: %s"
+msgstr "Erreur lors de la récupération des différences : %s"
+
+#: gitk:7886
+msgid "Goto:"
+msgstr "Aller à :"
+
+#: gitk:7888
+msgid "SHA1 ID:"
+msgstr "Id SHA1 :"
+
+#: gitk:7907
+#, tcl-format
+msgid "Short SHA1 id %s is ambiguous"
+msgstr "Id SHA1 court %s est ambigu"
+
+#: gitk:7914
+#, tcl-format
+msgid "Revision %s is not known"
+msgstr "Id SHA1 %s est inconnu"
+
+#: gitk:7924
+#, tcl-format
+msgid "SHA1 id %s is not known"
+msgstr "Id SHA1 %s est inconnu"
+
+#: gitk:7926
+#, tcl-format
+msgid "Revision %s is not in the current view"
+msgstr "La révision %s n'est pas dans la vue courante"
+
+#: gitk:8068
+msgid "Children"
+msgstr "Enfants"
+
+#: gitk:8125
+#, tcl-format
+msgid "Reset %s branch to here"
+msgstr "Réinitialiser la branche %s vers cet état"
+
+#: gitk:8127
+msgid "Detached head: can't reset"
+msgstr "Head détaché : impossible de réinitialiser"
+
+#: gitk:8236 gitk:8242
+msgid "Skipping merge commit "
+msgstr "Eviter le commit de la fusion "
+
+#: gitk:8251 gitk:8256
+msgid "Error getting patch ID for "
+msgstr "Erreur à l'obtention de l'ID du patch pour "
+
+#: gitk:8252 gitk:8257
+msgid " - stopping\n"
+msgstr " - arrêt en cours\n"
+
+#: gitk:8262 gitk:8265 gitk:8273 gitk:8283 gitk:8292
+msgid "Commit "
+msgstr "Commit "
+
+#: gitk:8266
+msgid ""
+" is the same patch as\n"
+"       "
+msgstr ""
+"est le même patch que \n"
+"       "
+
+#: gitk:8274
+msgid ""
+" differs from\n"
+"       "
+msgstr ""
+" diffère de\n"
+"       "
+
+#: gitk:8276
+msgid "- stopping\n"
+msgstr "- arrêt en cours\n"
+
+#: gitk:8284 gitk:8293
+#, tcl-format
+msgid " has %s children - stopping\n"
+msgstr "a %s enfants - arrêt en cours\n"
+
+#: gitk:8324
+msgid "Top"
+msgstr "Haut"
+
+#: gitk:8325
+msgid "From"
+msgstr "De"
+
+#: gitk:8330
+msgid "To"
+msgstr "À"
+
+#: gitk:8354
+msgid "Generate patch"
+msgstr "Générer le patch"
+
+#: gitk:8356
+msgid "From:"
+msgstr "De :"
+
+#: gitk:8365
+msgid "To:"
+msgstr "À :"
+
+#: gitk:8374
+msgid "Reverse"
+msgstr "Inverser"
+
+#: gitk:8376 gitk:8561
+msgid "Output file:"
+msgstr "Fichier de sortie :"
+
+#: gitk:8382
+msgid "Generate"
+msgstr "Générer"
+
+#: gitk:8420
+msgid "Error creating patch:"
+msgstr "Erreur à la création du patch :"
+
+#: gitk:8443 gitk:8549 gitk:8606
+msgid "ID:"
+msgstr "ID :"
+
+#: gitk:8452
+msgid "Tag name:"
+msgstr "Nom du Tag :"
+
+#: gitk:8456 gitk:8615
+msgid "Create"
+msgstr "Créer"
+
+#: gitk:8473
+msgid "No tag name specified"
+msgstr "Aucun nom de tag spécifié"
+
+#: gitk:8477
+#, tcl-format
+msgid "Tag \"%s\" already exists"
+msgstr "Le tag \"%s\" existe déjà"
+
+#: gitk:8483
+msgid "Error creating tag:"
+msgstr "Erreur à la création du tag :"
+
+#: gitk:8558
+msgid "Command:"
+msgstr "Commande :"
+
+#: gitk:8566
+msgid "Write"
+msgstr "Écrire"
+
+#: gitk:8584
+msgid "Error writing commit:"
+msgstr "Erreur à l'ecriture du commit :"
+
+#: gitk:8611
+msgid "Name:"
+msgstr "Nom :"
+
+#: gitk:8634
+msgid "Please specify a name for the new branch"
+msgstr "Veuillez spécifier un nom pour la nouvelle branche"
+
+#: gitk:8639
+#, tcl-format
+msgid "Branch '%s' already exists. Overwrite?"
+msgstr "La branche '%s' existe déjà. Écraser?"
+
+#: gitk:8705
+#, tcl-format
+msgid "Commit %s is already included in branch %s -- really re-apply
it?" +msgstr "Le Commit %s est déjà inclus dans la branche %s -- le
ré-appliquer " +"malgré tout?"
+
+#: gitk:8710
+msgid "Cherry-picking"
+msgstr "Cueillir (Cherry-picking)"
+
+#: gitk:8719
+#, tcl-format
+msgid ""
+"Cherry-pick failed because of local changes to file '%s'.\n"
+"Please commit, reset or stash your changes and try again."
+msgstr "La cueillette (cherry-pick) a échouée à cause de modifications
locales au fichier '%s'.\n" +"Veuillez commiter, réinitialiser ou
stasher vos changements et essayer de nouveau." +
+#: gitk:8725
+msgid ""
+"Cherry-pick failed because of merge conflict.\n"
+"Do you wish to run git citool to resolve it?"
+msgstr ""
+"La cueillette (cherry-pick) a échoué à cause d'un conflit lors d'une
fusion.\n" +"Souhaitez-vous exécuter git citool pour le résoudre?"
+
+#: gitk:8741
+msgid "No changes committed"
+msgstr "Aucun changement commité"
+
+#: gitk:8767
+msgid "Confirm reset"
+msgstr "Confirmer la réinitialisation"
+
+#: gitk:8769
+#, tcl-format
+msgid "Reset branch %s to %s?"
+msgstr "Réinitialiser la branche %s à %s?"
+
+#: gitk:8773
+msgid "Reset type:"
+msgstr "Type de réinitialisation :"
+
+#: gitk:8777
+msgid "Soft: Leave working tree and index untouched"
+msgstr "Douce : Laisse l'arbre de travail et l'index intact"
+
+#: gitk:8780
+msgid "Mixed: Leave working tree untouched, reset index"
+msgstr "Hybride : Laisse l'arbre de travail dans son état courant,
réinitialise l'index" +
+#: gitk:8783
+msgid ""
+"Hard: Reset working tree and index\n"
+"(discard ALL local changes)"
+msgstr ""
+"Dure : Réinitialise l'arbre de travail et l'index\n"
+"(abandonne TOUS les changements locaux)"
+
+#: gitk:8800
+msgid "Resetting"
+msgstr "Réinitialisation"
+
+#: gitk:8857
+msgid "Checking out"
+msgstr "Récupération"
+
+#: gitk:8910
+msgid "Cannot delete the currently checked-out branch"
+msgstr "Impossible de supprimer la branche en cours"
+
+#: gitk:8916
+#, tcl-format
+msgid ""
+"The commits on branch %s aren't on any other branch.\n"
+"Really delete branch %s?"
+msgstr ""
+"Les commits de la branche %s ne sont dans aucune autre branche.\n"
+"Voulez-vous vraiment supprimer cette branche %s ?"
+
+#: gitk:8947
+#, tcl-format
+msgid "Tags and heads: %s"
+msgstr "Tags et heads : %s"
+
+#: gitk:8962
+msgid "Filter"
+msgstr "Filtrer"
+
+#: gitk:9257
+msgid ""
+"Error reading commit topology information; branch and
preceding/following " +"tag information will be incomplete."
+msgstr ""
+"Erreur à la lecture des informations sur la topologie des commits, "
+"les informations sur les branches et les tags précédents/suivant "
+"seront incomplètes."
+
+#: gitk:10243
+msgid "Tag"
+msgstr "Tag"
+
+#: gitk:10243
+msgid "Id"
+msgstr "Id"
+
+#: gitk:10291
+msgid "Gitk font chooser"
+msgstr "Sélecteur de police de Gitk"
+
+#: gitk:10308
+msgid "B"
+msgstr "B"
+
+#: gitk:10311
+msgid "I"
+msgstr "I"
+
+#: gitk:10407
+msgid "Gitk preferences"
+msgstr "Préférences de Gitk"
+
+#: gitk:10409
+msgid "Commit list display options"
+msgstr "Options d'affichage de la liste des commits"
+
+#: gitk:10412
+msgid "Maximum graph width (lines)"
+msgstr "Longueur maximum du graphe (lignes)"
+
+#FIXME : Traduction standard de "pane"?
+#: gitk:10416
+#, tcl-format
+msgid "Maximum graph width (% of pane)"
+msgstr "Longueur maximum du graphe (% du panneau)"
+
+#: gitk:10420
+msgid "Show local changes"
+msgstr "Montrer les changements locaux"
+
+#: gitk:10423
+msgid "Auto-select SHA1"
+msgstr "Sélection auto. du SHA1"
+
+#: gitk:10427
+msgid "Diff display options"
+msgstr "Options d'affichage des différences"
+
+#: gitk:10429
+msgid "Tab spacing"
+msgstr "Taille des tabulations"
+
+#: gitk:10432
+msgid "Display nearby tags"
+msgstr "Afficher les tags les plus proches"
+
+#: gitk:10435
+msgid "Hide remote refs"
+msgstr "Cacher les refs distantes"
+
+#: gitk:10438
+msgid "Limit diffs to listed paths"
+msgstr "Limiter les différences aux chemins listés"
+
+#: gitk:10441
+msgid "Support per-file encodings"
+msgstr "Support pour un encodage des caractères par fichier"
+
+#: gitk:10447 gitk:10512
+msgid "External diff tool"
+msgstr "Outil de diff externe"
+
+#: gitk:10449
+msgid "Choose..."
+msgstr "Choisir..."
+
+#: gitk:10454
+msgid "Colors: press to choose"
+msgstr "Couleurs : cliquer pour choisir"
+
+#: gitk:10457
+msgid "Background"
+msgstr "Arrière-plan"
+
+#: gitk:10458 gitk:10488
+msgid "background"
+msgstr "arrière plan"
+
+#: gitk:10461
+msgid "Foreground"
+msgstr "Premier plan"
+
+#: gitk:10462
+msgid "foreground"
+msgstr "premier plan"
+
+#: gitk:10465
+msgid "Diff: old lines"
+msgstr "Différences : anciennes lignes"
+
+#: gitk:10466
+msgid "diff old lines"
+msgstr "différences anciennes lignes"
+
+#: gitk:10470
+msgid "Diff: new lines"
+msgstr "Différences : nouvelles lignes"
+
+#: gitk:10471
+msgid "diff new lines"
+msgstr "différences nouvelles lignes"
+
+#: gitk:10475
+msgid "Diff: hunk header"
+msgstr "Différences : entête du hunk"
+
+#: gitk:10477
+msgid "diff hunk header"
+msgstr "différences : entête du hunk"
+
+#: gitk:10481
+msgid "Marked line bg"
+msgstr "Arrière-plan de la ligne marquée"
+
+#: gitk:10483
+msgid "marked line background"
+msgstr "Arrière-plan de la ligne marquée"
+
+#: gitk:10487
+msgid "Select bg"
+msgstr "Sélectionner l'arrière-plan"
+
+#: gitk:10491
+msgid "Fonts: press to choose"
+msgstr "Polices : cliquer pour choisir"
+
+#: gitk:10493
+msgid "Main font"
+msgstr "Police principale"
+
+#: gitk:10494
+msgid "Diff display font"
+msgstr "Police d'affichage des différences"
+
+#: gitk:10495
+msgid "User interface font"
+msgstr "Police de l'interface utilisateur"
+
+#: gitk:10522
+#, tcl-format
+msgid "Gitk: choose color for %s"
+msgstr "Gitk : choisir la couleur de %s"
+
+#: gitk:10973
+msgid ""
+"Sorry, gitk cannot run with this version of Tcl/Tk.\n"
+" Gitk requires at least Tcl/Tk 8.4."
+msgstr ""
+"Désolé, gitk ne peut être exécuté avec cette version de Tcl/Tk.\n"
+" Gitk requiert Tcl/Tk version 8.4 ou supérieur."
+
+#: gitk:11101
+msgid "Cannot find a git repository here."
+msgstr "Impossible de trouver un dépôt git ici."
+
+#: gitk:11105
+#, tcl-format
+msgid "Cannot find the git directory \"%s\"."
+msgstr "Impossible de trouver le répertoire git \"%s\"."
+
+#: gitk:11152
+#, tcl-format
+msgid "Ambiguous argument '%s': both revision and filename"
+msgstr "Argument '%s' ambigu : à la fois une révision et un nom et
fichier" +
+#: gitk:11164
+msgid "Bad arguments to gitk:"
+msgstr "Arguments invalides pour gitk :"
+
+#: gitk:11249
+msgid "Command line"
+msgstr "Ligne de commande"

^ permalink raw reply related

* RE: Hey - A Conceptual Simplication....
From: George Dennie @ 2009-11-19 20:12 UTC (permalink / raw)
  To: git
  Cc: B.Steinbrink, 'Jason Sewall', 'Jakub Narebski',
	'Jan Krüger', torvalds
In-Reply-To: <20091119074226.GA23304@atjola.homenet>

Thanks Jakub Narebski and Björn Steinbrink...Nice description Björn.

I think an important piece of conceptual information missing from the docs
is a concise list of the conceptual properties defining the context of the
working tree, index, and repository during normal use. This itemization
would go far in explaining the synergies between the various commands. 

Functionally, all the commands merely manipulate these properties. If these
properties were summarize in context one would expect that would represent a
very complete functional model of Git. A user could review the description
figure what they wanted to do and then find the command(s) to accomplish it.


Presently this knowledge is accreted over time as oppose to merely being
read and in the space of a few minutes "groked" (of course it could be that
I am particularly limited :).

For example, towards a functional model, is this close? (note: all
properties can be blank/empty)...

REPOSITORIES
	Collection of Commits
	Collection of Branches
		-- collection of commits without children
		-- as a result each commits either augments
		-- and existing branch or creates a new one
	Master Branch
		-- typically the publishable development history

INDEX
	Collections of Parent/Merge Commits
		-- the commit will use all these as its parent

	Staged Commit 
		-- these changes are shown relative to the working tree

	Default Branch
		-- the history the staged commit is suppose to augment

	Collection of Stashes
		-- these are not copies of the working tree since they
		-- only contain "versioned" files/folders and so is not
		-- a backup

WORKING_TREE
	Collection of Files and Folders
	

As far as I can tell, the working tree is not suppose to be stateful, but it
seems the commands treat it as such.

What is interesting is that branches serve to encourage a serialized view of
commits. More than structure, they are like books in a library narrating a
development story. Consequently, and interestingly, they are as much the
purpose of the repository as the commits they organize...which is
interesting.


Again, thanks for your patients.

George.

^ permalink raw reply

* [PATCH] Documentation: undocument gc'd function graph_release()
From: Greg Price @ 2009-11-19 20:58 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

graph_release() was removed in 064bfbd.  Cut it from the API
documentation and a comment.

Signed-off-by: Greg Price <price@ksplice.com>
---
 Documentation/technical/api-history-graph.txt |    5 -----
 graph.h                                       |    1 -
 2 files changed, 0 insertions(+), 6 deletions(-)

diff --git a/Documentation/technical/api-history-graph.txt
b/Documentation/technical/api-history-graph.txt
index d66e61b..d6fc90a 100644
--- a/Documentation/technical/api-history-graph.txt
+++ b/Documentation/technical/api-history-graph.txt
@@ -11,9 +11,6 @@ Core functions:

 * `graph_init()` creates a new `struct git_graph`

-* `graph_release()` destroys a `struct git_graph`, and frees the memory
-  associated with it.
-
 * `graph_update()` moves the graph to a new commit.

 * `graph_next_line()` outputs the next line of the graph into a strbuf.  It
@@ -134,8 +131,6 @@ while ((commit = get_revision(opts)) != NULL) {
 			putchar(opts->diffopt.line_termination);
 	}
 }
-
-graph_release(graph);
 ------------

 Sample output
diff --git a/graph.h b/graph.h
index bc30d68..b82ae87 100644
--- a/graph.h
+++ b/graph.h
@@ -6,7 +6,6 @@ struct git_graph;

 /*
  * Create a new struct git_graph.
- * The graph should be freed with graph_release() when no longer needed.
  */
 struct git_graph *graph_init(struct rev_info *opt);

-- 
1.6.5.2.37.ge17fd.dirty

^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox