/* * rename files in a git repository, keeping the guid. * * Copyright Simon Fowler , 2005. */ #include #include #include #include "cache.h" static int remove_lock = 0; static void remove_lock_file(void) { if (remove_lock) unlink(".git/index.lock"); } int main(int argc, char *argv[]) { struct stat stats; struct cache_entry *ce, *new; int newfd, entries, pos, pos2; if (argc != 3) usage("rename-file "); if (stat(argv[1], &stats)) { perror("rename-file: "); exit(1); } if (!stat(argv[2], &stats)) die("rename-file: destination file already exists"); newfd = open(".git/index.lock", O_RDWR | O_CREAT | O_EXCL, 0600); if (newfd < 0) die("unable to create new cachefile"); atexit(remove_lock_file); remove_lock = 1; entries = read_cache(); if (entries < 0) die("cache corrupted"); pos = cache_name_pos(argv[1], strlen(argv[1])); pos2 = cache_name_pos(argv[2], strlen(argv[2])); if (pos < 0) die("original file not in cache"); if (pos2 >= 0) die("destination file already in cache"); ce = active_cache[pos]; new = malloc(sizeof(struct cache_entry) + strlen(argv[2]) + 1); memcpy(new, ce, sizeof(struct cache_entry)); new->namelen = strlen(argv[2]); memcpy(new->name, argv[2], new->namelen); if (rename(argv[1], argv[2])) { perror("rename-file: "); exit(1); } remove_file_from_cache(argv[1]); add_cache_entry(new, 1); if (write_cache(newfd, active_cache, active_nr) || rename(".git/index.lock", ".git/index")) die("Unable to write new cachefile"); remove_lock = 0; return 0; }