mirror of
https://github.com/git/git.git
synced 2024-11-24 10:26:17 +08:00
f0c6b2a2fd
This attempts to optimize "diff-tree -[CM] --stdin", which compares successible tree pairs. This optimization does not make much sense for other commands in the diff-* brothers. When reading from --stdin and using rename/copy detection, the patch makes diff-tree to read the current index file first. This is done to reuse the optimization used by diff-cache in the non-cached case. Similarity estimator can avoid expanding a blob if the index says what is in the work tree has an exact copy of that blob already expanded. Another optimization the patch makes is to check only file sizes first to terminate similarity estimation early. In order for this to work, it needs a way to tell the size of the blob without expanding it. Since an obvious way of doing it, which is to keep all the blobs previously used in the memory, is too costly, it does so by keeping the filesize for each object it has already seen in memory. Signed-off-by: Junio C Hamano <junkio@cox.net> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
88 lines
2.6 KiB
C
88 lines
2.6 KiB
C
/*
|
|
* Copyright (C) 2005 Junio C Hamano
|
|
*/
|
|
#ifndef _DIFFCORE_H_
|
|
#define _DIFFCORE_H_
|
|
|
|
/* This header file is internal between diff.c and its diff transformers
|
|
* (e.g. diffcore-rename, diffcore-pickaxe). Never include this header
|
|
* in anything else.
|
|
*/
|
|
#define MAX_SCORE 10000
|
|
#define DEFAULT_MINIMUM_SCORE 5000
|
|
|
|
#define RENAME_DST_MATCHED 01
|
|
|
|
struct diff_filespec {
|
|
unsigned char sha1[20];
|
|
char *path;
|
|
void *data;
|
|
unsigned long size;
|
|
int xfrm_flags; /* for use by the xfrm */
|
|
unsigned short mode; /* file mode */
|
|
unsigned sha1_valid : 1; /* if true, use sha1 and trust mode;
|
|
* if false, use the name and read from
|
|
* the filesystem.
|
|
*/
|
|
#define DIFF_FILE_VALID(spec) (((spec)->mode) != 0)
|
|
unsigned should_free : 1; /* data should be free()'ed */
|
|
unsigned should_munmap : 1; /* data should be munmap()'ed */
|
|
};
|
|
|
|
extern struct diff_filespec *alloc_filespec(const char *);
|
|
extern void fill_filespec(struct diff_filespec *, const unsigned char *,
|
|
unsigned short);
|
|
|
|
extern int diff_populate_filespec(struct diff_filespec *, int);
|
|
extern void diff_free_filespec_data(struct diff_filespec *);
|
|
|
|
struct diff_filepair {
|
|
struct diff_filespec *one;
|
|
struct diff_filespec *two;
|
|
unsigned short int score; /* only valid when one and two are
|
|
* different paths
|
|
*/
|
|
char source_stays; /* all of R/C are copies */
|
|
char status; /* M C R N D U (see Documentation/diff-format.txt) */
|
|
};
|
|
#define DIFF_PAIR_UNMERGED(p) \
|
|
(!DIFF_FILE_VALID((p)->one) && !DIFF_FILE_VALID((p)->two))
|
|
|
|
#define DIFF_PAIR_TYPE_CHANGED(p) \
|
|
((S_IFMT & (p)->one->mode) != (S_IFMT & (p)->two->mode))
|
|
|
|
#define DIFF_PAIR_MODE_CHANGED(p) ((p)->one->mode != (p)->two->mode)
|
|
|
|
#define DIFF_FILE_CANON_MODE(mode) \
|
|
(S_ISREG(mode) ? (S_IFREG | ce_permissions(mode)) : \
|
|
S_ISLNK(mode) ? S_IFLNK : S_IFDIR)
|
|
|
|
extern void diff_free_filepair(struct diff_filepair *);
|
|
|
|
extern int diff_unmodified_pair(struct diff_filepair *);
|
|
|
|
struct diff_queue_struct {
|
|
struct diff_filepair **queue;
|
|
int alloc;
|
|
int nr;
|
|
};
|
|
|
|
extern struct diff_queue_struct diff_queued_diff;
|
|
extern struct diff_filepair *diff_queue(struct diff_queue_struct *,
|
|
struct diff_filespec *,
|
|
struct diff_filespec *);
|
|
extern void diff_q(struct diff_queue_struct *, struct diff_filepair *);
|
|
|
|
#define DIFF_DEBUG 0
|
|
#if DIFF_DEBUG
|
|
void diff_debug_filespec(struct diff_filespec *, int, const char *);
|
|
void diff_debug_filepair(const struct diff_filepair *, int);
|
|
void diff_debug_queue(const char *, struct diff_queue_struct *);
|
|
#else
|
|
#define diff_debug_filespec(a,b,c) do {} while(0)
|
|
#define diff_debug_filepair(a,b) do {} while(0)
|
|
#define diff_debug_queue(a,b) do {} while(0)
|
|
#endif
|
|
|
|
#endif
|