|
|
|
/*
|
|
|
|
* GIT - The information manager from hell
|
|
|
|
*
|
|
|
|
* Copyright (C) Linus Torvalds, 2005
|
|
|
|
*/
|
|
|
|
#include "builtin.h"
|
|
|
|
#include "cache.h"
|
|
|
|
#include "tree.h"
|
|
|
|
#include "cache-tree.h"
|
|
|
|
|
|
|
|
static const char write_tree_usage[] =
|
|
|
|
"git-write-tree [--missing-ok] [--prefix=<prefix>/]";
|
|
|
|
|
|
|
|
int cmd_write_tree(int argc, const char **argv, const char *unused_prefix)
|
|
|
|
{
|
|
|
|
int missing_ok = 0, ret;
|
|
|
|
const char *prefix = NULL;
|
|
|
|
unsigned char sha1[20];
|
|
|
|
const char *me = "git-write-tree";
|
|
|
|
|
Fix racy-git handling in git-write-tree.
After git-write-tree finishes computing the tree, it updates the
index so that later operations can take advantage of fully
populated cache tree.
However, anybody writing the index file has to mark the entries
that are racily clean. For each entry whose cached lstat(3)
data in the index exactly matches what is obtained from the
filesystem, if the timestamp on the index file was the same or
older than the modification timestamp of the file, the blob
contents and the work tree file, after convert_to_git(), need to
be compared, and if they are different, its index entry needs to
be marked not to match the lstat(3) data from the filesystem.
In order for this to work, convert_to_git() needs to work
correctly, which in turn means you need to read the config file
to get the settings of core.crlf and friends.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
18 years ago
|
|
|
git_config(git_default_config);
|
|
|
|
while (1 < argc) {
|
|
|
|
const char *arg = argv[1];
|
|
|
|
if (!strcmp(arg, "--missing-ok"))
|
|
|
|
missing_ok = 1;
|
Mechanical conversion to use prefixcmp()
This mechanically converts strncmp() to use prefixcmp(), but only when
the parameters match specific patterns, so that they can be verified
easily. Leftover from this will be fixed in a separate step, including
idiotic conversions like
if (!strncmp("foo", arg, 3))
=>
if (!(-prefixcmp(arg, "foo")))
This was done by using this script in px.perl
#!/usr/bin/perl -i.bak -p
if (/strncmp\(([^,]+), "([^\\"]*)", (\d+)\)/ && (length($2) == $3)) {
s|strncmp\(([^,]+), "([^\\"]*)", (\d+)\)|prefixcmp($1, "$2")|;
}
if (/strncmp\("([^\\"]*)", ([^,]+), (\d+)\)/ && (length($1) == $3)) {
s|strncmp\("([^\\"]*)", ([^,]+), (\d+)\)|(-prefixcmp($2, "$1"))|;
}
and running:
$ git grep -l strncmp -- '*.c' | xargs perl px.perl
Signed-off-by: Junio C Hamano <junkio@cox.net>
18 years ago
|
|
|
else if (!prefixcmp(arg, "--prefix="))
|
|
|
|
prefix = arg + 9;
|
|
|
|
else
|
|
|
|
usage(write_tree_usage);
|
|
|
|
argc--; argv++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (argc > 2)
|
|
|
|
die("too many options");
|
|
|
|
|
|
|
|
ret = write_cache_as_tree(sha1, missing_ok, prefix);
|
|
|
|
switch (ret) {
|
|
|
|
case 0:
|
|
|
|
printf("%s\n", sha1_to_hex(sha1));
|
|
|
|
break;
|
|
|
|
case WRITE_TREE_UNREADABLE_INDEX:
|
|
|
|
die("%s: error reading the index", me);
|
|
|
|
break;
|
|
|
|
case WRITE_TREE_UNMERGED_INDEX:
|
|
|
|
die("%s: error building trees; the index is unmerged?", me);
|
|
|
|
break;
|
|
|
|
case WRITE_TREE_PREFIX_ERROR:
|
|
|
|
die("%s: prefix %s not found", me, prefix);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|