<pre style='margin:0'>
Clemens Lang (neverpanic) pushed a commit to branch gsoc17-migrate
in repository macports-base.
</pre>
<p><a href="https://github.com/macports/macports-base/commit/e6a06d48269dc316c4186e0c66a446d069b0983f">https://github.com/macports/macports-base/commit/e6a06d48269dc316c4186e0c66a446d069b0983f</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit e6a06d48269dc316c4186e0c66a446d069b0983f
</span>Author: Umesh Singla <umeshksingla@macports.org>
AuthorDate: Sat Aug 26 19:39:05 2017 +0530
<span style='display:block; white-space:pre;color:#404040;'> Fetch list of last 10 snapshots for restore
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> if the user didn't specify any particular snapshot-id as an
</span><span style='display:block; white-space:pre;color:#404040;'> argument to `port restore`. Add all the supporting methods
</span><span style='display:block; white-space:pre;color:#404040;'> like reg_stmt_to_snapshot, reg_all_snapshots etc., alongwith
</span><span style='display:block; white-space:pre;color:#404040;'> their documentation.
</span>---
src/cregistry/snapshot.c | 71 +++++++++++++++++++++++++++++++++++++++++---
src/cregistry/snapshot.h | 3 ++
src/macports1.0/restore.tcl | 21 ++++++-------
src/macports1.0/snapshot.tcl | 10 -------
src/registry2.0/snapshot.c | 36 ++++++++++++++++++++--
5 files changed, 115 insertions(+), 26 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/cregistry/snapshot.c b/src/cregistry/snapshot.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 2fff7eb..b3d967e 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/cregistry/snapshot.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/cregistry/snapshot.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -63,11 +63,53 @@ int get_parsed_variants(char* variants_str, variant* all_variants,
</span> *(all_variants + *variant_count) = v;
*variant_count = *variant_count + 1;
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> return 0;
}
/**
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Converts a `sqlite3_stmt` into a `reg_snapshot`. The first column of the stmt's
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * row must be the id of an snapshot; the second either `SQLITE_NULL` or the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * address of the snapshot in memory.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] userdata sqlite3 database
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [out] snapshot snapshot described by `stmt`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] stmt `sqlite3_stmt` with appropriate columns
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [out] errPtr unused
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @return true if success; false if failure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int reg_stmt_to_snapshot(void* userdata, void** snapshot, void* stmt,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void* calldata UNUSED, reg_error* errPtr UNUSED) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reg_registry* reg = (reg_registry*)userdata;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sqlite_int64 id = sqlite3_column_int64(stmt, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reg_snapshot* s = malloc(sizeof(reg_snapshot));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!s) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s->reg = reg;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s->id = id;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ s->proc = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *snapshot = s;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/**
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Type-safe version of `reg_all_objects` for `reg_snapshot`.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] reg registry to select snapshots from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] query the select query to execute
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] query_len length of the query (or -1 for automatic)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [out] objects the snapshots selected
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [out] errPtr on error, a description of the error that occurred
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @return the number of snapshots if success; negative if failure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int reg_all_snapshots(reg_registry* reg, char* query, int query_len,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reg_snapshot*** objects, reg_error* errPtr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int lower_bound = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return reg_all_objects(reg, query, query_len, (void***)objects,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reg_stmt_to_snapshot, &lower_bound, NULL, errPtr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/**
</span> * Opens an existing snapshot in the registry.
* NOTE: This function is actually not required but only to make sure that
* the user has input a valid sqlite id for snapshot
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -80,7 +122,6 @@ int get_parsed_variants(char* variants_str, variant* all_variants,
</span> reg_snapshot* reg_snapshot_open(reg_registry* reg, sqlite_int64 id, reg_error* errPtr) {
sqlite3_stmt* stmt = NULL;
reg_snapshot* snapshot = NULL;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- int lower_bound = 0;
</span> char* query = "SELECT id FROM registry.snapshots WHERE id=?";
if ((sqlite3_prepare_v2(reg->db, query, -1, &stmt, NULL) == SQLITE_OK)
&& (sqlite3_bind_int64(stmt, 1, id) == SQLITE_OK)) {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -116,9 +157,30 @@ reg_snapshot* reg_snapshot_open(reg_registry* reg, sqlite_int64 id, reg_error* e
</span> }
/**
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Lists all the existing snapshots in the registry for the user to choose
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * from, for restore action
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] reg registry to search in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [out] snapshots a list of snapshots
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [out] errPtr on error, a description of the error that occurred
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @return the number of snapshots if success; false if failure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int reg_snapshot_list(reg_registry* reg, reg_snapshot*** snapshots, reg_error* errPtr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Currently limiting to last 10 snapshots in the registry
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int lower_bound = 10;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char* query;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int result;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ query = sqlite3_mprintf("SELECT id FROM registry.snapshots ORDER BY id DESC LIMIT %d",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ lower_bound);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ result = reg_all_snapshots(reg, query, -1, snapshots, errPtr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sqlite3_free(query);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return result;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/**
</span> * Creates a new snapshot in the snapshots registry.
*
<span style='display:block; white-space:pre;background:#ffe0e0;'>- * @param [in] reg the registry to create the entry in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] reg the registry to create the snapshot in
</span> * @param [in] note any note/details to identify the snapshot by the user
if not time
* @param [out] errPtr on error, a description of the error that occurred
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -180,7 +242,7 @@ reg_snapshot* reg_snapshot_create(reg_registry* reg, char* note, reg_error* errP
</span> * @param [out] errPtr on error, a description of the error that occurred
* @return true if success; 0 if failure
*/
<span style='display:block; white-space:pre;background:#ffe0e0;'>-int snapshot_store_ports(reg_registry* reg, reg_snapshot* snapshot, reg_error* errPtr){
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int snapshot_store_ports(reg_registry* reg, reg_snapshot* snapshot, reg_error* errPtr) {
</span> reg_entry** entries;
reg_error error;
int i, entry_count;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -456,6 +518,7 @@ int reg_snapshot_ports_get(reg_snapshot* snapshot, port*** ports, reg_error* err
</span> sqlite3_finalize(stmt);
}
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ reg_sqlite_error(reg->db, errPtr, query);
</span> }
/**
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/cregistry/snapshot.h b/src/cregistry/snapshot.h
</span><span style='display:block; white-space:pre;color:#808080;'>index c54faf4..498e5f4 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/cregistry/snapshot.h
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/cregistry/snapshot.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -67,6 +67,9 @@ int get_parsed_variants(char* variants_str, variant* all_variants,
</span> // get snapshot using id
reg_snapshot* reg_snapshot_open(reg_registry* reg, sqlite_int64 id,
reg_error* errPtr);
<span style='display:block; white-space:pre;background:#e0ffe0;'>+// list all snapshots
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int reg_snapshot_list(reg_registry* reg, reg_snapshot*** snapshots,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reg_error* errPtr);
</span> // create snapshot method
reg_snapshot* reg_snapshot_create(reg_registry* reg, char* note,
reg_error* errPtr);
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/restore.tcl b/src/macports1.0/restore.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index b17f4a5..9f55149 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/restore.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/restore.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -35,9 +35,9 @@ package require registry 1.0
</span> package require snapshot 1.0
namespace eval restore {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- proc main {opts} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ proc main {opts} {
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>- array set options $opts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ array set options $opts
</span>
if ([info exists options(ports_restore_snapshot-id)]) {
# use that snapshot
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -47,17 +47,18 @@ namespace eval restore {
</span> puts [$snapshot created_at]
puts [$snapshot ports]
} else {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- # TODO: fetch the list of snapshots
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set list [list_snapshots]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ foreach l $list {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ puts "[$l note] [$l created_at]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- proc fetch_snapshot {snapshot_id} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return [registry::snapshot get_by_id $snapshot_id]
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>- proc fetch_snapshot_details {snapshot} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ proc fetch_snapshot {snapshot_id} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return [registry::snapshot get_by_id $snapshot_id]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>- return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ proc list_snapshots {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return [registry::snapshot get_all]
</span> }
}
\ No newline at end of file
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/snapshot.tcl b/src/macports1.0/snapshot.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 12a263c..db1f1a7 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/snapshot.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/snapshot.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -40,14 +40,4 @@ namespace eval snapshot {
</span>
return $snapshot
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- proc all_snapshots {opts} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # List the snapshots
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- puts "listing"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- proc fetch_snapshot {opts} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Get the latest snapshot
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return [registry::entry get_snapshot]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span> }
\ No newline at end of file
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/registry2.0/snapshot.c b/src/registry2.0/snapshot.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 2cc59dc..7817a1c 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/registry2.0/snapshot.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/registry2.0/snapshot.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -73,7 +73,6 @@ void delete_snapshot(ClientData clientData) {
</span> * note is required
*/
static int snapshot_create(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[]) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> reg_registry* reg = registry_for(interp, reg_attached);
if (objc > 3) {
Tcl_WrongNumArgs(interp, 2, objv, "create_snapshot ?note?");
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -100,7 +99,6 @@ static int snapshot_create(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[])
</span> * snapshot_id is required
*/
static int snapshot_get(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[]) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> reg_registry* reg = registry_for(interp, reg_attached);
if (objc > 3) {
Tcl_WrongNumArgs(interp, 2, objv, "get_by_id ?snapshot_id?");
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -122,6 +120,39 @@ static int snapshot_get(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[]) {
</span> }
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * registry::snaphot get_all
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int snapshot_get_list(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reg_registry* reg = registry_for(interp, reg_attached);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (objc > 2) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Tcl_WrongNumArgs(interp, 1, objv, "get_all");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return TCL_ERROR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else if (reg == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return TCL_ERROR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reg_error error;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reg_snapshot** snapshots;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int snapshot_count = reg_snapshot_list(reg, &snapshots, &error);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (snapshot_count >= 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int retval;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Tcl_Obj* result;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Tcl_Obj** objs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (list_snapshot_to_obj(interp, &objs, snapshots, snapshot_count, &error)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ result = Tcl_NewListObj(snapshot_count, objs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Tcl_SetObjResult(interp, result);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(objs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ retval = TCL_OK;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ retval = registry_failed(interp, &error);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ free(snapshots);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return retval;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return registry_failed(interp, &error);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> typedef struct {
char* name;
int (*function)(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[]);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -131,6 +162,7 @@ static snapshot_cmd_type snapshot_cmds[] = {
</span> /* Global commands */
{ "create", snapshot_create},
{ "get_by_id", snapshot_get},
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ { "get_all", snapshot_get_list},
</span> { NULL, NULL }
};
</pre><pre style='margin:0'>
</pre>