mirror of
git://git.psyced.org/git/psyced
synced 2024-08-15 03:25:10 +00:00
216 lines
5 KiB
C
216 lines
5 KiB
C
/* 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 <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <time.h>
|
|
|
|
#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-<date>.tar.bz2\n", argv[0]);
|
|
return 1;
|
|
}
|
|
|
|
l = strlen(argv[1]);
|
|
if (l < 10 || l > 30) {
|
|
puts(">> This doesn't look like a psyced-<date>.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")) {
|
|
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;
|
|
}
|