Add a "check-files" command, which is useful for scripting
authorLinus Torvalds <torvalds@ppc970.osdl.org>
Tue, 12 Apr 2005 07:23:14 +0000 (00:23 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Tue, 12 Apr 2005 07:23:14 +0000 (00:23 -0700)
patches.

In particular, it verifies that all the listed files are up-to-date
in the cache (or don't exist and are ready to be added).

Makefile
check-files.c [new file with mode: 0644]

index a1753fe..dc6e5ab 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,8 @@ CFLAGS=-g -O3 -Wall
 CC=gcc
 
 PROG=  update-cache show-diff init-db write-tree read-tree commit-tree \
-       cat-file fsck-cache checkout-cache diff-tree rev-tree show-files
+       cat-file fsck-cache checkout-cache diff-tree rev-tree show-files \
+       check-files
 
 all: $(PROG)
 
@@ -46,6 +47,9 @@ rev-tree: rev-tree.o read-cache.o
 show-files: show-files.o read-cache.o
        $(CC) $(CFLAGS) -o show-files show-files.o read-cache.o $(LIBS)
 
+check-files: check-files.o read-cache.o
+       $(CC) $(CFLAGS) -o check-files check-files.o read-cache.o $(LIBS)
+
 read-cache.o: cache.h
 show-diff.o: cache.h
 
diff --git a/check-files.c b/check-files.c
new file mode 100644 (file)
index 0000000..c74bf87
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * check-files.c
+ *
+ * Check that a set of files are up-to-date in the filesystem or
+ * do not exist. Used to verify a patch target before doing a patch.
+ *
+ * Copyright (C) 2005 Linus Torvalds
+ */
+#include "cache.h"
+
+static void check_file(const char *path)
+{
+       int fd = open(path, O_RDONLY);
+       struct cache_entry *ce;
+       struct stat st;
+       int pos, changed;
+
+       /* Nonexistent is fine */
+       if (fd < 0) {
+               if (errno != ENOENT)
+                       usage("%s: %s", path, strerror(errno));
+               return;
+       }
+
+       /* Exists but is not in the cache is not fine */
+       pos = cache_name_pos(path, strlen(path));
+       if (pos < 0)
+               usage("preparing to update existing file '%s' not in cache", path);
+       ce = active_cache[pos];
+
+       if (fstat(fd, &st) < 0)
+               usage("fstat(%s): %s", path, strerror(errno));
+
+       changed = cache_match_stat(ce, &st);
+       if (changed)
+               usage("preparing to update file '%s' not uptodate in cache", path);
+}
+
+int main(int argc, char **argv)
+{
+       int i;
+
+       read_cache();
+       for (i = 1; i < argc ; i++)
+               check_file(argv[i]);
+       return 0;
+}