|
|
|
/*
|
|
|
|
* 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 *);
|
|
|
|
extern void diff_free_filespec_data(struct diff_filespec *);
|
|
|
|
|
|
|
|
struct diff_filepair {
|
|
|
|
struct diff_filespec *one;
|
|
|
|
struct diff_filespec *two;
|
[PATCH] Rename/copy detection fix.
The rename/copy detection logic in earlier round was only good
enough to show patch output and discussion on the mailing list
about the diff-raw format updates revealed many problems with
it. This patch fixes all the ones known to me, without making
things I want to do later impossible, mostly related to patch
reordering.
(1) Earlier rename/copy detector determined which one is rename
and which one is copy too early, which made it impossible
to later introduce diffcore transformers to reorder
patches. This patch fixes it by moving that logic to the
very end of the processing.
(2) Earlier output routine diff_flush() was pruning all the
"no-change" entries indiscriminatingly. This was done due
to my false assumption that one of the requirements in the
diff-raw output was not to show such an entry (which
resulted in my incorrect comment about "diff-helper never
being able to be equivalent to built-in diff driver"). My
special thanks go to Linus for correcting me about this.
When we produce diff-raw output, for the downstream to be
able to tell renames from copies, sometimes it _is_
necessary to output "no-change" entries, and this patch
adds diffcore_prune() function for doing it.
(3) Earlier diff_filepair structure was trying to be not too
specific about rename/copy operations, but the purpose of
the structure was to record one or two paths, which _was_
indeed about rename/copy. This patch discards xfrm_msg
field which was trying to be generic for this wrong reason,
and introduces a couple of fields (rename_score and
rename_rank) that are explicitly specific to rename/copy
logic. One thing to note is that the information in a
single diff_filepair structure _still_ does not distinguish
renames from copies, and it is deliberately so. This is to
allow patches to be reordered in later stages.
(4) This patch also adds some tests about diff-raw format
output and makes sure that necessary "no-change" entries
appear on the output.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
20 years ago
|
|
|
int score; /* only valid when one and two are different paths */
|
|
|
|
int 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 *);
|
|
|
|
|
[PATCH] Rename/copy detection fix.
The rename/copy detection logic in earlier round was only good
enough to show patch output and discussion on the mailing list
about the diff-raw format updates revealed many problems with
it. This patch fixes all the ones known to me, without making
things I want to do later impossible, mostly related to patch
reordering.
(1) Earlier rename/copy detector determined which one is rename
and which one is copy too early, which made it impossible
to later introduce diffcore transformers to reorder
patches. This patch fixes it by moving that logic to the
very end of the processing.
(2) Earlier output routine diff_flush() was pruning all the
"no-change" entries indiscriminatingly. This was done due
to my false assumption that one of the requirements in the
diff-raw output was not to show such an entry (which
resulted in my incorrect comment about "diff-helper never
being able to be equivalent to built-in diff driver"). My
special thanks go to Linus for correcting me about this.
When we produce diff-raw output, for the downstream to be
able to tell renames from copies, sometimes it _is_
necessary to output "no-change" entries, and this patch
adds diffcore_prune() function for doing it.
(3) Earlier diff_filepair structure was trying to be not too
specific about rename/copy operations, but the purpose of
the structure was to record one or two paths, which _was_
indeed about rename/copy. This patch discards xfrm_msg
field which was trying to be generic for this wrong reason,
and introduces a couple of fields (rename_score and
rename_rank) that are explicitly specific to rename/copy
logic. One thing to note is that the information in a
single diff_filepair structure _still_ does not distinguish
renames from copies, and it is deliberately so. This is to
allow patches to be reordered in later stages.
(4) This patch also adds some tests about diff-raw format
output and makes sure that necessary "no-change" entries
appear on the output.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
20 years ago
|
|
|
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 *);
|
[PATCH] Rename/copy detection fix.
The rename/copy detection logic in earlier round was only good
enough to show patch output and discussion on the mailing list
about the diff-raw format updates revealed many problems with
it. This patch fixes all the ones known to me, without making
things I want to do later impossible, mostly related to patch
reordering.
(1) Earlier rename/copy detector determined which one is rename
and which one is copy too early, which made it impossible
to later introduce diffcore transformers to reorder
patches. This patch fixes it by moving that logic to the
very end of the processing.
(2) Earlier output routine diff_flush() was pruning all the
"no-change" entries indiscriminatingly. This was done due
to my false assumption that one of the requirements in the
diff-raw output was not to show such an entry (which
resulted in my incorrect comment about "diff-helper never
being able to be equivalent to built-in diff driver"). My
special thanks go to Linus for correcting me about this.
When we produce diff-raw output, for the downstream to be
able to tell renames from copies, sometimes it _is_
necessary to output "no-change" entries, and this patch
adds diffcore_prune() function for doing it.
(3) Earlier diff_filepair structure was trying to be not too
specific about rename/copy operations, but the purpose of
the structure was to record one or two paths, which _was_
indeed about rename/copy. This patch discards xfrm_msg
field which was trying to be generic for this wrong reason,
and introduces a couple of fields (rename_score and
rename_rank) that are explicitly specific to rename/copy
logic. One thing to note is that the information in a
single diff_filepair structure _still_ does not distinguish
renames from copies, and it is deliberately so. This is to
allow patches to be reordered in later stages.
(4) This patch also adds some tests about diff-raw format
output and makes sure that necessary "no-change" entries
appear on the output.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
20 years ago
|
|
|
|
|
|
|
extern int diff_needs_to_stay(struct diff_queue_struct *, int,
|
|
|
|
struct diff_filespec *);
|
|
|
|
|
|
|
|
#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
|