Merge early parts of branch 'ls/am'
This commit is contained in:
commit
69c18d8872
40
Makefile
40
Makefile
@ -144,34 +144,33 @@ SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \
|
|||||||
|
|
||||||
# The ones that do not have to link with lcrypto, lz nor xdiff.
|
# The ones that do not have to link with lcrypto, lz nor xdiff.
|
||||||
SIMPLE_PROGRAMS = \
|
SIMPLE_PROGRAMS = \
|
||||||
git-mailsplit$X \
|
git-daemon$X
|
||||||
git-stripspace$X git-daemon$X
|
|
||||||
|
|
||||||
# ... and all the rest that could be moved out of bindir to gitexecdir
|
# ... and all the rest that could be moved out of bindir to gitexecdir
|
||||||
PROGRAMS = \
|
PROGRAMS = \
|
||||||
git-checkout-index$X git-clone-pack$X \
|
git-checkout-index$X git-clone-pack$X \
|
||||||
git-convert-objects$X git-fetch-pack$X git-fsck-objects$X \
|
git-convert-objects$X git-fetch-pack$X git-fsck-objects$X \
|
||||||
git-hash-object$X git-index-pack$X git-local-fetch$X \
|
git-hash-object$X git-index-pack$X git-local-fetch$X \
|
||||||
git-mailinfo$X git-merge-base$X \
|
git-merge-base$X \
|
||||||
git-merge-index$X git-mktag$X git-mktree$X git-pack-objects$X git-patch-id$X \
|
git-merge-index$X git-mktag$X git-mktree$X git-pack-objects$X git-patch-id$X \
|
||||||
git-peek-remote$X git-prune-packed$X git-receive-pack$X \
|
git-peek-remote$X git-prune-packed$X git-receive-pack$X \
|
||||||
git-send-pack$X git-shell$X \
|
git-send-pack$X git-shell$X \
|
||||||
git-show-index$X git-ssh-fetch$X \
|
git-show-index$X git-ssh-fetch$X \
|
||||||
git-ssh-upload$X git-unpack-file$X \
|
git-ssh-upload$X git-unpack-file$X \
|
||||||
git-unpack-objects$X git-update-index$X git-update-server-info$X \
|
git-unpack-objects$X git-update-server-info$X \
|
||||||
git-upload-pack$X git-verify-pack$X git-write-tree$X \
|
git-upload-pack$X git-verify-pack$X \
|
||||||
git-update-ref$X git-symbolic-ref$X \
|
git-symbolic-ref$X \
|
||||||
git-name-rev$X git-pack-redundant$X git-repo-config$X git-var$X \
|
git-name-rev$X git-pack-redundant$X git-repo-config$X git-var$X \
|
||||||
git-describe$X git-merge-tree$X git-blame$X git-imap-send$X
|
git-describe$X git-merge-tree$X git-blame$X git-imap-send$X
|
||||||
|
|
||||||
BUILT_INS = git-log$X git-whatchanged$X git-show$X \
|
BUILT_INS = git-log$X git-whatchanged$X git-show$X git-update-ref$X \
|
||||||
git-count-objects$X git-diff$X git-push$X \
|
git-count-objects$X git-diff$X git-push$X git-mailsplit$X \
|
||||||
git-grep$X git-add$X git-rm$X git-rev-list$X \
|
git-grep$X git-add$X git-rm$X git-rev-list$X git-stripspace$X \
|
||||||
git-check-ref-format$X git-rev-parse$X \
|
git-check-ref-format$X git-rev-parse$X git-mailinfo$X \
|
||||||
git-init-db$X git-tar-tree$X git-upload-tar$X git-format-patch$X \
|
git-init-db$X git-tar-tree$X git-upload-tar$X git-format-patch$X \
|
||||||
git-ls-files$X git-ls-tree$X git-get-tar-commit-id$X \
|
git-ls-files$X git-ls-tree$X git-get-tar-commit-id$X \
|
||||||
git-read-tree$X git-commit-tree$X \
|
git-read-tree$X git-commit-tree$X git-write-tree$X \
|
||||||
git-apply$X git-show-branch$X git-diff-files$X \
|
git-apply$X git-show-branch$X git-diff-files$X git-update-index$X \
|
||||||
git-diff-index$X git-diff-stages$X git-diff-tree$X git-cat-file$X
|
git-diff-index$X git-diff-stages$X git-diff-tree$X git-cat-file$X
|
||||||
|
|
||||||
# what 'all' will build and 'install' will install, in gitexecdir
|
# what 'all' will build and 'install' will install, in gitexecdir
|
||||||
@ -222,12 +221,13 @@ BUILTIN_OBJS = \
|
|||||||
builtin-log.o builtin-help.o builtin-count.o builtin-diff.o builtin-push.o \
|
builtin-log.o builtin-help.o builtin-count.o builtin-diff.o builtin-push.o \
|
||||||
builtin-grep.o builtin-add.o builtin-rev-list.o builtin-check-ref-format.o \
|
builtin-grep.o builtin-add.o builtin-rev-list.o builtin-check-ref-format.o \
|
||||||
builtin-rm.o builtin-init-db.o builtin-rev-parse.o \
|
builtin-rm.o builtin-init-db.o builtin-rev-parse.o \
|
||||||
builtin-tar-tree.o builtin-upload-tar.o \
|
builtin-tar-tree.o builtin-upload-tar.o builtin-update-index.o \
|
||||||
builtin-ls-files.o builtin-ls-tree.o \
|
builtin-ls-files.o builtin-ls-tree.o builtin-write-tree.o \
|
||||||
builtin-read-tree.o builtin-commit-tree.o \
|
builtin-read-tree.o builtin-commit-tree.o builtin-mailinfo.o \
|
||||||
builtin-apply.o builtin-show-branch.o builtin-diff-files.o \
|
builtin-apply.o builtin-show-branch.o builtin-diff-files.o \
|
||||||
builtin-diff-index.o builtin-diff-stages.o builtin-diff-tree.o \
|
builtin-diff-index.o builtin-diff-stages.o builtin-diff-tree.o \
|
||||||
builtin-cat-file.o
|
builtin-cat-file.o builtin-mailsplit.o builtin-stripspace.o \
|
||||||
|
builtin-update-ref.o
|
||||||
|
|
||||||
GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
|
GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
|
||||||
LIBS = $(GITLIBS) -lz
|
LIBS = $(GITLIBS) -lz
|
||||||
@ -380,9 +380,7 @@ ifdef NEEDS_LIBICONV
|
|||||||
else
|
else
|
||||||
ICONV_LINK =
|
ICONV_LINK =
|
||||||
endif
|
endif
|
||||||
LIB_4_ICONV = $(ICONV_LINK) -liconv
|
LIBS += $(ICONV_LINK) -liconv
|
||||||
else
|
|
||||||
LIB_4_ICONV =
|
|
||||||
endif
|
endif
|
||||||
ifdef NEEDS_SOCKET
|
ifdef NEEDS_SOCKET
|
||||||
LIBS += -lsocket
|
LIBS += -lsocket
|
||||||
@ -565,10 +563,6 @@ $(SIMPLE_PROGRAMS) : git-%$X : %.o
|
|||||||
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
|
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
|
||||||
$(LIB_FILE) $(SIMPLE_LIB)
|
$(LIB_FILE) $(SIMPLE_LIB)
|
||||||
|
|
||||||
git-mailinfo$X: mailinfo.o $(LIB_FILE)
|
|
||||||
$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
|
|
||||||
$(LIB_FILE) $(SIMPLE_LIB) $(LIB_4_ICONV)
|
|
||||||
|
|
||||||
git-local-fetch$X: fetch.o
|
git-local-fetch$X: fetch.o
|
||||||
git-ssh-fetch$X: rsh.o fetch.o
|
git-ssh-fetch$X: rsh.o fetch.o
|
||||||
git-ssh-upload$X: rsh.o
|
git-ssh-upload$X: rsh.o
|
||||||
|
@ -12,11 +12,12 @@
|
|||||||
#endif
|
#endif
|
||||||
#include "git-compat-util.h"
|
#include "git-compat-util.h"
|
||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
|
#include "builtin.h"
|
||||||
|
|
||||||
static FILE *cmitmsg, *patchfile;
|
static FILE *cmitmsg, *patchfile, *fin, *fout;
|
||||||
|
|
||||||
static int keep_subject = 0;
|
static int keep_subject = 0;
|
||||||
static char *metainfo_charset = NULL;
|
static const char *metainfo_charset = NULL;
|
||||||
static char line[1000];
|
static char line[1000];
|
||||||
static char date[1000];
|
static char date[1000];
|
||||||
static char name[1000];
|
static char name[1000];
|
||||||
@ -648,7 +649,7 @@ static void handle_info(void)
|
|||||||
cleanup_space(email);
|
cleanup_space(email);
|
||||||
cleanup_space(sub);
|
cleanup_space(sub);
|
||||||
|
|
||||||
printf("Author: %s\nEmail: %s\nSubject: %s\nDate: %s\n\n",
|
fprintf(fout, "Author: %s\nEmail: %s\nSubject: %s\nDate: %s\n\n",
|
||||||
name, email, sub, date);
|
name, email, sub, date);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -685,7 +686,7 @@ static int handle_commit_msg(int *seen)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
fputs(line, cmitmsg);
|
fputs(line, cmitmsg);
|
||||||
} while (fgets(line, sizeof(line), stdin) != NULL);
|
} while (fgets(line, sizeof(line), fin) != NULL);
|
||||||
fclose(cmitmsg);
|
fclose(cmitmsg);
|
||||||
cmitmsg = NULL;
|
cmitmsg = NULL;
|
||||||
return 0;
|
return 0;
|
||||||
@ -706,7 +707,7 @@ static void handle_patch(void)
|
|||||||
decode_transfer_encoding(line);
|
decode_transfer_encoding(line);
|
||||||
fputs(line, patchfile);
|
fputs(line, patchfile);
|
||||||
patch_lines++;
|
patch_lines++;
|
||||||
} while (fgets(line, sizeof(line), stdin) != NULL);
|
} while (fgets(line, sizeof(line), fin) != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* multipart boundary and transfer encoding are set up for us, and we
|
/* multipart boundary and transfer encoding are set up for us, and we
|
||||||
@ -719,7 +720,7 @@ static int handle_multipart_one_part(int *seen)
|
|||||||
{
|
{
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
|
||||||
while (fgets(line, sizeof(line), stdin) != NULL) {
|
while (fgets(line, sizeof(line), fin) != NULL) {
|
||||||
again:
|
again:
|
||||||
n++;
|
n++;
|
||||||
if (is_multipart_boundary(line))
|
if (is_multipart_boundary(line))
|
||||||
@ -740,7 +741,7 @@ static void handle_multipart_body(void)
|
|||||||
int part_num = 0;
|
int part_num = 0;
|
||||||
|
|
||||||
/* Skip up to the first boundary */
|
/* Skip up to the first boundary */
|
||||||
while (fgets(line, sizeof(line), stdin) != NULL)
|
while (fgets(line, sizeof(line), fin) != NULL)
|
||||||
if (is_multipart_boundary(line)) {
|
if (is_multipart_boundary(line)) {
|
||||||
part_num = 1;
|
part_num = 1;
|
||||||
break;
|
break;
|
||||||
@ -749,7 +750,7 @@ static void handle_multipart_body(void)
|
|||||||
return;
|
return;
|
||||||
/* We are on boundary line. Start slurping the subhead. */
|
/* We are on boundary line. Start slurping the subhead. */
|
||||||
while (1) {
|
while (1) {
|
||||||
int hdr = read_one_header_line(line, sizeof(line), stdin);
|
int hdr = read_one_header_line(line, sizeof(line), fin);
|
||||||
if (!hdr) {
|
if (!hdr) {
|
||||||
if (handle_multipart_one_part(&seen) < 0)
|
if (handle_multipart_one_part(&seen) < 0)
|
||||||
return;
|
return;
|
||||||
@ -781,10 +782,45 @@ static void handle_body(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mailinfo(FILE *in, FILE *out, int ks, const char *encoding,
|
||||||
|
const char *msg, const char *patch)
|
||||||
|
{
|
||||||
|
keep_subject = ks;
|
||||||
|
metainfo_charset = encoding;
|
||||||
|
fin = in;
|
||||||
|
fout = out;
|
||||||
|
|
||||||
|
cmitmsg = fopen(msg, "w");
|
||||||
|
if (!cmitmsg) {
|
||||||
|
perror(msg);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
patchfile = fopen(patch, "w");
|
||||||
|
if (!patchfile) {
|
||||||
|
perror(patch);
|
||||||
|
fclose(cmitmsg);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
while (1) {
|
||||||
|
int hdr = read_one_header_line(line, sizeof(line), fin);
|
||||||
|
if (!hdr) {
|
||||||
|
if (multipart_boundary[0])
|
||||||
|
handle_multipart_body();
|
||||||
|
else
|
||||||
|
handle_body();
|
||||||
|
handle_info();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
check_header_line(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const char mailinfo_usage[] =
|
static const char mailinfo_usage[] =
|
||||||
"git-mailinfo [-k] [-u | --encoding=<encoding>] msg patch <mail >info";
|
"git-mailinfo [-k] [-u | --encoding=<encoding>] msg patch <mail >info";
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int cmd_mailinfo(int argc, const char **argv, char **envp)
|
||||||
{
|
{
|
||||||
/* NEEDSWORK: might want to do the optional .git/ directory
|
/* NEEDSWORK: might want to do the optional .git/ directory
|
||||||
* discovery
|
* discovery
|
||||||
@ -805,27 +841,6 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
if (argc != 3)
|
if (argc != 3)
|
||||||
usage(mailinfo_usage);
|
usage(mailinfo_usage);
|
||||||
cmitmsg = fopen(argv[1], "w");
|
|
||||||
if (!cmitmsg) {
|
return !!mailinfo(stdin, stdout, keep_subject, metainfo_charset, argv[1], argv[2]);
|
||||||
perror(argv[1]);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
patchfile = fopen(argv[2], "w");
|
|
||||||
if (!patchfile) {
|
|
||||||
perror(argv[2]);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
while (1) {
|
|
||||||
int hdr = read_one_header_line(line, sizeof(line), stdin);
|
|
||||||
if (!hdr) {
|
|
||||||
if (multipart_boundary[0])
|
|
||||||
handle_multipart_body();
|
|
||||||
else
|
|
||||||
handle_body();
|
|
||||||
handle_info();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
check_header_line(line);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
@ -12,6 +12,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
|
#include "builtin.h"
|
||||||
|
|
||||||
static const char git_mailsplit_usage[] =
|
static const char git_mailsplit_usage[] =
|
||||||
"git-mailsplit [-d<prec>] [-f<n>] [-b] -o<directory> <mbox>...";
|
"git-mailsplit [-d<prec>] [-f<n>] [-b] -o<directory> <mbox>...";
|
||||||
@ -102,14 +103,48 @@ static int split_one(FILE *mbox, const char *name, int allow_bare)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, const char **argv)
|
int split_mbox(const char **mbox, const char *dir, int allow_bare, int nr_prec, int skip)
|
||||||
{
|
{
|
||||||
int nr = 0, nr_prec = 4;
|
char *name = xmalloc(strlen(dir) + 2 + 3 * sizeof(skip));
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
while (*mbox) {
|
||||||
|
const char *file = *mbox++;
|
||||||
|
FILE *f = !strcmp(file, "-") ? stdin : fopen(file, "r");
|
||||||
|
int file_done = 0;
|
||||||
|
|
||||||
|
if ( !f ) {
|
||||||
|
error("cannot open mbox %s", file);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fgets(buf, sizeof(buf), f) == NULL) {
|
||||||
|
if (f == stdin)
|
||||||
|
break; /* empty stdin is OK */
|
||||||
|
error("cannot read mbox %s", file);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!file_done) {
|
||||||
|
sprintf(name, "%s/%0*d", dir, nr_prec, ++skip);
|
||||||
|
file_done = split_one(f, name, allow_bare);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (f != stdin)
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
ret = skip;
|
||||||
|
out:
|
||||||
|
free(name);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
int cmd_mailsplit(int argc, const char **argv, char **envp)
|
||||||
|
{
|
||||||
|
int nr = 0, nr_prec = 4, ret;
|
||||||
int allow_bare = 0;
|
int allow_bare = 0;
|
||||||
const char *dir = NULL;
|
const char *dir = NULL;
|
||||||
const char **argp;
|
const char **argp;
|
||||||
static const char *stdin_only[] = { "-", NULL };
|
static const char *stdin_only[] = { "-", NULL };
|
||||||
char *name;
|
|
||||||
|
|
||||||
for (argp = argv+1; *argp; argp++) {
|
for (argp = argv+1; *argp; argp++) {
|
||||||
const char *arg = *argp;
|
const char *arg = *argp;
|
||||||
@ -158,31 +193,9 @@ int main(int argc, const char **argv)
|
|||||||
argp = stdin_only;
|
argp = stdin_only;
|
||||||
}
|
}
|
||||||
|
|
||||||
name = xmalloc(strlen(dir) + 2 + 3 * sizeof(nr));
|
ret = split_mbox(argp, dir, allow_bare, nr_prec, nr);
|
||||||
|
if (ret != -1)
|
||||||
|
printf("%d\n", ret);
|
||||||
|
|
||||||
while (*argp) {
|
return ret == -1;
|
||||||
const char *file = *argp++;
|
|
||||||
FILE *f = !strcmp(file, "-") ? stdin : fopen(file, "r");
|
|
||||||
int file_done = 0;
|
|
||||||
|
|
||||||
if ( !f )
|
|
||||||
die ("cannot open mbox %s", file);
|
|
||||||
|
|
||||||
if (fgets(buf, sizeof(buf), f) == NULL) {
|
|
||||||
if (f == stdin)
|
|
||||||
break; /* empty stdin is OK */
|
|
||||||
die("cannot read mbox %s", file);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (!file_done) {
|
|
||||||
sprintf(name, "%s/%0*d", dir, nr_prec, ++nr);
|
|
||||||
file_done = split_one(f, name, allow_bare);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (f != stdin)
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("%d\n", nr);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
@ -1,6 +1,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include "builtin.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Remove empty lines from the beginning and end.
|
* Remove empty lines from the beginning and end.
|
||||||
@ -28,21 +29,21 @@ static int cleanup(char *line)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
void stripspace(FILE *in, FILE *out)
|
||||||
{
|
{
|
||||||
int empties = -1;
|
int empties = -1;
|
||||||
int incomplete = 0;
|
int incomplete = 0;
|
||||||
char line[1024];
|
char line[1024];
|
||||||
|
|
||||||
while (fgets(line, sizeof(line), stdin)) {
|
while (fgets(line, sizeof(line), in)) {
|
||||||
incomplete = cleanup(line);
|
incomplete = cleanup(line);
|
||||||
|
|
||||||
/* Not just an empty line? */
|
/* Not just an empty line? */
|
||||||
if (line[0] != '\n') {
|
if (line[0] != '\n') {
|
||||||
if (empties > 0)
|
if (empties > 0)
|
||||||
putchar('\n');
|
fputc('\n', out);
|
||||||
empties = 0;
|
empties = 0;
|
||||||
fputs(line, stdout);
|
fputs(line, out);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (empties < 0)
|
if (empties < 0)
|
||||||
@ -50,6 +51,11 @@ int main(int argc, char **argv)
|
|||||||
empties++;
|
empties++;
|
||||||
}
|
}
|
||||||
if (incomplete)
|
if (incomplete)
|
||||||
putchar('\n');
|
fputc('\n', out);
|
||||||
|
}
|
||||||
|
|
||||||
|
int cmd_stripspace(int argc, const char **argv, char **envp)
|
||||||
|
{
|
||||||
|
stripspace(stdin, stdout);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
@ -8,6 +8,7 @@
|
|||||||
#include "quote.h"
|
#include "quote.h"
|
||||||
#include "cache-tree.h"
|
#include "cache-tree.h"
|
||||||
#include "tree-walk.h"
|
#include "tree-walk.h"
|
||||||
|
#include "builtin.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Default to not allowing changes to the list of files. The
|
* Default to not allowing changes to the list of files. The
|
||||||
@ -186,8 +187,6 @@ static void chmod_path(int flip, const char *path)
|
|||||||
die("git-update-index: cannot chmod %cx '%s'", flip, path);
|
die("git-update-index: cannot chmod %cx '%s'", flip, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct lock_file lock_file;
|
|
||||||
|
|
||||||
static void update_one(const char *path, const char *prefix, int prefix_length)
|
static void update_one(const char *path, const char *prefix, int prefix_length)
|
||||||
{
|
{
|
||||||
const char *p = prefix_path(prefix, prefix_length, path);
|
const char *p = prefix_path(prefix, prefix_length, path);
|
||||||
@ -477,7 +476,7 @@ static int do_reupdate(int ac, const char **av,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, const char **argv)
|
int cmd_update_index(int argc, const char **argv, char **envp)
|
||||||
{
|
{
|
||||||
int i, newfd, entries, has_errors = 0, line_termination = '\n';
|
int i, newfd, entries, has_errors = 0, line_termination = '\n';
|
||||||
int allow_options = 1;
|
int allow_options = 1;
|
||||||
@ -486,12 +485,16 @@ int main(int argc, const char **argv)
|
|||||||
int prefix_length = prefix ? strlen(prefix) : 0;
|
int prefix_length = prefix ? strlen(prefix) : 0;
|
||||||
char set_executable_bit = 0;
|
char set_executable_bit = 0;
|
||||||
unsigned int refresh_flags = 0;
|
unsigned int refresh_flags = 0;
|
||||||
|
struct lock_file *lock_file;
|
||||||
|
|
||||||
git_config(git_default_config);
|
git_config(git_default_config);
|
||||||
|
|
||||||
newfd = hold_lock_file_for_update(&lock_file, get_index_file());
|
/* We can't free this memory, it becomes part of a linked list parsed atexit() */
|
||||||
|
lock_file = xmalloc(sizeof(struct lock_file));
|
||||||
|
|
||||||
|
newfd = hold_lock_file_for_update(lock_file, get_index_file());
|
||||||
if (newfd < 0)
|
if (newfd < 0)
|
||||||
die("unable to create new index file");
|
die("unable to create new cachefile");
|
||||||
|
|
||||||
entries = read_cache();
|
entries = read_cache();
|
||||||
if (entries < 0)
|
if (entries < 0)
|
||||||
@ -645,9 +648,11 @@ int main(int argc, const char **argv)
|
|||||||
finish:
|
finish:
|
||||||
if (active_cache_changed) {
|
if (active_cache_changed) {
|
||||||
if (write_cache(newfd, active_cache, active_nr) ||
|
if (write_cache(newfd, active_cache, active_nr) ||
|
||||||
commit_lock_file(&lock_file))
|
commit_lock_file(lock_file))
|
||||||
die("Unable to write new index file");
|
die("Unable to write new index file");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rollback_lock_file(lock_file);
|
||||||
|
|
||||||
return has_errors ? 1 : 0;
|
return has_errors ? 1 : 0;
|
||||||
}
|
}
|
@ -1,10 +1,11 @@
|
|||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
#include "refs.h"
|
#include "refs.h"
|
||||||
|
#include "builtin.h"
|
||||||
|
|
||||||
static const char git_update_ref_usage[] =
|
static const char git_update_ref_usage[] =
|
||||||
"git-update-ref <refname> <value> [<oldval>] [-m <reason>]";
|
"git-update-ref <refname> <value> [<oldval>] [-m <reason>]";
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int cmd_update_ref(int argc, const char **argv, char **envp)
|
||||||
{
|
{
|
||||||
const char *refname=NULL, *value=NULL, *oldval=NULL, *msg=NULL;
|
const char *refname=NULL, *value=NULL, *oldval=NULL, *msg=NULL;
|
||||||
struct ref_lock *lock;
|
struct ref_lock *lock;
|
||||||
@ -52,5 +53,7 @@ int main(int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
if (write_ref_sha1(lock, sha1, msg) < 0)
|
if (write_ref_sha1(lock, sha1, msg) < 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
/* write_ref_sha1 always unlocks the ref, no need to do it explicitly */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
@ -3,29 +3,72 @@
|
|||||||
*
|
*
|
||||||
* Copyright (C) Linus Torvalds, 2005
|
* Copyright (C) Linus Torvalds, 2005
|
||||||
*/
|
*/
|
||||||
|
#include "builtin.h"
|
||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
#include "tree.h"
|
#include "tree.h"
|
||||||
#include "cache-tree.h"
|
#include "cache-tree.h"
|
||||||
|
|
||||||
static int missing_ok = 0;
|
|
||||||
static char *prefix = NULL;
|
|
||||||
|
|
||||||
static const char write_tree_usage[] =
|
static const char write_tree_usage[] =
|
||||||
"git-write-tree [--missing-ok] [--prefix=<prefix>/]";
|
"git-write-tree [--missing-ok] [--prefix=<prefix>/]";
|
||||||
|
|
||||||
static struct lock_file lock_file;
|
int write_tree(unsigned char *sha1, int missing_ok, const char *prefix)
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
{
|
||||||
int entries, was_valid, newfd;
|
int entries, was_valid, newfd;
|
||||||
|
|
||||||
|
/* We can't free this memory, it becomes part of a linked list parsed atexit() */
|
||||||
|
struct lock_file *lock_file = xmalloc(sizeof(struct lock_file));
|
||||||
|
|
||||||
|
newfd = hold_lock_file_for_update(lock_file, get_index_file());
|
||||||
|
|
||||||
|
entries = read_cache();
|
||||||
|
if (entries < 0)
|
||||||
|
die("git-write-tree: error reading cache");
|
||||||
|
|
||||||
|
if (!active_cache_tree)
|
||||||
|
active_cache_tree = cache_tree();
|
||||||
|
|
||||||
|
was_valid = cache_tree_fully_valid(active_cache_tree);
|
||||||
|
|
||||||
|
if (!was_valid) {
|
||||||
|
if (cache_tree_update(active_cache_tree,
|
||||||
|
active_cache, active_nr,
|
||||||
|
missing_ok, 0) < 0)
|
||||||
|
die("git-write-tree: error building trees");
|
||||||
|
if (0 <= newfd) {
|
||||||
|
if (!write_cache(newfd, active_cache, active_nr))
|
||||||
|
commit_lock_file(lock_file);
|
||||||
|
}
|
||||||
|
/* Not being able to write is fine -- we are only interested
|
||||||
|
* in updating the cache-tree part, and if the next caller
|
||||||
|
* ends up using the old index with unupdated cache-tree part
|
||||||
|
* it misses the work we did here, but that is just a
|
||||||
|
* performance penalty and not a big deal.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prefix) {
|
||||||
|
struct cache_tree *subtree =
|
||||||
|
cache_tree_find(active_cache_tree, prefix);
|
||||||
|
memcpy(sha1, subtree->sha1, 20);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
memcpy(sha1, active_cache_tree->sha1, 20);
|
||||||
|
|
||||||
|
rollback_lock_file(lock_file);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cmd_write_tree(int argc, const char **argv, char **envp)
|
||||||
|
{
|
||||||
|
int missing_ok = 0, ret;
|
||||||
|
const char *prefix = NULL;
|
||||||
|
unsigned char sha1[20];
|
||||||
|
|
||||||
setup_git_directory();
|
setup_git_directory();
|
||||||
|
|
||||||
newfd = hold_lock_file_for_update(&lock_file, get_index_file());
|
|
||||||
entries = read_cache();
|
|
||||||
|
|
||||||
while (1 < argc) {
|
while (1 < argc) {
|
||||||
char *arg = argv[1];
|
const char *arg = argv[1];
|
||||||
if (!strcmp(arg, "--missing-ok"))
|
if (!strcmp(arg, "--missing-ok"))
|
||||||
missing_ok = 1;
|
missing_ok = 1;
|
||||||
else if (!strncmp(arg, "--prefix=", 9))
|
else if (!strncmp(arg, "--prefix=", 9))
|
||||||
@ -38,35 +81,8 @@ int main(int argc, char **argv)
|
|||||||
if (argc > 2)
|
if (argc > 2)
|
||||||
die("too many options");
|
die("too many options");
|
||||||
|
|
||||||
if (entries < 0)
|
ret = write_tree(sha1, missing_ok, prefix);
|
||||||
die("git-write-tree: error reading cache");
|
printf("%s\n", sha1_to_hex(sha1));
|
||||||
|
|
||||||
if (!active_cache_tree)
|
return ret;
|
||||||
active_cache_tree = cache_tree();
|
|
||||||
|
|
||||||
was_valid = cache_tree_fully_valid(active_cache_tree);
|
|
||||||
if (!was_valid) {
|
|
||||||
if (cache_tree_update(active_cache_tree,
|
|
||||||
active_cache, active_nr,
|
|
||||||
missing_ok, 0) < 0)
|
|
||||||
die("git-write-tree: error building trees");
|
|
||||||
if (0 <= newfd) {
|
|
||||||
if (!write_cache(newfd, active_cache, active_nr))
|
|
||||||
commit_lock_file(&lock_file);
|
|
||||||
}
|
|
||||||
/* Not being able to write is fine -- we are only interested
|
|
||||||
* in updating the cache-tree part, and if the next caller
|
|
||||||
* ends up using the old index with unupdated cache-tree part
|
|
||||||
* it misses the work we did here, but that is just a
|
|
||||||
* performance penalty and not a big deal.
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
if (prefix) {
|
|
||||||
struct cache_tree *subtree =
|
|
||||||
cache_tree_find(active_cache_tree, prefix);
|
|
||||||
printf("%s\n", sha1_to_hex(subtree->sha1));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printf("%s\n", sha1_to_hex(active_cache_tree->sha1));
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
15
builtin.h
15
builtin.h
@ -1,6 +1,8 @@
|
|||||||
#ifndef BUILTIN_H
|
#ifndef BUILTIN_H
|
||||||
#define BUILTIN_H
|
#define BUILTIN_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#ifndef PATH_MAX
|
#ifndef PATH_MAX
|
||||||
# define PATH_MAX 4096
|
# define PATH_MAX 4096
|
||||||
#endif
|
#endif
|
||||||
@ -45,5 +47,18 @@ extern int cmd_diff_stages(int argc, const char **argv, char **envp);
|
|||||||
extern int cmd_diff_tree(int argc, const char **argv, char **envp);
|
extern int cmd_diff_tree(int argc, const char **argv, char **envp);
|
||||||
extern int cmd_cat_file(int argc, const char **argv, char **envp);
|
extern int cmd_cat_file(int argc, const char **argv, char **envp);
|
||||||
extern int cmd_rev_parse(int argc, const char **argv, char **envp);
|
extern int cmd_rev_parse(int argc, const char **argv, char **envp);
|
||||||
|
extern int cmd_update_index(int argc, const char **argv, char **envp);
|
||||||
|
extern int cmd_update_ref(int argc, const char **argv, char **envp);
|
||||||
|
|
||||||
|
extern int cmd_write_tree(int argc, const char **argv, char **envp);
|
||||||
|
extern int write_tree(unsigned char *sha1, int missing_ok, const char *prefix);
|
||||||
|
|
||||||
|
extern int cmd_mailsplit(int argc, const char **argv, char **envp);
|
||||||
|
extern int split_mbox(const char **mbox, const char *dir, int allow_bare, int nr_prec, int skip);
|
||||||
|
|
||||||
|
extern int cmd_mailinfo(int argc, const char **argv, char **envp);
|
||||||
|
extern int mailinfo(FILE *in, FILE *out, int ks, const char *encoding, const char *msg, const char *patch);
|
||||||
|
|
||||||
|
extern int cmd_stripspace(int argc, const char **argv, char **envp);
|
||||||
|
extern void stripspace(FILE *in, FILE *out);
|
||||||
#endif
|
#endif
|
||||||
|
8
git.c
8
git.c
@ -178,7 +178,13 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
|
|||||||
{ "diff-stages", cmd_diff_stages },
|
{ "diff-stages", cmd_diff_stages },
|
||||||
{ "diff-tree", cmd_diff_tree },
|
{ "diff-tree", cmd_diff_tree },
|
||||||
{ "cat-file", cmd_cat_file },
|
{ "cat-file", cmd_cat_file },
|
||||||
{ "rev-parse", cmd_rev_parse }
|
{ "rev-parse", cmd_rev_parse },
|
||||||
|
{ "write-tree", cmd_write_tree },
|
||||||
|
{ "mailsplit", cmd_mailsplit },
|
||||||
|
{ "mailinfo", cmd_mailinfo },
|
||||||
|
{ "stripspace", cmd_stripspace },
|
||||||
|
{ "update-index", cmd_update_index },
|
||||||
|
{ "update-ref", cmd_update_ref }
|
||||||
};
|
};
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user