]> git.ipfire.org Git - thirdparty/git.git/commitdiff
whitespace: allocate a few more bits and define WS_INCOMPLETE_LINE
authorJunio C Hamano <gitster@pobox.com>
Wed, 5 Nov 2025 21:30:49 +0000 (13:30 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 5 Nov 2025 21:37:19 +0000 (13:37 -0800)
Reserve a few more bits in the diff flags word to be used for future
whitespace rules.  Add WS_INCOMPLETE_LINE without implementing the
behaviour (yet).

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config/core.adoc
diff.c
diff.h
ws.c
ws.h

index e2de270c869c77b330cffa60a0e9ab848c546315..682fb595fb096c9c2e096901fde566579db3e975 100644 (file)
@@ -626,6 +626,8 @@ core.whitespace::
   part of the line terminator, i.e. with it, `trailing-space`
   does not trigger if the character before such a carriage-return
   is not a whitespace (not enabled by default).
+* `incomplete-line` treats the last line of a file that is missing the
+  newline at the end as an error (not enabled by default).
 * `tabwidth=<n>` tells how many character positions a tab occupies; this
   is relevant for `indent-with-non-tab` and when Git fixes `tab-in-indent`
   errors. The default tab width is 8. Allowed values are 1 to 63.
diff --git a/diff.c b/diff.c
index 99298720f48c6d69c480b9111fa5c98a856ae7ed..8d03146aaac7181f8a171734488efa3f84936563 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -804,15 +804,15 @@ enum diff_symbol {
 
 /*
  * Flags for content lines:
- * 0..11 are whitespace rules (see ws.h)
- * 12..14 are WSEH_NEW | WSEH_CONTEXT | WSEH_OLD
- * 16 is marking if the line is blank at EOF
- * 17..19 are used for color-moved.
+ * 0..15 are whitespace rules (see ws.h)
+ * 16..18 are WSEH_NEW | WSEH_CONTEXT | WSEH_OLD
+ * 19 is marking if the line is blank at EOF
+ * 20..22 are used for color-moved.
  */
-#define DIFF_SYMBOL_CONTENT_BLANK_LINE_EOF     (1<<16)
-#define DIFF_SYMBOL_MOVED_LINE                 (1<<17)
-#define DIFF_SYMBOL_MOVED_LINE_ALT             (1<<18)
-#define DIFF_SYMBOL_MOVED_LINE_UNINTERESTING   (1<<19)
+#define DIFF_SYMBOL_CONTENT_BLANK_LINE_EOF     (1<<19)
+#define DIFF_SYMBOL_MOVED_LINE                 (1<<20)
+#define DIFF_SYMBOL_MOVED_LINE_ALT             (1<<21)
+#define DIFF_SYMBOL_MOVED_LINE_UNINTERESTING   (1<<22)
 
 #define DIFF_SYMBOL_CONTENT_WS_MASK (WSEH_NEW | WSEH_OLD | WSEH_CONTEXT | WS_RULE_MASK)
 
diff --git a/diff.h b/diff.h
index cbd355cf50f68e348bb9214d50b5c20471a578e4..422658407d4e86f5cf4b2224f373fcc2e7f4791f 100644 (file)
--- a/diff.h
+++ b/diff.h
@@ -331,9 +331,9 @@ struct diff_options {
 
        int ita_invisible_in_index;
 /* white-space error highlighting */
-#define WSEH_NEW        (1<<12)
-#define WSEH_CONTEXT    (1<<13)
-#define WSEH_OLD        (1<<14)
+#define WSEH_NEW        (1<<16)
+#define WSEH_CONTEXT    (1<<17)
+#define WSEH_OLD        (1<<18)
        unsigned ws_error_highlight;
        const char *prefix;
        int prefix_length;
diff --git a/ws.c b/ws.c
index 70acee3337f2418ccf3f5d124815e4d24d56e073..34a7b4fad2840a9277950199ddc4cd3401465dad 100644 (file)
--- a/ws.c
+++ b/ws.c
@@ -26,6 +26,7 @@ static struct whitespace_rule {
        { "blank-at-eol", WS_BLANK_AT_EOL, 0 },
        { "blank-at-eof", WS_BLANK_AT_EOF, 0 },
        { "tab-in-indent", WS_TAB_IN_INDENT, 0, 1 },
+       { "incomplete-line", WS_INCOMPLETE_LINE, 0, 0 },
 };
 
 unsigned parse_whitespace_rule(const char *string)
@@ -139,6 +140,11 @@ char *whitespace_error_string(unsigned ws)
                        strbuf_addstr(&err, ", ");
                strbuf_addstr(&err, "tab in indent");
        }
+       if (ws & WS_INCOMPLETE_LINE) {
+               if (err.len)
+                       strbuf_addstr(&err, ", ");
+               strbuf_addstr(&err, "no newline at the end of file");
+       }
        return strbuf_detach(&err, NULL);
 }
 
diff --git a/ws.h b/ws.h
index 23708efb7322ede7d3cb34e5ee9f0237b3739491..06d5cb73f8f88f97fc613ae2e3fbeeb82cfb1f09 100644 (file)
--- a/ws.h
+++ b/ws.h
@@ -15,13 +15,14 @@ struct strbuf;
 #define WS_CR_AT_EOL            (1<<9)
 #define WS_BLANK_AT_EOF         (1<<10)
 #define WS_TAB_IN_INDENT        (1<<11)
+#define WS_INCOMPLETE_LINE      (1<<12)
 
 #define WS_TRAILING_SPACE       (WS_BLANK_AT_EOL|WS_BLANK_AT_EOF)
 #define WS_DEFAULT_RULE (WS_TRAILING_SPACE|WS_SPACE_BEFORE_TAB|8)
 #define WS_TAB_WIDTH_MASK       ((1<<6)-1)
 
 /* All WS_* -- when extended, adapt constants defined after diff.c:diff_symbol */
-#define WS_RULE_MASK            ((1<<12)-1)
+#define WS_RULE_MASK            ((1<<16)-1)
 
 extern unsigned whitespace_rule_cfg;
 unsigned whitespace_rule(struct index_state *, const char *);