/* Why do we use C for shell scripts? * Well.. why not? * Because people like me need to add something and end up spending half * an hour for a 30 second change. */ #include #include #include #include #include #include #include #define unless(x) if (!(x)) void vcscp(char *filename) { char cmdline[1000]; printf(">>> %s\n", filename); snprintf(cmdline, (sizeof cmdline) - 1, "cp %s ../skel", filename); if (system(cmdline)) { printf(">> Could not update %s. Exiting.\n", filename); exit(1); } } void webcp(char *filename) { char cmdline[1000]; printf(">>> %s\n", filename); snprintf(cmdline, (sizeof cmdline) - 1, "lynx -dump http://www.psyced.org/%s.html > %s.txt", filename, filename); if (system(cmdline)) { printf(">> Could not update %s. Exiting.\n", filename); exit(1); } } int main(int argc, char **argv) { time_t t; struct tm *lt; char ft[200], s[1000]; int l, hadskel; time(&t); lt = localtime(&t); /* new format without dashes to accomodate gentoo versioning style */ strftime(ft, 199, "%Y%m%d", lt); /* strftime(ft, 199, "%F", lt); */ if (chdir("skel")) { hadskel = 0; printf(">> Welcome. Today is %s. I will create a skel and data directory here.\n", ft); if (argc != 2) { printf(">> Usage: %s psyced-.tar.bz2\n", argv[0]); return 1; } l = strlen(argv[1]); if (l < 10 || l > 30) { puts(">> This doesn't look like a psyced-.tar.bz2."); return 1; } puts(">> Let me unpack this."); snprintf(s, (sizeof s) - 1, "tar xvfj %s", argv[1]); if (system(s)) { printf(">> Could not untar %s. Exiting.\n", argv[1]); return 1; } argv[1][l - sizeof("tar.bz2")] = 0; if (rename(argv[1], "skel")) { printf(">> Could not rename %s. Exiting.\n", argv[1]); return 1; } if (chdir("skel")) { puts(">> Could not enter skel/. Exiting."); return 1; } } else { hadskel = 1; puts(">> You already have a skel, good. Skipping unpack operation."); } if (!unlink(".config")) { puts(">> Deleted a .config that someone left lying around."); } if (mkdir("../data", S_IRWXU)) { puts(">> Could not create data/. Already there?"); /* return 1; */ } else { puts(">> Extracting data"); if (system("tar xf data.tar -C../data")) { puts(">> Error in extracting data.tar. Exiting."); return 1; } } if (chdir("../data")) { puts(">> Could not enter data/. Exiting."); return 1; } /* we don't want to update CHANGESTODO. we put a fake file there so it doesn't download the real thing, later we delete it system("cp BANNER CHANGESTODO"); hmm, doesn't really work like that */ puts(">> Doing a git fetch"); if (system("git fetch origin")) { puts(">> Error during git fetch. Exiting."); return 1; } puts(">> Suspend to inspect a '(cd data;git diff master..origin/master)'."); sleep(4); puts(">> Doing a git merge"); if (system("git merge -s resolve origin")) { puts(">> Error during git merge. Exiting."); return 1; } puts(">> Doing a git garbage collection"); if (system("git gc --aggressive")) { puts(">> Error during git gc. Exiting."); return 1; } /* we used to do this with cvs.. for git we could do .gitignore unlink("CHANGESTODO"); */ /* system("rm .#CHANGESTODO*") */ puts(">> Now is your chance to make manual changes. Suspend now."); sleep(4); puts(">> Creating new data.tar"); if (system("tar cf ../skel/data.tar --owner=root --group=root .")) { puts(">> Error during archiving. Exiting."); return 1; } puts(">> Updating files from version control system"); vcscp("install.sh"); puts(">> Cleaning up data/"); chdir(".."); if (system("rm -rf data")) { puts(">> Could not remove data/. Exiting."); return 1; } if (chdir("skel")) { puts(">> Could not enter skel/. Exiting."); return 1; } puts(">> Updating files from Webserver"); webcp("README"); webcp("INSTALL"); webcp("FIRSTSTEPS"); puts(">> Creating archive"); snprintf(s, (sizeof s) - 1, "../psyced-%s", ft); if (mkdir(s, S_IRWXU)) { printf(">> Could not create %s/. Exiting.\n", s); return 1; } snprintf(s, (sizeof s) - 1, "tar cf - . | tar xf - -C../psyced-%s", ft); if (system(s)) { puts(">> Could not copy data for tarring. Exiting."); return 1; } chdir(".."); snprintf(s, (sizeof s) - 1, "tar cfj psyced-%s.tar.bz2 --owner=root --group=root psyced-%s", ft, ft); if (system(s)) { printf(">> Could not create psyced-%s.tar.bz2. Exiting.\n", ft); return 1; } printf(">> psyced-%s.tar.bz2 has been created. Cleaning up.\n", ft); snprintf(s, (sizeof s) - 1, "rm -rf psyced-%s", ft); if (system(s)) { printf(">> Could not remove psyced-%s. Exiting.\n", ft); return 1; } if (!hadskel) { if (system("rm -r skel")) { puts(">> I'm done, but I could not remove the skel directory."); return 1; } } puts(">> Done."); return 0; }