int cmd__path_utils()

in t/helper/test-path-utils.c [294:500]


int cmd__path_utils(int argc, const char **argv)
{
	if (argc == 3 && !strcmp(argv[1], "normalize_path_copy")) {
		char *buf = xmallocz(strlen(argv[2]));
		int rv = normalize_path_copy(buf, argv[2]);
		puts(rv ? "++failed++" : buf);
		free(buf);
		return 0;
	}

	if (argc >= 2 && !strcmp(argv[1], "real_path")) {
		struct strbuf realpath = STRBUF_INIT;
		while (argc > 2) {
			strbuf_realpath(&realpath, argv[2], 1);
			puts(realpath.buf);
			argc--;
			argv++;
		}
		strbuf_release(&realpath);
		return 0;
	}

	if (argc >= 2 && !strcmp(argv[1], "absolute_path")) {
		while (argc > 2) {
			puts(absolute_path(argv[2]));
			argc--;
			argv++;
		}
		return 0;
	}

	if (argc == 4 && !strcmp(argv[1], "longest_ancestor_length")) {
		int len;
		struct string_list ceiling_dirs = STRING_LIST_INIT_DUP;
		char *path = xstrdup(argv[2]);

		/*
		 * We have to normalize the arguments because under
		 * Windows, bash mangles arguments that look like
		 * absolute POSIX paths or colon-separate lists of
		 * absolute POSIX paths into DOS paths (e.g.,
		 * "/foo:/foo/bar" might be converted to
		 * "D:\Src\msysgit\foo;D:\Src\msysgit\foo\bar"),
		 * whereas longest_ancestor_length() requires paths
		 * that use forward slashes.
		 */
		if (normalize_path_copy(path, path))
			die("Path \"%s\" could not be normalized", argv[2]);
		string_list_split(&ceiling_dirs, argv[3], PATH_SEP, -1);
		filter_string_list(&ceiling_dirs, 0,
				   normalize_ceiling_entry, NULL);
		len = longest_ancestor_length(path, &ceiling_dirs);
		string_list_clear(&ceiling_dirs, 0);
		free(path);
		printf("%d\n", len);
		return 0;
	}

	if (argc >= 4 && !strcmp(argv[1], "prefix_path")) {
		const char *prefix = argv[2];
		int prefix_len = strlen(prefix);
		int nongit_ok;
		setup_git_directory_gently(&nongit_ok);
		while (argc > 3) {
			char *pfx = prefix_path(prefix, prefix_len, argv[3]);

			puts(pfx);
			free(pfx);
			argc--;
			argv++;
		}
		return 0;
	}

	if (argc == 4 && !strcmp(argv[1], "strip_path_suffix")) {
		char *prefix = strip_path_suffix(argv[2], argv[3]);
		printf("%s\n", prefix ? prefix : "(null)");
		free(prefix);
		return 0;
	}

	if (argc == 3 && !strcmp(argv[1], "print_path")) {
		puts(argv[2]);
		return 0;
	}

	if (argc == 4 && !strcmp(argv[1], "relative_path")) {
		struct strbuf sb = STRBUF_INIT;
		const char *in, *prefix, *rel;
		normalize_argv_string(&in, argv[2]);
		normalize_argv_string(&prefix, argv[3]);
		rel = relative_path(in, prefix, &sb);
		if (!rel)
			puts("(null)");
		else
			puts(strlen(rel) > 0 ? rel : "(empty)");
		strbuf_release(&sb);
		return 0;
	}

	if (argc == 2 && !strcmp(argv[1], "basename"))
		return test_function(basename_data, posix_basename, argv[1]);

	if (argc == 2 && !strcmp(argv[1], "dirname"))
		return test_function(dirname_data, posix_dirname, argv[1]);

	if (argc > 2 && !strcmp(argv[1], "is_dotgitmodules")) {
		return check_dotfile("modules", argv + 2,
				     is_hfs_dotgitmodules,
				     is_ntfs_dotgitmodules);
	}
	if (argc > 2 && !strcmp(argv[1], "is_dotgitignore")) {
		return check_dotfile("ignore", argv + 2,
				     is_hfs_dotgitignore,
				     is_ntfs_dotgitignore);
	}
	if (argc > 2 && !strcmp(argv[1], "is_dotgitattributes")) {
		return check_dotfile("attributes", argv + 2,
				     is_hfs_dotgitattributes,
				     is_ntfs_dotgitattributes);
	}
	if (argc > 2 && !strcmp(argv[1], "is_dotmailmap")) {
		return check_dotfile("mailmap", argv + 2,
				     is_hfs_dotmailmap,
				     is_ntfs_dotmailmap);
	}

	if (argc > 2 && !strcmp(argv[1], "file-size")) {
		int res = 0, i;
		struct stat st;

		for (i = 2; i < argc; i++)
			if (stat(argv[i], &st))
				res = error_errno("Cannot stat '%s'", argv[i]);
			else
				printf("%"PRIuMAX"\n", (uintmax_t)st.st_size);
		return !!res;
	}

	if (argc == 4 && !strcmp(argv[1], "skip-n-bytes")) {
		int fd = open(argv[2], O_RDONLY), offset = atoi(argv[3]);
		char buffer[65536];

		if (fd < 0)
			die_errno("could not open '%s'", argv[2]);
		if (lseek(fd, offset, SEEK_SET) < 0)
			die_errno("could not skip %d bytes", offset);
		for (;;) {
			ssize_t count = read(fd, buffer, sizeof(buffer));
			if (count < 0)
				die_errno("could not read '%s'", argv[2]);
			if (!count)
				break;
			if (write(1, buffer, count) < 0)
				die_errno("could not write to stdout");
		}
		close(fd);
		return 0;
	}

	if (argc > 5 && !strcmp(argv[1], "slice-tests")) {
		int res = 0;
		long offset, stride, i;
		struct string_list list = STRING_LIST_INIT_NODUP;
		struct stat st;

		offset = strtol(argv[2], NULL, 10);
		stride = strtol(argv[3], NULL, 10);
		if (stride < 1)
			stride = 1;
		for (i = 4; i < argc; i++)
			if (stat(argv[i], &st))
				res = error_errno("Cannot stat '%s'", argv[i]);
			else
				string_list_append(&list, argv[i])->util =
					(void *)(intptr_t)st.st_size;
		QSORT(list.items, list.nr, cmp_by_st_size);
		for (i = offset; i < list.nr; i+= stride)
			printf("%s\n", list.items[i].string);

		return !!res;
	}

	if (argc > 1 && !strcmp(argv[1], "protect_ntfs_hfs"))
		return !!protect_ntfs_hfs_benchmark(argc - 1, argv + 1);

	if (argc > 1 && !strcmp(argv[1], "is_valid_path")) {
		int res = 0, expect = 1, i;

		for (i = 2; i < argc; i++)
			if (!strcmp("--not", argv[i]))
				expect = 0;
			else if (expect != is_valid_path(argv[i]))
				res = error("'%s' is%s a valid path",
					    argv[i], expect ? " not" : "");
			else
				fprintf(stderr,
					"'%s' is%s a valid path\n",
					argv[i], expect ? "" : " not");

		return !!res;
	}

	fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
		argv[1] ? argv[1] : "(there was none)");
	return 1;
}