Commit ee36856d authored by Junio C Hamano's avatar Junio C Hamano

Merge branch 'cr/tag'

* cr/tag:
  Add test-script for git-tag
  Add test script for git-stripspace.
  Fix git-stripspace to process correctly long lines and spaces.
parents 0227f988 ef5a6fb5
#include "builtin.h"
#include "cache.h"
/*
* Remove empty lines from the beginning and end.
* Remove trailing spaces from a line.
*
* Turn multiple consecutive empty lines into just one
* empty line. Return true if it is an incomplete line.
* If the line ends with newline, it will be removed too.
* Returns the new length of the string.
*/
static int cleanup(char *line)
static int cleanup(char *line, int len)
{
int len = strlen(line);
if (len) {
if (line[len - 1] == '\n')
len--;
if (len && line[len-1] == '\n') {
if (len == 1)
return 0;
do {
unsigned char c = line[len-2];
while (len) {
unsigned char c = line[len - 1];
if (!isspace(c))
break;
line[len-2] = '\n';
len--;
line[len] = 0;
} while (len > 1);
return 0;
}
line[len] = 0;
}
return 1;
return len;
}
static void stripspace(FILE *in, FILE *out)
/*
* Remove empty lines from the beginning and end
* and also trailing spaces from every line.
*
* Turn multiple consecutive empty lines between paragraphs
* into just one empty line.
*
* If the input has only empty lines and spaces,
* no output will be produced.
*
* Enable skip_comments to skip every line starting with "#".
*/
void stripspace(FILE *in, FILE *out, int skip_comments)
{
int empties = -1;
int incomplete = 0;
char line[1024];
int alloc = 1024;
char *line = xmalloc(alloc);
while (fgets(line, alloc, in)) {
int len = strlen(line);
while (fgets(line, sizeof(line), in)) {
incomplete = cleanup(line);
while (len == alloc - 1 && line[len - 1] != '\n') {
alloc = alloc_nr(alloc);
line = xrealloc(line, alloc);
fgets(line + len, alloc - len, in);
len += strlen(line + len);
}
if (skip_comments && line[0] == '#')
continue;
len = cleanup(line, len);
/* Not just an empty line? */
if (line[0] != '\n') {
if (len) {
if (empties > 0)
fputc('\n', out);
empties = 0;
fputs(line, out);
fputc('\n', out);
continue;
}
if (empties < 0)
continue;
empties++;
}
if (incomplete)
fputc('\n', out);
free(line);
}
int cmd_stripspace(int argc, const char **argv, const char *prefix)
{
stripspace(stdin, stdout);
stripspace(stdin, stdout, 0);
return 0;
}
......@@ -7,6 +7,7 @@ extern const char git_version_string[];
extern const char git_usage_string[];
extern void help_unknown_cmd(const char *cmd);
extern void stripspace(FILE *in, FILE *out, int skip_comments);
extern int write_tree(unsigned char *sha1, int missing_ok, const char *prefix);
extern void prune_packed_objects(int);
......
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment