cpack_repository/commit

ADDED: Rebuild all RDF data from the GIT repositories.

authorJan Wielemaker
Fri Dec 3 15:49:32 2010 +0100
committerJan Wielemaker
Fri Dec 3 15:49:32 2010 +0100
commitd24cc82bbe236808c23e72fb15846e455b32ec4b
tree73712f023f8c1783844f8ae20894770044debedb
parent54e886c8db3198374939f9b87f84aaba597923c5
Diff style: patch stat
diff --git a/applications/cpack_submit.pl b/applications/cpack_submit.pl
index 026c935..026edae 100644
--- a/applications/cpack_submit.pl
+++ b/applications/cpack_submit.pl
@@ -45,16 +45,17 @@
 
 http:location(cpack_api,  api(cpack),  []).
 
-:- http_handler(cpack(submit),		   cpack_submit_form,	     []).
-:- http_handler(cpack(clone_server),	   cpack_clone_server_form,  []).
-:- http_handler(cpack(list_packages),	   cpack_list_packages,	     []).
-:- http_handler(cpack(my_packages),	   cpack_my_packages,	     []).
-:- http_handler(cpack(update_my_packages), cpack_update_my_packages, []).
-:- http_handler(cpack_api(submit),	   cpack_submit,	     []).
-:- http_handler(cpack_api(resubmit),	   cpack_resubmit,	     []).
-:- http_handler(cpack_api(clone_server),   cpack_clone_server,	     []).
-:- http_handler(cpack(show_file),	   cpack_show_file,	     []).
-:- http_handler(cpack(git_show),	   git_show,	             []).
+:- http_handler(cpack(submit),		     cpack_submit_form,		 []).
+:- http_handler(cpack(clone_server),	     cpack_clone_server_form,	 []).
+:- http_handler(cpack(list_packages),	     cpack_list_packages,	 []).
+:- http_handler(cpack(my_packages),	     cpack_my_packages,		 []).
+:- http_handler(cpack(update_my_packages),   cpack_update_my_packages,	 []).
+:- http_handler(cpack_api(submit),	     cpack_submit,		 []).
+:- http_handler(cpack_api(resubmit),	     cpack_resubmit,		 []).
+:- http_handler(cpack_api(clone_server),     cpack_clone_server,	 []).
+:- http_handler(cpack_api(refresh_metadata), cpack_refresh_metadata_api, []).
+:- http_handler(cpack(show_file),	     cpack_show_file,		 []).
+:- http_handler(cpack(git_show),	     git_show,			 []).
 
 /** <module> User interaction to manage CPACKS
 */
@@ -296,3 +297,15 @@ cpack_clone_server(Request) :-
 	user_property(User, url(UserURL)),
 	call_showing_messages(cpack_clone_server(UserURL, ServerURL, []),
 			      []).
+
+
+%%	cpack_refresh_metadata_api(+Request)
+%
+%	API to reload all metadata.
+
+cpack_refresh_metadata_api(_Request) :-
+	authorized(write(cpack, refresh_metadata)),
+	call_showing_messages(cpack_refresh_metadata,
+			      []).
+
+
diff --git a/config-available/cpack_repository.pl b/config-available/cpack_repository.pl
index e2ab2bc..0d8f653 100644
--- a/config-available/cpack_repository.pl
+++ b/config-available/cpack_repository.pl
@@ -18,10 +18,11 @@ http:location(cpack, root(cpack), []).
 cliopatria:menu_popup_order(cpack, 250).
 cliopatria:menu_label(cpack, 'CPACK').
 
-cliopatria:menu_item(100=cpack/cpack_list_packages,	 'List packs').
-cliopatria:menu_item(200=cpack/cpack_submit_form,	 'Submit pack').
-cliopatria:menu_item(300=cpack/cpack_clone_server_form,	 'Clone server').
-cliopatria:menu_item(275=current_user/cpack_my_packages, 'My CPACKs') :-
+cliopatria:menu_item(100=cpack/cpack_list_packages,	   'List packs').
+cliopatria:menu_item(200=cpack/cpack_submit_form,	   'Submit pack').
+cliopatria:menu_item(300=cpack/cpack_clone_server_form,	   'Clone server').
+cliopatria:menu_item(400=cpack/cpack_refresh_metadata_api, 'Refresh metadata').
+cliopatria:menu_item(275=current_user/cpack_my_packages,   'My CPACKs') :-
 	logged_on(_).
 
 :- rdf_attach_library(cliopatria(rdf)).
diff --git a/lib/cpack/repository.pl b/lib/cpack/repository.pl
index cb911a3..7fc6c9b 100644
--- a/lib/cpack/repository.pl
+++ b/lib/cpack/repository.pl
@@ -31,6 +31,8 @@
 :- module(cpack_repository,
 	  [ cpack_add_repository/3,	% +User, +GitRepo, +Options
 	    cpack_update_package/2,	% +User, +Package
+	    cpack_refresh_metadata/0,
+	    cpack_refresh_metadata/1,	% +MirrorGit
 	    cpack_our_mirror/2,		% +Package, -MirrorDir
 	    cpack_clone_server/3,	% +User, +Server, +Options)
 	    cpack_uri/3,		% +Type, +Object, -URI
@@ -155,7 +157,7 @@ update_metadata(BareGitPath, Graph, Options) :-
 	catch(load_meta_data(BareGitPath, Graph, Options), E,
 	      print_message(error, E)),
 	update_decription(BareGitPath, Graph),
-	add_timestamp(Graph),
+	add_timestamp(Graph, Options),
 	(   option(cloned(ClonedURL), Options)
 	->  option(branch(Branch), Options, master),
 	    rdf_bnode(Cloned),
@@ -179,7 +181,10 @@ update_metadata(BareGitPath, Graph, Options) :-
 	foaf_merge(_),
 	xref_cpack(Graph).
 
-add_timestamp(Graph) :-
+add_timestamp(Graph, Options) :-
+	option(submitted_date(DateTime), Options), !,
+	rdf_assert(Graph, cpack:submittedDate, DateTime, Graph).
+add_timestamp(Graph, _Options) :-
 	get_time(Now),
 	format_time(atom(DateTime), '%FT%T%Oz', Now),
 	rdf_assert(Graph, cpack:submittedDate,
@@ -311,6 +316,55 @@ rdf_load_git_stream(Graph, Format, In) :-
 	forall(member(rdf(S,P,O), RDF),
 	       rdf_assert(S,P,O,Graph)).
 
+
+		 /*******************************
+		 *	UPDATE FROM MIRROR	*
+		 *******************************/
+
+%%	cpack_refresh_metadata(+BareGitPath) is det.
+%
+%	Regenerate the metadata associated  with   BareGitPath  from the
+%	plain (mirrored) git repository.
+
+cpack_refresh_metadata(BareGitPath) :-
+	file_base_name(BareGitPath, BareGit),
+	file_name_extension(PackageName, git, BareGit),
+	package_graph(PackageName, Graph),
+	git_remote_url(origin, Origin, [directory(BareGitPath)]),
+	git_default_branch(DefBranch, [directory(BareGitPath)]),
+	(   rdf_has(Graph, cpack:submittedDate, Date)
+	->  Extra = [submitted_date(Date)]
+	;   Extra = []
+	),
+	update_metadata(BareGitPath, Graph,
+			[ cloned(Origin),
+			  branch(DefBranch)
+			| Extra
+			]).
+
+%%	cpack_refresh_metadata
+%
+%	Rebuild all (xref) metadata for all  packages from scratch. This
+%	is intended to deal with changes   to the metadata formats, lost
+%	GIT mirrors, etc.
+
+cpack_refresh_metadata :-
+	setting(cpack:mirrors, MirrorDir),
+	directory_file_path(MirrorDir, '*.git', Pattern),
+	expand_file_name(Pattern, BareGits),
+	clear_xref_graphs,
+	maplist(cpack_refresh_metadata, BareGits).
+
+clear_xref_graphs :-
+	clear_xref_graph(prolog),
+	clear_xref_graph(cliopatria),
+	clear_xref_graph('file-references').
+
+clear_xref_graph(Name) :-
+	cpack_uri(graph, Name, URI),
+	rdf_retractall(_,_,_,URI).
+
+
 		 /*******************************
 		 *	  CLONE A SERVER	*
 		 *******************************/