2005-07-06 08:08:02 +08:00
|
|
|
#include "cache.h"
|
2007-04-09 13:06:36 +08:00
|
|
|
#include "pack.h"
|
2005-07-06 08:08:02 +08:00
|
|
|
|
2009-11-09 23:04:55 +08:00
|
|
|
static const char show_index_usage[] =
|
usage: do not insist that standard input must come from a file
The synopsys text and the usage string of subcommands that read list
of things from the standard input are often shown like this:
git gostak [--distim] < <list-of-doshes>
This is problematic in a number of ways:
* The way to use these commands is more often to feed them the
output from another command, not feed them from a file.
* Manual pages outside Git, commands that operate on the data read
from the standard input, e.g "sort", "grep", "sed", etc., are not
described with such a "< redirection-from-file" in their synopsys
text. Our doing so introduces inconsistency.
* We do not insist on where the output should go, by saying
git gostak [--distim] < <list-of-doshes> > <output>
* As it is our convention to enclose placeholders inside <braket>,
the redirection operator followed by a placeholder filename
becomes very hard to read, both in the documentation and in the
help text.
Let's clean them all up, after making sure that the documentation
clearly describes the modes that take information from the standard
input and what kind of things are expected on the input.
[jc: stole example for fmt-merge-msg from Jonathan]
Helped-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2015-10-17 02:27:42 +08:00
|
|
|
"git show-index";
|
2009-11-09 23:04:55 +08:00
|
|
|
|
2005-07-06 08:08:02 +08:00
|
|
|
int main(int argc, char **argv)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
unsigned nr;
|
2007-04-09 13:06:36 +08:00
|
|
|
unsigned int version;
|
2005-07-06 08:08:02 +08:00
|
|
|
static unsigned int top_index[256];
|
|
|
|
|
i18n: add infrastructure for translating Git with gettext
Change the skeleton implementation of i18n in Git to one that can show
localized strings to users for our C, Shell and Perl programs using
either GNU libintl or the Solaris gettext implementation.
This new internationalization support is enabled by default. If
gettext isn't available, or if Git is compiled with
NO_GETTEXT=YesPlease, Git falls back on its current behavior of
showing interface messages in English. When using the autoconf script
we'll auto-detect if the gettext libraries are installed and act
appropriately.
This change is somewhat large because as well as adding a C, Shell and
Perl i18n interface we're adding a lot of tests for them, and for
those tests to work we need a skeleton PO file to actually test
translations. A minimal Icelandic translation is included for this
purpose. Icelandic includes multi-byte characters which makes it easy
to test various edge cases, and it's a language I happen to
understand.
The rest of the commit message goes into detail about various
sub-parts of this commit.
= Installation
Gettext .mo files will be installed and looked for in the standard
$(prefix)/share/locale path. GIT_TEXTDOMAINDIR can also be set to
override that, but that's only intended to be used to test Git itself.
= Perl
Perl code that's to be localized should use the new Git::I18n
module. It imports a __ function into the caller's package by default.
Instead of using the high level Locale::TextDomain interface I've
opted to use the low-level (equivalent to the C interface)
Locale::Messages module, which Locale::TextDomain itself uses.
Locale::TextDomain does a lot of redundant work we don't need, and
some of it would potentially introduce bugs. It tries to set the
$TEXTDOMAIN based on package of the caller, and has its own
hardcoded paths where it'll search for messages.
I found it easier just to completely avoid it rather than try to
circumvent its behavior. In any case, this is an issue wholly
internal Git::I18N. Its guts can be changed later if that's deemed
necessary.
See <AANLkTilYD_NyIZMyj9dHtVk-ylVBfvyxpCC7982LWnVd@mail.gmail.com> for
a further elaboration on this topic.
= Shell
Shell code that's to be localized should use the git-sh-i18n
library. It's basically just a wrapper for the system's gettext.sh.
If gettext.sh isn't available we'll fall back on gettext(1) if it's
available. The latter is available without the former on Solaris,
which has its own non-GNU gettext implementation. We also need to
emulate eval_gettext() there.
If neither are present we'll use a dumb printf(1) fall-through
wrapper.
= About libcharset.h and langinfo.h
We use libcharset to query the character set of the current locale if
it's available. I.e. we'll use it instead of nl_langinfo if
HAVE_LIBCHARSET_H is set.
The GNU gettext manual recommends using langinfo.h's
nl_langinfo(CODESET) to acquire the current character set, but on
systems that have libcharset.h's locale_charset() using the latter is
either saner, or the only option on those systems.
GNU and Solaris have a nl_langinfo(CODESET), FreeBSD can use either,
but MinGW and some others need to use libcharset.h's locale_charset()
instead.
=Credits
This patch is based on work by Jeff Epler <jepler@unpythonic.net> who
did the initial Makefile / C work, and a lot of comments from the Git
mailing list, including Jonathan Nieder, Jakub Narebski, Johannes
Sixt, Erik Faye-Lund, Peter Krefting, Junio C Hamano, Thomas Rast and
others.
[jc: squashed a small Makefile fix from Ramsay]
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-11-18 07:14:42 +08:00
|
|
|
git_setup_gettext();
|
|
|
|
|
2009-11-09 23:04:55 +08:00
|
|
|
if (argc != 1)
|
|
|
|
usage(show_index_usage);
|
2007-04-09 13:06:36 +08:00
|
|
|
if (fread(top_index, 2 * 4, 1, stdin) != 1)
|
|
|
|
die("unable to read header");
|
|
|
|
if (top_index[0] == htonl(PACK_IDX_SIGNATURE)) {
|
|
|
|
version = ntohl(top_index[1]);
|
|
|
|
if (version < 2 || version > 2)
|
|
|
|
die("unknown index version");
|
|
|
|
if (fread(top_index, 256 * 4, 1, stdin) != 1)
|
|
|
|
die("unable to read index");
|
|
|
|
} else {
|
|
|
|
version = 1;
|
|
|
|
if (fread(&top_index[2], 254 * 4, 1, stdin) != 1)
|
|
|
|
die("unable to read index");
|
|
|
|
}
|
2005-07-06 08:08:02 +08:00
|
|
|
nr = 0;
|
|
|
|
for (i = 0; i < 256; i++) {
|
|
|
|
unsigned n = ntohl(top_index[i]);
|
|
|
|
if (n < nr)
|
|
|
|
die("corrupt index file");
|
|
|
|
nr = n;
|
|
|
|
}
|
2007-04-09 13:06:36 +08:00
|
|
|
if (version == 1) {
|
|
|
|
for (i = 0; i < nr; i++) {
|
|
|
|
unsigned int offset, entry[6];
|
2005-07-06 08:08:02 +08:00
|
|
|
|
2007-04-09 13:06:36 +08:00
|
|
|
if (fread(entry, 4 + 20, 1, stdin) != 1)
|
|
|
|
die("unable to read entry %u/%u", i, nr);
|
|
|
|
offset = ntohl(entry[0]);
|
|
|
|
printf("%u %s\n", offset, sha1_to_hex((void *)(entry+1)));
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
unsigned off64_nr = 0;
|
|
|
|
struct {
|
|
|
|
unsigned char sha1[20];
|
|
|
|
uint32_t crc;
|
|
|
|
uint32_t off;
|
2011-10-07 02:22:22 +08:00
|
|
|
} *entries = xmalloc(nr * sizeof(entries[0]));
|
2007-04-09 13:06:36 +08:00
|
|
|
for (i = 0; i < nr; i++)
|
|
|
|
if (fread(entries[i].sha1, 20, 1, stdin) != 1)
|
|
|
|
die("unable to read sha1 %u/%u", i, nr);
|
|
|
|
for (i = 0; i < nr; i++)
|
|
|
|
if (fread(&entries[i].crc, 4, 1, stdin) != 1)
|
|
|
|
die("unable to read crc %u/%u", i, nr);
|
|
|
|
for (i = 0; i < nr; i++)
|
|
|
|
if (fread(&entries[i].off, 4, 1, stdin) != 1)
|
|
|
|
die("unable to read 32b offset %u/%u", i, nr);
|
|
|
|
for (i = 0; i < nr; i++) {
|
|
|
|
uint64_t offset;
|
|
|
|
uint32_t off = ntohl(entries[i].off);
|
|
|
|
if (!(off & 0x80000000)) {
|
|
|
|
offset = off;
|
|
|
|
} else {
|
|
|
|
uint32_t off64[2];
|
|
|
|
if ((off & 0x7fffffff) != off64_nr)
|
|
|
|
die("inconsistent 64b offset index");
|
|
|
|
if (fread(off64, 8, 1, stdin) != 1)
|
|
|
|
die("unable to read 64b offset %u", off64_nr);
|
|
|
|
offset = (((uint64_t)ntohl(off64[0])) << 32) |
|
|
|
|
ntohl(off64[1]);
|
|
|
|
off64_nr++;
|
|
|
|
}
|
2008-07-03 23:52:09 +08:00
|
|
|
printf("%" PRIuMAX " %s (%08"PRIx32")\n",
|
|
|
|
(uintmax_t) offset,
|
2007-04-09 13:06:36 +08:00
|
|
|
sha1_to_hex(entries[i].sha1),
|
|
|
|
ntohl(entries[i].crc));
|
|
|
|
}
|
|
|
|
free(entries);
|
2005-07-06 08:08:02 +08:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|