aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2019-12-18 13:30:57 -0500
committerJoseph Hunkeler <jhunkeler@gmail.com>2019-12-18 13:30:57 -0500
commit3166627f1485e2f05421fe874b2236852fe5d017 (patch)
treed22a6c9b0e61907d15678146a3298efab1beed5b
parent2be3d5c5d905bd748b8ce511033065fa5a83a59c (diff)
downloadspmc-3166627f1485e2f05421fe874b2236852fe5d017.tar.gz
Improved output and error handling
-rw-r--r--archive.c11
-rw-r--r--deps.c64
-rw-r--r--install.c4
-rw-r--r--spm.c29
-rw-r--r--spm.h2
5 files changed, 93 insertions, 17 deletions
diff --git a/archive.c b/archive.c
index 19269a8..7ec9d04 100644
--- a/archive.c
+++ b/archive.c
@@ -14,6 +14,12 @@ int tar_extract_file(const char *archive, const char* filename, const char *dest
char cmd[PATH_MAX];
sprintf(cmd, "tar xf %s -C %s %s 2>&1", archive, destination, filename);
+ if (exists(archive) != 0) {
+ fprintf(stderr, "%s :: ", archive);
+ fprintf(SYSERROR);
+ return -1;
+ }
+
shell(&proc, SHELL_OUTPUT, cmd);
if (!proc) {
fprintf(SYSERROR);
@@ -31,6 +37,11 @@ int tar_extract_archive(const char *_archive, const char *_destination) {
int status;
char cmd[PATH_MAX];
+ if (exists(_archive) != 0) {
+ fprintf(SYSERROR);
+ return -1;
+ }
+
char *archive = strdup(_archive);
if (!archive) {
fprintf(SYSERROR);
diff --git a/deps.c b/deps.c
index 452e551..99f6148 100644
--- a/deps.c
+++ b/deps.c
@@ -42,21 +42,45 @@ void dep_free(Dependencies **deps) {
free((*deps));
}
-int dep_append(Dependencies **deps, char *name) {
+int dep_append(Dependencies **deps, char *_name) {
+ char *name = NULL;
+ char *bname = NULL;
+
if (!(*deps)) {
return -1;
}
+
+ name = find_package(_name);
+ if (!name) {
+ perror(_name);
+ fprintf(SYSERROR);
+ return -1;
+ }
+
+ bname = basename(name);
+ if (!bname) {
+ perror(name);
+ fprintf(SYSERROR);
+ return -1;
+ }
+
(*deps)->__size++;
(*deps)->list = (char **)realloc((*deps)->list, sizeof(char *) * (*deps)->__size);
if (!(*deps)->list) {
+ free(name);
return -1;
}
- (*deps)->list[(*deps)->records] = (char *)calloc(strlen(name) + 1, sizeof(char));
+
+ (*deps)->list[(*deps)->records] = (char *)calloc(strlen(bname) + 1, sizeof(char));
if (!(*deps)->list[(*deps)->records]) {
+ free(name);
return -1;
}
- strcpy((*deps)->list[(*deps)->records], name);//, strlen(name));
+
+ strcpy((*deps)->list[(*deps)->records], bname);
(*deps)->records++;
+
+ free(name);
return 0;
}
@@ -105,24 +129,42 @@ int dep_solve(Dependencies **deps, const char *filename) {
return line_count;
}
-void dep_all(Dependencies **deps, const char *_package) {
+int dep_all(Dependencies **deps, const char *_package) {
static int next = 0;
- char *package = find_package(_package);
+ char *package = NULL;
char depfile[PATH_MAX];
char template[PATH_MAX];
char suffix[PATH_MAX] = "spm_depends_all_XXXXXX";
- sprintf(template, "%s%c%s", TMP_DIR, DIRSEP, suffix);
+
+ // Verify the requested package pattern exists
+ package = find_package(_package);
+ if (!package) {
+ perror(_package);
+ fprintf(SYSERROR);
+ return -1;
+ }
// Create a new temporary directory and extract the requested package into it
+ sprintf(template, "%s%c%s", TMP_DIR, DIRSEP, suffix);
char *tmpdir = mkdtemp(template);
if (!tmpdir) {
- perror(tmpdir);
- exit(errno);
+ perror(template);
+ fprintf(SYSERROR);
+ return -1;
+ }
+ if (tar_extract_file(package, ".SPM_DEPENDS", tmpdir) < 0) {
+ perror(package);
+ fprintf(SYSERROR);
+ return -1;
}
- tar_extract_file(package, ".SPM_DEPENDS", tmpdir);
- sprintf(depfile, "%s%c%s", tmpdir, DIRSEP, ".SPM_DEPENDS");
+ // Scan depencency tree
+ sprintf(depfile, "%s%c%s", tmpdir, DIRSEP, ".SPM_DEPENDS");
int resolved = dep_solve(deps, depfile);
+
+ // NOTE:
+ // 1. `resolved` is the number of dependencies for the package we're scanning
+ // 2. `next` permits us to converge on `resolved`, otherwise `i` would reset to `0` each time `dep_all` is called
for (int i = next; i < resolved; i++) {
next++;
if (dep_seen(deps, (*deps)->list[i])) {
@@ -130,8 +172,10 @@ void dep_all(Dependencies **deps, const char *_package) {
}
}
+ // Remove temporary data
unlink(depfile);
unlink(tmpdir);
+ return 0;
}
void dep_show(Dependencies **deps) {
diff --git a/install.c b/install.c
index 95d4b4a..e647d31 100644
--- a/install.c
+++ b/install.c
@@ -6,8 +6,8 @@ int install(const char *destroot, const char *_package) {
fprintf(SYSERROR);
return -1;
}
- printf("Installing: %s\n", package);
- if (access(destroot, F_OK) != 0) {
+
+ if (exists(destroot) != 0) {
if (mkdirs(destroot, 0755) != 0) {
fprintf(SYSERROR);
return -2;
diff --git a/spm.c b/spm.c
index ec8b7ba..3607117 100644
--- a/spm.c
+++ b/spm.c
@@ -17,21 +17,42 @@ int main(int argc, char *argv[]) {
check_runtime_environment();
// Install a package to test things out
+ char *match;
+ char *package;
const char *root = "/tmp/root";
- const char *package = "python";
+ if ((match = find_package("python")) == NULL) {
+ fprintf(SYSERROR);
+ exit(1);
+ }
+ if ((package = basename(match)) == NULL) {
+ fprintf(stderr, "Unable to derive package name from package path:\n\t-> %s\n", match);
+ exit(1);
+ }
Dependencies *deps = NULL;
dep_init(&deps);
- dep_all(&deps, package);
+
+ if (dep_all(&deps, package) < 0) {
+ dep_free(&deps);
+ free_global_config();
+ exit(1);
+ }
+
printf("%s requires:\n", package);
dep_show(&deps);
// Install dependencies first
for (int i = 0; i < deps->records; i++) {
- install(root, deps->list[i]);
+ if (install(root, deps->list[i]) < 0) {
+ fprintf(SYSERROR);
+ exit(errno);
+ }
}
// Install package
- install(root, package);
+ if (install(root, package) < 0) {
+ fprintf(SYSERROR);
+ exit(errno);
+ }
dep_free(&deps);
free_global_config();
diff --git a/spm.h b/spm.h
index 52b791c..9f3ae17 100644
--- a/spm.h
+++ b/spm.h
@@ -169,7 +169,7 @@ int dep_init(Dependencies **deps);
void dep_free(Dependencies **deps);
int dep_append(Dependencies **deps, char *name);
int dep_solve(Dependencies **deps, const char *filename);
-void dep_all(Dependencies **deps, const char *_package);
+int dep_all(Dependencies **deps, const char *_package);
void dep_show(Dependencies **deps);
// fstree.c