aboutsummaryrefslogtreecommitdiff
path: root/core.c
diff options
context:
space:
mode:
authorSebastian Pipping <sebastian@pipping.org>2010-10-11 17:20:11 +0200
committerSebastian Pipping <sebastian@pipping.org>2010-10-11 17:20:11 +0200
commitf3fee983dd082266cc932df5b248d1a9b1bdd41a (patch)
tree547d2b6c7e6fc1afed5854568d1a18a2f8331b02 /core.c
parentZero (diff)
downloadconf-update-f3fee983dd082266cc932df5b248d1a9b1bdd41a.tar.gz
conf-update-f3fee983dd082266cc932df5b248d1a9b1bdd41a.tar.bz2
conf-update-f3fee983dd082266cc932df5b248d1a9b1bdd41a.zip
Add code of conf-update 1.01.0
Diffstat (limited to 'core.c')
-rw-r--r--core.c173
1 files changed, 173 insertions, 0 deletions
diff --git a/core.c b/core.c
new file mode 100644
index 0000000..de9cc64
--- /dev/null
+++ b/core.c
@@ -0,0 +1,173 @@
+#include "conf-update.h"
+
+char *get_real_filename(const char *update) {
+ char *file = (char *)calloc(strlen(update) + 1 - strlen("._cfg????_"), sizeof(char));
+ strncpy(file, update, strrchr(update, '/') - update + 1);
+ strcat(file, strrchr(update, '/') + strlen("._cfg????_") + 1);
+
+ return file;
+}
+
+char *get_highest_update(char **index, char *update) {
+ // update is just any update of the real file we want to get the highest update for
+ char *real_file = get_real_filename(update);
+ char *my_real_file;
+ char *highest_update = update;
+ int i;
+
+ for (i=0;!is_last_entry(index[i]);i++) {
+ if (is_valid_entry(index[i])) {
+ my_real_file = get_real_filename(index[i]);
+ if (!strcmp(my_real_file, real_file)) {
+ if (strcmp(index[i], highest_update) > 0) {
+ highest_update = index[i];
+ }
+ }
+ free(my_real_file);
+ }
+ }
+
+ free(real_file);
+
+ return highest_update;
+}
+
+bool is_last_entry(const char *entry) {
+ if (entry == LAST_ENTRY) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
+bool is_valid_entry(const char *entry) {
+ if (entry == LAST_ENTRY || entry == SKIP_ENTRY) {
+ return FALSE;
+ } else {
+ return TRUE;
+ }
+}
+
+void merge(char *update, char **index) {
+ char *real_file = get_real_filename(update);
+ char *my_real_file;
+ int i;
+
+ exit_error(!rename(update, real_file), update);
+
+ for (i=0;!is_last_entry(index[i]);i++) {
+ if (is_valid_entry(index[i])) {
+ my_real_file = get_real_filename(index[i]);
+ if (!strcmp(my_real_file, real_file)) {
+ if (strcmp(update, index[i])) {
+ exit_error(!unlink(index[i]), index[i]);
+ }
+ free(index[i]);
+ index[i] = SKIP_ENTRY;
+ }
+ free(my_real_file);
+ }
+ }
+
+ free(real_file);
+}
+
+void show_diff(char *update) {
+ extern struct configuration config;
+ char *realfile = get_real_filename(update);
+ char *esc_realfile = g_shell_quote(realfile);
+ char *esc_update = g_shell_quote(update);
+ char *cmd = (char *)calloc(strlen(config.diff_tool) + strlen(" % % | ") + strlen(esc_update) + strlen(esc_realfile) + strlen(config.pager) + 1, sizeof(char));
+ strcpy(cmd, config.diff_tool);
+ strcat(cmd, " ");
+ strcat(cmd, esc_realfile);
+ strcat(cmd, " ");
+ strcat(cmd, esc_update);
+ if (strcmp(config.pager, "")) {
+ strcat(cmd, " | ");
+ strcat(cmd, config.pager);
+ }
+ free(realfile);
+ g_free(esc_realfile);
+ g_free(esc_update);
+ system(cmd);
+ free(cmd);
+}
+
+void edit_update(char *update) {
+ extern struct configuration config;
+ char *esc_update = g_shell_quote(update);
+ char *cmd = calloc(strlen(config.edit_tool) + strlen(" ") + strlen(esc_update), sizeof(char));
+
+ strcpy(cmd, config.edit_tool);
+ strcat(cmd, " ");
+ strcat(cmd, esc_update);
+
+ system(cmd);
+ g_free(esc_update);
+ free(cmd);
+}
+
+char **merge_interactively(char *update, char **index) {
+ // customized versions are ._cfg????- with a minus instead of a underscore
+ // that way get_real_filename() works without modification
+ extern struct configuration config;
+ char *realfile = get_real_filename(update);
+ char *esc_realfile = g_shell_quote(realfile);
+ char *esc_update = g_shell_quote(update);
+ char *cmd = calloc(strlen("clear ; ") + strlen(config.merge_tool) + 2 * strlen(esc_update) + strlen(esc_realfile) + strlen(" % % %"), sizeof(char));
+ char *merged, *esc_merged;
+ char **new_index = index;
+ int retval, ct;
+
+ // interactively merge an interactively merged file? naah.
+ if (*(strstr(update, "._cfg") + strlen("._cfg????")) == '_') {
+ merged = strdup(update);
+ *(strstr(merged, "._cfg") + strlen("._cfg????")) = '-';
+ esc_merged = g_shell_quote(merged);
+ strcpy(cmd, "clear ; ");
+ strcat(cmd, config.merge_tool);
+ strcat(cmd, " ");
+ strcat(cmd, esc_merged);
+ strcat(cmd, " ");
+ strcat(cmd, esc_realfile);
+ strcat(cmd, " ");
+ strcat(cmd, esc_update);
+ retval = WEXITSTATUS(system(cmd));
+
+ if (retval == 0 || retval == 1) {
+ for (ct=0;!is_last_entry(index[ct]);ct++) {}
+ new_index = realloc(index, (ct + 2) * sizeof(char *));
+ new_index[ct] = strdup(merged);
+ new_index[ct+1] = LAST_ENTRY;
+ } else {
+ // user aborted or error
+ unlink(merged);
+ }
+ free(merged);
+ g_free(esc_merged);
+ }
+ free(cmd);
+ free(realfile);
+ g_free(esc_realfile);
+ g_free(esc_update);
+
+ return new_index;
+}
+void display_help() {
+ char *str = \
+ "Usage: " PROG_NAME " [options] [location1] [locationN] ...\n\n"
+
+ "Options:\n"
+ "\t--help (-h) Show this message\n"
+ "\n"
+ "Locations: absolute path to a directory to search through\n"
+ " instead of CONFIG_PROTECT\n"
+ "\n"
+ "Shortcuts: \n"
+ "\tSelecting a directory will select all its updates\n";
+
+
+ fprintf(stderr, str);
+ exit(EXIT_SUCCESS);
+}